From 9d6e6241954d001a5b49e4ea9a48c10e2a792958 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Mon, 10 Dec 2012 17:19:54 -0600 Subject: generate XML schema docs from XML schemas themselves --- testsuite/Testschema/test_schema.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'testsuite/Testschema/test_schema.py') diff --git a/testsuite/Testschema/test_schema.py b/testsuite/Testschema/test_schema.py index 56fe76205..ddfe4775f 100644 --- a/testsuite/Testschema/test_schema.py +++ b/testsuite/Testschema/test_schema.py @@ -1,7 +1,7 @@ import os -import re import sys import glob +import lxml.etree from subprocess import Popen, PIPE, STDOUT # add all parent testsuite directories to sys.path to allow (most) @@ -27,14 +27,46 @@ except OSError: HAS_XMLLINT = False +XS = "http://www.w3.org/2001/XMLSchema" +XS_NS = "{%s}" % XS +NSMAP = dict(xs=XS) + + class TestSchemas(Bcfg2TestCase): schema_url = "http://www.w3.org/2001/XMLSchema.xsd" @skipUnless(HAS_XMLLINT, "xmllint not installed") def test_valid(self): - schemas = [s for s in glob.glob(os.path.join(srcpath,'*.xsd'))] + schemas = [s for s in glob.glob(os.path.join(srcpath, '*.xsd'))] xmllint = Popen(['xmllint', '--xinclude', '--noout', '--schema', self.schema_url] + schemas, stdout=PIPE, stderr=STDOUT) print(xmllint.communicate()[0]) self.assertEqual(xmllint.wait(), 0) + + def test_duplicates(self): + entities = dict() + for root, _, files in os.walk(srcpath): + for fname in files: + if not fname.endswith(".xsd"): + continue + path = os.path.join(root, fname) + relpath = path[len(srcpath):].strip("/") + schema = lxml.etree.parse(path).getroot() + ns = schema.get("targetNamespace") + if ns not in entities: + entities[ns] = dict(group=dict(), + attributeGroup=dict(), + simpleType=dict(), + complexType=dict()) + for entity in schema.xpath("//xs:*[@name]", namespaces=NSMAP): + tag = entity.tag[len(XS_NS):] + if tag not in entities[ns]: + continue + name = entity.get("name") + if name in entities[ns][tag]: + self.assertNotIn(name, entities[ns][tag], + "Duplicate %s %s (in %s and %s)" % + (tag, name, fname, + entities[ns][tag][name])) + entities[ns][tag][name] = fname -- cgit v1.2.3-1-g7c22