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)
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))
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))
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))
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)
def _get_cpis(self, cpis: str): try: return str(ConditionalPackageIdentifier.parse(cpis)) except Exception: return cpis