Commit a2f9aec5 by Sébastien Eustace

Fix optional dependencies being set as required in sdist

parent 601652a3
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
### Fixed ### Fixed
- Fixed Python version retrieval inside virtualenvs. - Fixed Python version retrieval inside virtualenvs.
- Fixed optional dependencies being set as required in sdist.
## [0.6.3] - 2018-03-20 ## [0.6.3] - 2018-03-20
......
...@@ -130,7 +130,10 @@ class SdistBuilder(Builder): ...@@ -130,7 +130,10 @@ class SdistBuilder(Builder):
else: else:
extra.append("'py_modules': {!r},".format(self._module.name)) extra.append("'py_modules': {!r},".format(self._module.name))
dependencies, extras = self.convert_dependencies(self._package.requires) dependencies, extras = self.convert_dependencies(
self._package,
self._package.requires
)
if dependencies: if dependencies:
before.append("install_requires = \\\n{}\n".format(pformat(dependencies))) before.append("install_requires = \\\n{}\n".format(pformat(dependencies)))
extra.append("'install_requires': install_requires,") extra.append("'install_requires': install_requires,")
...@@ -213,19 +216,23 @@ class SdistBuilder(Builder): ...@@ -213,19 +216,23 @@ class SdistBuilder(Builder):
@classmethod @classmethod
def convert_dependencies(cls, def convert_dependencies(cls,
package,
dependencies: List[Dependency]): dependencies: List[Dependency]):
main = [] main = []
extras = [] extras = defaultdict(list)
for dependency in dependencies: for dependency in dependencies:
requirement = dependency.to_pep_508() if dependency.is_optional():
for extra_name, reqs in package.extras.items():
for req in reqs:
if req.name == dependency.name:
extras[extra_name].append(dependency.to_pep_508())
continue
if ';' in requirement: requirement = dependency.to_pep_508()
extras.append(requirement) main.append(requirement)
else:
main.append(requirement)
return main, extras return main, dict(extras)
@classmethod @classmethod
def clean_tarinfo(cls, tar_info): def clean_tarinfo(cls, tar_info):
......
...@@ -21,9 +21,13 @@ keywords = ["packaging", "dependency", "poetry"] ...@@ -21,9 +21,13 @@ keywords = ["packaging", "dependency", "poetry"]
python = "^3.6" python = "^3.6"
cleo = "^0.6" cleo = "^0.6"
pendulum = { version = "^1.4", optional = true }
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "~3.4" pytest = "~3.4"
[tool.poetry.extras]
time = ["pendulum"]
[tool.poetry.scripts] [tool.poetry.scripts]
my-script = "my_package:main" my-script = "my_package:main"
......
...@@ -8,6 +8,7 @@ from pathlib import Path ...@@ -8,6 +8,7 @@ from pathlib import Path
from poetry import Poetry from poetry import Poetry
from poetry.io import NullIO from poetry.io import NullIO
from poetry.masonry.builders.sdist import SdistBuilder from poetry.masonry.builders.sdist import SdistBuilder
from poetry.packages import Package
from poetry.utils.venv import NullVenv from poetry.utils.venv import NullVenv
from tests.helpers import get_dependency from tests.helpers import get_dependency
...@@ -36,35 +37,44 @@ def project(name): ...@@ -36,35 +37,44 @@ def project(name):
def test_convert_dependencies(): def test_convert_dependencies():
result = SdistBuilder.convert_dependencies([ package = Package('foo', '1.2.3')
get_dependency('A', '^1.0'), result = SdistBuilder.convert_dependencies(
get_dependency('B', '~1.0'), package,
get_dependency('C', '1.2.3'), [
]) get_dependency('A', '^1.0'),
get_dependency('B', '~1.0'),
get_dependency('C', '1.2.3'),
]
)
main = [ main = [
'A (>=1.0.0.0,<2.0.0.0)', 'A (>=1.0.0.0,<2.0.0.0)',
'B (>=1.0.0.0,<1.1.0.0)', 'B (>=1.0.0.0,<1.1.0.0)',
'C (==1.2.3.0)', 'C (==1.2.3.0)',
] ]
extras = [] extras = {}
assert result == (main, extras) assert result == (main, extras)
dependency_with_python = get_dependency('A', '^1.0') package = Package('foo', '1.2.3')
dependency_with_python.python_versions = '^3.4' package.extras = {
'bar': [get_dependency('A')]
}
result = SdistBuilder.convert_dependencies([ result = SdistBuilder.convert_dependencies(
dependency_with_python, package,
get_dependency('B', '~1.0'), [
get_dependency('C', '1.2.3'), get_dependency('A', '>=1.2', optional=True),
]) get_dependency('B', '~1.0'),
get_dependency('C', '1.2.3'),
]
)
main = [ main = [
'B (>=1.0.0.0,<1.1.0.0)', 'B (>=1.0.0.0,<1.1.0.0)',
'C (==1.2.3.0)', 'C (==1.2.3.0)',
] ]
extras = [ extras = {
'A (>=1.0.0.0,<2.0.0.0); python_version>="3.4.0.0" and python_version<"4.0.0.0"', 'bar': ['A (>=1.2.0.0)']
] }
assert result == (main, extras) assert result == (main, extras)
...@@ -93,6 +103,11 @@ def test_make_setup(): ...@@ -93,6 +103,11 @@ def test_make_setup():
'my-2nd-script = my_package:main2', 'my-2nd-script = my_package:main2',
] ]
} }
assert ns['extras_require'] == {
'time': [
'pendulum (>=1.4.0.0,<2.0.0.0)'
]
}
def test_find_files_to_add(): def test_find_files_to_add():
......
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