summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isort/finders.py23
-rwxr-xr-xsetup.py2
-rw-r--r--test_isort.py7
-rw-r--r--tox.ini5
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
diff --git a/setup.py b/setup.py
index 1da87643..5a6a4faf 100755
--- a/setup.py
+++ b/setup.py
@@ -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()
diff --git a/tox.ini b/tox.ini
index f9a3226c..817908af 100644
--- a/tox.ini
+++ b/tox.ini
@@ -5,7 +5,10 @@ envlist =
lint
[testenv]
-deps = pytest
+deps =
+ pytest
+ pip
+ pipreqs
commands = py.test test_isort.py {posargs}
[testenv:isort-check]