Commit 1da0690c by Sébastien Eustace

Add support for extras in the add command

parent 5db5c925
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
- Added the `cache:clear` command. - Added the `cache:clear` command.
- Added support for `git` dependencies in the `add` command. - Added support for `git` dependencies in the `add` command.
- Added support for `file` dependencies in the `add` command. - Added support for `file` dependencies in the `add` command.
- Added support for extras in the `add` command.
- Added support for `src/` layout for packages. - Added support for `src/` layout for packages.
- Added automatic detection of `.venv` virtualenvs. - Added automatic detection of `.venv` virtualenvs.
......
...@@ -15,6 +15,7 @@ class AddCommand(VenvCommand): ...@@ -15,6 +15,7 @@ class AddCommand(VenvCommand):
{ --D|dev : Add package as development dependency. } { --D|dev : Add package as development dependency. }
{ --git= : The url of the Git repository. } { --git= : The url of the Git repository. }
{ --path= : The path to a dependency. } { --path= : The path to a dependency. }
{ --E|extras=* : Extras to activate for the dependency. }
{ --optional : Add as an optional dependency. } { --optional : Add as an optional dependency. }
{ --allow-prereleases : Accept prereleases. } { --allow-prereleases : Accept prereleases. }
{ --dry-run : Outputs the operations but will not execute anything { --dry-run : Outputs the operations but will not execute anything
...@@ -37,7 +38,7 @@ If you do not specify a version constraint, poetry will choose a suitable one ba ...@@ -37,7 +38,7 @@ If you do not specify a version constraint, poetry will choose a suitable one ba
packages = self.argument('name') packages = self.argument('name')
is_dev = self.option('dev') is_dev = self.option('dev')
if (self.option('git') or self.option('path')) and len(packages) > 1: if (self.option('git') or self.option('path') or self.option('extras')) and len(packages) > 1:
raise ValueError( raise ValueError(
'You can only specify one package ' 'You can only specify one package '
'when using the --git or --path options' 'when using the --git or --path options'
...@@ -99,6 +100,9 @@ If you do not specify a version constraint, poetry will choose a suitable one ba ...@@ -99,6 +100,9 @@ If you do not specify a version constraint, poetry will choose a suitable one ba
if self.option('allow-prereleases'): if self.option('allow-prereleases'):
constraint['allows-prereleases'] = True constraint['allows-prereleases'] = True
if self.option('extras'):
constraint['extras'] = self.option('extras')
if len(constraint) == 1 and 'version' in constraint: if len(constraint) == 1 and 'version' in constraint:
constraint = constraint['version'] constraint = constraint['version']
......
...@@ -46,12 +46,16 @@ class Repository(BaseRepository): ...@@ -46,12 +46,16 @@ class Repository(BaseRepository):
pkg_constraint = Constraint('==', package.version) pkg_constraint = Constraint('==', package.version)
if constraint is None or constraint.matches(pkg_constraint): if constraint is None or constraint.matches(pkg_constraint):
for extra in extras: for dep in package.requires:
if extra in package.extras: for extra in extras:
for dep in package.extras[extra]: if extra not in package.extras:
dep.activate() continue
package.requires += package.extras[extra] reqs = package.extras[extra]
for req in reqs:
if req == dep.name:
dep.activate()
packages.append(package) packages.append(package)
......
...@@ -253,3 +253,53 @@ Writing lock file ...@@ -253,3 +253,53 @@ Writing lock file
assert content['dependencies']['demo'] == { assert content['dependencies']['demo'] == {
'path': '../distributions/demo-0.1.0.tar.gz' 'path': '../distributions/demo-0.1.0.tar.gz'
} }
def test_add_constraint_with_extras(app, repo, installer):
command = app.find('add')
tester = CommandTester(command)
cachy2 = get_package('cachy', '0.2.0')
cachy2.extras = {
'msgpack': ['msgpack-python']
}
msgpack_dep = get_dependency('msgpack-python', '>=0.5 <0.6', optional=True)
cachy2.requires = [
msgpack_dep,
]
repo.add_package(get_package('cachy', '0.1.0'))
repo.add_package(cachy2)
repo.add_package(get_package('msgpack-python', '0.5.3'))
tester.execute([
('command', command.get_name()),
('name', ['cachy=0.2.0']),
('--extras', ['msgpack'])
])
expected = """\
Updating dependencies
Resolving dependencies
Package operations: 2 installs, 0 updates, 0 removals
Writing lock file
- Installing msgpack-python (0.5.3)
- Installing cachy (0.2.0)
"""
assert tester.get_display() == expected
assert len(installer.installs) == 2
content = app.poetry.file.read(raw=True)['tool']['poetry']
assert 'cachy' in content['dependencies']
assert content['dependencies']['cachy'] == {
'version': '0.2.0',
'extras': ['msgpack']
}
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