Merge branch 'next' into compare_modules_test

This commit is contained in:
Alan Barzilay 2023-10-10 15:36:35 -03:00 committed by GitHub
commit 2ebfc4645a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 113 additions and 25 deletions

View File

@ -21,7 +21,7 @@
Installation Installation
------------ ------------
:: .. code-block:: sh
pip install pipreqs pip install pipreqs

View File

@ -0,0 +1,4 @@
numpy
pandas==2.0.0
tensorflow
torch<4.0.0

View File

@ -0,0 +1,3 @@
pandas
tensorflow
torch

View File

@ -8,6 +8,8 @@ test_pipreqs
Tests for `pipreqs` module. Tests for `pipreqs` module.
""" """
import io
import sys
import unittest import unittest
import os import os
import requests import requests
@ -37,6 +39,31 @@ class TestPipreqs(unittest.TestCase):
self.modules2 = ["beautifulsoup4"] self.modules2 = ["beautifulsoup4"]
self.local = ["docopt", "requests", "nose", "pyflakes"] self.local = ["docopt", "requests", "nose", "pyflakes"]
self.project = os.path.join(os.path.dirname(__file__), "_data") self.project = os.path.join(os.path.dirname(__file__), "_data")
self.empty_filepath = os.path.join(self.project, "empty.txt")
self.imports_filepath = os.path.join(self.project, "imports.txt")
self.imports_no_version_filepath = os.path.join(self.project, "imports_no_version.txt")
self.imports_any_version_filepath = os.path.join(self.project, "imports_any_version.txt")
self.non_existent_filepath = os.path.join(self.project, "non_existent_file.txt")
self.parsed_packages = [
{"name": "pandas", "version": "2.0.0"},
{"name": "numpy", "version": "1.2.3"},
{"name": "torch", "version": "4.0.0"},
]
self.parsed_packages_no_version = [
{"name": "pandas", "version": None},
{"name": "tensorflow", "version": None},
{"name": "torch", "version": None},
]
self.parsed_packages_any_version = [
{"name": "numpy", "version": None},
{"name": "pandas", "version": "2.0.0"},
{"name": "tensorflow", "version": None},
{"name": "torch", "version": "4.0.0"},
]
self.project_clean = os.path.join(os.path.dirname(__file__), "_data_clean") self.project_clean = os.path.join(os.path.dirname(__file__), "_data_clean")
self.project_invalid = os.path.join(os.path.dirname(__file__), "_invalid_data") self.project_invalid = os.path.join(os.path.dirname(__file__), "_invalid_data")
self.parsed_packages = [ self.parsed_packages = [
@ -46,12 +73,10 @@ class TestPipreqs(unittest.TestCase):
] ]
self.empty_filepath = os.path.join(self.project, "empty.txt") self.empty_filepath = os.path.join(self.project, "empty.txt")
self.imports_filepath = os.path.join(self.project, "imports.txt") self.imports_filepath = os.path.join(self.project, "imports.txt")
self.project_with_ignore_directory = os.path.join(
os.path.dirname(__file__), "_data_ignore" self.project_with_ignore_directory = os.path.join(os.path.dirname(__file__), "_data_ignore")
) self.project_with_duplicated_deps = os.path.join(os.path.dirname(__file__), "_data_duplicated_deps")
self.project_with_duplicated_deps = os.path.join(
os.path.dirname(__file__), "_data_duplicated_deps"
)
self.requirements_path = os.path.join(self.project, "requirements.txt") self.requirements_path = os.path.join(self.project, "requirements.txt")
self.alt_requirement_path = os.path.join(self.project, "requirements2.txt") self.alt_requirement_path = os.path.join(self.project, "requirements2.txt")
@ -228,12 +253,8 @@ class TestPipreqs(unittest.TestCase):
""" """
import_name_with_alias = "requests as R" import_name_with_alias = "requests as R"
expected_import_name_without_alias = "requests" expected_import_name_without_alias = "requests"
import_name_without_aliases = pipreqs.get_name_without_alias( import_name_without_aliases = pipreqs.get_name_without_alias(import_name_with_alias)
import_name_with_alias self.assertEqual(import_name_without_aliases, expected_import_name_without_alias)
)
self.assertEqual(
import_name_without_aliases, expected_import_name_without_alias
)
def test_custom_pypi_server(self): def test_custom_pypi_server(self):
""" """
@ -272,9 +293,7 @@ class TestPipreqs(unittest.TestCase):
"--mode": None, "--mode": None,
} }
) )
with open( with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r"
) as f:
data = f.read().lower() data = f.read().lower()
for item in ["click", "getpass"]: for item in ["click", "getpass"]:
self.assertFalse(item.lower() in data) self.assertFalse(item.lower() in data)
@ -297,9 +316,7 @@ class TestPipreqs(unittest.TestCase):
"--mode": "no-pin", "--mode": "no-pin",
} }
) )
with open( with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r"
) as f:
data = f.read().lower() data = f.read().lower()
for item in ["beautifulsoup4", "boto"]: for item in ["beautifulsoup4", "boto"]:
self.assertTrue(item.lower() in data) self.assertTrue(item.lower() in data)
@ -322,9 +339,7 @@ class TestPipreqs(unittest.TestCase):
"--mode": "gt", "--mode": "gt",
} }
) )
with open( with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r"
) as f:
data = f.readlines() data = f.readlines()
for item in data: for item in data:
symbol = ">=" symbol = ">="
@ -349,9 +364,7 @@ class TestPipreqs(unittest.TestCase):
"--mode": "compat", "--mode": "compat",
} }
) )
with open( with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r"
) as f:
data = f.readlines() data = f.readlines()
for item in data: for item in data:
symbol = "~=" symbol = "~="
@ -459,6 +472,74 @@ class TestPipreqs(unittest.TestCase):
self.assertSetEqual(modules_not_imported, expected_modules_not_imported) self.assertSetEqual(modules_not_imported, expected_modules_not_imported)
def test_output_requirements(self):
"""
Test --print parameter
It should print to stdout the same content as requeriments.txt
"""
capturedOutput = io.StringIO()
sys.stdout = capturedOutput
pipreqs.init(
{
"<path>": self.project,
"--savepath": None,
"--print": True,
"--use-local": None,
"--force": None,
"--proxy": None,
"--pypi-server": None,
"--diff": None,
"--clean": None,
"--mode": None,
}
)
pipreqs.init(
{
"<path>": self.project,
"--savepath": None,
"--print": False,
"--use-local": None,
"--force": True,
"--proxy": None,
"--pypi-server": None,
"--diff": None,
"--clean": None,
"--mode": None,
}
)
with open(self.requirements_path, "r") as f:
file_content = f.read().lower()
stdout_content = capturedOutput.getvalue().lower()
self.assertTrue(file_content == stdout_content)
def test_parse_requirements(self):
"""
Test parse_requirements function
"""
test_cases = [
(self.empty_filepath, []), # empty file
(self.imports_filepath, self.parsed_packages), # imports with versions
(
self.imports_no_version_filepath,
self.parsed_packages_no_version,
), # imports without versions
(
self.imports_any_version_filepath,
self.parsed_packages_any_version,
), # imports with and without versions
]
for test in test_cases:
with self.subTest(test):
filename, expected_parsed_requirements = test
parsed_requirements = pipreqs.parse_requirements(filename)
self.assertListEqual(parsed_requirements, expected_parsed_requirements)
def tearDown(self): def tearDown(self):
""" """
Remove requiremnts.txt files that were written Remove requiremnts.txt files that were written