"""Mercator: implementation of dependencies finder."""
from lxml import objectify
import re
[docs]class SimpleMercator:
"""SimpleMercator Implementation."""
def __init__(self, content):
"""Initialize the SimpleMercator object."""
con = content.encode() if isinstance(content, str) else content
if not con:
raise ValueError("Empty Content Error")
try:
self.root = objectify.fromstring(con.strip())
except Exception:
# Try to get the information from invalid pom
self.root = objectify.fromstring(self.handle_corrupt_pom(con))
if not hasattr(self, 'root'):
raise ValueError("Unable to read pom file.")
[docs] def get_dependencies(self):
"""Get the list dependencies."""
result = list()
try:
for dp in getattr(self.root.dependencies, 'dependency', list()):
result.append(self.Dependency(dp))
except AttributeError:
pass # dependencies does not exist in pom
return result
def __iter__(self):
"""Return the iterator of dictionaries."""
return iter(self.get_dependencies())
[docs] class Dependency:
"""Dependency class Implementation."""
def __init__(self, dep):
"""Initialize Dependency object."""
if not isinstance(dep, objectify.ObjectifiedElement):
raise ValueError
self.artifact_id = self.group_id = self.scope = None
try:
self.artifact_id = dep.artifactId
self.group_id = dep.groupId
self.scope = getattr(dep, 'scope', 'compile')
except AttributeError:
pass # artifactId, groupId does not exist in pom
def __iter__(self):
"""Iterate over attributes."""
return iter(self.__dict__.items())
[docs] @staticmethod
def handle_corrupt_pom(content):
"""Try to find the dependencies in corrupt/invalid pom."""
con = "<p><dependencies>{}</dependencies></p>"
dependencies_pattern = re.compile(r'<dependencies>(.*?)</dependencies>', flags=re.DOTALL)
dependency_pattern = re.compile(r'<dependency>(.*?)</dependency>', flags=re.DOTALL)
base_pattern = '<{tag}>(.*?)</{tag}>'
# can not run regex on bytes like object
content = content.decode() if not isinstance(content, str) else content
# remove dependencyManagement
content = re.sub(r'<dependencyManagement>(.*?)</dependencyManagement>',
'', content, flags=re.DOTALL)
# Construct dependency
con_dependency_obj_list = list()
con_dependency_obj_pattern = """
<dependency>
<groupId>{g}</groupId>
<artifactId>{a}</artifactId>
<scope>{s}</scope>
</dependency>
"""
for dependencies in dependencies_pattern.findall(content):
for dependency in dependency_pattern.findall(dependencies):
try:
aid = re.findall(base_pattern.format(tag='artifactId'),
dependency, flags=re.DOTALL)[0]
gid = re.findall(base_pattern.format(tag='groupId'),
dependency, flags=re.DOTALL)[0]
scope = re.findall(base_pattern.format(tag='scope'),
dependency, flags=re.DOTALL) or 'compile'
con_dependency_obj_list.append(
con_dependency_obj_pattern.format(g=gid, a=aid, s=scope))
except IndexError:
continue
return con.format(''.join(con_dependency_obj_list))