Source code for nxpy.maven.pom
# nxpy.maven package ---------------------------------------------------------
# Copyright Nicola Musatti 2010 - 2012
# Use, modification, and distribution are subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# See http://nxpy.sourceforge.net for library home page. ---------------------
r"""
Manipulation of Maven POM files.
"""
import os.path
import xml.etree.ElementTree
import nxpy.etree.util
import nxpy.maven.artifact
_ns = nxpy.etree.util.Namespace("http://maven.apache.org/POM/4.0.0")
[docs]class BadPomFileError(EnvironmentError):
pass
[docs]class Dependencies(object):
[docs] def __init__(self, element):
self.element = element
self.dependencies = {}
if self.element is not None:
for d in element.getchildren():
a = nxpy.maven.artifact.Artifact(d)
self.dependencies[a.artifactId] = a
def _saved(self):
for a in self.dependencies.values():
a._modified = False
@property
[docs] def modified(self):
return any([ a._modified for a in self.dependencies.values() ])
[docs] def contains(self, artifact):
if isinstance(artifact, nxpy.maven.artifact.Artifact):
group_id = artifact.groupId
artifact_id = artifact.artifactId
else:
group_id, artifact_id = artifact.split(":")[0:2]
for a in self.dependencies.values():
if a.groupId == group_id and a.artifactId == artifact_id:
return a
return None
[docs] def __str__(self):
return "\n".join([ str(a) for a in self.dependencies.values() ])
[docs]class Scm(object):
[docs] def __init__(self, element):
self._modified = False
self.element = element
self._connection = _ns.find(element, "connection")
self._developerConnection = _ns.find(element, "developerConnection")
self._url = _ns.find(element, "url")
connection = nxpy.etree.util.make_property("_connection")
developerConnection = nxpy.etree.util.make_property("_developerConnection")
url = nxpy.etree.util.make_property("_url")
@property
[docs] def modified(self):
return self._modified
[docs]class Repository(object):
[docs] def __init__(self, element):
self._modified = False
self.element = element
self._id = _ns.find(element, "id")
self._name = _ns.find(element, "name")
self._url = _ns.find(element, "url")
id = nxpy.etree.util.make_property("_id")
name = nxpy.etree.util.make_property("_name")
url = nxpy.etree.util.make_property("_url")
@property
[docs] def modified(self):
return self._modified
[docs]class DistributionManagement(object):
[docs] def __init__(self, element):
self.element = element
self.repository = Repository(_ns.find(element, "repository"))
self.snapshotRepository = Repository(_ns.find(element, "snapshotRepository"))
def _saved(self):
self.repository._modified = False
self.snapshotRepository._modified = False
@property
[docs] def modified(self):
return self.repository.modified or self.snapshotRepository.modified
[docs]class Properties(nxpy.etree.util.MappingElement):
[docs] def __init__(self, parent):
super(Properties, self).__init__(parent, "properties", _ns.url)
[docs]class Pom(object):
_root = ( r'<project xmlns="http://maven.apache.org/POM/4.0.0"'
r' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n'
r' xsi:schemaLocation="http://maven.apache.org/POM/4.0.0'
r' http://maven.apache.org/maven-v4_0_0.xsd">' )
[docs] def __init__(self, path):
self.path = os.path.realpath(path)
self.dir = os.path.split(self.path)[0]
try:
self.tree = xml.etree.ElementTree.parse(path)
except IOError:
raise BadPomFileError(path)
self.root = self.tree.getroot()
self.artifact = nxpy.maven.artifact.Artifact(self.root)
self.dependencies = Dependencies(_ns.find(self.root, "dependencies"))
parent = _ns.find(self.root, "parent")
try:
self.parent = nxpy.maven.artifact.Artifact(parent)
except AttributeError:
self.parent = None
self.scm = None
scm = _ns.find(self.root, "scm")
if scm is not None:
self.scm = Scm(scm)
self.modules = []
depmgmt = None
if self.artifact.packaging == "pom":
modules = _ns.find(self.root, "modules")
if modules is not None:
for m in modules.getchildren():
self.modules.append(m.text)
deps = _ns.find(self.root, "dependencyManagement")
if deps is not None:
depmgmt = _ns.find(deps, "dependencies")
self.dependencyManagement = Dependencies(depmgmt)
self.properties = nxpy.etree.util.MappingElement(self.root, "properties")
self.assembly_descriptor = None
build = _ns.find(self.root, "build")
if build is not None:
plugins = _ns.find(build, "plugins")
if plugins is not None:
for p in plugins.getchildren():
if _ns.find(p, "artifactId").text == "maven-assembly-plugin":
ad = _ns.find(_ns.find(p, "configuration"), "descriptors")[0]
self.assembly_descriptor = os.path.normpath(os.path.join(self.dir,
ad.text))
break
self.distributionManagement = None
dm = _ns.find(self.root, "distributionManagement")
if dm is not None:
self.distributionManagement = DistributionManagement(dm)
self._writer = nxpy.etree.util.Writer(self._root, None, 4)
[docs] def qualified_name(self, full=False):
return self.artifact.qualified_name(full)
@property
[docs] def modified(self):
return ( self.artifact.modified or ( self.parent and self.parent.modified ) or
self.dependencies.modified or self.dependencyManagement.modified or
( self.scm and self.scm.modified ) or self.properties.modified or
( self.distributionManagement and self.distributionManagement.modified ) )
[docs] def write(self, where):
if not where:
where = self.path
self._writer.write(self.root, where)
[docs] def save(self):
if self.modified:
self.write(None)
self.artifact._modified = False
if self.parent:
self.parent._modified = False
self.scm._modified = False
self.dependencies._saved()
self.dependencyManagement._saved()
self.distributionManagement._saved()
self.properties.modified = False
return True
return False