diff --git a/poethepoet/app.py b/poethepoet/app.py index fe83b72d..2b5577c3 100644 --- a/poethepoet/app.py +++ b/poethepoet/app.py @@ -90,12 +90,11 @@ def resolve_task(self) -> bool: return True def run_task(self, context: Optional[RunContext] = None) -> Optional[int]: - _, *extra_args = self.ui["task"] if context is None: context = self.get_run_context() try: assert self.task - return self.task.run(context=context, extra_args=extra_args) + return self.task.run(context=context, extra_args=self.ui["task"][1:]) except PoeException as error: self.print_help(error=error) return 1 diff --git a/poethepoet/task/script.py b/poethepoet/task/script.py index 710b1018..3b28e8d1 100644 --- a/poethepoet/task/script.py +++ b/poethepoet/task/script.py @@ -1,4 +1,5 @@ import ast +import re from typing import ( Any, Dict, @@ -104,7 +105,12 @@ def parse_script_content(self, args: Optional[Dict[str, Any]]) -> Tuple[str, str return target_module, f"{target_ref}(**({args}))" return target_module, f"{target_ref}()" - return target_module, resolve_function_call(target_ref, set(args or tuple())) + function_call = resolve_function_call(target_ref, set(args or tuple())) + # Strip out any new lines because they can be problematic on windows + function_call = re.sub(r"((\r\n|\r|\n) | (\r\n|\r|\n))", " ", function_call) + function_call = re.sub(r"(\r\n|\r|\n)", " ", function_call) + + return target_module, function_call @staticmethod def format_args_class( @@ -117,7 +123,7 @@ def format_args_class( if named_args is None: return "" return ( - f'__args=type("{classname}",(object,),' + f'{classname}=type("{classname}",(object,),' "{" + ",".join(f"{name!r}:{value!r}" for name, value in named_args.items()) + "});" diff --git a/poethepoet/virtualenv.py b/poethepoet/virtualenv.py index fe283379..cac23622 100644 --- a/poethepoet/virtualenv.py +++ b/poethepoet/virtualenv.py @@ -30,12 +30,13 @@ def resolve_executable(self, executable: str) -> str: bin_dir = self.bin_dir() if bin_dir.joinpath(executable).is_file(): return str(bin_dir.joinpath(executable)) - if ( - self._is_windows - and not executable.endswith(".exe") - and bin_dir.joinpath(f"{executable}.exe").is_file() - ): - return str(bin_dir.joinpath(f"{executable}.exe")) + if self._is_windows: + if bin_dir.joinpath(f"{executable}.com").is_file(): + return str(bin_dir.joinpath(f"{executable}.com")) + if bin_dir.joinpath(f"{executable}.exe").is_file(): + return str(bin_dir.joinpath(f"{executable}.exe")) + if bin_dir.joinpath(f"{executable}.bat").is_file(): + return str(bin_dir.joinpath(f"{executable}.bat")) return executable @staticmethod diff --git a/pyproject.toml b/pyproject.toml index ab33ab8e..55584e6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ poethepoet = "poethepoet.plugin:PoetryPlugin" htmlcov ./tests/fixtures/simple_project/venv ./tests/fixtures/venv_project/myvenv + ./tests/fixtures/poetry_plugin_project/**/.venv ./tests/temp """ diff --git a/tests/conftest.py b/tests/conftest.py index 6d29b39a..f5767f6d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -207,15 +207,17 @@ def run_poetry(use_venv, poe_project_path): def run_poetry(args: List[str], cwd: str, env: Optional[Dict[str, str]] = None): venv = Virtualenv(venv_location) + + cmd = (venv.resolve_executable("python"), "-m", "poetry", *args) + print("Poetry cmd:", cmd[0]) poetry_proc = Popen( - (venv.resolve_executable("poetry"), *args), + cmd, env=venv.get_env_vars({**os.environ, **(env or {})}), stdout=PIPE, stderr=PIPE, cwd=cwd, ) poetry_out, poetry_err = poetry_proc.communicate() - result = PoeRunResult( code=poetry_proc.returncode, path=cwd, @@ -230,9 +232,7 @@ def run_poetry(args: List[str], cwd: str, env: Optional[Dict[str, str]] = None): venv_location, [ ".[poetry_plugin]", - # TODO: poetry install from a release - "./tests/fixtures/packages/poetry-1.2.0b2.dev0-py3-none-any.whl", - "--pre", + "./tests/fixtures/packages/poetry-1.2.1-py3-none-any.whl", ], require_empty=True, ): diff --git a/tests/fixtures/packages/cowpy-1.1.5-py3-none-any.whl b/tests/fixtures/packages/cowpy-1.1.5-py3-none-any.whl new file mode 100644 index 00000000..28d2b34f Binary files /dev/null and b/tests/fixtures/packages/cowpy-1.1.5-py3-none-any.whl differ diff --git a/tests/fixtures/packages/poetry-1.2.0b2.dev0-py3-none-any.whl b/tests/fixtures/packages/poetry-1.2.0b2.dev0-py3-none-any.whl deleted file mode 100644 index c3298042..00000000 Binary files a/tests/fixtures/packages/poetry-1.2.0b2.dev0-py3-none-any.whl and /dev/null differ diff --git a/tests/fixtures/packages/poetry-1.2.1-py3-none-any.whl b/tests/fixtures/packages/poetry-1.2.1-py3-none-any.whl new file mode 100644 index 00000000..d8f3d614 Binary files /dev/null and b/tests/fixtures/packages/poetry-1.2.1-py3-none-any.whl differ diff --git a/tests/fixtures/packages/python_cowsay-1.0.1-py3-none-any.whl b/tests/fixtures/packages/python_cowsay-1.0.1-py3-none-any.whl deleted file mode 100644 index 4fa02334..00000000 Binary files a/tests/fixtures/packages/python_cowsay-1.0.1-py3-none-any.whl and /dev/null differ diff --git a/tests/fixtures/poetry_plugin_project/deps/cowsay-4.0-py2.py3-none-any.whl b/tests/fixtures/poetry_plugin_project/deps/cowsay-4.0-py2.py3-none-any.whl deleted file mode 100644 index 17c9c1e1..00000000 Binary files a/tests/fixtures/poetry_plugin_project/deps/cowsay-4.0-py2.py3-none-any.whl and /dev/null differ diff --git a/tests/fixtures/poetry_plugin_project/deps/poetry-1.2.0b2.dev0-py3-none-any.whl b/tests/fixtures/poetry_plugin_project/deps/poetry-1.2.0b2.dev0-py3-none-any.whl deleted file mode 100644 index 85e2effe..00000000 Binary files a/tests/fixtures/poetry_plugin_project/deps/poetry-1.2.0b2.dev0-py3-none-any.whl and /dev/null differ diff --git a/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.lock b/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.lock new file mode 100644 index 00000000..db62ca3f --- /dev/null +++ b/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.lock @@ -0,0 +1,35 @@ +[[package]] +name = "cowpy" +version = "1.1.5" +description = "" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.source] +type = "file" +url = "../../packages/cowpy-1.1.5-py3-none-any.whl" + +[[package]] +name = "poe-test-helpers" +version = "0.2.0" +description = "Provides cross platform executables to help with testing" +category = "dev" +optional = false +python-versions = ">=3.7" +develop = false + +[package.source] +type = "directory" +url = "../../packages/poe_test_helpers" + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "94002636f413787b5c4816f3f896ec98cd57abc7c8a9bb8e084a4af1eb6d551c" + +[metadata.files] +cowpy = [ + {file = "cowpy-1.1.5-py3-none-any.whl", hash = "sha256:de5ae7646dd30b4936013666c6bd019af9cf411cc3b377c8538cfd8414262921"}, +] +poe-test-helpers = [] diff --git a/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.toml b/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.toml new file mode 100644 index 00000000..ab1033bd --- /dev/null +++ b/tests/fixtures/poetry_plugin_project/empty_prefix/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/tests/fixtures/poetry_plugin_project/empty_prefix/pyproject.toml b/tests/fixtures/poetry_plugin_project/empty_prefix/pyproject.toml index 9dd7d00f..3d1cab9d 100644 --- a/tests/fixtures/poetry_plugin_project/empty_prefix/pyproject.toml +++ b/tests/fixtures/poetry_plugin_project/empty_prefix/pyproject.toml @@ -8,14 +8,15 @@ authors = ["Nat Noordanus "] python = "^3.7" [tool.poetry.dev-dependencies] -cowsay = "../../packages/python_cowsay-1.0.1-py3-none-any.whl" +cowpy = { path = "../../packages/cowpy-1.1.5-py3-none-any.whl" } +poe_test_helpers = { path = "../../packages/poe_test_helpers" } [tool.poe] poetry_command = "" [tool.poe.tasks] echo = { cmd = "poe_test_echo", help = "It's like echo"} -cow-greet = "cowsay 'good day sir!'" +cow-greet = "cowpy 'good day sir!'" [build-system] requires = ["poetry-core"] diff --git a/tests/fixtures/poetry_plugin_project/poetry.lock b/tests/fixtures/poetry_plugin_project/poetry.lock index 531892f6..8ac48613 100644 --- a/tests/fixtures/poetry_plugin_project/poetry.lock +++ b/tests/fixtures/poetry_plugin_project/poetry.lock @@ -1,18 +1,35 @@ [[package]] -name = "cowsay" -version = "4.0" -description = "The famous cowsay for GNU/Linux is now available for python" +name = "cowpy" +version = "1.1.5" +description = "" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" + +[package.source] +type = "file" +url = "../packages/cowpy-1.1.5-py3-none-any.whl" + +[[package]] +name = "poe-test-helpers" +version = "0.2.0" +description = "Provides cross platform executables to help with testing" +category = "dev" +optional = false +python-versions = ">=3.7" +develop = false + +[package.source] +type = "directory" +url = "../packages/poe_test_helpers" [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "2d0a2b1a347aadbadc1ac311b3a6fb22222d61d1bc110deaf3b3321a0bd15413" +content-hash = "5fa24f3ca30fc90015b8a3d1b0ba6b99711a860a945dce08a64dc9c06dc35c59" [metadata.files] -cowsay = [ - {file = "cowsay-4.0-py2.py3-none-any.whl", hash = "sha256:2594b11d6624fff4bf5147b6bdd510ada54a7b5b4e3f2b15ac2a6d3cf99e0bf8"}, - {file = "cowsay-4.0.tar.gz", hash = "sha256:a9e1e5f957054010b7faa6406deb5f6aa5cb674498118bbbed0151f92c2dc20e"}, +cowpy = [ + {file = "cowpy-1.1.5-py3-none-any.whl", hash = "sha256:de5ae7646dd30b4936013666c6bd019af9cf411cc3b377c8538cfd8414262921"}, ] +poe-test-helpers = [] diff --git a/tests/fixtures/poetry_plugin_project/pyproject.toml b/tests/fixtures/poetry_plugin_project/pyproject.toml index 3a32b53d..7fe5f3c3 100644 --- a/tests/fixtures/poetry_plugin_project/pyproject.toml +++ b/tests/fixtures/poetry_plugin_project/pyproject.toml @@ -8,7 +8,8 @@ authors = ["Nat Noordanus "] python = "^3.7" [tool.poetry.dev-dependencies] -cowsay = "../packages/python_cowsay-1.0.1-py3-none-any.whl" +cowpy = { path = "../packages/cowpy-1.1.5-py3-none-any.whl" } +poe_test_helpers = { path = "../packages/poe_test_helpers" } [tool.poe.poetry_hooks] pre_env_info = "echo 'THIS IS YOUR ENV!'" @@ -16,8 +17,8 @@ post_env_info = "echo 'THAT WAS YOUR ENV!'" [tool.poe.tasks] echo = { cmd = "poe_test_echo", help = "It's like echo"} -cow-greet = "cowsay 'good day sir!'" -cow-cheese.shell = "import cowsay; print(list(cowsay.char_names)[1])" +cow-greet = "cowpy" # Passing args to cowpy doesn't work with subprocess +cow-cheese.shell = "from cowpy import cow; print(list(cow.COWACTERS)[5])" cow-cheese.interpreter = "python" [build-system] diff --git a/tests/test_poetry_plugin.py b/tests/test_poetry_plugin.py index 0543c1a6..fd3ed85e 100644 --- a/tests/test_poetry_plugin.py +++ b/tests/test_poetry_plugin.py @@ -5,13 +5,14 @@ @pytest.fixture(scope="session") def setup_poetry_project(run_poetry, projects): - run_poetry( - ["config", "--local", "virtualenvs.in-project", "true"], - cwd=projects["poetry_plugin"], - ) run_poetry(["install"], cwd=projects["poetry_plugin"]) +@pytest.fixture(scope="session") +def setup_poetry_project_empty_prefix(run_poetry, projects): + run_poetry(["install"], cwd=projects["poetry_plugin/empty_prefix"].parent) + + @pytest.mark.slow @pytest.mark.skipif(version_info < (3, 7), reason="dependencies require python>=3.7") def test_poetry_help(run_poetry, projects): @@ -27,13 +28,20 @@ def test_poetry_help(run_poetry, projects): def test_task_with_cli_dependency( run_poetry, projects, setup_poetry_project, is_windows ): - result = run_poetry(["poe", "cow-greet"], cwd=projects["poetry_plugin"]) + result = run_poetry( + ["poe", "cow-greet", "yo yo yo"], + cwd=projects["poetry_plugin"], + ) if is_windows: - assert result.stdout.startswith("Poe => cowsay 'good day sir!'") - assert "| 'good day sir!' |" in result.stdout + assert result.stdout.startswith("Poe => cowpy yo yo yo") + assert "< yo yo yo >" in result.stdout else: - assert result.stdout.startswith("Poe => cowsay good day sir!") - assert "| good day sir! |" in result.stdout + # On POSIX cowpy expects notices its being called as a subprocess and tries + # unproductively to take input from stdin + assert result.stdout.startswith("Poe => cowpy yo yo yo") + assert ( + "< Cowacter, eyes:default, tongue:False, thoughts:False >" in result.stdout + ) # assert result.stderr == "" @@ -44,7 +52,7 @@ def test_task_with_lib_dependency( ): result = run_poetry(["poe", "cow-cheese"], cwd=projects["poetry_plugin"]) assert result.stdout == ( - "Poe => import cowsay; print(list(cowsay.char_names)[1])\ncheese\n" + "Poe => from cowpy import cow; print(list(cow.COWACTERS)[5])\ncheese\n" ) # assert result.stderr == "" @@ -65,7 +73,7 @@ def test_task_accepts_any_args(run_poetry, projects, setup_poetry_project): @pytest.mark.slow @pytest.mark.skipif(version_info < (3, 7), reason="dependencies require python>=3.7") def test_poetry_help_without_poe_command_prefix( - run_poetry, projects, setup_poetry_project + run_poetry, projects, setup_poetry_project_empty_prefix ): result = run_poetry([], cwd=projects["poetry_plugin/empty_prefix"].parent) assert result.stdout.startswith("Poetry (version ") @@ -77,7 +85,7 @@ def test_poetry_help_without_poe_command_prefix( @pytest.mark.slow @pytest.mark.skipif(version_info < (3, 7), reason="dependencies require python>=3.7") def test_running_tasks_without_poe_command_prefix( - run_poetry, projects, setup_poetry_project + run_poetry, projects, setup_poetry_project_empty_prefix ): result = run_poetry( ["echo", "--lol=:D", "--version", "--help"],