@@ -529,3 +529,80 @@ def test_new_resolver_handles_prerelease(
529
529
* pip_args
530
530
)
531
531
assert_installed (script , pkg = expected_version )
532
+
533
+
534
+ class TestExtraMerge (object ):
535
+ """
536
+ Test installing a package that depends the same package with different
537
+ extras, one listed as required and the other as in extra.
538
+ """
539
+
540
+ def _local_with_setup (script , name , version , requires , extras ):
541
+ """Create the package as a local source directory to install from path.
542
+ """
543
+ return create_test_package_with_setup (
544
+ script ,
545
+ name = name ,
546
+ version = version ,
547
+ install_requires = requires ,
548
+ extras_require = extras ,
549
+ )
550
+
551
+ def _direct_wheel (script , name , version , requires , extras ):
552
+ """Create the package as a wheel to install from path directly.
553
+ """
554
+ return create_basic_wheel_for_package (
555
+ script ,
556
+ name = name ,
557
+ version = version ,
558
+ depends = requires ,
559
+ extras = extras ,
560
+ )
561
+
562
+ def _wheel_from_index (script , name , version , requires , extras ):
563
+ """Create the package as a wheel to install from index.
564
+ """
565
+ create_basic_wheel_for_package (
566
+ script ,
567
+ name = name ,
568
+ version = version ,
569
+ depends = requires ,
570
+ extras = extras ,
571
+ )
572
+ return name
573
+
574
+ @pytest .mark .parametrize (
575
+ "pkg_builder" ,
576
+ [
577
+ pytest .param (
578
+ _local_with_setup , marks = pytest .mark .xfail (strict = True ),
579
+ ),
580
+ _direct_wheel ,
581
+ _wheel_from_index ,
582
+ ],
583
+ )
584
+ def test_new_resolver_extra_merge_in_package (
585
+ self , monkeypatch , script , pkg_builder ,
586
+ ):
587
+ create_basic_wheel_for_package (script , "depdev" , "1.0.0" )
588
+ create_basic_wheel_for_package (
589
+ script ,
590
+ "dep" ,
591
+ "1.0.0" ,
592
+ extras = {"dev" : ["depdev" ]},
593
+ )
594
+ requirement = pkg_builder (
595
+ script ,
596
+ name = "pkg" ,
597
+ version = "1.0.0" ,
598
+ requires = ["dep" ],
599
+ extras = {"dev" : ["dep[dev]" ]},
600
+ )
601
+
602
+ script .pip (
603
+ "install" , "--unstable-feature=resolver" ,
604
+ "--no-cache-dir" , "--no-index" ,
605
+ "--find-links" , script .scratch_path ,
606
+ requirement + "[dev]" ,
607
+ )
608
+ assert_installed (script , pkg = "1.0.0" , dep = "1.0.0" , depdev = "1.0.0" )
0 commit comments