diff --git a/conda_lock/conda_lock.py b/conda_lock/conda_lock.py index 60b1a0ae4..20b0617cb 100644 --- a/conda_lock/conda_lock.py +++ b/conda_lock/conda_lock.py @@ -262,7 +262,6 @@ def make_lock_files( # noqa: C901 channel_overrides: Optional[Sequence[str]] = None, virtual_package_spec: Optional[pathlib.Path] = None, update: Optional[Sequence[str]] = None, - include_dev_dependencies: bool = True, filename_template: Optional[str] = None, filter_categories: bool = False, extras: Optional[AbstractSet[str]] = None, @@ -295,8 +294,6 @@ def make_lock_files( # noqa: C901 update : Names of dependencies to update to their latest versions, regardless of whether the constraint in src_files has changed. - include_dev_dependencies : - Include development dependencies in explicit or env output filename_template : Format for names of rendered explicit or env files. Must include {platform}. extras : @@ -317,8 +314,6 @@ def make_lock_files( # noqa: C901 # Compute lock specification required_categories = {"main"} - if include_dev_dependencies: - required_categories.add("dev") if extras is not None: required_categories.update(extras) lock_spec = make_lock_spec( @@ -458,7 +453,6 @@ def make_lock_files( # noqa: C901 do_render( new_lock_content, kinds=[k for k in kinds if k != "lock"], - include_dev_dependencies=include_dev_dependencies, filename_template=filename_template, extras=extras, check_input_hash=check_input_hash, @@ -468,7 +462,6 @@ def make_lock_files( # noqa: C901 def do_render( lockfile: Lockfile, kinds: Sequence[Union[Literal["env"], Literal["explicit"]]], - include_dev_dependencies: bool = True, filename_template: Optional[str] = None, extras: Optional[AbstractSet[str]] = None, check_input_hash: bool = False, @@ -482,8 +475,6 @@ def do_render( Lock content kinds : Lockfile formats to render - include_dev_dependencies : - Include development dependencies in output filename_template : Format for the lock file names. Must include {platform}. extras : @@ -519,7 +510,6 @@ def do_render( if filename_template: context = { "platform": plat, - "dev-dependencies": str(include_dev_dependencies).lower(), "input-hash": lockfile.metadata.content_hash, "version": distribution("conda_lock").version, "timestamp": datetime.datetime.now(datetime.timezone.utc).strftime( @@ -544,7 +534,6 @@ def do_render( print(f"Rendering lockfile(s) for {plat}...", file=sys.stderr) lockfile_contents = render_lockfile_for_platform( lockfile=lockfile, - include_dev_dependencies=include_dev_dependencies, extras=extras, kind=kind, platform=plat, @@ -576,7 +565,6 @@ def do_render( def render_lockfile_for_platform( # noqa: C901 *, lockfile: Lockfile, - include_dev_dependencies: bool, extras: Optional[AbstractSet[str]], kind: Union[Literal["env"], Literal["explicit"]], platform: str, @@ -590,8 +578,6 @@ def render_lockfile_for_platform( # noqa: C901 ---------- lockfile : Locked package versions - include_dev_dependencies : - Include development dependencies in output extras : Optional dependency groups to include in output kind : @@ -611,7 +597,6 @@ def render_lockfile_for_platform( # noqa: C901 categories_to_install: Set[str] = { "main", *(extras or []), - *(["dev"] if include_dev_dependencies else []), } conda_deps: List[LockedDependency] = [] @@ -982,7 +967,6 @@ def _strip_auth_from_lockfile(lockfile: str) -> str: @contextmanager def _render_lockfile_for_install( filename: pathlib.Path, - include_dev_dependencies: bool = True, extras: Optional[AbstractSet[str]] = None, force_platform: Optional[str] = None, ) -> Iterator[pathlib.Path]: @@ -993,8 +977,6 @@ def _render_lockfile_for_install( ---------- filename : Path to conda-lock.yml - include_dev_dependencies : - Include development dependencies in output extras : Optional dependency groups to include in output @@ -1043,7 +1025,6 @@ def _render_lockfile_for_install( lockfile=lock_content, kind="explicit", platform=platform, - include_dev_dependencies=include_dev_dependencies, extras=extras, suppress_warning_for_pip_and_explicit=True, ) @@ -1070,6 +1051,22 @@ def _detect_lockfile_kind(path: pathlib.Path) -> TKindAll: ) +_deprecated_dev_help = ( + "(DEPRECATED) include (or not) dev dependencies in the lockfile (where applicable)" +) + + +def _deprecated_dev_cli(ctx: click.Context, param: click.Parameter, value: Any) -> Any: + """A click callback function raising a deprecation error.""" + if value: + raise click.BadParameter( + "--dev-dependencies/--no-dev-dependencies (lock, render) and --dev/--no-dev (install) " + "switches are deprecated. Use `--extra dev` instead." + ) + else: + return value + + def handle_no_specified_source_files( lockfile_path: Optional[pathlib.Path], ) -> List[pathlib.Path]: @@ -1131,7 +1128,6 @@ def run_lock( platforms: Optional[Sequence[str]] = None, mamba: bool = False, micromamba: bool = False, - include_dev_dependencies: bool = True, channel_overrides: Optional[Sequence[str]] = None, filename_template: Optional[str] = None, kinds: Optional[Sequence[TKindAll]] = None, @@ -1165,7 +1161,6 @@ def run_lock( kinds=kinds or DEFAULT_KINDS, lockfile_path=lockfile_path, filename_template=filename_template, - include_dev_dependencies=include_dev_dependencies, extras=extras, check_input_hash=check_input_hash, filter_categories=filter_categories, @@ -1227,10 +1222,16 @@ def main() -> None: help="""Override the channels to use when solving the environment. These will replace the channels as listed in the various source files.""", ) @click.option( - "--dev-dependencies/--no-dev-dependencies", + "--dev-dependencies", + "--no-dev-dependencies", + "dev_dependencies", is_flag=True, - default=True, - help="include dev dependencies in the lockfile (where applicable)", + flag_value=True, + default=False, + help=_deprecated_dev_help, + hidden=False, + is_eager=True, + callback=_deprecated_dev_cli, ) @click.option( "-f", @@ -1351,7 +1352,6 @@ def lock( micromamba: bool, platform: Sequence[str], channel_overrides: Sequence[str], - dev_dependencies: bool, files: Sequence[PathLike], kind: Sequence[Union[Literal["lock"], Literal["env"], Literal["explicit"]]], filename_template: str, @@ -1368,6 +1368,7 @@ def lock( update: Optional[Sequence[str]] = None, metadata_choices: Sequence[str] = (), metadata_yamls: Sequence[PathLike] = (), + dev_dependencies: bool = False, # DEPRECATED ) -> None: """Generate fully reproducible lock files for conda environments. @@ -1379,7 +1380,6 @@ def lock( \b platform: The platform this lock file was generated for (conda subdir). - dev-dependencies: Whether or not dev dependencies are included in this lock file. input-hash: A sha256 hash of the lock file input specification. version: The version of conda-lock used to generate this lock file. timestamp: The approximate timestamp of the output file in ISO8601 basic format. @@ -1421,7 +1421,6 @@ def lock( platforms=platform, mamba=mamba, micromamba=micromamba, - include_dev_dependencies=dev_dependencies, channel_overrides=channel_overrides, kinds=kind, lockfile_path=None if lockfile is None else pathlib.Path(lockfile), @@ -1455,7 +1454,6 @@ def lock( DEFAULT_INSTALL_OPT_COPY = False DEFAULT_INSTALL_OPT_VALIDATE_PLATFORM = True DEFAULT_INSTALL_OPT_LOG_LEVEL = "INFO" -DEFAULT_INSTALL_OPT_DEV = True DEFAULT_INSTALL_OPT_LOCK_FILE = pathlib.Path(DEFAULT_LOCKFILE_NAME) @@ -1507,10 +1505,16 @@ def lock( type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]), ) @click.option( - "--dev/--no-dev", + "--dev", + "--no-dev", + "dev", is_flag=True, - default=DEFAULT_INSTALL_OPT_DEV, - help="install dev dependencies from the lockfile (where applicable)", + flag_value=True, + default=False, + help=_deprecated_dev_help, + hidden=False, + is_eager=True, + callback=_deprecated_dev_cli, ) @click.option( "-E", @@ -1539,9 +1543,9 @@ def click_install( auth_file: Optional[PathLike], validate_platform: bool, log_level: TLogLevel, - dev: bool, extras: List[str], force_platform: str, + dev: bool, # DEPRECATED ) -> None: # bail out if we do not encounter the lockfile lock_file = pathlib.Path(lock_file) @@ -1562,7 +1566,6 @@ def click_install( auth=auth, auth_file=auth_file, validate_platform=validate_platform, - dev=dev, extras=extras, force_platform=force_platform, ) @@ -1579,7 +1582,6 @@ def install( auth: Optional[str] = None, auth_file: Optional[PathLike] = None, validate_platform: bool = DEFAULT_INSTALL_OPT_VALIDATE_PLATFORM, - dev: bool = DEFAULT_INSTALL_OPT_DEV, extras: Optional[List[str]] = None, force_platform: Optional[str] = None, ) -> None: @@ -1602,7 +1604,6 @@ def install( ) with _render_lockfile_for_install( lock_file, - include_dev_dependencies=dev, extras=set(extras), force_platform=force_platform, ) as lockfile: @@ -1615,10 +1616,16 @@ def install( @main.command("render", context_settings=CONTEXT_SETTINGS) @click.option( - "--dev-dependencies/--no-dev-dependencies", + "--dev-dependencies", + "--no-dev-dependencies", + "dev_dependencies", is_flag=True, - default=True, - help="include dev dependencies in the lockfile (where applicable)", + flag_value=True, + default=False, + help=_deprecated_dev_help, + hidden=False, + is_eager=True, + callback=_deprecated_dev_cli, ) @click.option( "-k", @@ -1660,7 +1667,6 @@ def install( @click.pass_context def render( ctx: click.Context, - dev_dependencies: bool, kind: Sequence[Union[Literal["env"], Literal["explicit"]]], filename_template: str, extras: List[str], @@ -1668,6 +1674,7 @@ def render( lock_file: PathLike, pdb: bool, platform: Sequence[str], + dev_dependencies: bool, # DEPRECATED ) -> None: """Render multi-platform lockfile into single-platform env or explicit file""" logging.basicConfig(level=log_level) @@ -1688,7 +1695,6 @@ def render( lock_content, filename_template=filename_template, kinds=kind, - include_dev_dependencies=dev_dependencies, extras=set(extras), override_platform=platform, ) @@ -1727,10 +1733,16 @@ def render( help="""Override the channels to use when solving the environment. These will replace the channels as listed in the various source files.""", ) @click.option( - "--dev-dependencies/--no-dev-dependencies", + "--dev-dependencies", + "--no-dev-dependencies", + "dev_dependencies", is_flag=True, - default=True, - help="include dev dependencies in the lockfile spec (where applicable)", + flag_value=True, + default=False, + help=_deprecated_dev_help, + hidden=False, + is_eager=True, + callback=_deprecated_dev_cli, ) @click.option( "-f", @@ -1872,7 +1884,6 @@ def render_lock_spec( # noqa: C901 micromamba: Optional[bool], platform: Sequence[str], channel_overrides: Sequence[str], - dev_dependencies: bool, files: Sequence[PathLike], kind: Sequence[Literal["pixi.toml"]], filename_template: Optional[str], @@ -1892,6 +1903,7 @@ def render_lock_spec( # noqa: C901 stdout: bool, pixi_project_name: Optional[str], editable: Sequence[str], + dev_dependencies: bool, # DEPRECATED ) -> None: """Combine source files into a single lock specification""" kinds = set(kind) @@ -1993,7 +2005,6 @@ def render_lock_spec( # noqa: C901 stdout=stdout, platform_overrides=platform, channel_overrides=channel_overrides, - include_dev_dependencies=dev_dependencies, extras=set(extras), filter_categories=filter_categories, lockfile_path=lockfile_path, @@ -2011,7 +2022,6 @@ def do_render_lockspec( stdout: bool, platform_overrides: Optional[Sequence[str]] = None, channel_overrides: Optional[Sequence[str]] = None, - include_dev_dependencies: bool = True, extras: Optional[AbstractSet[str]] = None, filter_categories: bool = False, lockfile_path: Optional[pathlib.Path] = None, @@ -2024,8 +2034,6 @@ def do_render_lockspec( src_files = handle_no_specified_source_files(lockfile_path) required_categories = {"main"} - if include_dev_dependencies: - required_categories.add("dev") if extras is not None: required_categories.update(extras) lock_spec = make_lock_spec( diff --git a/tests/test_conda_lock.py b/tests/test_conda_lock.py index f947dbeda..b25cebaa6 100644 --- a/tests/test_conda_lock.py +++ b/tests/test_conda_lock.py @@ -1138,7 +1138,6 @@ def test_explicit_toposorted() -> None: lockfile=lockfile, kind="explicit", platform="linux-64", - include_dev_dependencies=False, extras=set(), ) @@ -2178,12 +2177,12 @@ def test_install( platform = "linux-64" lock_filename_template = ( - request.node.name + "conda-{platform}-{dev-dependencies}.lock" + request.node.name + "conda-{platform}.lock" ) if kind == "env": - lock_filename = request.node.name + "conda-linux-64-true.lock.yml" + lock_filename = request.node.name + "conda-linux-64.lock.yml" elif kind == "explicit": - lock_filename = request.node.name + "conda-linux-64-true.lock" + lock_filename = request.node.name + "conda-linux-64.lock" elif kind == "lock": lock_filename = "conda-lock.yml" else: