gobject-introspection r592 - in trunk: gir giscanner tools



Author: walters
Date: Fri Sep 12 22:44:29 2008
New Revision: 592
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=592&view=rev

Log:
Add --xpath-assertions option to g-ir-scanner

	* giscanner/minixpath.py: Code to run an "XPath"
	assertion against an XML tree, taken from
	gir-repository/gir/tests.py.
	* giscanner/Makefile.am: Ship it.
	* tools/g-ir-scanner: Add --xpath-assertions option.
	* gir/GLib-assertions.txt: Add a few assertions.
	* gir/Makefile.am: Run them.


Added:
   trunk/gir/GLib-assertions.txt
   trunk/giscanner/minixpath.py
Modified:
   trunk/gir/Makefile.am
   trunk/giscanner/Makefile.am
   trunk/tools/g-ir-scanner

Added: trunk/gir/GLib-assertions.txt
==============================================================================
--- (empty file)
+++ trunk/gir/GLib-assertions.txt	Fri Sep 12 22:44:29 2008
@@ -0,0 +1,3 @@
+/namespace/alias[ name='Quark']
+/namespace/record[ name='PtrArray']
+/namespace/callback[ name='ThreadFunc']/return-value/type[ name='any']

Modified: trunk/gir/Makefile.am
==============================================================================
--- trunk/gir/Makefile.am	(original)
+++ trunk/gir/Makefile.am	Fri Sep 12 22:44:29 2008
@@ -28,6 +28,8 @@
 	    -D__G_I18N_LIB_H__ \
 	    $(GLIB_LIBDIR)/glib-2.0/include/glibconfig.h \
 	    $(GLIB_INCLUDEDIR)/glib/*.h
+	PYTHONPATH=$(top_builddir):$$PYTHONPATH $(G_IR_SCANNER) \
+	    --xpath-assertions=GLib-assertions.txt GLib.gir	
 BUILT_SOURCES += GLib.gir
 
 # gobject

Modified: trunk/giscanner/Makefile.am
==============================================================================
--- trunk/giscanner/Makefile.am	(original)
+++ trunk/giscanner/Makefile.am	Fri Sep 12 22:44:29 2008
@@ -42,6 +42,7 @@
 	girwriter.py		\
 	glibast.py		\
 	glibtransformer.py 	\
+	minixpath.py		\
 	odict.py		\
 	sourcescanner.py	\
 	transformer.py		\

Added: trunk/giscanner/minixpath.py
==============================================================================
--- (empty file)
+++ trunk/giscanner/minixpath.py	Fri Sep 12 22:44:29 2008
@@ -0,0 +1,81 @@
+# -*- 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))

Modified: trunk/tools/g-ir-scanner
==============================================================================
--- trunk/tools/g-ir-scanner	(original)
+++ trunk/tools/g-ir-scanner	Fri Sep 12 22:44:29 2008
@@ -38,6 +38,7 @@
 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():
@@ -76,7 +77,9 @@
     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",
@@ -110,6 +113,21 @@
     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)
@@ -120,6 +138,9 @@
     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')
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]