From 1dee19e3f5652047a48b2a0e9c2725a76a4f3de8 Mon Sep 17 00:00:00 2001 From: littmus Date: Sat, 25 Apr 2015 19:26:39 +0900 Subject: [PATCH 1/3] Include packages imported with "as" and add tests. --- pipreqs/pipreqs.py | 9 +++++---- tests/_data/models.py | 0 tests/_data/test.py | 5 ++--- tests/test_pipreqs.py | 9 +++++---- 4 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 tests/_data/models.py diff --git a/pipreqs/pipreqs.py b/pipreqs/pipreqs.py index 7a63556..a9ead36 100755 --- a/pipreqs/pipreqs.py +++ b/pipreqs/pipreqs.py @@ -33,10 +33,8 @@ def get_all_imports(start_path): logging.debug('Traversing tree, start: %s', start_path) for root, dirs, files in os.walk(start_path): packages.append(os.path.basename(root)) + files = filter(lambda fn:os.path.splitext(fn)[1] == ".py", files) for file_name in files: - if file_name[-3:] != ".py": - continue - with open(os.path.join(root, file_name), "r") as file_object: for line in file_object: if line[0] == "#": @@ -51,6 +49,9 @@ def get_all_imports(start_path): if "," in item: for match in item.split(","): imports.append(match.strip()) + elif " as " in item: + to_append = item.split(" as ")[0] + imports.append(to_append.strip()) else: to_append = item if "." not in item else item.split(".")[0] imports.append(to_append.strip()) @@ -109,4 +110,4 @@ def main(): # pragma: no cover if __name__ == '__main__': - main() # pragma: no cover \ No newline at end of file + main() # pragma: no cover diff --git a/tests/_data/models.py b/tests/_data/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/_data/test.py b/tests/_data/test.py index 03b688c..58a8764 100644 --- a/tests/_data/test.py +++ b/tests/_data/test.py @@ -10,11 +10,10 @@ import sys import signal import requests import nonexistendmodule -# Ignore this Line +# import django import flask.ext.somext from sqlalchemy import model - - +import ujson as json def main(): pass diff --git a/tests/test_pipreqs.py b/tests/test_pipreqs.py index f6dc73e..79992d2 100755 --- a/tests/test_pipreqs.py +++ b/tests/test_pipreqs.py @@ -15,25 +15,26 @@ from pipreqs import pipreqs class TestPipreqs(unittest.TestCase): def setUp(self): - self.modules = ['flask', 'requests', 'sqlalchemy', 'docopt', 'nonexistendmodule'] + self.modules = ['flask', 'requests', 'sqlalchemy', 'docopt', 'ujson', 'nonexistendmodule'] self.project = os.path.join(os.path.dirname(__file__), "_data") self.requirements_path = os.path.join(self.project, "requirements.txt") def test_get_all_imports(self): imports = pipreqs.get_all_imports(self.project) - self.assertEqual(len(imports), 5, "Incorrect Imports array length") + self.assertEqual(len(imports), 6, "Incorrect Imports array length") for item in imports: self.assertTrue(item in self.modules, "Import is missing") self.assertFalse("time" in imports) self.assertFalse("logging" in imports) self.assertFalse("curses" in imports) self.assertFalse("__future__" in imports) + self.assertFalse("django" in imports) def test_get_imports_info(self): imports = pipreqs.get_all_imports(self.project) with_info = pipreqs.get_imports_info(imports) - # Should contain only 4 Elements without the "nonexistendmodule" - self.assertEqual(len(with_info), 4, "Length of imports array with info is wrong") + # Should contain only 5 Elements without the "nonexistendmodule" + self.assertEqual(len(with_info), 5, "Length of imports array with info is wrong") for item in with_info: self.assertTrue(item['name'] in self.modules, "Import item appears to be missing") From a438406f68d7a260d2743117011a8e01312f441c Mon Sep 17 00:00:00 2001 From: littmus Date: Sun, 26 Apr 2015 23:32:41 +0900 Subject: [PATCH 2/3] - Pre-filter python files only and remove empty lines in file. - Exclude local packages import. --- pipreqs/pipreqs.py | 4 +++- tests/_data/test.py | 7 ++++++- tests/test_pipreqs.py | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pipreqs/pipreqs.py b/pipreqs/pipreqs.py index a9ead36..3d4afa0 100755 --- a/pipreqs/pipreqs.py +++ b/pipreqs/pipreqs.py @@ -34,9 +34,11 @@ def get_all_imports(start_path): for root, dirs, files in os.walk(start_path): packages.append(os.path.basename(root)) files = filter(lambda fn:os.path.splitext(fn)[1] == ".py", files) + packages += map(lambda fn:os.path.splitext(fn)[0], files) for file_name in files: with open(os.path.join(root, file_name), "r") as file_object: - for line in file_object: + lines = filter(lambda l:len(l) > 0, map(lambda l:l.strip(), file_object)) + for line in lines: if line[0] == "#": continue if "(" in line: diff --git a/tests/_data/test.py b/tests/_data/test.py index 58a8764..b033ef7 100644 --- a/tests/_data/test.py +++ b/tests/_data/test.py @@ -13,7 +13,12 @@ import nonexistendmodule # import django import flask.ext.somext from sqlalchemy import model -import ujson as json +try: + import ujson as json +except ImportError: + import json + +import models def main(): pass diff --git a/tests/test_pipreqs.py b/tests/test_pipreqs.py index 79992d2..a2001dd 100755 --- a/tests/test_pipreqs.py +++ b/tests/test_pipreqs.py @@ -29,6 +29,7 @@ class TestPipreqs(unittest.TestCase): self.assertFalse("curses" in imports) self.assertFalse("__future__" in imports) self.assertFalse("django" in imports) + self.assertFalse("models" in imports) def test_get_imports_info(self): imports = pipreqs.get_all_imports(self.project) From eca9884b25adefe8cb1b2c876d1c7546a749afbc Mon Sep 17 00:00:00 2001 From: littmus Date: Mon, 27 Apr 2015 00:10:05 +0900 Subject: [PATCH 3/3] Change map and filter to list comprehension for py2 and py3 compatible --- pipreqs/pipreqs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipreqs/pipreqs.py b/pipreqs/pipreqs.py index 3d4afa0..c8f8d6d 100755 --- a/pipreqs/pipreqs.py +++ b/pipreqs/pipreqs.py @@ -33,8 +33,8 @@ def get_all_imports(start_path): logging.debug('Traversing tree, start: %s', start_path) for root, dirs, files in os.walk(start_path): packages.append(os.path.basename(root)) - files = filter(lambda fn:os.path.splitext(fn)[1] == ".py", files) - packages += map(lambda fn:os.path.splitext(fn)[0], files) + files = [fn for fn in files if os.path.splitext(fn)[1] == ".py"] + packages += [os.path.splitext(fn)[0] for fn in files] for file_name in files: with open(os.path.join(root, file_name), "r") as file_object: lines = filter(lambda l:len(l) > 0, map(lambda l:l.strip(), file_object))