-
Notifications
You must be signed in to change notification settings - Fork 0
/
find_in_stdl.py
executable file
·106 lines (78 loc) · 4.04 KB
/
find_in_stdl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python
import argparse
import logging
import os
import sys
import re
from os.path import join
from stdlib_list import stdlib_list
py2_version = "2.7"
py3_version = "3.4"
py2_libraries = stdlib_list(py2_version)
py3_libraries = stdlib_list(py3_version)
import_line_re = re.compile('^(\s+)?import\s|^(\s+)?from\s')
import_from_re = re.compile('^from\s+(?P<module_name>[A-z0-9_.]+)\s+import\s+(?P<imported_modules_names>[A-z0-9_., ]+)')
import_re = re.compile('^import\s+(?P<modules_names>[A-z0-9_., ]+)')
main_module_re = re.compile('^(?P<main_module>[A-z0-9_]+)\.')
modules = []
def module_in_the_line(line, module_list):
for module in module_list:
if line.startswith('import ' + module) or line.startswith('from ' + module):
return True
return False
def main(args):
for root, dirs, files in os.walk(args.directory):
files_in_cur_dir = [join(root,name) for name in files if name.endswith('.py')]
for file in files_in_cur_dir:
with open(file) as open_file:
for line in open_file:
if import_line_re.match(line):
line = re.sub('^\s+','',line)
line = re.sub('\s{2,}',' ',line)
if args.exclude and module_in_the_line(line, args.exclude):
continue
if line.startswith('from'):
match = import_from_re.match(line)
if match:
for module in match.group('imported_modules_names').split(','):
if module:
if match.group('module_name').startswith('.'):
continue
formated_module = match.group('module_name') + '.' + re.sub('(^\s|\s$|\sas\s[A-z0-9._]+)','',module)
if formated_module not in modules:
modules.append(formated_module)
else:
match = import_re.match(line)
if match:
for module in match.group('modules_names').split(','):
if module:
if module.startswith('.'):
continue
formated_module = re.sub('(^\s|\s$|\sas\s[A-z0-9._]+)','',module)
if formated_module not in modules:
modules.append(formated_module)
for module in modules:
main_module = ''
match = main_module_re.match(module)
if match:
main_module = match.group('main_module')
if module not in py2_libraries:
if main_module and main_module in py2_libraries:
print('Main "%s" is in STD-LIB-%s but %s is not. Please check documentation.' % (main_module, py2_version, module))
else:
print('Module "%s" is not in STD-LIB-%s' % (module, py2_version))
if args.py3:
if module not in py3_libraries:
if main_module and main_module in py3_libraries:
print('Main "%s" is in STD-LIB-%s but %s is not. Please check documentation.' % (main_module, py3_version, module))
else:
print('Module "%s" is not in STD-LIB-%s' % (module, py3_version))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Show non-standart dependencies.')
parser.add_argument('-d', '--directory', metavar=('DIR'), type=str,
help='Directory', default='.')
parser.add_argument('-p', '--py3', help='Whether to add py3 support', action='store_true')
parser.add_argument('-e', '--exclude', nargs='+', metavar=('EXCLUDE_LIST'), type=str,
help='Exclude list')
args = parser.parse_args()
main(args)