@@ -779,77 +779,94 @@ pub fn find_python_installations<'a>(
779
779
. map ( FindPythonResult :: Ok )
780
780
} )
781
781
} ) ,
782
- PythonRequest :: Version ( version) => Box :: new ( {
783
- debug ! ( "Searching for {request} in {preference}" ) ;
784
- python_interpreters ( Some ( version) , None , environments, preference, cache)
782
+ PythonRequest :: Version ( version) => {
783
+ if let Err ( err) = version. check_supported ( ) {
784
+ return Box :: new ( std:: iter:: once ( Err ( Error :: InvalidVersionRequest ( err) ) ) ) ;
785
+ } ;
786
+ Box :: new ( {
787
+ debug ! ( "Searching for {request} in {preference}" ) ;
788
+ python_interpreters ( Some ( version) , None , environments, preference, cache)
789
+ . filter ( |result| match result {
790
+ Err ( _) => true ,
791
+ Ok ( ( _source, interpreter) ) => version. matches_interpreter ( interpreter) ,
792
+ } )
793
+ . map ( |result| {
794
+ result
795
+ . map ( PythonInstallation :: from_tuple)
796
+ . map ( FindPythonResult :: Ok )
797
+ } )
798
+ } )
799
+ }
800
+ PythonRequest :: Implementation ( implementation) => Box :: new ( {
801
+ debug ! ( "Searching for a {request} interpreter in {preference}" ) ;
802
+ python_interpreters ( None , Some ( implementation) , environments, preference, cache)
785
803
. filter ( |result| match result {
786
804
Err ( _) => true ,
787
- Ok ( ( _source, interpreter) ) => version. matches_interpreter ( interpreter) ,
805
+ Ok ( ( _source, interpreter) ) => interpreter
806
+ . implementation_name ( )
807
+ . eq_ignore_ascii_case ( implementation. into ( ) ) ,
788
808
} )
789
809
. map ( |result| {
790
810
result
791
811
. map ( PythonInstallation :: from_tuple)
792
812
. map ( FindPythonResult :: Ok )
793
813
} )
794
814
} ) ,
795
- PythonRequest :: Implementation ( implementation) => Box :: new ( {
796
- debug ! ( "Searching for a {request} interpreter in {preference}" ) ;
797
- python_interpreters ( None , Some ( implementation) , environments, preference, cache)
815
+ PythonRequest :: ImplementationVersion ( implementation, version) => {
816
+ if let Err ( err) = version. check_supported ( ) {
817
+ return Box :: new ( std:: iter:: once ( Err ( Error :: InvalidVersionRequest ( err) ) ) ) ;
818
+ } ;
819
+ Box :: new ( {
820
+ debug ! ( "Searching for {request} in {preference}" ) ;
821
+ python_interpreters (
822
+ Some ( version) ,
823
+ Some ( implementation) ,
824
+ environments,
825
+ preference,
826
+ cache,
827
+ )
798
828
. filter ( |result| match result {
799
829
Err ( _) => true ,
800
- Ok ( ( _source, interpreter) ) => interpreter
801
- . implementation_name ( )
802
- . eq_ignore_ascii_case ( implementation. into ( ) ) ,
830
+ Ok ( ( _source, interpreter) ) => {
831
+ version. matches_interpreter ( interpreter)
832
+ && interpreter
833
+ . implementation_name ( )
834
+ . eq_ignore_ascii_case ( implementation. into ( ) )
835
+ }
803
836
} )
804
837
. map ( |result| {
805
838
result
806
839
. map ( PythonInstallation :: from_tuple)
807
840
. map ( FindPythonResult :: Ok )
808
841
} )
809
- } ) ,
810
- PythonRequest :: ImplementationVersion ( implementation, version) => Box :: new ( {
811
- debug ! ( "Searching for {request} in {preference}" ) ;
812
- python_interpreters (
813
- Some ( version) ,
814
- Some ( implementation) ,
815
- environments,
816
- preference,
817
- cache,
818
- )
819
- . filter ( |result| match result {
820
- Err ( _) => true ,
821
- Ok ( ( _source, interpreter) ) => {
822
- version. matches_interpreter ( interpreter)
823
- && interpreter
824
- . implementation_name ( )
825
- . eq_ignore_ascii_case ( implementation. into ( ) )
826
- }
827
- } )
828
- . map ( |result| {
829
- result
830
- . map ( PythonInstallation :: from_tuple)
831
- . map ( FindPythonResult :: Ok )
832
- } )
833
- } ) ,
834
- PythonRequest :: Key ( request) => Box :: new ( {
835
- debug ! ( "Searching for {request} in {preference}" ) ;
836
- python_interpreters (
837
- request. version ( ) ,
838
- request. implementation ( ) ,
839
- environments,
840
- preference,
841
- cache,
842
- )
843
- . filter ( |result| match result {
844
- Err ( _) => true ,
845
- Ok ( ( _source, interpreter) ) => request. satisfied_by_interpreter ( interpreter) ,
846
842
} )
847
- . map ( |result| {
848
- result
849
- . map ( PythonInstallation :: from_tuple)
850
- . map ( FindPythonResult :: Ok )
843
+ }
844
+ PythonRequest :: Key ( request) => {
845
+ if let Some ( version) = request. version ( ) {
846
+ if let Err ( err) = version. check_supported ( ) {
847
+ return Box :: new ( std:: iter:: once ( Err ( Error :: InvalidVersionRequest ( err) ) ) ) ;
848
+ } ;
849
+ } ;
850
+ Box :: new ( {
851
+ debug ! ( "Searching for {request} in {preference}" ) ;
852
+ python_interpreters (
853
+ request. version ( ) ,
854
+ request. implementation ( ) ,
855
+ environments,
856
+ preference,
857
+ cache,
858
+ )
859
+ . filter ( |result| match result {
860
+ Err ( _) => true ,
861
+ Ok ( ( _source, interpreter) ) => request. satisfied_by_interpreter ( interpreter) ,
862
+ } )
863
+ . map ( |result| {
864
+ result
865
+ . map ( PythonInstallation :: from_tuple)
866
+ . map ( FindPythonResult :: Ok )
867
+ } )
851
868
} )
852
- } ) ,
869
+ }
853
870
}
854
871
}
855
872
@@ -1449,6 +1466,37 @@ impl VersionRequest {
1449
1466
. flatten ( )
1450
1467
}
1451
1468
1469
+ pub ( crate ) fn check_supported ( & self ) -> Result < ( ) , String > {
1470
+ match self {
1471
+ Self :: Any => ( ) ,
1472
+ Self :: Major ( major) => {
1473
+ if * major < 3 {
1474
+ return Err ( format ! (
1475
+ "Python <3 is not supported but {major} was requested."
1476
+ ) ) ;
1477
+ }
1478
+ }
1479
+ Self :: MajorMinor ( major, minor) => {
1480
+ if ( * major, * minor) < ( 3 , 7 ) {
1481
+ return Err ( format ! (
1482
+ "Python <3.7 is not supported but {major}.{minor} was requested."
1483
+ ) ) ;
1484
+ }
1485
+ }
1486
+ Self :: MajorMinorPatch ( major, minor, patch) => {
1487
+ if ( * major, * minor) < ( 3 , 7 ) {
1488
+ return Err ( format ! (
1489
+ "Python <3.7 is not supported but {major}.{minor}.{patch} was requested."
1490
+ ) ) ;
1491
+ }
1492
+ }
1493
+ // TODO(zanieb): We could do some checking here to see if the range can be satisfied
1494
+ Self :: Range ( _) => ( ) ,
1495
+ }
1496
+
1497
+ Ok ( ( ) )
1498
+ }
1499
+
1452
1500
/// Check if a interpreter matches the requested Python version.
1453
1501
pub ( crate ) fn matches_interpreter ( & self , interpreter : & Interpreter ) -> bool {
1454
1502
match self {
0 commit comments