Fix indentation, pep8. Optimize imports and adding missing import for sys module.

Improvements in some parts of  get_all_imports method and removing unused path variable.
This commit is contained in:
Michael 2015-04-25 12:31:05 +03:00
parent 61a01d78c6
commit 655b32797a
2 changed files with 100 additions and 90 deletions

View File

@ -11,34 +11,39 @@ Options:
--savepath path to requirements.txt (Optional)
"""
from __future__ import print_function
import os, re, logging
import os
import sys
import re
import logging
from docopt import docopt
import yarg
from yarg.exceptions import HTTPError
REGEXP = [
re.compile(r'^import (.+)$'),
re.compile(r'from (.*?) import (?:.*)')
]
def get_all_imports(start_path):
imports = []
packages = []
logging.debug('Traversing tree, start: %s', start_path)
for root, dirs, files in os.walk(start_path):
path = root.split('/')
packages.append(os.path.basename(root))
for file in files:
if file[-3:] != ".py":
for file_name in files:
if file_name[-3:] != ".py":
continue
for rex in REGEXP:
with open(os.path.join(root,file), "r") as f:
lines = f.readlines()
for line in lines:
with open(os.path.join(root, file_name), "r") as file_object:
for line in file_object:
if line[0] == "#":
continue
if "(" in line:
break
for rex in REGEXP:
s = rex.match(line)
if not s:
continue
@ -55,6 +60,7 @@ def get_all_imports(start_path):
data = [x.strip() for x in f.readlines()]
return list(set(third_party_packages) - set(data))
def generate_requirements_file(path, imports):
with open(path, "w") as ff:
logging.debug('Writing requirements to file %s', path)
@ -62,6 +68,7 @@ def generate_requirements_file(path, imports):
ff.write(item['name'] + "==" + item['version'])
ff.write("\n")
def get_imports_info(imports):
result = []
for item in imports:
@ -73,18 +80,20 @@ def get_imports_info(imports):
if not data or len(data.release_ids) < 1:
continue
last_release = data.release_ids[-1]
result.append({'name':item,'version':last_release})
result.append({'name': item, 'version': last_release})
return result
def init(args):
print ("Looking for imports")
print("Looking for imports")
imports = get_all_imports(args['<path>'])
print ("Getting latest version of packages information from PyPi")
print("Getting latest version of packages information from PyPi")
imports_with_info = get_imports_info(imports)
print ("Found third-party imports: " + ", ".join(imports))
path = args["--savepath"] if args["--savepath"] else os.path.join(args['<path>'],"requirements.txt")
print("Found third-party imports: " + ", ".join(imports))
path = args["--savepath"] if args["--savepath"] else os.path.join(args['<path>'], "requirements.txt")
generate_requirements_file(path, imports_with_info)
print ("Successfuly saved requirements file in: " + path)
print("Successfuly saved requirements file in: " + path)
def main(): # pragma: no cover
args = docopt(__doc__, version='xstat 0.1')
@ -98,5 +107,6 @@ def main(): # pragma: no cover
except KeyboardInterrupt:
sys.exit(0)
if __name__ == '__main__':
main() # pragma: no cover

View File

@ -14,15 +14,14 @@ from pipreqs import pipreqs
class TestPipreqs(unittest.TestCase):
def setUp(self):
self.modules = ['flask', 'requests', 'sqlalchemy', 'docopt', 'nonexistendmodule']
self.project = os.path.join(os.path.dirname(__file__),"_data")
self.requirements_path = os.path.join(self.project,"requirements.txt")
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), 5, "Incorrect Imports array length")
for item in imports:
self.assertTrue(item in self.modules, "Import is missing")
self.assertFalse("time" in imports)
@ -34,12 +33,12 @@ class TestPipreqs(unittest.TestCase):
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")
self.assertEqual(len(with_info), 4, "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")
def test_init(self):
pipreqs.init({'<path>':self.project, '--savepath':None})
pipreqs.init({'<path>': self.project, '--savepath': None})
assert os.path.exists(self.requirements_path) == 1
with open(self.requirements_path, "r") as f:
data = f.read()
@ -52,5 +51,6 @@ class TestPipreqs(unittest.TestCase):
except OSError:
pass
if __name__ == '__main__':
unittest.main()