def test_adding_a_plugin_can_update_poetry_dependencies_if_needed( app, repo, tester, env, installed): poetry_package = Package("poetry", "1.2.0") poetry_package.add_dependency( Factory.create_dependency("tomlkit", "^0.7.0")) plugin_package = Package("poetry-plugin", "1.2.3") plugin_package.add_dependency( Factory.create_dependency("tomlkit", "^0.7.2")) installed.add_package(poetry_package) installed.add_package(Package("tomlkit", "0.7.1")) repo.add_package(plugin_package) repo.add_package(Package("tomlkit", "0.7.1")) repo.add_package(Package("tomlkit", "0.7.2")) tester.execute("poetry-plugin") expected = """\ Using version ^1.2.3 for poetry-plugin Updating dependencies Resolving dependencies... Writing lock file Package operations: 1 install, 1 update, 0 removals • Updating tomlkit (0.7.1 -> 0.7.2) • Installing poetry-plugin (1.2.3) """ assert_plugin_add_result(tester, app, env, expected, "^1.2.3")
def test_with_compatible_locked_dependencies_with_extras( root: ProjectPackage, provider: Provider, repo: Repository ): root.add_dependency(Factory.create_dependency("foo", "^1.0")) package_foo_0 = get_package("foo", "1.0.0") package_foo_1 = get_package("foo", "1.0.1") bar_extra_dep = Factory.create_dependency( "bar", {"version": "^1.0", "extras": "extra"} ) for package_foo in (package_foo_0, package_foo_1): package_foo.add_dependency(bar_extra_dep) repo.add_package(package_foo) bar_deps = {"baz": {"version": "^1.0", "extras": ["extra"]}} add_to_repo(repo, "bar", "1.0.0", bar_deps) add_to_repo(repo, "bar", "1.0.1", bar_deps) add_to_repo(repo, "baz", "1.0.0") add_to_repo(repo, "baz", "1.0.1") check_solver_result( root, provider, result={"foo": "1.0.0", "bar": "1.0.0", "baz": "1.0.0"}, locked={ "foo": get_package("foo", "1.0.0"), "bar": get_package("bar", "1.0.0"), "baz": get_package("baz", "1.0.0"), }, )
def test_simple_dependencies( root: "ProjectPackage", provider: "Provider", repo: "Repository" ): root.add_dependency(Factory.create_dependency("a", "1.0.0")) root.add_dependency(Factory.create_dependency("b", "1.0.0")) add_to_repo(repo, "a", "1.0.0", deps={"aa": "1.0.0", "ab": "1.0.0"}) add_to_repo(repo, "b", "1.0.0", deps={"ba": "1.0.0", "bb": "1.0.0"}) add_to_repo(repo, "aa", "1.0.0") add_to_repo(repo, "ab", "1.0.0") add_to_repo(repo, "ba", "1.0.0") add_to_repo(repo, "bb", "1.0.0") check_solver_result( root, provider, { "a": "1.0.0", "aa": "1.0.0", "ab": "1.0.0", "b": "1.0.0", "ba": "1.0.0", "bb": "1.0.0", }, )
def test_traverse_into_package_with_fewer_versions_first( root: "ProjectPackage", provider: "Provider", repo: "Repository"): # Dependencies are ordered so that packages with fewer versions are tried # first. Here, there are two valid solutions (either a or b must be # downgraded once). The chosen one depends on which dep is traversed first. # Since b has fewer versions, it will be traversed first, which means a will # come later. Since later selections are revised first, a gets downgraded. root.add_dependency(Factory.create_dependency("a", "*")) root.add_dependency(Factory.create_dependency("b", "*")) add_to_repo(repo, "a", "1.0.0", deps={"c": "*"}) add_to_repo(repo, "a", "2.0.0", deps={"c": "*"}) add_to_repo(repo, "a", "3.0.0", deps={"c": "*"}) add_to_repo(repo, "a", "4.0.0", deps={"c": "*"}) add_to_repo(repo, "a", "5.0.0", deps={"c": "1.0.0"}) add_to_repo(repo, "b", "1.0.0", deps={"c": "*"}) add_to_repo(repo, "b", "2.0.0", deps={"c": "*"}) add_to_repo(repo, "b", "3.0.0", deps={"c": "*"}) add_to_repo(repo, "b", "4.0.0", deps={"c": "2.0.0"}) add_to_repo(repo, "c", "1.0.0") add_to_repo(repo, "c", "2.0.0") check_solver_result(root, provider, { "a": "4.0.0", "b": "4.0.0", "c": "2.0.0" })
def test_with_compatible_locked_dependencies_use_latest(root, provider, repo): root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("baz", "*")) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "foo", "1.0.1", deps={"bar": "1.0.1"}) add_to_repo(repo, "foo", "1.0.2", deps={"bar": "1.0.2"}) add_to_repo(repo, "bar", "1.0.0") add_to_repo(repo, "bar", "1.0.1") add_to_repo(repo, "bar", "1.0.2") add_to_repo(repo, "baz", "1.0.0") add_to_repo(repo, "baz", "1.0.1") check_solver_result( root, provider, result={ "foo": "1.0.2", "bar": "1.0.2", "baz": "1.0.0" }, locked={ "foo": get_package("foo", "1.0.1"), "bar": get_package("bar", "1.0.1"), "baz": get_package("baz", "1.0.0"), }, use_latest=["foo"], )
def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_statisfied( root, provider, repo): root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("newdep", "2.0.0")) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "<2.0.0"}) add_to_repo(repo, "bar", "1.0.0", deps={"baz": "<2.0.0"}) add_to_repo(repo, "baz", "1.0.0", deps={"qux": "<2.0.0"}) add_to_repo(repo, "qux", "1.0.0") add_to_repo(repo, "foo", "2.0.0", deps={"bar": "<3.0.0"}) add_to_repo(repo, "bar", "2.0.0", deps={"baz": "<3.0.0"}) add_to_repo(repo, "baz", "2.0.0", deps={"qux": "<3.0.0"}) add_to_repo(repo, "qux", "2.0.0") add_to_repo(repo, "newdep", "2.0.0", deps={"baz": ">=1.5.0"}) check_solver_result( root, provider, result={ "foo": "2.0.0", "bar": "2.0.0", "baz": "2.0.0", "qux": "1.0.0", "newdep": "2.0.0", }, locked={ "foo": get_package("foo", "2.0.0"), "bar": get_package("bar", "1.0.0"), "baz": get_package("baz", "1.0.0"), "qux": get_package("qux", "1.0.0"), }, )
def test_self_update_does_not_update_non_recommended_installation( tester: CommandTester, http: type[httpretty.httpretty], mocker: MockerFixture, environ: None, tmp_venv: VirtualEnv, ): mocker.patch.object(EnvManager, "get_system_env", return_value=tmp_venv) command = tester.command new_version = Version.parse(__version__).next_minor().text old_poetry = Package("poetry", __version__) old_poetry.add_dependency(Factory.create_dependency("cleo", "^0.8.2")) new_poetry = Package("poetry", new_version) new_poetry.add_dependency(Factory.create_dependency("cleo", "^1.0.0")) installed_repository = Repository() installed_repository.add_package(old_poetry) installed_repository.add_package(Package("cleo", "0.8.2")) repository = Repository() repository.add_package(new_poetry) repository.add_package(Package("cleo", "1.0.0")) pool = Pool() pool.add_repository(repository) command._pool = pool with pytest.raises(PoetrySimpleConsoleException): tester.execute()
def test_show_hides_incompatible_package( tester: "CommandTester", poetry: "Poetry", installed: "Repository", repo: "TestRepository", ): poetry.package.add_dependency( Factory.create_dependency("cachy", {"version": "^0.1.0", "python": "< 2.0"}) ) poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0")) 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" installed.add_package(pendulum_200) 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": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": {"cachy": [], "pendulum": []}, }, } ) tester.execute() expected = """\ pendulum 2.0.0 Pendulum package """ assert expected == tester.io.fetch_output()
def test_show_outdated(tester, poetry, installed, repo): poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0")) poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0")) cachy_010 = get_package("cachy", "0.1.0") cachy_010.description = "Cachy package" cachy_020 = get_package("cachy", "0.2.0") cachy_020.description = "Cachy package" pendulum_200 = get_package("pendulum", "2.0.0") pendulum_200.description = "Pendulum package" installed.add_package(cachy_010) installed.add_package(pendulum_200) repo.add_package(cachy_010) repo.add_package(cachy_020) repo.add_package(pendulum_200) 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": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": {"cachy": [], "pendulum": []}, }, } ) tester.execute("--outdated") expected = """\ cachy 0.1.0 0.2.0 Cachy package """ assert expected == tester.io.fetch_output()
def test_show_tree(app, poetry, installed): command = app.find("show") tester = CommandTester(command) poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0")) cachy2 = get_package("cachy", "0.2.0") cachy2.add_dependency( Factory.create_dependency("msgpack-python", ">=0.5 <0.6")) installed.add_package(cachy2) poetry.locker.mock_lock_data({ "package": [ { "name": "cachy", "version": "0.2.0", "description": "", "category": "main", "optional": False, "platform": "*", "python-versions": "*", "checksum": [], "dependencies": { "msgpack-python": ">=0.5 <0.6" }, }, { "name": "msgpack-python", "version": "0.5.1", "description": "", "category": "main", "optional": False, "platform": "*", "python-versions": "*", "checksum": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": { "cachy": [], "msgpack-python": [] }, }, }) tester.execute("--tree") expected = """\ cachy 0.2.0 `-- msgpack-python >=0.5 <0.6 """ assert expected == tester.io.fetch_output()
def test_solver_dependency_cache_respects_subdirectories( root: ProjectPackage, provider: Provider, repo: Repository): dependency_one = Factory.create_dependency( "one", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "one", "platform": "linux", }, ) dependency_one_copy = Factory.create_dependency( "one", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "one-copy", "platform": "win32", }, ) root.add_dependency(dependency_one) root.add_dependency(dependency_one_copy) cache = DependencyCache(provider) cache.search_for.cache_clear() # ensure cache was never hit for both calls cache.search_for(dependency_one) cache.search_for(dependency_one_copy) assert not cache.search_for.cache_info().hits # increase test coverage by searching for copies # (when searching for the exact same object, __eq__ is never called) packages_one = cache.search_for(deepcopy(dependency_one)) packages_one_copy = cache.search_for(deepcopy(dependency_one_copy)) assert cache.search_for.cache_info().hits == 2 assert cache.search_for.cache_info().currsize == 2 assert len(packages_one) == len(packages_one_copy) == 1 package_one = packages_one[0] package_one_copy = packages_one_copy[0] assert package_one.package.name == package_one_copy.name assert package_one.package.version.text == package_one_copy.package.version.text assert package_one.package.source_type == package_one_copy.source_type == "git" assert (package_one.package.source_resolved_reference == package_one_copy.source_resolved_reference == "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24") assert (package_one.package.source_subdirectory != package_one_copy.source_subdirectory) assert package_one.package.source_subdirectory == "one" assert package_one_copy.package.source_subdirectory == "one-copy" assert package_one.dependency.marker.intersect( package_one_copy.dependency.marker).is_empty()
def test_self_update_can_update_from_recommended_installation( tester: CommandTester, http: type[httpretty.httpretty], mocker: MockerFixture, environ: None, tmp_venv: VirtualEnv, ): mocker.patch.object(EnvManager, "get_system_env", return_value=tmp_venv) command = tester.command command._data_dir = tmp_venv.path.parent new_version = Version.parse(__version__).next_minor().text old_poetry = Package("poetry", __version__) old_poetry.add_dependency(Factory.create_dependency("cleo", "^0.8.2")) new_poetry = Package("poetry", new_version) new_poetry.add_dependency(Factory.create_dependency("cleo", "^1.0.0")) installed_repository = Repository() installed_repository.add_package(old_poetry) installed_repository.add_package(Package("cleo", "0.8.2")) repository = Repository() repository.add_package(new_poetry) repository.add_package(Package("cleo", "1.0.0")) pool = Pool() pool.add_repository(repository) command._pool = pool mocker.patch.object(InstalledRepository, "load", return_value=installed_repository) tester.execute() expected_output = f"""\ Updating Poetry to 1.2.0 Updating dependencies Resolving dependencies... Package operations: 0 installs, 2 updates, 0 removals - Updating cleo (0.8.2 -> 1.0.0) - Updating poetry ({__version__} -> {new_version}) Updating the poetry script Poetry ({new_version}) is installed now. Great! """ assert tester.io.fetch_output() == expected_output
def test_show_basic_with_not_installed_packages_decorated( 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")) 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" installed.add_package(cachy_010) 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": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": { "cachy": [], "pendulum": [] }, }, }) tester.io.set_formatter(AnsiFormatter(forced=True)) tester.execute() expected = """\ \033[36mcachy \033[0m \033[1m0.1.0\033[0m Cachy package \033[31mpendulum\033[0m \033[1m2.0.0\033[0m Pendulum package """ assert expected == tester.io.fetch_output()
def test_show_basic_with_not_installed_packages_non_decorated( tester: "CommandTester", poetry: "Poetry", installed: "Repository"): poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0")) poetry.package.add_dependency( Factory.create_dependency("pendulum", "^2.0.0")) 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" installed.add_package(cachy_010) 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": [], }, ], "metadata": { "python-versions": "*", "platform": "*", "content-hash": "123456789", "hashes": { "cachy": [], "pendulum": [] }, }, }) tester.execute() expected = """\ cachy 0.1.0 Cachy package pendulum (!) 2.0.0 Pendulum package """ assert tester.io.fetch_output() == expected
def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers_any( tmp_dir, poetry, dev, lines): poetry.locker.mock_lock_data({ "package": [ { "name": "a", "version": "1.2.3", "category": "main", "optional": False, "python-versions": "*", }, { "name": "b", "version": "4.5.6", "category": "dev", "optional": False, "python-versions": "*", "dependencies": { "a": ">=1.2.3" }, }, ], "metadata": { "python-versions": "*", "content-hash": "123456789", "hashes": { "a": [], "b": [] }, }, }) poetry.package.requires = [ Factory.create_dependency(name="a", constraint=dict(version="^1.2.3", python="<3.8")), ] poetry.package.dev_requires = [ Factory.create_dependency(name="b", constraint=dict(version="^4.5.6"), category="dev"), ] exporter = Exporter(poetry) exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=dev) with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() assert content.strip() == "\n".join(lines)
def test_disjoint_root_constraints(root, provider, repo): root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("foo", "2.0.0")) add_to_repo(repo, "foo", "1.0.0") add_to_repo(repo, "foo", "2.0.0") error = """\ Because myapp depends on both foo (1.0.0) and foo (2.0.0), version solving failed.""" check_solver_result(root, provider, error=error)
def test_remove_without_specific_group_removes_from_specific_groups( tester: "CommandTester", app: "PoetryTestApplication", repo: "TestRepository", command_tester_factory: "CommandTesterFactory", installed: "Repository", ): """ Removing with a specific group given removes packages only from this group. """ installed.add_package(Package("foo", "2.0.0")) repo.add_package(Package("foo", "2.0.0")) repo.add_package(Package("baz", "1.0.0")) content = app.poetry.file.read() groups_content = tomlkit.parse( """\ [tool.poetry.group.bar.dependencies] foo = "^2.0.0" baz = "^1.0.0" """ ) content["tool"]["poetry"]["dependencies"]["foo"] = "^2.0.0" content["tool"]["poetry"].value._insert_after( "dependencies", "group", groups_content["tool"]["poetry"]["group"] ) app.poetry.file.write(content) app.poetry.package.add_dependency(Factory.create_dependency("foo", "^2.0.0")) app.poetry.package.add_dependency( Factory.create_dependency("foo", "^2.0.0", groups=["bar"]) ) app.poetry.package.add_dependency( Factory.create_dependency("baz", "^1.0.0", groups=["bar"]) ) tester.execute("foo --group bar") content = app.poetry.file.read()["tool"]["poetry"] assert "foo" in content["dependencies"] assert "foo" not in content["group"]["bar"]["dependencies"] assert "baz" in content["group"]["bar"]["dependencies"] expected = """\ [tool.poetry.group.bar.dependencies] baz = "^1.0.0" """ assert expected in content.as_string()
def test_remove_without_specific_group_removes_from_specific_groups( tester: CommandTester, app: PoetryTestApplication, repo: TestRepository, command_tester_factory: CommandTesterFactory, installed: Repository, ): """ Removing with a specific group given removes packages only from this group. """ installed.add_package(Package("foo", "2.0.0")) repo.add_package(Package("foo", "2.0.0")) repo.add_package(Package("baz", "1.0.0")) content = app.poetry.file.read() groups_content = tomlkit.parse("""\ [tool.poetry.group.bar.dependencies] foo = "^2.0.0" baz = "^1.0.0" """) content["tool"]["poetry"]["dependencies"]["foo"] = "^2.0.0" content["tool"]["poetry"]["group"] = groups_content["tool"]["poetry"][ "group"] app.poetry.file.write(content) app.poetry.package.add_dependency( Factory.create_dependency("foo", "^2.0.0")) app.poetry.package.add_dependency( Factory.create_dependency("foo", "^2.0.0", groups=["bar"])) app.poetry.package.add_dependency( Factory.create_dependency("baz", "^1.0.0", groups=["bar"])) tester.execute("foo --group bar") content = app.poetry.file.read()["tool"]["poetry"] assert "foo" in content["dependencies"] assert "foo" not in content["group"]["bar"]["dependencies"] assert "baz" in content["group"]["bar"]["dependencies"] expected = """\ [tool.poetry.group.bar.dependencies] baz = "^1.0.0" """ string_content = content.as_string() if "\r\n" in string_content: # consistent line endings expected = expected.replace("\n", "\r\n") assert expected in string_content
def test_remove_canonicalized_named_removes_dependency_correctly( tester: CommandTester, app: PoetryTestApplication, repo: TestRepository, command_tester_factory: CommandTesterFactory, installed: Repository, ): """ Removing a dependency using a canonicalized named removes the dependency. """ installed.add_package(Package("foo-bar", "2.0.0")) repo.add_package(Package("foo-bar", "2.0.0")) repo.add_package(Package("baz", "1.0.0")) content = app.poetry.file.read() groups_content = tomlkit.parse("""\ [tool.poetry.group.bar.dependencies] foo-bar = "^2.0.0" baz = "^1.0.0" """) content["tool"]["poetry"]["dependencies"]["foo-bar"] = "^2.0.0" content["tool"]["poetry"].value._insert_after( "dependencies", "group", groups_content["tool"]["poetry"]["group"]) app.poetry.file.write(content) app.poetry.package.add_dependency( Factory.create_dependency("foo-bar", "^2.0.0")) app.poetry.package.add_dependency( Factory.create_dependency("foo-bar", "^2.0.0", groups=["bar"])) app.poetry.package.add_dependency( Factory.create_dependency("baz", "^1.0.0", groups=["bar"])) tester.execute("Foo_Bar") content = app.poetry.file.read()["tool"]["poetry"] assert "foo-bar" not in content["dependencies"] assert "foo-bar" not in content["group"]["bar"]["dependencies"] assert "baz" in content["group"]["bar"]["dependencies"] expected = """\ [tool.poetry.group.bar.dependencies] baz = "^1.0.0" """ string_content = content.as_string() if "\r\n" in string_content: # consistent line endings expected = expected.replace("\n", "\r\n") assert expected in string_content
def test_shared_dependencies_with_overlapping_constraints( root: "ProjectPackage", provider: "Provider", repo: "Repository" ): root.add_dependency(Factory.create_dependency("a", "1.0.0")) root.add_dependency(Factory.create_dependency("b", "1.0.0")) add_to_repo(repo, "a", "1.0.0", deps={"shared": ">=2.0.0 <4.0.0"}) add_to_repo(repo, "b", "1.0.0", deps={"shared": ">=3.0.0 <5.0.0"}) add_to_repo(repo, "shared", "2.0.0") add_to_repo(repo, "shared", "3.0.0") add_to_repo(repo, "shared", "3.6.9") add_to_repo(repo, "shared", "4.0.0") add_to_repo(repo, "shared", "5.0.0") check_solver_result(root, provider, {"a": "1.0.0", "b": "1.0.0", "shared": "3.6.9"})
def test_invalid_versions_ignored(): repo = MockRepository() # the json metadata for this package contains one malformed version # and a correct one. packages = repo.find_packages(Factory.create_dependency("pygame-music-grid", "*")) assert len(packages) == 1
def test_extras_dependencies_are_ordered(locker: Locker, root: ProjectPackage): package_a = get_package("A", "1.0.0") package_a.add_dependency( Factory.create_dependency( "B", {"version": "^1.0.0", "optional": True, "extras": ["c", "a", "b"]} ) ) package_a.requires[-1].activate() locker.set_lock_data(root, [package_a]) expected = """[[package]] name = "A" version = "1.0.0" description = "" category = "main" optional = false python-versions = "*" [package.dependencies] B = {version = "^1.0.0", extras = ["a", "b", "c"], optional = true} [metadata] lock-version = "1.1" python-versions = "*" content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831" [metadata.files] A = [] """ with locker.lock.open(encoding="utf-8") as f: content = f.read() assert content == expected
def test_extras_dependencies_are_ordered(locker: Locker, root: ProjectPackage): package_a = get_package("A", "1.0.0") package_a.add_dependency( Factory.create_dependency( "B", {"version": "^1.0.0", "optional": True, "extras": ["c", "a", "b"]} ) ) package_a.requires[-1].activate() locker.set_lock_data(root, [package_a]) expected = """[[package]] name = "A" version = "1.0.0" description = "" category = "main" optional = false python-versions = "*" [package.dependencies] B = {version = "^1.0.0", extras = ["a", "b", "c"], optional = true} [metadata] lock-version = "1.1" python-versions = "*" content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" [metadata.files] A = [] """ with locker.lock.open(encoding="utf-8") as f: content = f.read() assert content == expected
def test_package_with_the_same_name_gives_clear_error_message( root: "ProjectPackage", provider: "Provider", repo: "Repository"): pkg_name = "a" root.add_dependency(Factory.create_dependency(pkg_name, "*")) add_to_repo(repo, pkg_name, "1.0.0", deps={pkg_name: "1.0.0"}) error = f"Package '{pkg_name}' is listed as a dependency of itself." check_solver_result(root, provider, error=error)
def test_disjoint_constraints(root, provider, repo): root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("bar", "1.0.0")) add_to_repo(repo, "foo", "1.0.0", deps={"shared": "<=2.0.0"}) add_to_repo(repo, "bar", "1.0.0", deps={"shared": ">3.0.0"}) add_to_repo(repo, "shared", "2.0.0") add_to_repo(repo, "shared", "4.0.0") error = """\ Because bar (1.0.0) depends on shared (>3.0.0) and foo (1.0.0) depends on shared (<=2.0.0), bar (1.0.0) is incompatible with foo (1.0.0). So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving failed.""" check_solver_result(root, provider, error=error) check_solver_result(root, provider, error=error)
def test_no_version_that_matches_combined_constraints(root, provider, repo): root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("bar", "1.0.0")) add_to_repo(repo, "foo", "1.0.0", deps={"shared": ">=2.0.0 <3.0.0"}) add_to_repo(repo, "bar", "1.0.0", deps={"shared": ">=2.9.0 <4.0.0"}) add_to_repo(repo, "shared", "2.5.0") add_to_repo(repo, "shared", "3.5.0") error = """\ Because foo (1.0.0) depends on shared (>=2.0.0 <3.0.0) and no versions of shared match >=2.9.0,<3.0.0, foo (1.0.0) requires shared (>=2.0.0,<2.9.0). And because bar (1.0.0) depends on shared (>=2.9.0 <4.0.0), bar (1.0.0) is incompatible with foo (1.0.0). So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving failed.""" check_solver_result(root, provider, error=error)
def test_backjump_past_failed_package_on_disjoint_constraint( root: "ProjectPackage", provider: "Provider", repo: "Repository"): root.add_dependency(Factory.create_dependency("a", "*")) root.add_dependency(Factory.create_dependency("foo", ">2.0.0")) add_to_repo(repo, "a", "1.0.0", deps={"foo": "*"}) # ok add_to_repo(repo, "a", "2.0.0", deps={"foo": "<1.0.0"}) # disjoint with myapp's constraint on foo add_to_repo(repo, "foo", "2.0.0") add_to_repo(repo, "foo", "2.0.1") add_to_repo(repo, "foo", "2.0.2") add_to_repo(repo, "foo", "2.0.3") add_to_repo(repo, "foo", "2.0.4") check_solver_result(root, provider, {"a": "1.0.0", "foo": "2.0.4"})
def test_complete_package_preserves_source_type_with_subdirectories( provider: Provider, root: ProjectPackage) -> None: dependency_one = Factory.create_dependency( "one", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "one", }, ) dependency_one_copy = Factory.create_dependency( "one", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "one-copy", }, ) dependency_two = Factory.create_dependency( "two", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "two" }, ) root.add_dependency( Factory.create_dependency( "one", { "git": "https://github.com/demo/subdirectories.git", "subdirectory": "one", }, )) root.add_dependency(dependency_one_copy) root.add_dependency(dependency_two) complete_package = provider.complete_package( DependencyPackage(root.to_dependency(), root)) requires = complete_package.package.all_requires assert len(requires) == 3 assert {r.to_pep_508() for r in requires} == { dependency_one.to_pep_508(), dependency_one_copy.to_pep_508(), dependency_two.to_pep_508(), }
def test_circular_dependency(root: ProjectPackage, provider: Provider, repo: Repository): root.add_dependency(Factory.create_dependency("foo", "1.0.0")) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "bar", "1.0.0", deps={"foo": "1.0.0"}) check_solver_result(root, provider, {"foo": "1.0.0", "bar": "1.0.0"})
def test_show_displays_installed_plugins_with_dependencies( app: PoetryTestApplication, tester: CommandTester, installed: Repository, mocker: MockerFixture, plugin_package: Package, plugin_distro: Distribution, ): mocker.patch( "entrypoints.get_group_all", side_effect=[ [ EntryPoint( "poetry-plugin", "poetry_plugin.plugins:ApplicationPlugin", "FirstApplicationPlugin", distro=plugin_distro, ) ], [ EntryPoint( "poetry-plugin", "poetry_plugin.plugins:Plugin", "FirstPlugin", distro=plugin_distro, ) ], ], ) plugin_package.add_dependency(Factory.create_dependency("foo", ">=1.2.3")) plugin_package.add_dependency(Factory.create_dependency("bar", "<4.5.6")) installed.add_package(plugin_package) tester.execute("") expected = """ • poetry-plugin (1.2.3) 1 plugin and 1 application plugin Dependencies - foo (>=1.2.3) - bar (<4.5.6) """ assert tester.io.fetch_output() == expected