--- /dev/null
+# -*- Mode: Python -*-
+# GObject-Introspection - a framework for introspecting GObject libraries
+# Copyright (C) 2008 Colin Walters
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+
+from .girparser import C_NS, GLIB_NS
+from .girparser import _corens
+
+_nsmap = {'c': C_NS,
+ 'glib': GLIB_NS}
+
+
+def myxpath(node, expr):
+ """I Can't Believe It's Not XPath!"""
+ elts = expr.split('/')
+ curnode = node
+ for elt in elts:
+ if elt == '':
+ continue
+ try:
+ (elt, qual) = elt.split('[', 1)
+ qual = qual[1:-1]
+ pairs = [x.split('=', 1) for x in qual.split(',')]
+ exp_attrs = [(x[0], x[1][1:-1]) for x in pairs]
+ except ValueError, e:
+ (elt, exp_attrs) = (elt, [])
+ try:
+ (ns, elt) = elt.split(':', 1)
+ ns = _nsmap[ns]
+ elt = '{%s}%s' % (ns, elt)
+ except ValueError, e:
+ elt = _corens(elt)
+ curnodes = curnode.findall(elt)
+ if not curnodes:
+ return None
+ found = True
+ for node in curnodes:
+ passes = True
+ for (name, val) in exp_attrs:
+ a = node.attrib.get(name)
+ if not a or a != val:
+ passes = False
+ break
+ if passes:
+ found = True
+ #print 'ATTR PASS: %r' % (node, )
+ curnode = node
+ break
+ found = False
+ if not found:
+ return None
+ return curnode
+
+
+def xpath_assert(node, path, attribs=[]):
+ elt = myxpath(node, path)
+ if elt is None:
+ raise AssertionError("Failed to find %r" % (path, ))
+ for (name, expvalue) in attribs:
+ value = elt.attrib.get(name)
+ if not value:
+ raise AssertionError("Failed to find attibute %r" +
+ "in node %r" % (name, elt, ))
+ if value != expvalue:
+ raise AssertionError("Attibute %r in node %r has " +
+ "unexpected value %r" % (name, elt, expvalue))
from giscanner.glibtransformer import GLibTransformer
from giscanner.sourcescanner import SourceScanner
from giscanner.transformer import Transformer
+from giscanner.minixpath import xpath_assert
def _get_option_parser():
parser.add_option("", "--typelib-xml",
action="store_true", dest="typelib_xml",
help="Just convert GIR to typelib XML")
-
+ parser.add_option("", "--xpath-assertions",
+ action="store", dest="xpath_assertions",
+ help="Use given file to create assertions on GIR content")
group = optparse.OptionGroup(parser, "Preprocessor options")
group.add_option("-I", help="Pre-processor include file",
doc.write(sys.stdout)
return 0
+def validate(assertions, path):
+ from xml.etree.cElementTree import parse
+ doc = parse(open(path))
+ root = doc.getroot()
+ f = open(assertions)
+ assertions_list = f.readlines()
+ print "=== CHECKING %s (%d assertions) ===" % (assertions,
+ len(assertions_list))
+ for assertion in assertions_list:
+ assertion = assertion.strip()
+ xpath_assert(root, assertion)
+ f.close()
+ print "=== PASSED %s ===" % (assertions, )
+ return 0
+
def main(args):
parser = _get_option_parser()
(options, args) = parser.parse_args(args)
if options.typelib_xml:
return typelib_xml_strip(args[1])
+ if options.xpath_assertions:
+ return validate(options.xpath_assertions, args[1])
+
if not options.namespace_name:
_error('Namespace name missing')