Commit c824c630 by Sébastien Eustace

Add the script command

parent 0f25e1b5
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
- Added the `version` command to automatically bump the package's version. - Added the `version` command to automatically bump the package's version.
- Added a standalone installer to install `poetry` isolated. - Added a standalone installer to install `poetry` isolated.
- Added support for classifiers in `pyproject.toml`. - Added support for classifiers in `pyproject.toml`.
- Added the `script` command.
### Changed ### Changed
......
...@@ -253,6 +253,25 @@ poetry run python -V ...@@ -253,6 +253,25 @@ poetry run python -V
Note that this command has no option. Note that this command has no option.
## script
The `script` executes one of the scripts defined in `pyproject.toml`.
So, if you have a script defined like this:
```toml
[tool.poetry.scripts]
my-script = "my_module:main"
```
You can execute it like so:
```bash
poetry script my-script
```
Note that this command has no option.
## check ## check
The `check` command validate the structure of the `pyproject.toml` file The `check` command validate the structure of the `pyproject.toml` file
......
...@@ -19,6 +19,7 @@ from .commands import NewCommand ...@@ -19,6 +19,7 @@ from .commands import NewCommand
from .commands import PublishCommand from .commands import PublishCommand
from .commands import RemoveCommand from .commands import RemoveCommand
from .commands import RunCommand from .commands import RunCommand
from .commands import ScriptCommand
from .commands import ShowCommand from .commands import ShowCommand
from .commands import UpdateCommand from .commands import UpdateCommand
from .commands import VersionCommand from .commands import VersionCommand
...@@ -57,7 +58,7 @@ class Application(BaseApplication): ...@@ -57,7 +58,7 @@ class Application(BaseApplication):
o = ConsoleOutput() o = ConsoleOutput()
name = i.get_first_argument() name = i.get_first_argument()
if name == 'run': if name in ['run', 'script']:
self._skip_io_configuration = True self._skip_io_configuration = True
i = RawArgvInput() i = RawArgvInput()
...@@ -66,7 +67,7 @@ class Application(BaseApplication): ...@@ -66,7 +67,7 @@ class Application(BaseApplication):
def do_run(self, i, o): def do_run(self, i, o):
name = self.get_command_name(i) name = self.get_command_name(i)
if name != 'run': if name not in ['run', 'script']:
return super().do_run(i, o) return super().do_run(i, o)
command = self.find(name) command = self.find(name)
...@@ -98,6 +99,7 @@ class Application(BaseApplication): ...@@ -98,6 +99,7 @@ class Application(BaseApplication):
PublishCommand(), PublishCommand(),
RemoveCommand(), RemoveCommand(),
RunCommand(), RunCommand(),
ScriptCommand(),
ShowCommand(), ShowCommand(),
UpdateCommand(), UpdateCommand(),
VersionCommand(), VersionCommand(),
......
...@@ -9,6 +9,7 @@ from .new import NewCommand ...@@ -9,6 +9,7 @@ from .new import NewCommand
from .publish import PublishCommand from .publish import PublishCommand
from .remove import RemoveCommand from .remove import RemoveCommand
from .run import RunCommand from .run import RunCommand
from .script import ScriptCommand
from .show import ShowCommand from .show import ShowCommand
from .update import UpdateCommand from .update import UpdateCommand
from .version import VersionCommand from .version import VersionCommand
import sys
from .venv_command import VenvCommand
class ScriptCommand(VenvCommand):
"""
Executes a script defined in <comment>pyproject.toml</comment>
script
{ script-name : The name of the script to execute }
{ args?* : The command and arguments/options to pass to the script. }
"""
def handle(self):
script = self.argument('script-name')
argv = [script] + self.argument('args')
scripts = self.poetry.config.get('scripts')
if not scripts:
raise RuntimeError('No scripts defined in pyproject.toml')
if script not in scripts:
raise ValueError('Script {} is not defined'.format(script))
module, callable_ = scripts[script].split(':')
cmd = ['python', '-c']
cmd += [
'"import sys; '
'from importlib import import_module; '
'sys.argv = {!r}; '
'import_module(\'{}\').{}()"'.format(
argv, module, callable_
)
]
self.venv.run(*cmd, shell=True, call=True)
def merge_application_definition(self, merge_args=True):
if self._application is None \
or (self._application_definition_merged
and (self._application_definition_merged_with_args or not merge_args)):
return
if merge_args:
current_arguments = self._definition.get_arguments()
self._definition.set_arguments(self._application.get_definition().get_arguments())
self._definition.add_arguments(current_arguments)
self._application_definition_merged = True
if merge_args:
self._application_definition_merged_with_args = True
...@@ -15,8 +15,6 @@ class Locker: ...@@ -15,8 +15,6 @@ class Locker:
_relevant_keys = [ _relevant_keys = [
'name', 'name',
'version', 'version',
'python-versions',
'platform',
'dependencies', 'dependencies',
'dev-dependencies', 'dev-dependencies',
'source', 'source',
......
...@@ -201,18 +201,25 @@ class Venv: ...@@ -201,18 +201,25 @@ class Venv:
return value return value
def run(self, bin: str, *args, **kwargs) -> str: def run(self, bin: str, *args, **kwargs):
""" """
Run a command inside the virtual env. Run a command inside the virtual env.
""" """
cmd = [bin] + list(args) cmd = [bin] + list(args)
shell = kwargs.get('shell', False) shell = kwargs.get('shell', False)
call = kwargs.pop('call', False)
if shell: if shell:
cmd = ' '.join(cmd) cmd = ' '.join(cmd)
try: try:
if not self.is_venv(): if not self.is_venv():
if call:
return subprocess.call(
cmd, stderr=subprocess.STDOUT,
**kwargs
)
output = subprocess.check_output( output = subprocess.check_output(
cmd, stderr=subprocess.STDOUT, cmd, stderr=subprocess.STDOUT,
**kwargs **kwargs
...@@ -228,6 +235,12 @@ class Venv: ...@@ -228,6 +235,12 @@ class Venv:
self.unset_env('PYTHONHOME') self.unset_env('PYTHONHOME')
self.unset_env('__PYVENV_LAUNCHER__') self.unset_env('__PYVENV_LAUNCHER__')
if call:
return subprocess.call(
cmd, stderr=subprocess.STDOUT,
**kwargs
)
output = subprocess.check_output( output = subprocess.check_output(
cmd, stderr=subprocess.STDOUT, cmd, stderr=subprocess.STDOUT,
**kwargs **kwargs
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment