@@ -569,3 +569,177 @@ def test_propagate_property_chunking():
569569 transformer = ManifestComponentTransformer ()
570570 actual_component = transformer .propagate_types_and_parameters ("" , component , {})
571571 assert actual_component == expected_component
572+
573+
574+ @pytest .mark .parametrize (
575+ "use_parent_parameters, expected_retriever_name, expected_requester_name, expected_requester_params_name" ,
576+ [
577+ pytest .param (
578+ True ,
579+ "parent_priority" ,
580+ "component_priority" ,
581+ "parent_priority" ,
582+ id = "use_parent_parameters_true" ,
583+ ),
584+ pytest .param (
585+ False ,
586+ "parent_priority" ,
587+ "component_priority" ,
588+ "component_priority" ,
589+ id = "use_parent_parameters_false" ,
590+ ),
591+ ],
592+ )
593+ def test_use_parent_parameters_configuration (
594+ use_parent_parameters ,
595+ expected_retriever_name ,
596+ expected_requester_name ,
597+ expected_requester_params_name ,
598+ ):
599+ """Test that use_parent_parameters configuration controls parameter precedence."""
600+ component_with_parent_priority = {
601+ "type" : "DeclarativeStream" ,
602+ "retriever" : {
603+ "type" : "SimpleRetriever" ,
604+ "requester" : {
605+ "type" : "HttpRequester" ,
606+ "name" : "component_priority" ,
607+ "url_base" : "https://coffee.example.io/v1/" ,
608+ "http_method" : "GET" ,
609+ "primary_key" : "id" ,
610+ "$parameters" : {
611+ "name" : "component_priority" ,
612+ },
613+ },
614+ "$parameters" : {
615+ "name" : "parent_priority" ,
616+ },
617+ },
618+ }
619+
620+ expected_component = {
621+ "type" : "DeclarativeStream" ,
622+ "retriever" : {
623+ "type" : "SimpleRetriever" ,
624+ "name" : expected_retriever_name ,
625+ "requester" : {
626+ "type" : "HttpRequester" ,
627+ "name" : expected_requester_name ,
628+ "url_base" : "https://coffee.example.io/v1/" ,
629+ "http_method" : "GET" ,
630+ "primary_key" : "id" ,
631+ "$parameters" : {
632+ "name" : expected_requester_params_name ,
633+ },
634+ },
635+ "$parameters" : {
636+ "name" : "parent_priority" ,
637+ },
638+ },
639+ }
640+
641+ transformer = ManifestComponentTransformer ()
642+ actual_component = transformer .propagate_types_and_parameters (
643+ "" , component_with_parent_priority , {}, use_parent_parameters = use_parent_parameters
644+ )
645+ assert actual_component == expected_component
646+
647+
648+ def test_use_parent_parameters_none_behavior ():
649+ """Test that use_parent_parameters=None maintains backward compatibility."""
650+ component = {
651+ "type" : "DeclarativeStream" ,
652+ "retriever" : {
653+ "type" : "SimpleRetriever" ,
654+ "requester" : {
655+ "type" : "HttpRequester" ,
656+ "name" : "component_priority" ,
657+ "url_base" : "https://coffee.example.io/v1/" ,
658+ "http_method" : "GET" ,
659+ "primary_key" : "id" ,
660+ "$parameters" : {
661+ "name" : "component_priority" ,
662+ },
663+ },
664+ "$parameters" : {
665+ "name" : "parent_priority" ,
666+ },
667+ },
668+ }
669+
670+ expected_component_priority = {
671+ "type" : "DeclarativeStream" ,
672+ "retriever" : {
673+ "type" : "SimpleRetriever" ,
674+ "name" : "parent_priority" , # Parent parameter takes precedence (default behavior)
675+ "requester" : {
676+ "type" : "HttpRequester" ,
677+ "name" : "component_priority" , # Component parameter takes precedence
678+ "url_base" : "https://coffee.example.io/v1/" ,
679+ "http_method" : "GET" ,
680+ "primary_key" : "id" ,
681+ "$parameters" : {
682+ "name" : "component_priority" ,
683+ },
684+ },
685+ "$parameters" : {
686+ "name" : "parent_priority" ,
687+ },
688+ },
689+ }
690+
691+ transformer = ManifestComponentTransformer ()
692+ actual = transformer .propagate_types_and_parameters (
693+ "" , component , {}, use_parent_parameters = None
694+ )
695+ assert actual == expected_component_priority
696+
697+
698+ def test_dynamic_stream_use_parent_parameters_configuration ():
699+ """Test that use_parent_parameters configuration is properly read from dynamic stream definitions."""
700+
701+ transformer = ManifestComponentTransformer ()
702+
703+ # Only parent has $parameters
704+ component = {
705+ "type" : "DeclarativeStream" ,
706+ "retriever" : {
707+ "type" : "SimpleRetriever" ,
708+ },
709+ "$parameters" : {"name" : "parent_name" },
710+ }
711+
712+ # When use_parent_parameters=False, component parameters should take precedence (but there are none)
713+ result_false = transformer .propagate_types_and_parameters (
714+ "" , component , {}, use_parent_parameters = False
715+ )
716+ # When use_parent_parameters=True, parent parameters should take precedence (and are used)
717+ result_true = transformer .propagate_types_and_parameters (
718+ "" , component , {}, use_parent_parameters = True
719+ )
720+
721+ # In both cases, since only the parent has $parameters, the retriever should get "parent_name"
722+ assert result_false ["retriever" ]["name" ] == "parent_name"
723+ assert result_true ["retriever" ]["name" ] == "parent_name"
724+
725+ # Now, add a $parameters to the retriever to see the difference
726+ component_with_both = {
727+ "type" : "DeclarativeStream" ,
728+ "retriever" : {
729+ "type" : "SimpleRetriever" ,
730+ "$parameters" : {"name" : "retriever_name" },
731+ },
732+ "$parameters" : {"name" : "parent_name" },
733+ }
734+
735+ result_false = transformer .propagate_types_and_parameters (
736+ "" , component_with_both , {}, use_parent_parameters = False
737+ )
738+ result_true = transformer .propagate_types_and_parameters (
739+ "" , component_with_both , {}, use_parent_parameters = True
740+ )
741+
742+ # When use_parent_parameters=False, retriever's own $parameters win
743+ assert result_false ["retriever" ]["name" ] == "retriever_name"
744+ # When use_parent_parameters=True, parent's $parameters win
745+ assert result_true ["retriever" ]["name" ] == "parent_name"
0 commit comments