def add_replacement_migrator( migrators: MutableSequence[Migrator], gx: nx.DiGraph, old_pkg: "PackageName", new_pkg: "PackageName", rationale: str, ) -> None: """Adds a migrator to replace one package with another. Parameters ---------- migrators : list of Migrator The list of migrators to run. gx : graph The conda-forge dependency graph. old_pkg : str The package to be replaced. new_pkg : str The package to replace the `old_pkg`. rationale : str The reason the for the migration. Should be a full statement. """ total_graph = copy.deepcopy(gx) for node, node_attrs in gx.nodes.items(): meta_yaml = node_attrs["payload"].get("meta_yaml", {}) or {} pkgs = {old_pkg} old_pkg_c = len(pkgs.intersection(get_requirements(meta_yaml))) > 0 rq = _host_run_test_dependencies(meta_yaml) for e in list(total_graph.in_edges(node)): if e[0] not in rq: total_graph.remove_edge(*e) if not old_pkg_c: pluck(total_graph, node) # post plucking we can have several strange cases, lets remove all selfloops total_graph.remove_edges_from(nx.selfloop_edges(total_graph)) migrators.append( Replacement(old_pkg=old_pkg, new_pkg=new_pkg, rationale=rationale, pr_limit=5), )
def add_replacement_migrator( migrators: MutableSequence[Migrator], gx: nx.DiGraph, old_pkg: "PackageName", new_pkg: "PackageName", rationale: str, alt_migrator: Union[Migrator, None] = None, ) -> None: """Adds a migrator to replace one package with another. Parameters ---------- migrators : list of Migrator The list of migrators to run. gx : graph The conda-forge dependency graph. old_pkg : str The package to be replaced. new_pkg : str The package to replace the `old_pkg`. rationale : str The reason the for the migration. Should be a full statement. alt_migrator : Replacement migrator or a sublcass thereof An alternate Replacement migrator to use for special tasks. """ total_graph = copy.deepcopy(gx) for node, node_attrs in gx.nodes.items(): requirements = node_attrs["payload"].get("requirements", {}) rq = ( requirements.get("build", set()) | requirements.get("host", set()) | requirements.get("run", set()) | requirements.get("test", set()) ) pkgs = {old_pkg} old_pkg_c = pkgs.intersection(rq) if not old_pkg_c: pluck(total_graph, node) # post plucking we can have several strange cases, lets remove all selfloops total_graph.remove_edges_from(nx.selfloop_edges(total_graph)) if alt_migrator is not None: migrators.append( alt_migrator( old_pkg=old_pkg, new_pkg=new_pkg, rationale=rationale, pr_limit=PR_LIMIT, graph=total_graph, ), ) else: migrators.append( Replacement( old_pkg=old_pkg, new_pkg=new_pkg, rationale=rationale, pr_limit=PR_LIMIT, graph=total_graph, ), )
pass rebuild = _Rebuild(name="rebuild", cycles=[]) class _BlasRebuild(NoFilter, BlasRebuild): pass blas_rebuild = _BlasRebuild(cycles=[]) matplotlib = Replacement( old_pkg="matplotlib", new_pkg="matplotlib-base", rationale=("Unless you need `pyqt`, recipes should depend only on " "`matplotlib-base`."), pr_limit=5, ) G = nx.DiGraph() G.add_node("conda", reqs=["python"]) env = builtins.__xonsh__.env # type: ignore env["GRAPH"] = G env["CIRCLE_BUILD_URL"] = "hi world" def run_test_migration( m, inp, output,