def from_yaml(cls, filename): with open(filename) as fp: data = yaml.load(fp) packages = collections.OrderedDict( parse_package_list(data.get("packages", []))) operations = data.get("request", []) request = Request() for operation in operations: kind = operation["operation"] requirement = Requirement._from_string(operation["requirement"]) getattr(request, kind)(requirement) decisions = data.get("decisions", {}) operations = [] for operation in data.get("transaction", []): if operation["kind"] == "install": operations.append(InstallOperation(operation["package"])) elif operation["kind"] == "update": operations.append( UpdateOperation(operation["from"], operation["to"])) elif operation["kind"] == "remove": operations.append(RemoveOperation(operation["package"])) else: msg = "invalid operation kind {!r}".format(operation["kind"]) raise ValueError(msg) return cls(packages, [remote_repository(data, packages)], installed_repository(data, packages), request, decisions, operations)
# Step 2: recurse for dependency in best_dependencies: solution = optimize_at_level(pool, dependency, new_rules, solution) return solution def optimize(pool, requirement, rules): best_package = find_best_candidate(pool, requirement, rules) solution = [best_package] return optimize_at_level(pool, best_package, rules, solution) if __name__ == '__main__': repository = repository_from_index("full_index.json") pool = Pool([repository]) requirement_str = "scikit_learn < 0.14" requirement = Requirement._from_string(requirement_str) request = Request() request.install(requirement) rules_generator = RulesGenerator(pool, request) rules = list(rules_generator.iter_rules()) solution = optimize(pool, requirement, rules) for decision in solution: print(decision.name, str(decision.version))