2023-10-21 23:25:00 -04:00
#![ cfg(feature = " pypi " ) ]
2023-10-12 13:34:48 -04:00
//! Integration tests for the resolver. These tests rely on a live network connection, and hit
//! `PyPI` directly.
2023-11-13 17:14:07 +01:00
use std ::path ::{ Path , PathBuf } ;
2023-10-10 23:30:53 -04:00
use std ::str ::FromStr ;
use anyhow ::Result ;
2023-11-19 07:10:57 -08:00
use chrono ::{ DateTime , Utc } ;
2023-10-12 13:34:48 -04:00
use once_cell ::sync ::Lazy ;
2023-10-10 23:30:53 -04:00
2024-02-11 19:31:41 -06:00
use distribution_types ::{ IndexLocations , Resolution , SourceDist } ;
2023-10-10 23:30:53 -04:00
use pep508_rs ::{ MarkerEnvironment , Requirement , StringVersion } ;
2024-03-13 12:51:14 +01:00
use platform_tags ::{ Arch , Os , Platform , Tags } ;
2024-02-15 11:19:46 -06:00
use uv_cache ::Cache ;
use uv_client ::{ FlatIndex , RegistryClientBuilder } ;
2024-03-13 12:51:14 +01:00
use uv_interpreter ::{ find_default_python , Interpreter , PythonEnvironment } ;
2024-02-15 11:19:46 -06:00
use uv_resolver ::{
2024-01-30 11:50:16 -08:00
DisplayResolutionGraph , InMemoryIndex , Manifest , Options , OptionsBuilder , PreReleaseMode ,
2024-03-18 18:02:18 -07:00
Preference , ResolutionGraph , ResolutionMode , Resolver ,
2023-11-17 10:53:53 -08:00
} ;
2024-03-07 06:04:02 -08:00
use uv_traits ::{
BuildContext , BuildIsolation , BuildKind , NoBinary , NoBuild , SetupPyStrategy , SourceBuildTrait ,
} ;
2023-10-25 22:05:13 +02:00
2023-11-19 07:10:57 -08:00
// Exclude any packages uploaded after this date.
static EXCLUDE_NEWER : Lazy < DateTime < Utc > > = Lazy ::new ( | | {
DateTime ::parse_from_rfc3339 ( " 2023-11-18T12:00:00Z " )
. unwrap ( )
. with_timezone ( & Utc )
} ) ;
2023-11-13 17:14:07 +01:00
struct DummyContext {
2023-11-28 18:11:14 +01:00
cache : Cache ,
2023-11-23 09:57:33 +01:00
interpreter : Interpreter ,
2024-02-06 11:04:14 -06:00
index_locations : IndexLocations ,
}
impl DummyContext {
fn new ( cache : Cache , interpreter : Interpreter ) -> Self {
Self {
cache ,
interpreter ,
index_locations : IndexLocations ::default ( ) ,
}
}
2023-11-13 17:14:07 +01:00
}
2023-10-25 22:05:13 +02:00
impl BuildContext for DummyContext {
2023-12-12 21:45:37 +01:00
type SourceDistBuilder = DummyBuilder ;
2023-11-28 18:11:14 +01:00
fn cache ( & self ) -> & Cache {
2023-11-24 18:47:58 +01:00
& self . cache
2023-10-25 22:05:13 +02:00
}
2023-11-23 09:57:33 +01:00
fn interpreter ( & self ) -> & Interpreter {
& self . interpreter
2023-10-25 22:11:36 +02:00
}
2024-03-07 06:04:02 -08:00
fn build_isolation ( & self ) -> BuildIsolation {
BuildIsolation ::Isolated
}
2024-02-11 19:31:41 -06:00
fn no_build ( & self ) -> & NoBuild {
& NoBuild ::None
2024-01-09 20:27:06 -05:00
}
2024-01-19 11:24:27 -06:00
fn no_binary ( & self ) -> & NoBinary {
& NoBinary ::None
}
2024-01-09 20:27:06 -05:00
fn setup_py_strategy ( & self ) -> SetupPyStrategy {
SetupPyStrategy ::default ( )
}
2024-02-06 11:04:14 -06:00
fn index_locations ( & self ) -> & IndexLocations {
& self . index_locations
}
2024-02-21 18:53:41 +01:00
async fn resolve < ' a > ( & ' a self , _ : & ' a [ Requirement ] ) -> Result < Resolution > {
2023-10-25 22:05:13 +02:00
panic! ( " The test should not need to build source distributions " )
}
2024-02-28 10:04:55 -05:00
async fn install < ' a > ( & ' a self , _ : & ' a Resolution , _ : & ' a PythonEnvironment ) -> Result < ( ) > {
2023-10-25 22:05:13 +02:00
panic! ( " The test should not need to build source distributions " )
}
2023-12-28 21:08:35 +01:00
async fn setup_build < ' a > (
2023-10-25 22:05:13 +02:00
& ' a self ,
2024-02-21 18:53:41 +01:00
_ : & ' a Path ,
_ : Option < & ' a Path > ,
_ : & ' a str ,
_ : Option < & ' a SourceDist > ,
_ : BuildKind ,
2023-12-28 21:08:35 +01:00
) -> Result < Self ::SourceDistBuilder > {
Ok ( DummyBuilder )
2023-12-12 21:45:37 +01:00
}
}
struct DummyBuilder ;
impl SourceBuildTrait for DummyBuilder {
2023-12-28 21:08:35 +01:00
async fn metadata ( & mut self ) -> Result < Option < PathBuf > > {
2023-12-12 21:45:37 +01:00
panic! ( " The test should not need to build source distributions " )
}
2024-02-21 18:53:41 +01:00
async fn wheel < ' a > ( & ' a self , _ : & ' a Path ) -> Result < String > {
2023-10-25 22:05:13 +02:00
panic! ( " The test should not need to build source distributions " )
}
}
2023-10-10 23:30:53 -04:00
2023-11-13 17:14:07 +01:00
async fn resolve (
manifest : Manifest ,
2024-01-30 11:50:16 -08:00
options : Options ,
2023-11-13 17:14:07 +01:00
markers : & 'static MarkerEnvironment ,
tags : & Tags ,
2023-12-13 12:36:27 -05:00
) -> Result < ResolutionGraph > {
2023-11-28 18:11:14 +01:00
let client = RegistryClientBuilder ::new ( Cache ::temp ( ) ? ) . build ( ) ;
2024-01-15 11:02:02 -05:00
let flat_index = FlatIndex ::default ( ) ;
2024-01-16 00:37:15 -05:00
let index = InMemoryIndex ::default ( ) ;
2024-03-13 12:51:14 +01:00
// TODO(konstin): Should we also use the bootstrapped pythons here?
let real_interpreter =
find_default_python ( & Cache ::temp ( ) . unwrap ( ) ) . expect ( " Expected a python to be installed " ) ;
let interpreter = Interpreter ::artificial ( real_interpreter . platform ( ) . clone ( ) , markers . clone ( ) ) ;
2024-02-06 11:04:14 -06:00
let build_context = DummyContext ::new ( Cache ::temp ( ) ? , interpreter . clone ( ) ) ;
2024-01-03 11:20:45 -04:00
let resolver = Resolver ::new (
manifest ,
options ,
markers ,
& interpreter ,
tags ,
& client ,
2024-01-15 11:02:02 -05:00
& flat_index ,
2024-01-16 00:37:15 -05:00
& index ,
2024-01-03 11:20:45 -04:00
& build_context ,
2024-02-21 21:27:58 -05:00
) ? ;
2023-11-13 17:14:07 +01:00
Ok ( resolver . resolve ( ) . await ? )
}
2024-01-08 03:54:57 -05:00
macro_rules ! assert_snapshot {
( $value :expr , @ $snapshot :literal ) = > {
let snapshot = anstream ::adapter ::strip_str ( & format! ( " {} " , $value ) ) . to_string ( ) ;
insta ::assert_snapshot! ( & snapshot , @ $snapshot )
} ;
}
2023-10-10 23:30:53 -04:00
#[ tokio::test ]
2023-10-12 13:34:48 -04:00
async fn black ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black<=23.9.1 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-10 23:30:53 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-10 23:30:53 -04:00
Ok ( ( ) )
}
#[ tokio::test ]
2023-10-12 13:34:48 -04:00
async fn black_colorama ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [
Requirement ::from_str ( " black[colorama]<=23.9.1 " ) . unwrap ( )
] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-12-13 12:36:27 -05:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
colorama==0.4.6
2024-01-26 04:07:51 -08:00
# via black
2023-12-13 19:35:38 -05:00
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-12-13 12:36:27 -05:00
Ok ( ( ) )
}
/// Resolve Black with an invalid extra. The resolver should ignore the extra.
#[ tokio::test ]
async fn black_tensorboard ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [
Requirement ::from_str ( " black[tensorboard]<=23.9.1 " ) . unwrap ( )
] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-10 23:30:53 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-10 23:30:53 -04:00
Ok ( ( ) )
}
2023-10-12 13:34:48 -04:00
#[ tokio::test ]
async fn black_python_310 ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black<=23.9.1 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_310 , & TAGS_310 ) . await ? ;
2023-10-10 23:30:53 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
tomli==2.0.1
# via black
typing-extensions==4.8.0
# via black
"### ) ;
2023-10-10 23:30:53 -04:00
Ok ( ( ) )
}
2023-10-12 13:34:48 -04:00
2023-10-19 20:24:05 -04:00
/// Resolve `black` with a constraint on `mypy-extensions`, to ensure that constraints are
/// respected.
#[ tokio::test ]
async fn black_mypy_extensions ( ) -> Result < ( ) > {
2023-10-29 11:31:55 -07:00
let manifest = Manifest ::new (
2023-10-25 21:36:03 -07:00
vec! [ Requirement ::from_str ( " black<=23.9.1 " ) . unwrap ( ) ] ,
2023-10-30 08:21:10 -07:00
vec! [ Requirement ::from_str ( " mypy-extensions<0.4.4 " ) . unwrap ( ) ] ,
2023-10-25 21:36:03 -07:00
vec! [ ] ,
2023-12-13 10:03:38 -05:00
vec! [ ] ,
2023-11-16 20:46:17 +01:00
None ,
2023-12-16 23:37:34 +01:00
vec! [ ] ,
2023-10-21 22:58:06 -04:00
) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-19 20:24:05 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==0.4.3
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-19 20:24:05 -04:00
Ok ( ( ) )
}
/// Resolve `black` with a constraint on `mypy-extensions[extra]`, to ensure that extras are
/// ignored when resolving constraints.
#[ tokio::test ]
async fn black_mypy_extensions_extra ( ) -> Result < ( ) > {
2023-10-29 11:31:55 -07:00
let manifest = Manifest ::new (
2023-10-25 21:36:03 -07:00
vec! [ Requirement ::from_str ( " black<=23.9.1 " ) . unwrap ( ) ] ,
2023-10-30 08:21:10 -07:00
vec! [ Requirement ::from_str ( " mypy-extensions[extra]<0.4.4 " ) . unwrap ( ) ] ,
2023-10-25 21:36:03 -07:00
vec! [ ] ,
2023-12-13 10:03:38 -05:00
vec! [ ] ,
2023-11-16 20:46:17 +01:00
None ,
2023-12-16 23:37:34 +01:00
vec! [ ] ,
2023-10-21 22:58:06 -04:00
) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-19 20:24:05 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==0.4.3
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-19 20:24:05 -04:00
Ok ( ( ) )
}
/// Resolve `black` with a redundant constraint on `flake8`, to ensure that constraints don't
/// introduce new dependencies.
#[ tokio::test ]
async fn black_flake8 ( ) -> Result < ( ) > {
2023-10-29 11:31:55 -07:00
let manifest = Manifest ::new (
2023-10-25 21:36:03 -07:00
vec! [ Requirement ::from_str ( " black<=23.9.1 " ) . unwrap ( ) ] ,
vec! [ Requirement ::from_str ( " flake8<1 " ) . unwrap ( ) ] ,
vec! [ ] ,
2023-12-13 10:03:38 -05:00
vec! [ ] ,
2023-11-16 20:46:17 +01:00
None ,
2023-12-16 23:37:34 +01:00
vec! [ ] ,
2023-10-21 22:58:06 -04:00
) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-21 22:58:06 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-21 22:58:06 -04:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_lowest ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black>21 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. resolution_mode ( ResolutionMode ::Lowest )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-21 22:58:06 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==22.1.0
click==8.0.0
# via black
mypy-extensions==0.4.3
# via black
pathspec==0.9.0
# via black
platformdirs==2.0.0
# via black
tomli==1.1.0
# via black
"### ) ;
2023-10-21 22:58:06 -04:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_lowest_direct ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black>21 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. resolution_mode ( ResolutionMode ::LowestDirect )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-25 21:28:58 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==22.1.0
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
tomli==2.0.1
# via black
"### ) ;
2023-10-25 21:28:58 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_respect_preference ( ) -> Result < ( ) > {
2023-10-29 11:31:55 -07:00
let manifest = Manifest ::new (
2024-03-18 18:02:18 -07:00
vec! [ Requirement ::from_str ( " black<=23.9.1 " ) ? ] ,
2023-10-25 21:36:03 -07:00
vec! [ ] ,
2023-12-13 10:03:38 -05:00
vec! [ ] ,
2024-03-18 18:02:18 -07:00
vec! [ Preference ::from_requirement ( Requirement ::from_str (
" black==23.9.0 " ,
) ? ) ] ,
2023-11-16 20:46:17 +01:00
None ,
2023-12-16 23:37:34 +01:00
vec! [ ] ,
2023-10-25 21:28:58 -07:00
) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-25 21:28:58 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.0
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-25 21:28:58 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_ignore_preference ( ) -> Result < ( ) > {
2023-10-29 11:31:55 -07:00
let manifest = Manifest ::new (
2024-03-18 18:02:18 -07:00
vec! [ Requirement ::from_str ( " black<=23.9.1 " ) ? ] ,
2023-10-25 21:36:03 -07:00
vec! [ ] ,
2023-12-13 10:03:38 -05:00
vec! [ ] ,
2024-03-18 18:02:18 -07:00
vec! [ Preference ::from_requirement ( Requirement ::from_str (
" black==23.9.2 " ,
) ? ) ] ,
2023-11-16 20:46:17 +01:00
None ,
2023-12-16 23:37:34 +01:00
vec! [ ] ,
2023-10-29 11:31:55 -07:00
) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-19 07:10:57 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-29 11:31:55 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
black==23.9.1
click==8.1.7
# via black
mypy-extensions==1.0.0
# via black
packaging==23.2
# via black
pathspec==0.11.2
# via black
platformdirs==4.0.0
# via black
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_disallow_prerelease ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black<=20.0 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::Disallow )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-17 10:53:53 -08:00
let err = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 )
2023-11-13 17:14:07 +01:00
. await
. unwrap_err ( ) ;
2023-10-29 11:31:55 -07:00
2024-01-09 09:58:38 -05:00
assert_snapshot! ( err , @ r ### "
2024-01-19 11:17:42 -06:00
Because only black>20.0 is available and you require black<=20.0, we can conclude that the requirements are unsatisfiable.
2024-01-09 09:58:38 -05:00
hint: Pre-releases are available for black in the requested range (e.g., 19.10b0), but pre-releases weren't enabled (try: `--prerelease=allow`)
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn black_allow_prerelease_if_necessary ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " black<=20.0 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::IfNecessary )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-17 10:53:53 -08:00
let err = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 )
2023-11-13 17:14:07 +01:00
. await
. unwrap_err ( ) ;
2023-10-29 11:31:55 -07:00
2024-01-09 09:58:38 -05:00
assert_snapshot! ( err , @ r ### "
2024-01-19 11:17:42 -06:00
Because only black>20.0 is available and you require black<=20.0, we can conclude that the requirements are unsatisfiable.
2024-01-09 09:58:38 -05:00
hint: Pre-releases are available for black in the requested range (e.g., 19.10b0), but pre-releases weren't enabled (try: `--prerelease=allow`)
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn pylint_disallow_prerelease ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " pylint==2.3.0 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::Disallow )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-29 11:31:55 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
astroid==3.0.1
# via pylint
isort==5.12.0
# via pylint
mccabe==0.7.0
# via pylint
pylint==2.3.0
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn pylint_allow_prerelease ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " pylint==2.3.0 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::Allow )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-29 11:31:55 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
astroid==3.0.1
# via pylint
isort==6.0.0b2
# via pylint
mccabe==0.7.0
# via pylint
pylint==2.3.0
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn pylint_allow_explicit_prerelease_without_marker ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [
Requirement ::from_str ( " pylint==2.3.0 " ) . unwrap ( ) ,
Requirement ::from_str ( " isort>=5.0.0 " ) . unwrap ( ) ,
] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::Explicit )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-29 11:31:55 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-29 11:31:55 -07:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
astroid==3.0.1
# via pylint
isort==5.12.0
# via pylint
mccabe==0.7.0
# via pylint
pylint==2.3.0
"### ) ;
2023-10-29 11:31:55 -07:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn pylint_allow_explicit_prerelease_with_marker ( ) -> Result < ( ) > {
2023-12-13 12:41:29 -05:00
let manifest = Manifest ::simple ( vec! [
Requirement ::from_str ( " pylint==2.3.0 " ) . unwrap ( ) ,
Requirement ::from_str ( " isort>=5.0.0b " ) . unwrap ( ) ,
] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. prerelease_mode ( PreReleaseMode ::Explicit )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-10-25 21:28:58 -07:00
2023-11-17 10:53:53 -08:00
let resolution = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 ) . await ? ;
2023-10-19 20:24:05 -04:00
2024-01-12 12:44:19 -05:00
assert_snapshot! ( DisplayResolutionGraph ::from ( & resolution ) , @ r ### "
2023-12-13 19:35:38 -05:00
astroid==3.0.1
# via pylint
isort==6.0.0b2
# via pylint
mccabe==0.7.0
# via pylint
pylint==2.3.0
"### ) ;
2023-10-15 22:05:44 -04:00
Ok ( ( ) )
}
2023-12-28 22:44:35 -04:00
/// Resolve `msgraph-sdk==1.0.0`, which depends on `msgraph-core>=1.0.0a2`. The resolver should
/// fail with a pre-release-centric hint.
#[ tokio::test ]
async fn msgraph_sdk ( ) -> Result < ( ) > {
let manifest = Manifest ::simple ( vec! [ Requirement ::from_str ( " msgraph-sdk==1.0.0 " ) . unwrap ( ) ] ) ;
2024-01-30 11:50:16 -08:00
let options = OptionsBuilder ::new ( )
. exclude_newer ( Some ( * EXCLUDE_NEWER ) )
. build ( ) ;
2023-12-28 22:44:35 -04:00
let err = resolve ( manifest , options , & MARKERS_311 , & TAGS_311 )
. await
. unwrap_err ( ) ;
2024-01-08 03:54:57 -05:00
assert_snapshot! ( err , @ r ### "
2024-01-19 10:48:20 -06:00
Because only msgraph-core<1.0.0a2 is available and msgraph-sdk==1.0.0 depends on msgraph-core>=1.0.0a2, we can conclude that msgraph-sdk==1.0.0 cannot be used.
2024-01-22 13:31:09 -06:00
And because you require msgraph-sdk==1.0.0, we can conclude that the requirements are unsatisfiable.
2023-12-28 22:44:35 -04:00
2024-01-10 14:16:23 -06:00
hint: msgraph-core was requested with a pre-release marker (e.g., msgraph-core>=1.0.0a2), but pre-releases weren't enabled (try: `--prerelease=allow`)
2023-12-28 22:44:35 -04:00
"### ) ;
Ok ( ( ) )
}
2023-10-12 13:34:48 -04:00
static MARKERS_311 : Lazy < MarkerEnvironment > = Lazy ::new ( | | {
MarkerEnvironment {
implementation_name : " cpython " . to_string ( ) ,
implementation_version : StringVersion ::from_str ( " 3.11.5 " ) . unwrap ( ) ,
os_name : " posix " . to_string ( ) ,
platform_machine : " arm64 " . to_string ( ) ,
platform_python_implementation : " CPython " . to_string ( ) ,
platform_release : " 21.6.0 " . to_string ( ) ,
platform_system : " Darwin " . to_string ( ) ,
platform_version : " Darwin Kernel Version 21.6.0: Mon Aug 22 20:19:52 PDT 2022; root:xnu-8020.140.49~2/RELEASE_ARM64_T6000 " . to_string ( ) ,
python_full_version : StringVersion ::from_str ( " 3.11.5 " ) . unwrap ( ) ,
python_version : StringVersion ::from_str ( " 3.11 " ) . unwrap ( ) ,
sys_platform : " darwin " . to_string ( ) ,
}
} ) ;
static TAGS_311 : Lazy < Tags > = Lazy ::new ( | | {
Tags ::from_env (
& Platform ::new (
Os ::Macos {
major : 21 ,
minor : 6 ,
} ,
Arch ::Aarch64 ,
) ,
( 3 , 11 ) ,
2024-01-22 09:22:27 -05:00
" cpython " ,
( 3 , 11 ) ,
2023-10-12 13:34:48 -04:00
)
. unwrap ( )
} ) ;
static MARKERS_310 : Lazy < MarkerEnvironment > = Lazy ::new ( | | {
MarkerEnvironment {
implementation_name : " cpython " . to_string ( ) ,
implementation_version : StringVersion ::from_str ( " 3.10.5 " ) . unwrap ( ) ,
os_name : " posix " . to_string ( ) ,
platform_machine : " arm64 " . to_string ( ) ,
platform_python_implementation : " CPython " . to_string ( ) ,
platform_release : " 21.6.0 " . to_string ( ) ,
platform_system : " Darwin " . to_string ( ) ,
platform_version : " Darwin Kernel Version 21.6.0: Mon Aug 22 20:19:52 PDT 2022; root:xnu-8020.140.49~2/RELEASE_ARM64_T6000 " . to_string ( ) ,
python_full_version : StringVersion ::from_str ( " 3.10.5 " ) . unwrap ( ) ,
python_version : StringVersion ::from_str ( " 3.10 " ) . unwrap ( ) ,
sys_platform : " darwin " . to_string ( ) ,
}
} ) ;
static TAGS_310 : Lazy < Tags > = Lazy ::new ( | | {
Tags ::from_env (
& Platform ::new (
Os ::Macos {
major : 21 ,
minor : 6 ,
} ,
Arch ::Aarch64 ,
) ,
( 3 , 10 ) ,
2024-01-22 09:22:27 -05:00
" cpython " ,
( 3 , 10 ) ,
2023-10-12 13:34:48 -04:00
)
. unwrap ( )
} ) ;