-
-
Notifications
You must be signed in to change notification settings - Fork 311
/
Copy pathdependencies.py
120 lines (106 loc) · 3.76 KB
/
dependencies.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# -*- coding: utf-8 -*-
"""
dependencies
~~~~~~~~~~~~
Implements Dependencies Check
:author: BlBana <[email protected]>
:homepage: https://github.com/wufeifei/cobra
:license: MIT, see LICENSE for more details.
:copyright: Copyright (c) 2017 Feei. All rights reserved
"""
import os
import xml.etree.cElementTree as eT
from utils.log import logger
class Dependencies(object):
def __init__(self, target_directory):
"""
:param target_directory: The project's path
"""
self.directory = os.path.abspath(target_directory)
self._result = {}
self._framework = []
self.dependencies()
def dependencies(self):
file_path, flag = self.find_file()
if flag == 0: # flag == 0
logger.debug('Dependency analysis cannot be done without finding dependency files')
return False
if flag == 1:
self.find_python_pip(file_path)
return True
if flag == 2:
self.find_java_mvn(file_path)
return True
def find_file(self):
"""
:return:flag:{1:'python', 2:'java', 3:'oc'}
"""
flag = 0
file_path = []
if os.path.isdir(self.directory):
for root, dirs, filenames in os.walk(self.directory):
for filename in filenames:
if filename == 'requirements.txt' and flag != 2:
file_path.append(self.get_path(root, filename))
flag = 1
if filename == 'pom.xml' and flag != 1:
file_path.append(self.get_path(root, filename))
flag = 2
return file_path, flag
else:
filename = os.path.basename(self.directory)
if filename == 'requirements.txt':
flag = 1
file_path.append(self.directory)
return file_path, flag
if filename == 'pom.xml':
flag = 2
file_path.append(self.directory)
return file_path, flag
return file_path, flag
@staticmethod
def get_path(root, filename):
"""
:param root:
:param filename:
:return:
"""
return os.path.join(root, filename)
def find_python_pip(self, file_path):
for requirement in file_path:
with open(requirement) as fi:
for line in fi.readlines():
flag = line.find("==")
if flag != -1:
module_ = line[:flag]
version = line[flag+2:].strip()
self._framework.append(module_)
self._result[module_] = version
def find_java_mvn(self, file_path):
pom_ns = "{http://maven.apache.org/POM/4.0.0}"
for pom in file_path:
tree = self.parse_xml(pom)
root = tree.getroot()
childs = root.findall('.//%sdependency' % pom_ns)
for child in childs:
group_id = list(child)[0].text
artifact_id = list(child)[1].text
if len(list(child)) > 2:
version = list(child)[2].text
else:
version = 'The latest version'
module_ = artifact_id
self._framework.append(group_id)
self._framework.append(artifact_id)
self._result[module_] = version
@staticmethod
def parse_xml(file_path):
return eT.parse(file_path)
def get_version(self, module_):
return self._result[module_]
@property
def get_result(self):
return self._result
@property
def get_framework(self):
return self._framework