From 3a41defe7a0916c0a953276a94fe0a2f24d2d7b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 9 Apr 2022 23:41:07 +0200 Subject: [PATCH 01/14] Update lock file after rebase of referenced branch --- poetry.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 787235b..8513910 100644 --- a/poetry.lock +++ b/poetry.lock @@ -361,6 +361,7 @@ packaging = "^20.4" pexpect = "^4.7.0" pkginfo = "^1.5" poetry-core = "^1.1.0a7" +poetry-plugin-export = "^1.0" requests = "^2.18" requests-toolbelt = "^0.9.1" shellingham = "^1.1" @@ -372,7 +373,7 @@ virtualenv = "(>=20.4.3,<20.4.5 || >=20.4.7)" type = "git" url = "https://github.com/abn/poetry.git" reference = "use-export-plugin" -resolved_reference = "c5f74f605f0eecd5aedcfb75d06e5a7230ab1b16" +resolved_reference = "aee5e054cb9978dc4908a8715a8c85a98a209b58" [[package]] name = "poetry-core" @@ -641,7 +642,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "90f3e97cd2d184279fb3e5c0ebf6cba349fbf615158e98817e27ad1925e895a2" +content-hash = "47488c6d0154828f63ebf2f95d6be02314fbd3e3e060fdbfd0b1bf526b8cfb84" [metadata.files] atomicwrites = [ From d1776ccd8a89cd41e9f54066df9ec7d120f30ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 9 Apr 2022 23:43:17 +0200 Subject: [PATCH 02/14] test plugin instead of old in-tree exporter --- tests/test_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_exporter.py b/tests/test_exporter.py index cd5ea74..056a15d 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -15,8 +15,8 @@ from poetry.factory import Factory from poetry.packages import Locker as BaseLocker from poetry.repositories.legacy_repository import LegacyRepository -from poetry.utils.exporter import Exporter +from poetry_plugin_export.exporter import Exporter from tests.markers import MARKER_PY from tests.markers import MARKER_PY27 from tests.markers import MARKER_PY36 From 52244390e3b0a2ab0e597dcb6a17c12fb79296b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 9 Apr 2022 23:46:30 +0200 Subject: [PATCH 03/14] adapt tests to new interface --- tests/test_exporter.py | 87 ++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/tests/test_exporter.py b/tests/test_exporter.py index 056a15d..d2202a0 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys - from pathlib import Path from typing import TYPE_CHECKING from typing import Any @@ -9,6 +7,7 @@ import pytest +from cleo.io.buffered_io import BufferedIO from poetry.core.packages.dependency import Dependency from poetry.core.toml.file import TOMLFile from poetry.core.version.markers import parse_marker @@ -33,7 +32,6 @@ if TYPE_CHECKING: - from _pytest.capture import CaptureFixture from poetry.poetry import Poetry from pytest_mock import MockerFixture @@ -96,7 +94,10 @@ def set_package_requires(poetry: Poetry, skip: set[str] | None = None) -> None: package = poetry.package.with_dependency_groups([], only=True) for pkg in packages: if pkg.name not in skip: - package.add_dependency(pkg.to_dependency()) + dep = pkg.to_dependency() + if pkg.category == "dev": + dep._groups = frozenset(["dev"]) + package.add_dependency(dep) poetry._package = package @@ -538,7 +539,9 @@ def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers_a poetry._package = root exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=dev) + if dev: + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -623,9 +626,8 @@ def test_exporter_requirements_txt_with_standard_packages_and_hashes_disabled( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export( - "requirements.txt", Path(tmp_dir), "requirements.txt", with_hashes=False - ) + exporter.with_hashes(False) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -713,7 +715,8 @@ def test_exporter_exports_requirements_txt_with_dev_packages_if_opted_in( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True) + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -759,7 +762,8 @@ def test_exporter_exports_requirements_txt_without_optional_packages( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True) + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -844,13 +848,13 @@ def test_exporter_exports_requirements_txt_with_optional_packages( set_package_requires(poetry) exporter = Exporter(poetry) + exporter.only_groups(["default", "dev"]) + exporter.with_hashes(False) + exporter.with_extras(extras) exporter.export( "requirements.txt", Path(tmp_dir), "requirements.txt", - dev=True, - with_hashes=False, - extras=extras, ) with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: @@ -1063,9 +1067,8 @@ def test_exporter_can_export_requirements_txt_with_nested_packages_and_multiple_ set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export( - "requirements.txt", Path(tmp_dir), "requirements.txt", with_hashes=False - ) + exporter.with_hashes(False) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1409,7 +1412,8 @@ def test_exporter_exports_requirements_txt_with_legacy_packages( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True) + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1466,9 +1470,9 @@ def test_exporter_exports_requirements_txt_with_url_false(tmp_dir: str, poetry: set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export( - "requirements.txt", Path(tmp_dir), "requirements.txt", dev=True, with_urls=False - ) + exporter.only_groups(["default", "dev"]) + exporter.with_urls(False) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1517,7 +1521,8 @@ def test_exporter_exports_requirements_txt_with_legacy_packages_trusted_host( ) set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True) + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1599,7 +1604,9 @@ def test_exporter_exports_requirements_txt_with_dev_extras( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=dev) + if dev: + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1672,7 +1679,8 @@ def test_exporter_exports_requirements_txt_with_legacy_packages_and_duplicate_so set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True) + exporter.only_groups(["default", "dev"]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: content = f.read() @@ -1737,12 +1745,12 @@ def test_exporter_exports_requirements_txt_with_legacy_packages_and_credentials( set_package_requires(poetry) exporter = Exporter(poetry) + exporter.only_groups(["default", "dev"]) + exporter.with_credentials() exporter.export( "requirements.txt", Path(tmp_dir), "requirements.txt", - dev=True, - with_credentials=True, ) with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: @@ -1761,7 +1769,7 @@ def test_exporter_exports_requirements_txt_with_legacy_packages_and_credentials( def test_exporter_exports_requirements_txt_to_standard_output( - tmp_dir: str, poetry: Poetry, capsys: CaptureFixture + tmp_dir: str, poetry: Poetry ): poetry.locker.mock_lock_data( { @@ -1791,20 +1799,18 @@ def test_exporter_exports_requirements_txt_to_standard_output( set_package_requires(poetry) exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), sys.stdout) + io = BufferedIO() + exporter.export("requirements.txt", Path(tmp_dir), io) - out, err = capsys.readouterr() expected = f"""\ bar==4.5.6 ; {MARKER_PY} foo==1.2.3 ; {MARKER_PY} """ - assert out == expected + assert io.fetch_output() == expected -def test_exporter_doesnt_confuse_repeated_packages( - tmp_dir: str, poetry: Poetry, capsys: CaptureFixture -): +def test_exporter_doesnt_confuse_repeated_packages(tmp_dir: str, poetry: Poetry): # Testcase derived from . poetry.locker.mock_lock_data( { @@ -1905,9 +1911,10 @@ def test_exporter_doesnt_confuse_repeated_packages( poetry._package = root exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), sys.stdout) + exporter.only_groups(["default", "dev"]) + io = BufferedIO() + exporter.export("requirements.txt", Path(tmp_dir), io) - out, err = capsys.readouterr() expected = f"""\ celery==5.1.2 ; {MARKER_PY36_ONLY} celery==5.2.3 ; {MARKER_PY37} @@ -1918,12 +1925,10 @@ def test_exporter_doesnt_confuse_repeated_packages( click==8.0.3 ; {MARKER_PY37.union(MARKER_PY37_PY400)} """ - assert out == expected + assert io.fetch_output() == expected -def test_exporter_handles_extras_next_to_non_extras( - tmp_dir: str, poetry: Poetry, capsys: CaptureFixture -): +def test_exporter_handles_extras_next_to_non_extras(tmp_dir: str, poetry: Poetry): # Testcase similar to the solver testcase added at #5305. poetry.locker.mock_lock_data( { @@ -2019,9 +2024,9 @@ def test_exporter_handles_extras_next_to_non_extras( poetry._package = root exporter = Exporter(poetry) - exporter.export("requirements.txt", Path(tmp_dir), sys.stdout) + io = BufferedIO() + exporter.export("requirements.txt", Path(tmp_dir), io) - out, err = capsys.readouterr() expected = f"""\ localstack-ext==1.0.0 ; {MARKER_PY36} localstack==1.0.0 ; {MARKER_PY36} @@ -2029,4 +2034,4 @@ def test_exporter_handles_extras_next_to_non_extras( something==1.0.0 ; {MARKER_PY36} """ - assert out == expected + assert io.fetch_output() == expected From 8a706698efda8c02df78d30017b77938f3eef869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 9 Apr 2022 23:51:47 +0200 Subject: [PATCH 04/14] fix: get_project_dependency_packages has to be called with dev=True (packages are filtered by including/excluding groups of the root package) --- src/poetry_plugin_export/exporter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index 562aad5..d1c2bb1 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -109,6 +109,7 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: for dependency_package in self._poetry.locker.get_project_dependency_packages( project_requires=root_package.all_requires, project_python_marker=root_package.python_marker, + dev=True, extras=self._extras, ): line = "" From 727326216e898bd6b8982435a70cf7af7ff77d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 9 Apr 2022 23:52:51 +0200 Subject: [PATCH 05/14] simplifications --- src/poetry_plugin_export/exporter.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index d1c2bb1..e894593 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -98,17 +98,9 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: ops = solver.solve().calculate_operations() packages = sorted((op.package for op in ops), key=lambda pkg: pkg.name) - # Get project dependencies. - if self._groups is not None: - root_package = self._poetry.package.with_dependency_groups( - list(self._groups), only=True - ) - else: - root_package = self._poetry.package.without_optional_dependency_groups() - for dependency_package in self._poetry.locker.get_project_dependency_packages( - project_requires=root_package.all_requires, - project_python_marker=root_package.python_marker, + project_requires=root.all_requires, + project_python_marker=root.python_marker, dev=True, extras=self._extras, ): @@ -162,11 +154,9 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: hashes.append(f"{algorithm}:{h}") - if hashes: - line += " \\\n" - for i, h in enumerate(hashes): - suffix = " \\\n" if i < len(hashes) - 1 else "" - line += f" --hash={h}{suffix}" + for h in hashes: + line += f" \\\n --hash={h}" + dependency_lines.add(line) content += "\n".join(sorted(dependency_lines)) From 4154d7b9c439212abd98ba4ce1b37dedd4cd04a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sun, 10 Apr 2022 00:03:33 +0200 Subject: [PATCH 06/14] prefer actual-expected order in tests --- tests/command/test_command_export.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/command/test_command_export.py b/tests/command/test_command_export.py index 9ceec95..3df7d29 100644 --- a/tests/command/test_command_export.py +++ b/tests/command/test_command_export.py @@ -88,7 +88,7 @@ def _export_requirements(tester: CommandTester, poetry: Poetry) -> None: foo==1.0.0 ; {MARKER_PY} """ - assert expected == content + assert content == expected def test_export_exports_requirements_txt_file_locks_if_no_lock_file( @@ -116,7 +116,7 @@ def test_export_prints_to_stdout_by_default(tester: CommandTester, do_lock: None expected = f"""\ foo==1.0.0 ; {MARKER_PY} """ - assert expected == tester.io.fetch_output() + assert tester.io.fetch_output() == expected def test_export_uses_requirements_txt_format_by_default( @@ -126,7 +126,7 @@ def test_export_uses_requirements_txt_format_by_default( expected = f"""\ foo==1.0.0 ; {MARKER_PY} """ - assert expected == tester.io.fetch_output() + assert tester.io.fetch_output() == expected def test_export_includes_extras_by_flag(tester: CommandTester, do_lock: None): @@ -135,7 +135,7 @@ def test_export_includes_extras_by_flag(tester: CommandTester, do_lock: None): bar==1.1.0 ; {MARKER_PY} foo==1.0.0 ; {MARKER_PY} """ - assert expected == tester.io.fetch_output() + assert tester.io.fetch_output() == expected def test_export_with_urls( From 1ee643ab6127892a9c204c86f26d9b7107599eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sun, 10 Apr 2022 13:21:42 +0200 Subject: [PATCH 07/14] restore default behavior of exporter (export only "default" group instead of all non-optional dependencies) --- src/poetry_plugin_export/exporter.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index e894593..8f8ae72 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -78,12 +78,9 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: content = "" dependency_lines = set() - if self._groups is not None: - root = self._poetry.package.with_dependency_groups( - list(self._groups), only=True - ) - else: - root = self._poetry.package.without_optional_dependency_groups() + root = self._poetry.package.with_dependency_groups( + list(self._groups or ["default"]), only=True + ) locked_repository = self._poetry.locker.locked_repository(True) From 3d72943a862cc7aa93dad61981e8a3b9a689b6ea Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Mon, 11 Apr 2022 00:35:51 +0200 Subject: [PATCH 08/14] Update src/poetry_plugin_export/exporter.py --- src/poetry_plugin_export/exporter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index 8f8ae72..8ca5feb 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -98,7 +98,6 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: for dependency_package in self._poetry.locker.get_project_dependency_packages( project_requires=root.all_requires, project_python_marker=root.python_marker, - dev=True, extras=self._extras, ): line = "" From 1a5b93427e31715ccfa817b5fe606cdd0db3f25a Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Mon, 11 Apr 2022 00:41:57 +0200 Subject: [PATCH 09/14] Update poetry.lock --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 8513910..026ec87 100644 --- a/poetry.lock +++ b/poetry.lock @@ -373,7 +373,7 @@ virtualenv = "(>=20.4.3,<20.4.5 || >=20.4.7)" type = "git" url = "https://github.com/abn/poetry.git" reference = "use-export-plugin" -resolved_reference = "aee5e054cb9978dc4908a8715a8c85a98a209b58" +resolved_reference = "642775bf9c7ad2ac74e9495fd8290525bb9060c9" [[package]] name = "poetry-core" From 2c033aa4244cd7a493279e939d06eaa681531a8e Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Mon, 11 Apr 2022 00:46:16 +0200 Subject: [PATCH 10/14] tests: remove use of with_dev_reqs parameter --- tests/test_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_exporter.py b/tests/test_exporter.py index d2202a0..433dcd6 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -90,7 +90,7 @@ def poetry(fixture_dir: FixtureDirGetter, locker: Locker) -> Poetry: def set_package_requires(poetry: Poetry, skip: set[str] | None = None) -> None: skip = skip or set() - packages = poetry.locker.locked_repository(with_dev_reqs=True).packages + packages = poetry.locker.locked_repository().packages package = poetry.package.with_dependency_groups([], only=True) for pkg in packages: if pkg.name not in skip: From 5df1ab8ff9bb02d46c9fc382e7a6ec1a7378f4fc Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Mon, 11 Apr 2022 00:54:37 +0200 Subject: [PATCH 11/14] exporter: remove with_dev_reqs usage --- src/poetry_plugin_export/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index 8ca5feb..877ccde 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -82,7 +82,7 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: list(self._groups or ["default"]), only=True ) - locked_repository = self._poetry.locker.locked_repository(True) + locked_repository = self._poetry.locker.locked_repository() pool = Pool(ignore_repository_names=True) pool.add_repository(locked_repository) From 37e3183e11a207ed419a56a766c2b09365561bfd Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Mon, 11 Apr 2022 09:57:28 +0200 Subject: [PATCH 12/14] tests: fix nested package lock data --- tests/test_exporter.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_exporter.py b/tests/test_exporter.py index 433dcd6..a436ddc 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -930,7 +930,12 @@ def test_exporter_can_export_requirements_txt_with_nested_packages( "category": "main", "optional": False, "python-versions": "*", - "dependencies": {"foo": "rev 123456"}, + "dependencies": { + "foo": { + "git": "https://github.com/foo/foo.git", + "rev": "123456", + } + }, }, ], "metadata": { From 14180c7a7184b1e4494e0600ac128008b8d53182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:42:17 +0200 Subject: [PATCH 13/14] exporter: fix special case "export nothing" --- src/poetry_plugin_export/exporter.py | 4 +-- tests/test_exporter.py | 40 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index 877ccde..dff0bbb 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -30,7 +30,7 @@ def __init__(self, poetry: Poetry) -> None: self._with_credentials = False self._with_urls = True self._extras: list[str] = [] - self._groups: Iterable[str] | None = None + self._groups: Iterable[str] = ["default"] @classmethod def is_format_supported(cls, fmt: str) -> bool: @@ -79,7 +79,7 @@ def _export_requirements_txt(self, cwd: Path, output: IO | str) -> None: dependency_lines = set() root = self._poetry.package.with_dependency_groups( - list(self._groups or ["default"]), only=True + list(self._groups), only=True ) locked_repository = self._poetry.locker.locked_repository() diff --git a/tests/test_exporter.py b/tests/test_exporter.py index a436ddc..e512079 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -731,6 +731,46 @@ def test_exporter_exports_requirements_txt_with_dev_packages_if_opted_in( assert content == expected +def test_exporter_exports_requirements_txt_without_groups_if_set_explicity( + tmp_dir: str, poetry: Poetry +): + poetry.locker.mock_lock_data( + { + "package": [ + { + "name": "foo", + "version": "1.2.3", + "category": "main", + "optional": False, + "python-versions": "*", + }, + { + "name": "bar", + "version": "4.5.6", + "category": "dev", + "optional": False, + "python-versions": "*", + }, + ], + "metadata": { + "python-versions": "*", + "content-hash": "123456789", + "hashes": {"foo": ["12345"], "bar": ["67890"]}, + }, + } + ) + set_package_requires(poetry) + + exporter = Exporter(poetry) + exporter.only_groups([]) + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") + + with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: + content = f.read() + + assert content == "\n" + + def test_exporter_exports_requirements_txt_without_optional_packages( tmp_dir: str, poetry: Poetry ): From f927b849a64d98d7829328fb6be77f2e71ae47ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:45:08 +0200 Subject: [PATCH 14/14] command: restore default behavior, consistent behavior for --with/--without, tests --- src/poetry_plugin_export/command.py | 4 +++ tests/command/test_command_export.py | 39 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/poetry_plugin_export/command.py b/src/poetry_plugin_export/command.py index 150c86d..5cf81b0 100644 --- a/src/poetry_plugin_export/command.py +++ b/src/poetry_plugin_export/command.py @@ -41,6 +41,10 @@ class ExportCommand(InstallerCommand): option("with-credentials", None, "Include credentials for extra indices."), ] + @property + def non_optional_groups(self) -> set[str]: + return {"default"} + def handle(self) -> None: fmt = self.option("format") diff --git a/tests/command/test_command_export.py b/tests/command/test_command_export.py index 3df7d29..848d3cf 100644 --- a/tests/command/test_command_export.py +++ b/tests/command/test_command_export.py @@ -50,6 +50,16 @@ foo = "^1.0" bar = { version = "^1.1", optional = true } +[tool.poetry.group.dev.dependencies] +baz = "^2.0" + +[tool.poetry.group.opt] +optional = true + +[tool.poetry.group.opt.dependencies] +opt = "^2.2" + + [tool.poetry.extras] feature_bar = ["bar"] """ @@ -59,6 +69,8 @@ def setup(repo: Repository) -> None: repo.add_package(Package("foo", "1.0.0")) repo.add_package(Package("bar", "1.1.0")) + repo.add_package(Package("baz", "2.0.0")) + repo.add_package(Package("opt", "2.2.0")) @pytest.fixture @@ -129,6 +141,33 @@ def test_export_uses_requirements_txt_format_by_default( assert tester.io.fetch_output() == expected +@pytest.mark.parametrize( + "options, expected", + [ + ("", f"foo==1.0.0 ; {MARKER_PY}\n"), + ("--with dev", f"baz==2.0.0 ; {MARKER_PY}\nfoo==1.0.0 ; {MARKER_PY}\n"), + ("--with opt", f"foo==1.0.0 ; {MARKER_PY}\nopt==2.2.0 ; {MARKER_PY}\n"), + ( + "--with dev,opt", + f"baz==2.0.0 ; {MARKER_PY}\nfoo==1.0.0 ; {MARKER_PY}\nopt==2.2.0 ;" + f" {MARKER_PY}\n", + ), + ("--without default", "\n"), + ("--without dev", f"foo==1.0.0 ; {MARKER_PY}\n"), + ("--without opt", f"foo==1.0.0 ; {MARKER_PY}\n"), + ("--without default,dev,opt", "\n"), + ("--only default", f"foo==1.0.0 ; {MARKER_PY}\n"), + ("--only dev", f"baz==2.0.0 ; {MARKER_PY}\n"), + ("--only default,dev", f"baz==2.0.0 ; {MARKER_PY}\nfoo==1.0.0 ; {MARKER_PY}\n"), + ], +) +def test_export_groups( + tester: CommandTester, do_lock: None, options: str, expected: str +): + tester.execute(options) + assert tester.io.fetch_output() == expected + + def test_export_includes_extras_by_flag(tester: CommandTester, do_lock: None): tester.execute("--format requirements.txt --extras feature_bar") expected = f"""\