def package_with_groups(): package = Package("foo", "1.2.3") optional_group = DependencyGroup("optional", optional=True) optional_group.add_dependency(Factory.create_dependency("bam", "^3.0.0")) package.add_dependency(Factory.create_dependency("bar", "^1.0.0")) package.add_dependency(Factory.create_dependency("baz", "^1.1.0")) package.add_dependency(Factory.create_dependency("bim", "^2.0.0", groups=["dev"])) package.add_dependency_group(optional_group) return package
def _add_package_group_dependencies( cls, package: ProjectPackage, group: str | DependencyGroup, dependencies: DependencyConfig, ) -> None: from poetry.core.packages.dependency_group import MAIN_GROUP if isinstance(group, str): if package.has_dependency_group(group): group = package.dependency_group(group) else: from poetry.core.packages.dependency_group import DependencyGroup group = DependencyGroup(group) for name, constraints in dependencies.items(): _constraints = (constraints if isinstance(constraints, list) else [constraints]) for _constraint in _constraints: if name.lower() == "python": if group.name == MAIN_GROUP and isinstance( _constraint, str): package.python_versions = _constraint continue group.add_dependency( cls.create_dependency( name, _constraint, groups=[group.name], root_dir=package.root_dir, )) package.add_dependency_group(group)
def add_dependency( self, dependency: Dependency, ) -> Dependency: from poetry.core.packages.dependency_group import DependencyGroup for group_name in dependency.groups: if group_name not in self._dependency_groups: # Dynamically add the dependency group self.add_dependency_group(DependencyGroup(group_name)) self._dependency_groups[group_name].add_dependency(dependency) return dependency
def test_show_with_optional_group(tester, poetry, installed): poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0")) poetry.package.add_dependency( Factory.create_dependency("pendulum", "^2.0.0")) group = DependencyGroup("dev", optional=True) group.add_dependency( Factory.create_dependency("pytest", "*", groups=["dev"])) poetry.package.add_dependency_group(group) cachy_010 = get_package("cachy", "0.1.0") cachy_010.description = "Cachy package" pendulum_200 = get_package("pendulum", "2.0.0") pendulum_200.description = "Pendulum package" pytest_373 = get_package("pytest", "3.7.3") pytest_373.description = "Pytest package" pytest_373.category = "dev" installed.add_package(cachy_010) installed.add_package(pendulum_200) installed.add_package(pytest_373) poetry.locker.mock_lock_data({ "package": [ { "name": "cachy", "version": "0.1.0", "description": "Cachy package", "category": "main", "optional": False, "platform": "*", "python-versions": "*", "checksum": [], }, { "name": "pendulum", "version": "2.0.0", "description": "Pendulum package", "category": "main", "optional": False, "platform": "*", "python-versions": "*", "checksum": [], }, { "name": "pytest", "version": "3.7.3", "description": "Pytest package", "category": "dev", "optional": False, "platform": "*", "python-versions": "*", "checksum": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": { "cachy": [], "pendulum": [], "pytest": [] }, }, }) tester.execute() expected = """\ cachy 0.1.0 Cachy package pendulum 2.0.0 Pendulum package """ assert expected == tester.io.fetch_output() tester.execute("--with dev") expected = """\ cachy 0.1.0 Cachy package pendulum 2.0.0 Pendulum package pytest 3.7.3 Pytest package """ assert expected == tester.io.fetch_output()
def test_dependency_group_remove_dependency() -> None: group = DependencyGroup(name="linter") group.add_dependency(Dependency(name="black", constraint="*")) group.add_dependency(Dependency(name="isort", constraint="*")) group.add_dependency(Dependency(name="flake8", constraint="*")) assert {dependency.name for dependency in group.dependencies} == { "black", "isort", "flake8", } group.remove_dependency("isort") assert {dependency.name for dependency in group.dependencies} == {"black", "flake8"} group.remove_dependency("black") assert {dependency.name for dependency in group.dependencies} == {"flake8"} group.remove_dependency("flake8") assert {dependency.name for dependency in group.dependencies} == set()
def configure_package( cls, package: ProjectPackage, config: dict[str, Any], root: Path, with_groups: bool = True, ) -> ProjectPackage: from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency_group import MAIN_GROUP from poetry.core.packages.dependency_group import DependencyGroup from poetry.core.spdx.helpers import license_by_id package.root_dir = root for author in config["authors"]: package.authors.append(combine_unicode(author)) for maintainer in config.get("maintainers", []): package.maintainers.append(combine_unicode(maintainer)) package.description = config.get("description", "") package.homepage = config.get("homepage") package.repository_url = config.get("repository") package.documentation_url = config.get("documentation") try: license_: License | None = license_by_id(config.get("license", "")) except ValueError: license_ = None package.license = license_ package.keywords = config.get("keywords", []) package.classifiers = config.get("classifiers", []) if "readme" in config: if isinstance(config["readme"], str): package.readmes = (root / config["readme"], ) else: package.readmes = tuple(root / readme for readme in config["readme"]) if "platform" in config: package.platform = config["platform"] if "dependencies" in config: cls._add_package_group_dependencies( package=package, group=MAIN_GROUP, dependencies=config["dependencies"]) if with_groups and "group" in config: for group_name, group_config in config["group"].items(): group = DependencyGroup(group_name, optional=group_config.get( "optional", False)) cls._add_package_group_dependencies( package=package, group=group, dependencies=group_config["dependencies"], ) if with_groups and "dev-dependencies" in config: cls._add_package_group_dependencies( package=package, group="dev", dependencies=config["dev-dependencies"]) extras = config.get("extras", {}) for extra_name, requirements in extras.items(): package.extras[extra_name] = [] # Checking for dependency for req in requirements: req = Dependency(req, "*") for dep in package.requires: if dep.name == req.name: dep.in_extras.append(extra_name) package.extras[extra_name].append(dep) break if "build" in config: build = config["build"] if not isinstance(build, dict): build = {"script": build} package.build_config = build or {} if "include" in config: package.include = [] for include in config["include"]: if not isinstance(include, dict): include = {"path": include} formats = include.get("format", []) if formats and not isinstance(formats, list): formats = [formats] include["format"] = formats package.include.append(include) if "exclude" in config: package.exclude = config["exclude"] if "packages" in config: package.packages = config["packages"] # Custom urls if "urls" in config: package.custom_urls = config["urls"] return package