Beispiel #1
0
    def test_regex(self):
        pi = PackageIdentifier.parse("foo_1.2-beta")

        cpi = ConditionalPackageIdentifier.parse("foo_1.2-beta")
        self.assertEqual(pi, cpi)
        self.assertEqual([], cpi.conditions)

        cpi = ConditionalPackageIdentifier.parse("foo_1.2-beta(FOO=BAR)")
        self.assertEqual(pi, cpi)
        self.assertEqual(["FOO=BAR"], cpi.conditions)

        cpi = ConditionalPackageIdentifier.parse(
            "foo_1.2-beta(FOO)(!BAR)(FOO=BAR)(FOO!=BAR)(FOO~BaR)(FOO!~BaR)")
        self.assertEqual(pi, cpi)
        self.assertEqual(
            ["FOO", "!BAR", "FOO=BAR", "FOO!=BAR", "FOO~BaR", "FOO!~BaR"],
            cpi.conditions)
Beispiel #2
0
    def test_unset(self):
        cpi = ConditionalPackageIdentifier.parse("foo_1.2-beta(!FOO)")
        self.assertEqual(["!FOO"], cpi.conditions)

        env = Environment("ut", {})
        self.assertTrue(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "1"})
        self.assertFalse(cpi.are_conditions_satified(env))
Beispiel #3
0
    def test_not_equal(self):
        cpi = ConditionalPackageIdentifier.parse("foo_1.2-beta(FOO!=BAR)")
        self.assertEqual(["FOO!=BAR"], cpi.conditions)

        env = Environment("ut", {})
        self.assertTrue(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "BAR2"})
        self.assertTrue(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "BAR"})
        self.assertFalse(cpi.are_conditions_satified(env))
Beispiel #4
0
    def test_not_contains(self):
        cpi = ConditionalPackageIdentifier.parse("foo_1.2-beta(FOO!~BaR)")
        self.assertEqual(["FOO!~BaR"], cpi.conditions)

        env = Environment("ut", {})
        self.assertTrue(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "HELLO WORLD"})
        self.assertTrue(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "HELLO BAR WORLD"})
        self.assertFalse(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "HELLO bar WORLD"})
        self.assertFalse(cpi.are_conditions_satified(env))

        env = Environment("ut", {"FOO": "HELLO bAr WORLD"})
        self.assertFalse(cpi.are_conditions_satified(env))
Beispiel #5
0
    def generate_manifest(self,
                          output_file: Path,
                          fragment_files: list = None,
                          info_map: dict = None,
                          resolve_envvars: bool = False):
        """
        Used to create a manifest.json file
        """
        model = OrderedDict()

        # Load fragments
        if fragment_files is not None:
            for fragment_file in fragment_files:
                self.logger.print_default(
                    "Use json fragment: {fragment}".format(
                        fragment=fragment_file))
                jlayer_update(model,
                              jloadfile(fragment_file),
                              list_append=True)

        # Load model
        manifest = Manifest(model)
        info = manifest.jsonget(JsonConstants.INFO, default=OrderedDict())

        # Set the common info
        if info_map is not None:
            for key in (
                    JsonConstants.INFO_NAME,
                    JsonConstants.INFO_VERSION,
                    JsonConstants.INFO_DESCRIPTION,
                    JsonConstants.INFO_MASTER,
                    JsonConstants.INFO_DATE,
                    JsonConstants.INFO_REQUIRES,
                    JsonConstants.INFO_DEPENDS,
                    JsonConstants.INFO_TAGS,
                    JsonConstants.INFO_LEAF_MINVER,
                    JsonConstants.INFO_AUTOUPGRADE,
            ):
                if key in info_map:
                    value = info_map[key]
                    if value is not None:
                        if key in (JsonConstants.INFO_REQUIRES,
                                   JsonConstants.INFO_DEPENDS,
                                   JsonConstants.INFO_TAGS):
                            # Handle lists
                            model_list = manifest.jsonpath(
                                [JsonConstants.INFO, key], default=[])
                            for motif in value:
                                if motif not in model_list:
                                    if key == JsonConstants.INFO_DEPENDS:
                                        # Try to parse as a conditional package
                                        # identifier
                                        ConditionalPackageIdentifier.parse(
                                            motif)
                                    elif key == JsonConstants.INFO_REQUIRES:
                                        # Try to parse as a package identifier
                                        PackageIdentifier.parse(motif)

                                    self.logger.print_verbose(
                                        "Add '{motif}' to '{key}' list".format(
                                            motif=motif, key=key))
                                    model_list.append(motif)
                        else:
                            self.logger.print_verbose(
                                "Set '{key}' = '{value}'".format(key=key,
                                                                 value=value))
                            info[key] = value

        # String replacement
        jsonstr = jtostring(manifest.json, pp=True)
        if resolve_envvars:
            for var in set(
                    re.compile(r"#\{([a-zA-Z0-9_]+)\}").findall(jsonstr)):
                value = os.environ.get(var)
                if value is None:
                    raise LeafException(
                        "Cannot find '{var}' in env".format(var=var),
                        hints="Set the variable with 'export {var}=xxx'".
                        format(var=var))
                self.logger.print_default("Replace {key} --> {value}".format(
                    key=var, value=value))
                jsonstr = jsonstr.replace("#{{{var}}}".format(var=var), value)

        if is_latest_package(manifest.identifier):
            raise LeafException(
                "Invalid version ({word} is a reserved keyword)".format(
                    word=LeafConstants.LATEST))

        self.logger.print_default(
            "Save '{mf.identifier}' manifest to {file}".format(
                mf=manifest, file=output_file))

        with output_file.open("w") as fp:
            fp.write(jsonstr)
Beispiel #6
0
 def _get_cpis(self, cpis: str):
     try:
         return str(ConditionalPackageIdentifier.parse(cpis))
     except Exception:
         return cpis