diff options
-rw-r--r-- | isort/finders.py | 23 | ||||
-rwxr-xr-x | setup.py | 2 | ||||
-rw-r--r-- | test_isort.py | 7 | ||||
-rw-r--r-- | tox.ini | 5 |
4 files changed, 33 insertions, 4 deletions
diff --git a/isort/finders.py b/isort/finders.py index 433abdf6..444f9eed 100644 --- a/isort/finders.py +++ b/isort/finders.py @@ -2,6 +2,7 @@ """ from __future__ import absolute_import, division, print_function, unicode_literals +import inspect import os import os.path import re @@ -13,6 +14,10 @@ from glob import glob from .pie_slice import PY2 from .utils import exists_case_sensitive +try: + from pipreqs import pipreqs +except ImportError: + pipreqs = None try: # pip>=10 @@ -172,6 +177,17 @@ class RequirementsFinder(BaseFinder): def __init__(self, config, sections, path='.'): super(RequirementsFinder, self).__init__(config, sections) self.path = path + self.mapping = self._load_mapping() + + @staticmethod + def _load_mapping(): + if not pipreqs: + return + path = os.path.dirname(inspect.getfile(pipreqs)) + path = os.path.join(path, 'mapping') + with open(path, "r") as f: + # pypi_name: import_name + return dict(line.strip().split(":")[::-1] for line in f) def _get_files(self): for fname in os.listdir(self.path): @@ -190,6 +206,11 @@ class RequirementsFinder(BaseFinder): if req.name: yield req.name + def _normalize_name(self, name): + if not self.mapping: + return name.lower() + return self.mapping.get(name, name).lower() + def find(self, module_name): # pip not installed yet if not parse_requirements: @@ -202,7 +223,7 @@ class RequirementsFinder(BaseFinder): for path in self._get_files(): for name in self._get_names(path): - if module_name == name.lower(): + if module_name == self._normalize_name(name): return self.sections.THIRDPARTY @@ -57,7 +57,7 @@ setup(name='isort', extra_requires={ 'requirements': ['pip', 'pipreqs'], 'pipfile': ['pip', 'requirementslib'], - } + }, install_requires=['futures; python_version < "3.2"'], python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", cmdclass={'test': PyTest}, diff --git a/test_isort.py b/test_isort.py index de0e9b8b..b22afabe 100644 --- a/test_isort.py +++ b/test_isort.py @@ -2485,10 +2485,15 @@ def test_requirements_finder(tmpdir): files = list(finder._get_files()) assert len(files) == 1 # file finding assert files[0].endswith('requirements.txt') # file finding - assert list(finder._get_names(str(req_file))) == ['Django', 'deal'] # file parsing + assert list(finder._get_names(str(req_file))) == ['Django', 'deal'] # file parsing assert finder.find("django") == si.sections.THIRDPARTY # package in reqs assert finder.find("flask") is None # package not in reqs assert finder.find("deal") == si.sections.THIRDPARTY # vcs + assert len(finder.mapping) > 100 + assert finder._normalize_name('deal') == 'deal' + assert finder._normalize_name('Django') == 'django' # lowercase + assert finder._normalize_name('django_haystack') == 'haystack' # mapping + req_file.remove() @@ -5,7 +5,10 @@ envlist = lint [testenv] -deps = pytest +deps = + pytest + pip + pipreqs commands = py.test test_isort.py {posargs} [testenv:isort-check] |