def translate_groups(project: Project, default: bool, dev: bool, groups: Iterable[str]) -> list[str]: """Translate default, dev and groups containing ":all" into a list of groups""" optional_groups = set(project.meta.optional_dependencies or []) dev_groups = set(project.tool_settings.get("dev-dependencies", [])) groups_set = set(groups) if dev is None: dev = True if groups_set & dev_groups: if not dev: raise PdmUsageError( "--prod is not allowed with dev groups and should be left") elif dev: groups_set.update(dev_groups) if ":all" in groups: groups_set.discard(":all") groups_set.update(optional_groups) if default: groups_set.add("default") # Sorts the result in ascending order instead of in random order # to make this function pure invalid_groups = groups_set - set(project.iter_groups()) if invalid_groups: project.core.ui.echo(f"Ignoring non-existing groups: {invalid_groups}", fg="yellow", err=True) groups_set -= invalid_groups return sorted(groups_set)
def do_remove( project: Project, dev: bool = False, group: str | None = None, sync: bool = True, packages: Collection[str] = (), no_editable: bool = False, no_self: bool = False, dry_run: bool = False, ) -> None: """Remove packages from working set and pyproject.toml""" check_project_file(project) if not packages: raise PdmUsageError("Must specify at least one package to remove.") if not group: group = "dev" if dev else "default" if group not in list(project.iter_groups()): raise ProjectError(f"No-exist group {group}") deps = project.get_pyproject_dependencies(group, dev) project.core.ui.echo( f"Removing packages from {group} {'dev-' if dev else ''}dependencies: " + ", ".join(str(termui.green(name, bold=True)) for name in packages) ) for name in packages: req = parse_requirement(name) matched_indexes = sorted( (i for i, r in enumerate(deps) if req.matches(r, False)), reverse=True ) if not matched_indexes: raise ProjectError( "{} does not exist in {} dependencies.".format( termui.green(name, bold=True), group ) ) for i in matched_indexes: del deps[i] if not dry_run: project.write_pyproject() do_lock(project, "reuse", dry_run=dry_run) if sync: do_sync( project, groups=(group,), default=False, clean=True, no_editable=no_editable, no_self=no_self, dry_run=dry_run, )