@@ -698,6 +698,139 @@ torch==2.4.1+cpu ; platform_machine == 'x86_64' \
698698
699699_tests .append (_test_torch_experimental_index_url )
700700
701+ def _test_index_url_precedence (env ):
702+ for test in [
703+ struct (
704+ requirements_txt = "simple==0.0.1 --hash=sha256:deadb00f" ,
705+ experimental_index_url = "https://experimental.example.com/simple" ,
706+ experimental_extra_index_urls = [],
707+ expect_index_url = "https://experimental.example.com/simple" ,
708+ expect_extra_index_urls = [],
709+ expect_url = "experimental.example.com/simple/" ,
710+ ),
711+ struct (
712+ requirements_txt = """\
713+ --index-url=https://file.example.com/simple
714+ simple==0.0.1 --hash=sha256:deadb00f
715+ """ ,
716+ experimental_index_url = "https://experimental.example.com/simple" ,
717+ experimental_extra_index_urls = [],
718+ expect_index_url = "https://file.example.com/simple" ,
719+ expect_extra_index_urls = [],
720+ expect_url = "file.example.com/simple/" ,
721+ ),
722+ struct (
723+ requirements_txt = "simple==0.0.1 --hash=sha256:deadb00f" ,
724+ experimental_index_url = "" ,
725+ experimental_extra_index_urls = [],
726+ expect_index_url = "https://pypi.org/simple" ,
727+ expect_extra_index_urls = [],
728+ expect_url = "pypi.org/simple/" ,
729+ ),
730+ struct (
731+ requirements_txt = """\
732+ --extra-index-url=https://extra1.example.com/simple
733+ --extra-index-url=https://extra2.example.com/simple
734+ simple==0.0.1 --hash=sha256:deadb00f
735+ """ ,
736+ experimental_index_url = "" ,
737+ experimental_extra_index_urls = [
738+ "https://ignored.example.com/simple" ,
739+ ],
740+ expect_index_url = "https://pypi.org/simple" ,
741+ expect_extra_index_urls = [
742+ "https://extra1.example.com/simple" ,
743+ "https://extra2.example.com/simple" ,
744+ ],
745+ expect_url = "pypi.org/simple/" ,
746+ ),
747+ ]:
748+ got_kwargs = {}
749+
750+ def mock_simpleapi_download (* _ , ** kwargs ):
751+ got_kwargs .update (kwargs )
752+ return {
753+ "simple" : struct (
754+ whls = {
755+ "deadb00f" : struct (
756+ yanked = None ,
757+ filename = "simple-0.0.1-py3-none-any.whl" ,
758+ sha256 = "deadb00f" ,
759+ url = test .expect_url ,
760+ ),
761+ },
762+ sdists = {},
763+ sha256s_by_version = {},
764+ index_url = test .expect_index_url ,
765+ ),
766+ }
767+
768+ builder = hub_builder (
769+ env ,
770+ simpleapi_download_fn = mock_simpleapi_download ,
771+ )
772+ builder .pip_parse (
773+ _mock_mctx (
774+ read = lambda x : {
775+ "requirements.txt" : test .requirements_txt ,
776+ }[x ],
777+ ),
778+ _parse (
779+ hub_name = "pypi" ,
780+ python_version = "3.15" ,
781+ experimental_index_url = test .experimental_index_url ,
782+ experimental_extra_index_urls = test .experimental_extra_index_urls ,
783+ requirements_lock = "requirements.txt" ,
784+ target_platforms = [
785+ "linux_x86_64" ,
786+ "osx_aarch64" ,
787+ ],
788+ ),
789+ )
790+ pypi = builder .build ()
791+
792+ pypi .exposed_packages ().contains_exactly (["simple" ])
793+ pypi .whl_map ().contains_exactly ({
794+ "simple" : {
795+ "pypi_315_simple_py3_none_any_deadb00f" : [
796+ whl_config_setting (
797+ target_platforms = ("cp315_linux_x86_64" , "cp315_osx_aarch64" ),
798+ version = "3.15" ,
799+ ),
800+ ],
801+ },
802+ })
803+ pypi .whl_libraries ().contains_exactly ({
804+ "pypi_315_simple_py3_none_any_deadb00f" : {
805+ "config_load" : "@pypi//:config.bzl" ,
806+ "dep_template" : "@pypi//{name}:{target}" ,
807+ "filename" : "simple-0.0.1-py3-none-any.whl" ,
808+ "index_url" : test .expect_index_url ,
809+ "requirement" : "simple==0.0.1" ,
810+ "sha256" : "deadb00f" ,
811+ "urls" : [test .expect_url ],
812+ },
813+ })
814+ pypi .extra_aliases ().contains_exactly ({})
815+
816+ env .expect .that_dict (got_kwargs ).contains_exactly ({
817+ "attr" : struct (
818+ auth_patterns = {},
819+ envsubst = {},
820+ extra_index_urls = test .expect_extra_index_urls ,
821+ index_url = test .expect_index_url ,
822+ index_url_overrides = {},
823+ netrc = None ,
824+ sources = {
825+ "simple" : ["0.0.1" ],
826+ },
827+ ),
828+ "cache" : {},
829+ "parallel_download" : False ,
830+ })
831+
832+ _tests .append (_test_index_url_precedence )
833+
701834def _test_download_only_multiple (env ):
702835 builder = hub_builder (env )
703836 builder .pip_parse (
0 commit comments