Skip to content

Commit

Permalink
non-package-mode:
Browse files Browse the repository at this point in the history
- metadata like `name` and `version` is not required
- the root package is never installed (same as `--no-root`)
- building and publishing is not possible
  • Loading branch information
radoering committed Nov 11, 2023
1 parent 6f73e9f commit 2f39e51
Show file tree
Hide file tree
Showing 10 changed files with 103 additions and 11 deletions.
4 changes: 4 additions & 0 deletions src/poetry/console/commands/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ class BuildCommand(EnvCommand):
def handle(self) -> int:
from poetry.core.masonry.builder import Builder

if not self.poetry.is_package_mode:
self.line_error("Building a package is not possible in non-package mode.")
return 1

with build_environment(poetry=self.poetry, env=self.env, io=self.io) as env:
fmt = self.option("format") or "all"
package = self.poetry.package
Expand Down
7 changes: 5 additions & 2 deletions src/poetry/console/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ def handle(self) -> int:
if return_code != 0:
return return_code

if self.option("no-root"):
if self.option("no-root") or not self.poetry.is_package_mode:
return 0

log_install = (
Expand Down Expand Up @@ -186,7 +186,10 @@ def handle(self) -> int:
self.line_error(
f"The current project could not be installed: <error>{e}</error>\n"
"If you do not want to install the current project"
" use <c1>--no-root</c1>",
" use <c1>--no-root</c1>.\n"
"If you want to use Poetry only for dependency management"
" and not for packaging, you may also try the non-package mode.\n"
"In a future version of Poetry this warning will become an error!",
style="warning",
)
return 0
Expand Down
4 changes: 4 additions & 0 deletions src/poetry/console/commands/publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ class PublishCommand(Command):
def handle(self) -> int:
from poetry.publishing.publisher import Publisher

if not self.poetry.is_package_mode:
self.line_error("Publishing a package is not possible in non-package mode.")
return 1

publisher = Publisher(self.poetry, self.io)

# Building package first, if told
Expand Down
4 changes: 2 additions & 2 deletions src/poetry/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,9 +370,9 @@ def validate(

dependencies = {canonicalize_name(d) for d in dependencies}

if canonicalize_name(config["name"]) in dependencies:
if (name := config.get("name")) and canonicalize_name(name) in dependencies:
results["errors"].append(
f"Project name ({config['name']}) is same as one of its dependencies"
f"Project name ({name}) is same as one of its dependencies"
)

return results
16 changes: 16 additions & 0 deletions tests/console/commands/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@
from tests.types import FixtureDirGetter


def test_build_not_possible_in_non_package_mode(
fixture_dir: FixtureDirGetter,
command_tester_factory: CommandTesterFactory,
) -> None:
source_dir = fixture_dir("non_package_mode")

poetry = Factory().create_poetry(source_dir)
tester = command_tester_factory("build", poetry)

assert tester.execute() == 1
assert (
tester.io.fetch_error()
== "Building a package is not possible in non-package mode.\n"
)


def test_build_with_multiple_readme_files(
fixture_dir: FixtureDirGetter,
tmp_path: Path,
Expand Down
28 changes: 22 additions & 6 deletions tests/console/commands/test_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import pytest

from poetry.packages import Locker
from poetry.toml import TOMLFile


if TYPE_CHECKING:
Expand Down Expand Up @@ -67,8 +68,6 @@ def test_check_valid(tester: CommandTester) -> None:
def test_check_invalid(
mocker: MockerFixture, tester: CommandTester, fixture_dir: FixtureDirGetter
) -> None:
from poetry.toml import TOMLFile

mocker.patch(
"poetry.poetry.Poetry.file",
return_value=TOMLFile(fixture_dir("invalid_pyproject") / "pyproject.toml"),
Expand Down Expand Up @@ -108,8 +107,27 @@ def test_check_private(
mocker: MockerFixture, tester: CommandTester, fixture_dir: FixtureDirGetter
) -> None:
mocker.patch(
"poetry.factory.Factory.locate",
return_value=fixture_dir("private_pyproject") / "pyproject.toml",
"poetry.poetry.Poetry.file",
return_value=TOMLFile(fixture_dir("private_pyproject") / "pyproject.toml"),
new_callable=mocker.PropertyMock,
)

tester.execute()

expected = """\
All set!
"""

assert tester.io.fetch_output() == expected


def test_check_non_package_mode(
mocker: MockerFixture, tester: CommandTester, fixture_dir: FixtureDirGetter
) -> None:
mocker.patch(
"poetry.poetry.Poetry.file",
return_value=TOMLFile(fixture_dir("non_package_mode") / "pyproject.toml"),
new_callable=mocker.PropertyMock,
)

tester.execute()
Expand All @@ -136,8 +154,6 @@ def test_check_lock_missing(
expected: str,
expected_status: int,
) -> None:
from poetry.toml import TOMLFile

mocker.patch(
"poetry.poetry.Poetry.file",
return_value=TOMLFile(fixture_dir("private_pyproject") / "pyproject.toml"),
Expand Down
19 changes: 18 additions & 1 deletion tests/console/commands/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ def test_install_logs_output_decorated(
assert tester.io.fetch_output() == expected


@pytest.mark.parametrize("with_root", [True])
@pytest.mark.parametrize("with_root", [True, False])
@pytest.mark.parametrize("error", ["module", "readme", ""])
def test_install_warning_corrupt_root(
command_tester_factory: CommandTesterFactory,
Expand Down Expand Up @@ -488,3 +488,20 @@ def test_install_missing_directory_dependency_with_no_directory(
else:
with pytest.raises(ValueError, match="does not exist"):
tester.execute(options)


def test_non_package_mode_does_not_try_to_install_root(
command_tester_factory: CommandTesterFactory,
project_factory: ProjectFactory,
) -> None:
content = """\
[tool.poetry]
mode = "non-package"
"""
poetry = project_factory(name="non-package-mode", pyproject_content=content)

tester = command_tester_factory("install", poetry=poetry)
tester.execute()

assert tester.status_code == 0
assert tester.io.fetch_error() == ""
19 changes: 19 additions & 0 deletions tests/console/commands/test_publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pytest
import requests

from poetry.factory import Factory
from poetry.publishing.uploader import UploadError


Expand All @@ -17,6 +18,24 @@
from pytest_mock import MockerFixture

from tests.helpers import PoetryTestApplication
from tests.types import CommandTesterFactory
from tests.types import FixtureDirGetter


def test_publish_not_possible_in_non_package_mode(
fixture_dir: FixtureDirGetter,
command_tester_factory: CommandTesterFactory,
) -> None:
source_dir = fixture_dir("non_package_mode")

poetry = Factory().create_poetry(source_dir)
tester = command_tester_factory("publish", poetry)

assert tester.execute() == 1
assert (
tester.io.fetch_error()
== "Publishing a package is not possible in non-package mode.\n"
)


def test_publish_returns_non_zero_code_for_upload_errors(
Expand Down
7 changes: 7 additions & 0 deletions tests/fixtures/non_package_mode/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[tool.poetry]
mode = "non-package"

[tool.poetry.dependencies]
python = "^3.8"
cleo = "^0.6"
pendulum = { git = "https://github.com/sdispater/pendulum.git", branch = "2.0" }
6 changes: 6 additions & 0 deletions tests/test_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,12 @@ def test_create_poetry_with_multi_constraints_dependency(
assert len(package.requires) == 2


def test_create_poetry_non_package_mode(fixture_dir: FixtureDirGetter) -> None:
poetry = Factory().create_poetry(fixture_dir("non_package_mode"))

assert not poetry.is_package_mode


def test_poetry_with_default_source_legacy(
fixture_dir: FixtureDirGetter, with_simple_keyring: None
) -> None:
Expand Down

0 comments on commit 2f39e51

Please sign in to comment.