예제 #1
0
    def test_target_overrides_separate_namespace(self):
        conf = Config({
            "config": [
                ConfigSetting(namespace="dontchangeme",
                              name="network-default-interface-type",
                              help_text="",
                              value="WIFI"),
                ConfigSetting(namespace="changeme",
                              name="network-default-interface-type",
                              help_text="",
                              value="WIFI"),
            ]
        })

        conf.update({
            "overrides": [
                Override(namespace="changeme",
                         name="network-default-interface-type",
                         value="ETHERNET")
            ]
        })

        dontchangeme, changeme, *_ = conf["config"]
        assert changeme.namespace == "changeme"
        assert changeme.value == "ETHERNET"
        assert dontchangeme.namespace == "dontchangeme"
        assert dontchangeme.value == "WIFI"
예제 #2
0
    def test_requires_are_appended_to(self):
        conf = Config({"requires": {"A"}})

        conf.update({"requires": {"B"}})
        conf.update({"requires": {"C"}})

        assert conf["requires"] == {"A", "B", "C"}
예제 #3
0
    def test_target_overrides_handled(self):
        conf = Config({
            "config": [
                ConfigSetting(namespace="target",
                              name="network-default-interface-type",
                              help_text="",
                              value="WIFI")
            ],
            "device_has": ["TEST"],
        })

        conf.update({
            "overrides": [
                Override(namespace="target",
                         name="network-default-interface-type",
                         value="ETHERNET"),
                Override(namespace="target",
                         name="device_has",
                         value={"OVERRIDDEN"}),
            ]
        })

        network_iface, *_ = conf["config"]
        assert network_iface.value == "ETHERNET"
        assert conf["device_has"] == {"OVERRIDDEN"}
예제 #4
0
 def test_warns_and_skips_override_for_undefined_config_parameter(
         self, caplog):
     conf = Config()
     override_name = "this-does-not-exist"
     conf.update(prepare({"target_overrides": {"*": {override_name: ""}}}))
     assert override_name in caplog.text
     assert not conf
예제 #5
0
    def test_cumulative_fields_can_be_modified(self):
        conf = Config({"device_has": {"FLASHING_LIGHTS"}, "macros": {"A"}})

        conf.update({
            "overrides": [
                Override(namespace="target",
                         name="device_has",
                         modifier="add",
                         value={"OTHER_STUFF"}),
                Override(namespace="target",
                         name="device_has",
                         modifier="remove",
                         value={"FLASHING_LIGHTS"}),
                Override(namespace="lib",
                         name="macros",
                         modifier="remove",
                         value={"A"}),
                Override(namespace="target",
                         name="macros",
                         modifier="add",
                         value={"B"}),
            ]
        })

        conf.update({
            "overrides": [
                Override(namespace="target",
                         name="macros",
                         modifier="add",
                         value={"B"})
            ]
        })
        assert conf["device_has"] == {"OTHER_STUFF"}
        assert conf["macros"] == {"B"}
예제 #6
0
    def test_macros_are_appended_to(self):
        conf = Config({"macros": {"A"}})

        conf.update({"macros": {"B"}})
        conf.update({"macros": {"B"}})

        assert conf["macros"] == {"A", "B"}
예제 #7
0
def _assemble_config_from_sources(
        target_attributes: dict,
        mbed_lib_files: List[Path],
        mbed_app_file: Optional[Path] = None) -> Config:
    config = Config(source.prepare(target_attributes, source_name="target"))
    previous_filter_data = None
    app_data = None
    if mbed_app_file:
        # We need to obtain the file filter data from mbed_app.json so we can select the correct set of mbed_lib.json
        # files to include in the config. We don't want to update the config object with all of the app settings yet
        # as we won't be able to apply overrides correctly until all relevant mbed_lib.json files have been parsed.
        app_data = source.from_file(
            mbed_app_file,
            default_name="app",
            target_filters=FileFilterData.from_config(config).labels)
        _get_app_filter_labels(app_data, config)

    current_filter_data = FileFilterData.from_config(config)
    while previous_filter_data != current_filter_data:
        filtered_files = _filter_files(mbed_lib_files, current_filter_data)
        for config_file in filtered_files:
            config.update(
                source.from_file(config_file,
                                 target_filters=current_filter_data.labels))
            # Remove any mbed_lib files we've already visited from the list so we don't parse them multiple times.
            mbed_lib_files.remove(config_file)

        previous_filter_data = current_filter_data
        current_filter_data = FileFilterData.from_config(config)

    # Apply mbed_app.json data last so config parameters are overriden in the correct order.
    if app_data:
        config.update(app_data)

    return config
