Merge "Validate further XML files"

This commit is contained in:
Jenkins 2014-01-14 08:12:43 +00:00 committed by Gerrit Code Review
commit 89d91f2d2a
4 changed files with 587 additions and 24 deletions

View File

@ -70,10 +70,11 @@ KNOWN_AUDIENCE_VALUES = ["enduser",
"installer",
"webpage"]
BASE_RNG = os.path.join(os.path.dirname(__file__), 'resources')
BASE_RNG = os.path.join(os.path.dirname(__file__), 'resources/')
RACKBOOK_RNG = os.path.join(BASE_RNG, 'rackbook.rng')
DOCBOOKXI_RNG = os.path.join(BASE_RNG, 'docbookxi.rng')
WADL_RNG = os.path.join(BASE_RNG, 'wadl.rng')
WADL_XSD = os.path.join(BASE_RNG, 'wadl.xsd')
# NOTE(berendt): check_output as provided in Python 2.7.5 to make script
@ -110,9 +111,15 @@ def get_schema(is_api_site=False):
def get_wadl_schema():
"""Return the Wadl schema."""
url = WADL_RNG
relaxng_doc = etree.parse(url, base_url=BASE_RNG)
return etree.RelaxNG(relaxng_doc)
# NOTE(jaegerandi): We could use the RelaxNG instead
# like follows but this gives quite some errors at the
# moment, so only validate using the XMLSchema
#url = WADL_RNG
#relaxng_doc = etree.parse(url, base_url=BASE_RNG)
#return etree.RelaxNG(relaxng_doc)
url = WADL_XSD
schema = etree.parse(url, base_url=BASE_RNG)
return etree.XMLSchema(schema)
def validation_failed(schema, doc):
@ -446,14 +453,15 @@ def is_xml(filename):
return filename.endswith('.xml') and not filename.endswith('/pom.xml')
def is_xml_wadl(filename):
"""Returns true if file ends a valid .xml or .wadl file.
def is_xml_like(filename):
"""Returns true if file is in some XML format we handle
Skips pom.xml files as well since those are not handled.
"""
return (filename.endswith(('.xml', '.wadl')) and
not filename.endswith('/pom.xml'))
return (filename.endswith(('.xml', '.xsd', '.xsl', '.wadl',
'.xjb')) and
not filename.endswith('pom.xml'))
def is_wadl(filename):
@ -476,24 +484,28 @@ def validate_individual_files(files_to_check, rootdir, exceptions, verbose,
no_failed = 0
if check_syntax and check_niceness:
print("Checking syntax and niceness of xml and wadl files...")
print("Checking syntax and niceness of XML files...")
elif check_syntax:
print("Checking syntax of xml and wadl files...")
print("Checking syntax of XML files...")
elif check_niceness:
print("Checking niceness of xml and wadl files...")
print("Checking niceness of XML files...")
for f in files_to_check:
base_f = os.path.basename(f)
if (base_f == "pom.xml" or
base_f in exceptions):
continue
# Files ending with ".xml" in subdirectories of
# wadls and samples files are not docbook files.
# We cannot validate with a schema for these
if (is_api_site and ("wadls" in f or "samples" in f)):
validate_schema = False
else:
validate_schema = True
validate_schema = True
if is_api_site:
# Files ending with ".xml" in subdirectories of
# wadls and samples files are not docbook files.
if (f.endswith('.xml') and
("wadls" in f or "samples" in f)):
validate_schema = False
# Right now we can only validate docbook .xml
# and .wadl files with a schema
elif not f.endswith(('.wadl', '.xml')):
validate_schema = False
if (is_api_site and is_wadl(f)):
any_failures = validate_one_file(wadl_schema, rootdir, f,
@ -512,12 +524,12 @@ def validate_individual_files(files_to_check, rootdir, exceptions, verbose,
no_validated = no_validated + 1
if no_failed > 0:
print("Check failed, validated %d xml/wadl files with %d failures.\n"
print("Check failed, validated %d XML files with %d failures.\n"
% (no_validated, no_failed))
if not ignore_errors:
sys.exit(1)
else:
print("Check passed, validated %d xml/wadl files.\n" % no_validated)
print("Check passed, validated %d XML files.\n" % no_validated)
def validate_modified_files(rootdir, exceptions, verbose,
@ -529,7 +541,7 @@ def validate_modified_files(rootdir, exceptions, verbose,
# or Type changed
modified_files = get_modified_files(rootdir, "--diff-filter=ACMRT")
modified_files = filter(is_xml_wadl, modified_files)
modified_files = filter(is_xml_like, modified_files)
validate_individual_files(modified_files, rootdir, exceptions,
verbose,
@ -557,9 +569,8 @@ def validate_all_files(rootdir, exceptions, verbose,
for f in files:
# Ignore maven files, which are called pom.xml
if (f.endswith(('.xml', '.wadl')) and
f != 'pom.xml' and
f not in exceptions):
if (is_xml_like(f) and
f not in exceptions):
path = os.path.abspath(os.path.join(root, f))
files_to_check.append(path)

View File

@ -3,3 +3,5 @@ These files are copied from the following locations:
* extensions.rng: clouddocs-maven-plugin
* rackbook.rng: clouddocs-maven-plugin
* wadl.rng: clouddocs-maven-plugin
* wadl.xsd: http://docs.rackspace.com/rackbook/wadl.xsd
* xml.xsd: http://docs.rackspace.com/rackbook/xml.xsd

View File

@ -0,0 +1,263 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://wadl.dev.java.net/2009/02"
xmlns:tns="http://wadl.dev.java.net/2009/02"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:element name="application">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:grammars" minOccurs="0"/>
<xs:element ref="tns:resources" minOccurs="0"
maxOccurs="unbounded"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="tns:resource_type"/>
<xs:element ref="tns:method"/>
<xs:element ref="tns:representation"/>
<xs:element ref="tns:param"/>
</xs:choice>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="doc">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="title" type="xs:string"/>
<xs:attribute ref="xml:lang"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="grammars">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="tns:include"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="resources">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:resource" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="base" type="xs:anyURI"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="tns:method"/>
<xs:element ref="tns:resource"/>
</xs:choice>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
processContents="lax"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="type" type="tns:resource_type_list"/>
<xs:attribute name="queryType" type="xs:string"
default="application/x-www-form-urlencoded"/>
<xs:attribute name="path" type="xs:string"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="resource_type_list">
<xs:list itemType="xs:anyURI"/>
</xs:simpleType>
<xs:element name="resource_type">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="tns:method"/>
<xs:element ref="tns:resource"/>
</xs:choice>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
processContents="lax"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="method">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:request" minOccurs="0"/>
<xs:element ref="tns:response" minOccurs="0"
maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="name" type="tns:Method"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="Method">
<xs:union memberTypes="tns:HTTPMethods xs:NMTOKEN"/>
</xs:simpleType>
<xs:simpleType name="HTTPMethods">
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="GET"/>
<xs:enumeration value="POST"/>
<xs:enumeration value="PUT"/>
<xs:enumeration value="HEAD"/>
<xs:enumeration value="DELETE"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="include">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="request">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:representation" minOccurs="0"
maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="response">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:representation" minOccurs="0"
maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="status" type="tns:statusCodeList"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="uriList">
<xs:list itemType="xs:anyURI"/>
</xs:simpleType>
<xs:element name="representation">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="element" type="xs:QName"/>
<xs:attribute name="mediaType" type="xs:string"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="profile" type="tns:uriList"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="statusCodeList">
<xs:list itemType="xs:unsignedInt"/>
</xs:simpleType>
<xs:simpleType name="ParamStyle">
<xs:restriction base="xs:string">
<xs:enumeration value="plain"/>
<xs:enumeration value="query"/>
<xs:enumeration value="matrix"/>
<xs:enumeration value="header"/>
<xs:enumeration value="template"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="param">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:option" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="tns:link" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="name" type="xs:NMTOKEN"/>
<xs:attribute name="style" type="tns:ParamStyle"/>
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="type" type="xs:QName" default="xs:string"/>
<xs:attribute name="default" type="xs:string"/>
<xs:attribute name="required" type="xs:boolean" default="false"/>
<xs:attribute name="repeating" type="xs:boolean" default="false"/>
<xs:attribute name="fixed" type="xs:string"/>
<xs:attribute name="path" type="xs:string"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="option">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="mediaType" type="xs:string"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="resource_type" type="xs:anyURI"/>
<xs:attribute name="rel" type="xs:token"/>
<xs:attribute name="rev" type="xs:token"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -0,0 +1,287 @@
<?xml version='1.0'?>
<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns ="http://www.w3.org/1999/xhtml"
xml:lang="en">
<xs:annotation>
<xs:documentation>
<div>
<h1>About the XML namespace</h1>
<div class="bodytext">
<p>
This schema document describes the XML namespace, in a form
suitable for import by other schema documents.
</p>
<p>
See <a href="http://www.w3.org/XML/1998/namespace.html">
http://www.w3.org/XML/1998/namespace.html</a> and
<a href="http://www.w3.org/TR/REC-xml">
http://www.w3.org/TR/REC-xml</a> for information
about this namespace.
</p>
<p>
Note that local names in this namespace are intended to be
defined only by the World Wide Web Consortium or its subgroups.
The names currently defined in this namespace are listed below.
They should not be used with conflicting semantics by any Working
Group, specification, or document instance.
</p>
<p>
See further below in this document for more information about <a
href="#usage">how to refer to this schema document from your own
XSD schema documents</a> and about <a href="#nsversioning">the
namespace-versioning policy governing this schema document</a>.
</p>
</div>
</div>
</xs:documentation>
</xs:annotation>
<xs:attribute name="lang">
<xs:annotation>
<xs:documentation>
<div>
<h3>lang (as an attribute name)</h3>
<p>
denotes an attribute whose value
is a language code for the natural language of the content of
any element; its value is inherited. This name is reserved
by virtue of its definition in the XML specification.</p>
</div>
<div>
<h4>Notes</h4>
<p>
Attempting to install the relevant ISO 2- and 3-letter
codes as the enumerated possible values is probably never
going to be a realistic possibility.
</p>
<p>
See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
and the IANA language subtag registry at
<a href="http://www.iana.org/assignments/language-subtag-registry">
http://www.iana.org/assignments/language-subtag-registry</a>
for further information.
</p>
<p>
The union allows for the 'un-declaration' of xml:lang with
the empty string.
</p>
</div>
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:union memberTypes="xs:language">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="space">
<xs:annotation>
<xs:documentation>
<div>
<h3>space (as an attribute name)</h3>
<p>
denotes an attribute whose
value is a keyword indicating what whitespace processing
discipline is intended for the content of the element; its
value is inherited. This name is reserved by virtue of its
definition in the XML specification.</p>
</div>
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:NCName">
<xs:enumeration value="default"/>
<xs:enumeration value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
<xs:documentation>
<div>
<h3>base (as an attribute name)</h3>
<p>
denotes an attribute whose value
provides a URI to be used as the base for interpreting any
relative URIs in the scope of the element on which it
appears; its value is inherited. This name is reserved
by virtue of its definition in the XML Base specification.</p>
<p>
See <a
href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
for information about this attribute.
</p>
</div>
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="id" type="xs:ID">
<xs:annotation>
<xs:documentation>
<div>
<h3>id (as an attribute name)</h3>
<p>
denotes an attribute whose value
should be interpreted as if declared to be of type ID.
This name is reserved by virtue of its definition in the
xml:id specification.</p>
<p>
See <a
href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
for information about this attribute.
</p>
</div>
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attributeGroup name="specialAttrs">
<xs:attribute ref="xml:base"/>
<xs:attribute ref="xml:lang"/>
<xs:attribute ref="xml:space"/>
<xs:attribute ref="xml:id"/>
</xs:attributeGroup>
<xs:annotation>
<xs:documentation>
<div>
<h3>Father (in any context at all)</h3>
<div class="bodytext">
<p>
denotes Jon Bosak, the chair of
the original XML Working Group. This name is reserved by
the following decision of the W3C XML Plenary and
XML Coordination groups:
</p>
<blockquote>
<p>
In appreciation for his vision, leadership and
dedication the W3C XML Plenary on this 10th day of
February, 2000, reserves for Jon Bosak in perpetuity
the XML name "xml:Father".
</p>
</blockquote>
</div>
</div>
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>
<div xml:id="usage" id="usage">
<h2><a name="usage">About this schema document</a></h2>
<div class="bodytext">
<p>
This schema defines attributes and an attribute group suitable
for use by schemas wishing to allow <code>xml:base</code>,
<code>xml:lang</code>, <code>xml:space</code> or
<code>xml:id</code> attributes on elements they define.
</p>
<p>
To enable this, such a schema must import this schema for
the XML namespace, e.g. as follows:
</p>
<pre>
&lt;schema . . .>
. . .
&lt;import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
</pre>
<p>
or
</p>
<pre>
&lt;import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
</pre>
<p>
Subsequently, qualified reference to any of the attributes or the
group defined below will have the desired effect, e.g.
</p>
<pre>
&lt;type . . .>
. . .
&lt;attributeGroup ref="xml:specialAttrs"/>
</pre>
<p>
will define a type which will schema-validate an instance element
with any of those attributes.
</p>
</div>
</div>
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>
<div id="nsversioning" xml:id="nsversioning">
<h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
<div class="bodytext">
<p>
In keeping with the XML Schema WG's standard versioning
policy, this schema document will persist at
<a href="http://www.w3.org/2009/01/xml.xsd">
http://www.w3.org/2009/01/xml.xsd</a>.
</p>
<p>
At the date of issue it can also be found at
<a href="http://www.w3.org/2001/xml.xsd">
http://www.w3.org/2001/xml.xsd</a>.
</p>
<p>
The schema document at that URI may however change in the future,
in order to remain compatible with the latest version of XML
Schema itself, or with the XML namespace itself. In other words,
if the XML Schema or XML namespaces change, the version of this
document at <a href="http://www.w3.org/2001/xml.xsd">
http://www.w3.org/2001/xml.xsd
</a>
will change accordingly; the version at
<a href="http://www.w3.org/2009/01/xml.xsd">
http://www.w3.org/2009/01/xml.xsd
</a>
will not change.
</p>
<p>
Previous dated (and unchanging) versions of this schema
document are at:
</p>
<ul>
<li><a href="http://www.w3.org/2009/01/xml.xsd">
http://www.w3.org/2009/01/xml.xsd</a></li>
<li><a href="http://www.w3.org/2007/08/xml.xsd">
http://www.w3.org/2007/08/xml.xsd</a></li>
<li><a href="http://www.w3.org/2004/10/xml.xsd">
http://www.w3.org/2004/10/xml.xsd</a></li>
<li><a href="http://www.w3.org/2001/03/xml.xsd">
http://www.w3.org/2001/03/xml.xsd</a></li>
</ul>
</div>
</div>
</xs:documentation>
</xs:annotation>
</xs:schema>