def simple_test(self): v = Values() self.assertEqual(v.compiler, None) v.compiler = 3 self.assertTrue(v.compiler == "3") self.assertEqual(v.compiler.version, None) v.compiler.version = "asfaf" self.assertEqual(v.compiler.version, "asfaf") my_list = v.as_list() self.assertEqual(my_list, [("compiler", "3"), ("compiler.version", "asfaf")]) values = Values.from_list(my_list) self.assertEqual(values.dumps(), v.dumps()) v.compiler = None self.assertEqual(v.as_list(), [("compiler", "None")]) self.assertEqual(v.dumps(), "compiler=None")
def simple_test(self): v = Values() self.assertEqual(v.compiler, None) v.compiler = 3 self.assertTrue(v.compiler == "3") self.assertEqual(v.compiler.version, None) v.compiler.version = "asfaf" self.assertEqual(v.compiler.version, "asfaf") my_list = v.as_list() self.assertEqual(my_list, [('compiler', '3'), ('compiler.version', 'asfaf')]) values = Values.from_list(my_list) self.assertEqual(values.dumps(), v.dumps()) v.compiler = None self.assertEqual(v.as_list(), [('compiler', 'None')]) self.assertEqual(v.dumps(), "compiler=None")
class OptionsValues(object): """ static= True, Boost.static = False, Poco.optimized = True """ def __init__(self): self._options = Values() self._reqs_options = {} # {name("Boost": Values} def __getitem__(self, item): return self._reqs_options.setdefault(item, Values()) def pop(self, item): return self._reqs_options.pop(item, None) def __repr__(self): return self.dumps() def __getattr__(self, attr): return getattr(self._options, attr) def copy(self): result = OptionsValues() result._options = self._options.copy() for k, v in self._reqs_options.items(): result._reqs_options[k] = v.copy() return result def __setattr__(self, attr, value): if attr[0] == "_": return super(OptionsValues, self).__setattr__(attr, value) return setattr(self._options, attr, value) def clear_indirect(self): for v in self._reqs_options.values(): v.clear() def as_list(self): result = [] options_list = self._options.as_list() if options_list: result.extend(options_list) for key in sorted(self._reqs_options.keys()): for line in self._reqs_options[key].as_list(): line_key, line_value = line result.append(("%s:%s" % (key, line_key), line_value)) return result @staticmethod def from_list(data): result = OptionsValues() by_package = defaultdict(list) for k, v in data: tokens = k.split(":") if len(tokens) == 2: package, option = tokens by_package[package.strip()].append((option, v)) else: by_package[None].append((k, v)) result._options = Values.from_list(by_package[None]) for k, v in by_package.items(): if k is not None: result._reqs_options[k] = Values.from_list(v) return result def dumps(self): result = [] for key, value in self.as_list(): result.append("%s=%s" % (key, value)) return "\n".join(result) @staticmethod def loads(text): result = OptionsValues() for line in text.splitlines(): line = line.strip() if not line: continue tokens = line.split(":") if len(tokens) == 2: package, option = tokens current = result._reqs_options.setdefault(package.strip(), Values()) else: option = tokens[0].strip() current = result._options current.add(option) return result @property def sha(self): result = [] result.append(self._options.sha) for key in sorted(list(self._reqs_options.keys())): result.append(self._reqs_options[key].sha) return sha1('\n'.join(result).encode()) def serialize(self): ret = {} ret["options"] = self._options.serialize() ret["req_options"] = {} for name, values in self._reqs_options.items(): ret["req_options"][name] = values.serialize() return ret @staticmethod def deserialize(data): result = OptionsValues() result._options = Values.deserialize(data["options"]) for name, data_values in data["req_options"].items(): result._reqs_options[name] = Values.deserialize(data_values) return result
class OptionsValues(object): """ static= True, Boost.static = False, Poco.optimized = True """ def __init__(self): self._options = Values() self._reqs_options = {} # {name("Boost": Values} def __getitem__(self, item): return self._reqs_options.setdefault(item, Values()) def pop(self, item): return self._reqs_options.pop(item, None) def __repr__(self): return self.dumps() def __getattr__(self, attr): return getattr(self._options, attr) def copy(self): result = OptionsValues() result._options = self._options.copy() for k, v in self._reqs_options.items(): result._reqs_options[k] = v.copy() return result def __setattr__(self, attr, value): if attr[0] == "_": return super(OptionsValues, self).__setattr__(attr, value) return setattr(self._options, attr, value) def clear_indirect(self): for v in self._reqs_options.values(): v.clear() def as_list(self): result = [] options_list = self._options.as_list() if options_list: result.extend(options_list) for key in sorted(self._reqs_options.keys()): for line in self._reqs_options[key].as_list(): line_key, line_value = line result.append(("%s:%s" % (key, line_key), line_value)) return result @staticmethod def from_list(data): result = OptionsValues() by_package = defaultdict(list) for k, v in data: tokens = k.split(":") if len(tokens) == 2: package, option = tokens by_package[package.strip()].append((option, v)) else: by_package[None].append((k, v)) result._options = Values.from_list(by_package[None]) for k, v in by_package.items(): if k is not None: result._reqs_options[k] = Values.from_list(v) return result def dumps(self): result = [] for key, value in self.as_list(): result.append("%s=%s" % (key, value)) return "\n".join(result) @staticmethod def loads(text): """ parses a multiline text in the form Package:option=value other_option=3 OtherPack:opt3=12.1 """ result = OptionsValues() for line in text.splitlines(): line = line.strip() if not line: continue # To avoid problems with values containing ":" as URLs name, value = line.split("=") tokens = name.split(":") if len(tokens) == 2: package, option = tokens current = result._reqs_options.setdefault( package.strip(), Values()) else: option = tokens[0].strip() current = result._options option = "%s=%s" % (option, value) current.add(option) return result def sha(self, non_dev_requirements): result = [] result.append(self._options.sha) if non_dev_requirements is None: # Not filtering for key in sorted(list(self._reqs_options.keys())): result.append(self._reqs_options[key].sha) else: for key in sorted(list(self._reqs_options.keys())): non_dev = key in non_dev_requirements if non_dev: result.append(self._reqs_options[key].sha) return sha1('\n'.join(result).encode()) def serialize(self): ret = {} ret["options"] = self._options.serialize() ret["req_options"] = {} for name, values in self._reqs_options.items(): ret["req_options"][name] = values.serialize() return ret @staticmethod def deserialize(data): result = OptionsValues() result._options = Values.deserialize(data["options"]) for name, data_values in data["req_options"].items(): result._reqs_options[name] = Values.deserialize(data_values) return result