Skip to content

Commit

Permalink
Merge pull request #30 from toabctl/requirement-spaces
Browse files Browse the repository at this point in the history
Requirement spaces
  • Loading branch information
saschpe committed Jul 11, 2015
2 parents a544e32 + 442d221 commit e657319
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 6 deletions.
27 changes: 25 additions & 2 deletions py2pack/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,40 @@ def _run_setup_py(tarfile, setup_filename, data):


def _canonicalize_setup_data(data):
def _sanitize_requirements(req):
""" find lowest required version"""
version_dep = None
version_comp = None
pkg = pkg_resources.Requirement.parse(req)
for dep in pkg.specs:
version = pkg_resources.parse_version(dep[1])
# try to use the lowest version available
# i.e. for ">=0.8.4,>=0.9.7", select "0.8.4"
if (not version_dep or
version < pkg_resources.parse_version(version_dep)):
version_dep = dep[1]
version_comp = dep[0]
return filter(lambda x: x is not None,
[pkg.unsafe_name, version_comp, version_dep])

if "install_requires" in data:
# install_requires may be a string, convert to list of strings:
if isinstance(data["install_requires"], str):
data["install_requires"] = data["install_requires"].splitlines()

# find lowest version and take care of spaces between name and version
data["install_requires"] = [" ".join(_sanitize_requirements(req))
for req in data["install_requires"]]

if "extras_require" in data:
# extras_require value may be a string, convert to list of strings:
for (key, value) in data["extras_require"].items():
if isinstance(value, str):
data["extras_require"][key] = value.splitlines()
# find lowest version and take care of spaces between name and ver
data["extras_require"][key] = [
" ".join(_sanitize_requirements(req))
for req in data["extras_require"][key]]

if "data_files" in data:
# data_files may be a sequence of files without a target directory:
Expand All @@ -172,8 +196,7 @@ def _canonicalize_setup_data(data):
if isinstance(data["entry_points"], str):
data["entry_points"] = pkg_resources.EntryPoint.parse_map(data["entry_points"])
if "console_scripts" in data["entry_points"]:
data["console_scripts"] = [
i[:i.index(" = ")] for i in data["entry_points"]["console_scripts"]]
data["console_scripts"] = data["entry_points"]["console_scripts"].keys()


def _augment_data_from_tarball(args, filename, data):
Expand Down
4 changes: 0 additions & 4 deletions py2pack/templates/opensuse.spec
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ Group: Development/Languages/Python
Source: {{ source_url|replace(version, '%{version}') }}
BuildRequires: python-devel {%- if requires_python %} = {{ requires_python }} {% endif %}
BuildRequires: python-setuptools
{%- for req in requires %}
BuildRequires: python-{{ req|replace('(','')|replace(')','') }}
Requires: python-{{ req|replace('(','')|replace(')','') }}
{%- endfor %}
{%- for req in install_requires %}
BuildRequires: python-{{ req|replace('(','')|replace(')','') }}
Requires: python-{{ req|replace('(','')|replace(')','') }}
Expand Down
38 changes: 38 additions & 0 deletions test/test_py2pack.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,41 @@ def test_normalize_license(self, value, expected_result):
d = { 'license': value }
py2pack._normalize_license(d)
self.assertEqual(d['license'], expected_result)

@data(
(
{'install_requires': ['six', 'monotonic>=0.1']},
{'install_requires': ['six', 'monotonic >= 0.1']},
),
(
{'install_requires': ['six', 'foobar>=0.1,>=0.5']},
{'install_requires': ['six', 'foobar >= 0.1']},
),
(
{'install_requires': ['six >=1.9', 'foobar>=0.1,>=0.5']},
{'install_requires': ['six >= 1.9', 'foobar >= 0.1']}
),
(
{'extras_require': {'extra1': ['foobar<=3.0, >= 2.1']}},
{'extras_require': {'extra1': ['foobar >= 2.1']}}
)
)
@unpack
def test_canonicalize_setup_data(self, data, expected_data):
py2pack._canonicalize_setup_data(data)
self.assertEqual(data, expected_data)

@data(
(
{'entry_points': "[console_scripts]\nfoo = foo:main"},
['foo']
),
(
{'entry_points': "[console_scripts]\nfoo = foo:main\n\nbar=abc:xyz"},
['foo', 'bar']
)
)
@unpack
def test_canonicalize_setup_data_console_scripts(self, data, expected_data):
py2pack._canonicalize_setup_data(data)
self.assertEqual(list(data['console_scripts']), expected_data)

0 comments on commit e657319

Please sign in to comment.