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

View File

@ -14,15 +14,14 @@ from pipreqs import pipreqs
class TestPipreqs(unittest.TestCase): class TestPipreqs(unittest.TestCase):
def setUp(self): def setUp(self):
self.modules = ['flask', 'requests', 'sqlalchemy', 'docopt', 'nonexistendmodule'] self.modules = ['flask', 'requests', 'sqlalchemy', 'docopt', 'nonexistendmodule']
self.project = os.path.join(os.path.dirname(__file__),"_data") self.project = os.path.join(os.path.dirname(__file__), "_data")
self.requirements_path = os.path.join(self.project,"requirements.txt") self.requirements_path = os.path.join(self.project, "requirements.txt")
def test_get_all_imports(self): def test_get_all_imports(self):
imports = pipreqs.get_all_imports(self.project) 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: for item in imports:
self.assertTrue(item in self.modules, "Import is missing") self.assertTrue(item in self.modules, "Import is missing")
self.assertFalse("time" in imports) self.assertFalse("time" in imports)
@ -34,12 +33,12 @@ class TestPipreqs(unittest.TestCase):
imports = pipreqs.get_all_imports(self.project) imports = pipreqs.get_all_imports(self.project)
with_info = pipreqs.get_imports_info(imports) with_info = pipreqs.get_imports_info(imports)
# Should contain only 4 Elements without the "nonexistendmodule" # 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: for item in with_info:
self.assertTrue(item['name'] in self.modules, "Import item appears to be missing") self.assertTrue(item['name'] in self.modules, "Import item appears to be missing")
def test_init(self): 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 assert os.path.exists(self.requirements_path) == 1
with open(self.requirements_path, "r") as f: with open(self.requirements_path, "r") as f:
data = f.read() data = f.read()
@ -52,5 +51,6 @@ class TestPipreqs(unittest.TestCase):
except OSError: except OSError:
pass pass
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()