@@ -3437,6 +3437,69 @@ def test_solver_cannot_choose_another_version_for_url_dependencies(
3437
3437
solver .solve ()
3438
3438
3439
3439
3440
+ @pytest .mark .parametrize ("explicit_source" , [True , False ])
3441
+ def test_solver_cannot_choose_url_dependency_for_explicit_source (
3442
+ solver : Solver ,
3443
+ repo : Repository ,
3444
+ package : ProjectPackage ,
3445
+ explicit_source : bool ,
3446
+ ) -> None :
3447
+ """A direct origin dependency cannot satisfy a version dependency with an explicit
3448
+ source. (It can satisfy a version dependency without an explicit source.)
3449
+ """
3450
+ package .add_dependency (
3451
+ Factory .create_dependency (
3452
+ "demo" ,
3453
+ {
3454
+ "markers" : "sys_platform != 'darwin'" ,
3455
+ "url" : "https://foo.bar/distributions/demo-0.1.0-py2.py3-none-any.whl" ,
3456
+ },
3457
+ )
3458
+ )
3459
+ package .add_dependency (
3460
+ Factory .create_dependency (
3461
+ "demo" ,
3462
+ {
3463
+ "version" : "0.1.0" ,
3464
+ "markers" : "sys_platform == 'darwin'" ,
3465
+ "source" : "repo" if explicit_source else None ,
3466
+ },
3467
+ )
3468
+ )
3469
+
3470
+ package_pendulum = get_package ("pendulum" , "1.4.4" )
3471
+ package_demo = get_package ("demo" , "0.1.0" )
3472
+ package_demo_url = Package (
3473
+ "demo" ,
3474
+ "0.1.0" ,
3475
+ source_type = "url" ,
3476
+ source_url = "https://foo.bar/distributions/demo-0.1.0-py2.py3-none-any.whl" ,
3477
+ )
3478
+ # The url demo dependency depends on pendulum.
3479
+ repo .add_package (package_pendulum )
3480
+ repo .add_package (package_demo )
3481
+
3482
+ transaction = solver .solve ()
3483
+
3484
+ if explicit_source :
3485
+ # direct origin cannot satisfy explicit source
3486
+ # -> package_demo MUST be included
3487
+ expected = [
3488
+ {"job" : "install" , "package" : package_pendulum },
3489
+ {"job" : "install" , "package" : package_demo_url },
3490
+ {"job" : "install" , "package" : package_demo },
3491
+ ]
3492
+ else :
3493
+ # direct origin can satisfy dependency without source
3494
+ # -> package_demo NEED NOT (but could) be included
3495
+ expected = [
3496
+ {"job" : "install" , "package" : package_pendulum },
3497
+ {"job" : "install" , "package" : package_demo_url },
3498
+ ]
3499
+
3500
+ check_solver_result (transaction , expected )
3501
+
3502
+
3440
3503
def test_solver_should_not_update_same_version_packages_if_installed_has_no_source_type (
3441
3504
package : ProjectPackage , repo : Repository , pool : RepositoryPool , io : NullIO
3442
3505
) -> None :
0 commit comments