blob: 614e3317f04ff19724ffed98702ed4c54702d30a [file] [log] [blame]
import importlib.machinery
import os
import posixpath
from pathlib import Path
from unittest.mock import patch
import pytest
from isort import sections, settings
from isort.deprecated import finders
from isort.deprecated.finders import FindersManager
from isort.settings import Config
PIPFILE = """
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[requires]
python_version = "3.5"
[packages]
Django = "~=1.11"
deal = {editable = true, git = "https://github.com/orsinium/deal.git"}
[dev-packages]
"""
class TestFindersManager:
def test_init(self):
assert FindersManager(settings.DEFAULT_CONFIG)
class ExceptionOnInit(finders.BaseFinder):
def __init__(*args, **kwargs):
super().__init__(*args, **kwargs)
raise ValueError("test")
with patch(
"isort.deprecated.finders.FindersManager._default_finders_classes",
FindersManager._default_finders_classes + (ExceptionOnInit,),
):
assert FindersManager(settings.Config(verbose=True))
def test_no_finders(self):
assert FindersManager(settings.DEFAULT_CONFIG, []).find("isort") is None
def test_find_broken_finder(self):
class ExceptionOnFind(finders.BaseFinder):
def find(*args, **kwargs):
raise ValueError("test")
assert (
FindersManager(settings.Config(verbose=True), [ExceptionOnFind]).find("isort") is None
)
class AbstractTestFinder:
kind = finders.BaseFinder
@classmethod
def setup_class(cls):
cls.instance = cls.kind(settings.DEFAULT_CONFIG)
def test_create(self):
assert self.kind(settings.DEFAULT_CONFIG)
def test_find(self):
self.instance.find("isort")
self.instance.find("")
class TestForcedSeparateFinder(AbstractTestFinder):
kind = finders.ForcedSeparateFinder
class TestDefaultFinder(AbstractTestFinder):
kind = finders.DefaultFinder
class TestKnownPatternFinder(AbstractTestFinder):
kind = finders.KnownPatternFinder
class TestLocalFinder(AbstractTestFinder):
kind = finders.LocalFinder
class TestPathFinder(AbstractTestFinder):
kind = finders.PathFinder
def test_conda_and_virtual_env(self, tmpdir):
python3lib = tmpdir.mkdir("lib").mkdir("python3")
python3lib.mkdir("site-packages").mkdir("y")
python3lib.mkdir("n").mkdir("site-packages").mkdir("x")
tmpdir.mkdir("z").join("__init__.py").write("__version__ = '1.0.0'")
tmpdir.chdir()
conda = self.kind(settings.Config(conda_env=str(tmpdir)), str(tmpdir))
venv = self.kind(settings.Config(virtual_env=str(tmpdir)), str(tmpdir))
assert conda.find("y") == venv.find("y") == "THIRDPARTY"
assert conda.find("x") == venv.find("x") == "THIRDPARTY"
assert conda.find("z") == "THIRDPARTY"
assert conda.find("os") == venv.find("os") == "STDLIB"
def test_default_section(self, tmpdir):
tmpdir.join("file.py").write("import b\nimport a\n")
assert self.kind(settings.Config(default_section="CUSTOM"), tmpdir).find("file") == "CUSTOM"
def test_src_paths(self, tmpdir):
tmpdir.join("file.py").write("import b\nimport a\n")
assert (
self.kind(settings.Config(src_paths=[Path(str(tmpdir))]), tmpdir).find("file")
== settings.DEFAULT_CONFIG.default_section
)
class TestPipfileFinder(AbstractTestFinder):
kind = finders.PipfileFinder
class TestRequirementsFinder(AbstractTestFinder):
kind = finders.RequirementsFinder
def test_no_pipreqs(self):
with patch("isort.deprecated.finders.pipreqs", None):
assert not self.kind(settings.DEFAULT_CONFIG).find("isort")
def test_not_enabled(self):
test_finder = self.kind(settings.DEFAULT_CONFIG)
test_finder.enabled = False
assert not test_finder.find("isort")
def test_requirements_dir(self, tmpdir):
tmpdir.mkdir("requirements").join("development.txt").write("x==1.00")
test_finder = self.kind(settings.DEFAULT_CONFIG, str(tmpdir))
assert test_finder.find("x")
def test_requirements_finder(tmpdir) -> None:
subdir = tmpdir.mkdir("subdir").join("lol.txt")
subdir.write("flask")
req_file = tmpdir.join("requirements.txt")
req_file.write("Django==1.11\n-e git+https://github.com/orsinium/deal.git#egg=deal\n")
for path in (str(tmpdir), str(subdir)):
finder = finders.RequirementsFinder(config=Config(), path=path)
files = list(finder._get_files())
assert len(files) == 1 # file finding
assert files[0].endswith("requirements.txt") # file finding
assert set(finder._get_names(str(req_file))) == {"Django", "deal"} # file parsing
assert finder.find("django") == sections.THIRDPARTY # package in reqs
assert finder.find("flask") is None # package not in reqs
assert finder.find("deal") == 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
assert finder._normalize_name("Flask-RESTful") == "flask_restful" # conver `-`to `_`
req_file.remove()
def test_pipfile_finder(tmpdir) -> None:
pipfile = tmpdir.join("Pipfile")
pipfile.write(PIPFILE)
finder = finders.PipfileFinder(config=Config(), path=str(tmpdir))
assert set(finder._get_names(str(tmpdir))) == {"Django", "deal"} # file parsing
assert finder.find("django") == sections.THIRDPARTY # package in reqs
assert finder.find("flask") is None # package not in reqs
assert finder.find("deal") == 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
assert finder._normalize_name("Flask-RESTful") == "flask_restful" # conver `-`to `_`
pipfile.remove()
def test_path_finder(monkeypatch) -> None:
config = config = Config()
finder = finders.PathFinder(config=config)
third_party_prefix = next(path for path in finder.paths if "site-packages" in path)
ext_suffixes = importlib.machinery.EXTENSION_SUFFIXES
imaginary_paths = {
posixpath.join(finder.stdlib_lib_prefix, "example_1.py"),
posixpath.join(third_party_prefix, "example_2.py"),
posixpath.join(os.getcwd(), "example_3.py"),
}
imaginary_paths.update(
{
posixpath.join(third_party_prefix, "example_" + str(i) + ext_suffix)
for i, ext_suffix in enumerate(ext_suffixes, 4)
}
)
monkeypatch.setattr(
"isort.deprecated.finders.exists_case_sensitive", lambda p: p in imaginary_paths
)
assert finder.find("example_1") == sections.STDLIB
assert finder.find("example_2") == sections.THIRDPARTY
assert finder.find("example_3") == settings.DEFAULT_CONFIG.default_section
for i, _ in enumerate(ext_suffixes, 4):
assert finder.find("example_" + str(i)) == sections.THIRDPARTY