예제 #8
0
    def test_config_updated(self):
        conf = Config()

        conf.update(prepare({"config": {"param": {"value": 0}}}, source_name="lib"))
        conf.update(prepare({"config": {"param2": {"value": 0}}}, source_name="lib2"))

        assert conf["config"][0].name == "param"
        assert conf["config"][1].name == "param2"
예제 #9
0
    def test_lib_overrides_handled(self):
        conf = Config(
            {
                "config": [
                    ConfigSetting(namespace="lib", name="network-default-interface-type", help_text="", value="WIFI")
                ],
            }
        )

        conf.update({"overrides": [Override(namespace="lib", name="network-default-interface-type", value="ETHERNET")]})

        network_iface, *_ = conf["config"]
        assert network_iface.value == "ETHERNET"
예제 #10
0
    def test_raises_when_trying_to_add_duplicate_config_setting(self):
        conf = Config(
            prepare({"config": {
                "param": {
                    "value": 0
                }
            }}, source_name="lib"))

        with pytest.raises(ValueError, match="lib.param already defined"):
            conf.update(
                prepare({"config": {
                    "param": {
                        "value": 0
                    }
                }}, source_name="lib"))
예제 #11
0
def _get_app_filter_labels(mbed_app_data: dict, config: Config) -> None:
    requires = mbed_app_data.get("requires")
    if requires:
        config["requires"] = requires

    config.update(_get_file_filter_overrides(mbed_app_data))
    def test_assembles_config_using_all_relevant_files(self):
        target = {
            "config": {
                "foo": {
                    "value": None
                }
            },
            "macros": [],
            "labels": ["A"],
            "extra_labels": [],
            "features": ["RED"],
            "components": [],
            "c_lib": "std",
            "printf_lib": "minimal-printf",
        }
        mbed_lib_files = [
            {
                "path": Path("subdir", "FEATURE_RED", "mbed_lib.json"),
                "json_contents": {
                    "name": "red",
                    "config": {
                        "bool": {
                            "value": False
                        }
                    },
                    "target_overrides": {
                        "A": {
                            "bool": True,
                            "target.features_add": ["BLUE"],
                            "target.components_add": ["LEG"]
                        }
                    },
                    "macros": ["RED_MACRO"],
                },
            },
            {
                "path": Path("TARGET_A", "mbed_lib.json"),
                "json_contents": {
                    "name": "a",
                    "config": {
                        "number": {
                            "value": 123
                        }
                    },
                    "target_overrides": {
                        "*": {
                            "target.features_add": ["RED"]
                        }
                    },
                },
            },
            {
                "path": Path("COMPONENT_LEG", "mbed_lib.json"),
                "json_contents": {
                    "name": "leg",
                    "config": {
                        "number-of-fingers": {
                            "value": 5
                        }
                    },
                    "macros": ["LEG_MACRO"],
                },
            },
        ]
        unused_mbed_lib_file = {
            "path": Path("subdir", "FEATURE_BROWN", "mbed_lib.json"),
            "json_contents": {
                "name": "brown",
                "target_overrides": {
                    "*": {
                        "red.bool": "DON'T USE ME"
                    }
                },
                "macros": ["DONT_USE_THIS_MACRO"],
            },
        }
        mbed_app_file = {
            "path": Path("mbed_app.json"),
            "json_contents": {
                "target_overrides": {
                    "*": {
                        "target.foo": "bar"
                    }
                }
            },
        }

        with TemporaryDirectory() as directory:
            created_mbed_lib_files = create_files(directory, mbed_lib_files)
            created_mbed_app_file = create_files(directory, [mbed_app_file])[0]
            create_files(directory, [unused_mbed_lib_file])

            subject = _assemble_config_from_sources(
                target, find_files("mbed_lib.json", Path(directory)),
                created_mbed_app_file)

            mbed_lib_sources = [
                prepare(decode_json_file(Path(directory, file)),
                        target_filters=["A"])
                for file in created_mbed_lib_files
            ]
            mbed_app_source = prepare(decode_json_file(
                Path(directory, created_mbed_app_file)),
                                      target_filters=["A"])
            expected_config = Config(prepare(target, source_name="target"))
            for source in mbed_lib_sources + [mbed_app_source]:
                expected_config.update(source)

            subject["config"].sort(key=lambda x: x.name)
            expected_config["config"].sort(key=lambda x: x.name)
            assert subject == expected_config