diff --git a/conda_forge_tick/auto_tick.py b/conda_forge_tick/auto_tick.py index 6ba5f26f7..ff3417e04 100644 --- a/conda_forge_tick/auto_tick.py +++ b/conda_forge_tick/auto_tick.py @@ -85,6 +85,7 @@ Migrator, MPIPinRunAsBuildCleanup, NoCondaInspectMigrator, + Numpy2Migrator, PipMigrator, PipWheelMigrator, QtQtMainMigrator, @@ -679,6 +680,8 @@ def add_rebuild_migration_yaml( piggy_back_migrations.append(JpegTurboMigrator()) if migration_name == "boost_cpp_to_libboost": piggy_back_migrations.append(LibboostMigrator()) + if migration_name == "numpy2": + piggy_back_migrations.append(Numpy2Migrator()) # stdlib migrator runs on top of ALL migrations, see # https://github.com/conda-forge/conda-forge.github.io/issues/2102 piggy_back_migrations.append(StdlibMigrator()) diff --git a/conda_forge_tick/migrators/__init__.py b/conda_forge_tick/migrators/__init__.py index 81963dc72..c5c314b49 100644 --- a/conda_forge_tick/migrators/__init__.py +++ b/conda_forge_tick/migrators/__init__.py @@ -25,6 +25,7 @@ from .matplotlib_base import MatplotlibBase from .migration_yaml import MigrationYaml, MigrationYamlCreator, merge_migrator_cbc from .mpi_pin_run_as_build import MPIPinRunAsBuildCleanup +from .numpy2 import Numpy2Migrator from .pip_check import PipCheckMigrator from .pip_wheel_dep import PipWheelMigrator from .qt_to_qt_main import QtQtMainMigrator diff --git a/conda_forge_tick/migrators/numpy2.py b/conda_forge_tick/migrators/numpy2.py new file mode 100644 index 000000000..418c1c8bd --- /dev/null +++ b/conda_forge_tick/migrators/numpy2.py @@ -0,0 +1,31 @@ +import os +import re + +from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.libboost import _replacer + +# pin_compatible("numpy"...) +# ^ ^ ^ +# p c n +raw_pat_pcn = r".*\{\{\s*pin_compatible\([\"\']numpy[\"\'].*" +pat_pcn = re.compile(raw_pat_pcn) + + +class Numpy2Migrator(MiniMigrator): + def filter(self, attrs, not_bad_str_start=""): + lines = attrs["raw_meta_yaml"].splitlines() + has_pcn = any(pat_pcn.search(line) for line in lines) + # filter() returns True if we _don't_ want to migrate + return not (has_pcn) + + def migrate(self, recipe_dir, attrs, **kwargs): + fname = os.path.join(recipe_dir, "meta.yaml") + if os.path.exists(fname): + with open(fname) as fp: + lines = fp.readlines() + + # _replacer take the raw pattern, not the compiled one + new_lines = _replacer(lines, raw_pat_pcn, "") + + with open(fname, "w") as fp: + fp.write("".join(new_lines))