From c1d69375f2033539aee317478cd407711d131ca6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 3 Jan 2013 12:33:09 +0000 Subject: [PATCH] Make the code generation tools work under either Python 2 or 3 They have been verified to produce identical output in _gen. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=56758 Signed-off-by: Simon McVittie --- tools/c-constants-gen.py | 12 +++---- tools/glib-client-gen.py | 18 ++++------ tools/glib-client-marshaller-gen.py | 20 +++++------ tools/glib-errors-check-gen.py | 62 +++++++++++++++++------------------ tools/glib-errors-str-gen.py | 14 +++----- tools/glib-ginterface-gen.py | 22 +++++-------- tools/glib-gtypes-generator.py | 14 ++++---- tools/glib-interfaces-gen.py | 14 ++++---- tools/gobject-foo.py | 2 +- tools/libglibcodegen.py | 4 +-- tools/libtpcodegen.py | 22 ++++++++++++- tools/make-version-script.py | 32 +++++++++--------- tools/xincludator.py | 13 ++++++-- 13 files changed, 129 insertions(+), 120 deletions(-) diff --git a/tools/c-constants-gen.py b/tools/c-constants-gen.py index c7a93d3..a08afee 100644 --- a/tools/c-constants-gen.py +++ b/tools/c-constants-gen.py @@ -3,7 +3,7 @@ from sys import argv, stdout, stderr import xml.dom.minidom -from libtpcodegen import file_set_contents +from libtpcodegen import file_set_contents, u from libglibcodegen import NS_TP, get_docstring, \ get_descendant_text, get_by_path @@ -12,7 +12,7 @@ class Generator(object): self.prefix = prefix + '_' self.spec = get_by_path(dom, "spec")[0] - self.output_base = output_base + self.output_base = output_base self.__header = [] self.__docs = [] @@ -21,14 +21,14 @@ class Generator(object): self.do_body() self.do_footer() - file_set_contents(self.output_base + '.h', ''.join(self.__header)) - file_set_contents(self.output_base + '-gtk-doc.h', ''.join(self.__docs)) + file_set_contents(self.output_base + '.h', u('').join(self.__header).encode('utf-8')) + file_set_contents(self.output_base + '-gtk-doc.h', u('').join(self.__docs).encode('utf-8')) def write(self, code): - self.__header.append(code.encode('utf-8')) + self.__header.append(code) def d(self, code): - self.__docs.append(code.encode('utf-8')) + self.__docs.append(code) # Header def do_header(self): diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py index f8465a6..e68e1a5 100644 --- a/tools/glib-client-gen.py +++ b/tools/glib-client-gen.py @@ -27,8 +27,8 @@ import os.path import xml.dom.minidom from getopt import gnu_getopt -from libtpcodegen import file_set_contents -from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \ +from libtpcodegen import file_set_contents, key_by_name, u +from libglibcodegen import Signature, type_to_gtype, \ get_docstring, xml_escape, get_deprecated @@ -74,18 +74,12 @@ class Generator(object): self.guard = opts.get('--guard', None) def h(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__header.append(s) def b(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__body.append(s) def d(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__docs.append(s) def get_iface_quark(self): @@ -1191,7 +1185,7 @@ class Generator(object): self.b('') nodes = self.dom.getElementsByTagName('node') - nodes.sort(cmp_by_name) + nodes.sort(key=key_by_name) for node in nodes: self.do_interface(node) @@ -1244,9 +1238,9 @@ class Generator(object): self.h('#endif /* defined (%s) */' % self.guard) self.h('') - file_set_contents(self.basename + '.h', '\n'.join(self.__header)) - file_set_contents(self.basename + '-body.h', '\n'.join(self.__body)) - file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs)) + file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8')) + file_set_contents(self.basename + '-body.h', u('\n').join(self.__body).encode('utf-8')) + file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8')) def types_to_gtypes(types): return [type_to_gtype(t)[1] for t in types] diff --git a/tools/glib-client-marshaller-gen.py b/tools/glib-client-marshaller-gen.py index cb27d63..cd9823b 100644 --- a/tools/glib-client-marshaller-gen.py +++ b/tools/glib-client-marshaller-gen.py @@ -31,23 +31,23 @@ class Generator(object): for signal in signals: self.do_signal(signal) - print 'void' - print '%s_register_dbus_glib_marshallers (void)' % self.prefix - print '{' + print('void') + print('%s_register_dbus_glib_marshallers (void)' % self.prefix) + print('{') - all = self.marshallers.keys() + all = list(self.marshallers.keys()) all.sort() for marshaller in all: rhs = self.marshallers[marshaller] - print ' dbus_g_object_register_marshaller (' - print ' g_cclosure_marshal_generic,' - print ' G_TYPE_NONE, /* return */' + print(' dbus_g_object_register_marshaller (') + print(' g_cclosure_marshal_generic,') + print(' G_TYPE_NONE, /* return */') for type in rhs: - print ' G_TYPE_%s,' % type.replace('VOID', 'NONE') - print ' G_TYPE_INVALID);' + print(' G_TYPE_%s,' % type.replace('VOID', 'NONE')) + print(' G_TYPE_INVALID);') - print '}' + print('}') def types_to_gtypes(types): diff --git a/tools/glib-errors-check-gen.py b/tools/glib-errors-check-gen.py index 553fc9c..fad261e 100644 --- a/tools/glib-errors-check-gen.py +++ b/tools/glib-errors-check-gen.py @@ -12,13 +12,13 @@ class Generator(object): def __call__(self): - print '{' - print ' GEnumClass *klass;' - print ' GEnumValue *value_by_name;' - print ' GEnumValue *value_by_nick;' - print '' - print ' g_type_init ();' - print ' klass = g_type_class_ref (TP_TYPE_ERROR);' + print('{') + print(' GEnumClass *klass;') + print(' GEnumValue *value_by_name;') + print(' GEnumValue *value_by_nick;') + print('') + print(' g_type_init ();') + print(' klass = g_type_class_ref (TP_TYPE_ERROR);') for error in self.errors.getElementsByTagNameNS(NS_TP, 'error'): ns = error.parentNode.getAttribute('namespace') @@ -28,30 +28,30 @@ class Generator(object): s = ('TP_ERROR_STR_' + error.getAttribute('name').replace(' ', '_').replace('.', '_').upper()) - print '' - print ' /* %s.%s */' % (ns, nick) - print (' value_by_name = g_enum_get_value_by_name (klass, "%s");' - % enum) - print (' value_by_nick = g_enum_get_value_by_nick (klass, "%s");' - % nick) - print (' g_assert (value_by_name != NULL);') - print (' g_assert (value_by_nick != NULL);') - print (' g_assert_cmpint (value_by_name->value, ==, %s);' - % enum) - print (' g_assert_cmpint (value_by_nick->value, ==, %s);' - % enum) - print (' g_assert_cmpstr (value_by_name->value_name, ==, "%s");' - % enum) - print (' g_assert_cmpstr (value_by_nick->value_name, ==, "%s");' - % enum) - print (' g_assert_cmpstr (value_by_name->value_nick, ==, "%s");' - % nick) - print (' g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");' - % nick) - print (' g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");' - % (s, nick)) - - print '}' + print('') + print(' /* %s.%s */' % (ns, nick)) + print(' value_by_name = g_enum_get_value_by_name (klass, "%s");' + % enum) + print(' value_by_nick = g_enum_get_value_by_nick (klass, "%s");' + % nick) + print(' g_assert (value_by_name != NULL);') + print(' g_assert (value_by_nick != NULL);') + print(' g_assert_cmpint (value_by_name->value, ==, %s);' + % enum) + print(' g_assert_cmpint (value_by_nick->value, ==, %s);' + % enum) + print(' g_assert_cmpstr (value_by_name->value_name, ==, "%s");' + % enum) + print(' g_assert_cmpstr (value_by_nick->value_name, ==, "%s");' + % enum) + print(' g_assert_cmpstr (value_by_name->value_nick, ==, "%s");' + % nick) + print(' g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");' + % nick) + print(' g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");' + % (s, nick)) + + print('}') if __name__ == '__main__': argv = sys.argv[1:] diff --git a/tools/glib-errors-str-gen.py b/tools/glib-errors-str-gen.py index b2cf520..ddb1e16 100644 --- a/tools/glib-errors-str-gen.py +++ b/tools/glib-errors-str-gen.py @@ -3,7 +3,7 @@ import sys import xml.dom.minidom -from libtpcodegen import file_set_contents +from libtpcodegen import file_set_contents, u from libglibcodegen import NS_TP, get_docstring, xml_escape class Generator(object): @@ -17,18 +17,12 @@ class Generator(object): self.__docs = [] def h(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__header.append(s) def b(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__body.append(s) def d(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__docs.append(s) def __call__(self): @@ -72,9 +66,9 @@ class Generator(object): self.h('') self.b('') - file_set_contents(self.basename + '.h', '\n'.join(self.__header)) - file_set_contents(self.basename + '.c', '\n'.join(self.__body)) - file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs)) + file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8')) + file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8')) + file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8')) if __name__ == '__main__': argv = sys.argv[1:] diff --git a/tools/glib-ginterface-gen.py b/tools/glib-ginterface-gen.py index 6fec0d3..c0ce20d 100644 --- a/tools/glib-ginterface-gen.py +++ b/tools/glib-ginterface-gen.py @@ -26,8 +26,8 @@ import sys import os.path import xml.dom.minidom -from libtpcodegen import file_set_contents -from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \ +from libtpcodegen import file_set_contents, key_by_name, u +from libglibcodegen import Signature, type_to_gtype, \ NS_TP, dbus_gutils_wincaps_to_uscore @@ -85,18 +85,12 @@ class Generator(object): self.allow_havoc = allow_havoc def h(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__header.append(s) def b(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__body.append(s) def d(self, s): - if isinstance(s, unicode): - s = s.encode('utf-8') self.__docs.append(s) def do_node(self, node): @@ -733,7 +727,7 @@ class Generator(object): def __call__(self): nodes = self.dom.getElementsByTagName('node') - nodes.sort(cmp_by_name) + nodes.sort(key=key_by_name) self.h('#include ') self.h('#include ') @@ -761,12 +755,12 @@ class Generator(object): self.h('') self.b('') - file_set_contents(self.basename + '.h', '\n'.join(self.__header)) - file_set_contents(self.basename + '.c', '\n'.join(self.__body)) - file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs)) + file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8')) + file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8')) + file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8')) def cmdline_error(): - print """\ + print("""\ usage: gen-ginterface [OPTIONS] xmlfile Prefix_ options: @@ -786,7 +780,7 @@ options: void symbol (DBusGMethodInvocation *context) and return some sort of "not implemented" error via dbus_g_method_return_error (context, ...) -""" +""") sys.exit(1) diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py index 21dfc6a..1477bd3 100644 --- a/tools/glib-gtypes-generator.py +++ b/tools/glib-gtypes-generator.py @@ -23,7 +23,7 @@ import sys import xml.dom.minidom -from libtpcodegen import file_set_contents +from libtpcodegen import file_set_contents, u from libglibcodegen import escape_as_identifier, \ get_docstring, \ NS_TP, \ @@ -68,13 +68,13 @@ class GTypesGenerator(object): self.need_other_arrays = {} def h(self, code): - self.header.append(code.encode("utf-8")) + self.header.append(code) def c(self, code): - self.body.append(code.encode("utf-8")) + self.body.append(code) def d(self, code): - self.docs.append(code.encode('utf-8')) + self.docs.append(code) def do_mapping_header(self, mapping): members = mapping.getElementsByTagNameNS(NS_TP, 'member') @@ -292,9 +292,9 @@ class GTypesGenerator(object): self.c(' return t;\n') self.c('}\n\n') - file_set_contents(self.output + '.h', ''.join(self.header)) - file_set_contents(self.output + '-body.h', ''.join(self.body)) - file_set_contents(self.output + '-gtk-doc.h', ''.join(self.docs)) + file_set_contents(self.output + '.h', u('').join(self.header).encode('utf-8')) + file_set_contents(self.output + '-body.h', u('').join(self.body).encode('utf-8')) + file_set_contents(self.output + '-gtk-doc.h', u('').join(self.docs).encode('utf-8')) if __name__ == '__main__': argv = sys.argv[1:] diff --git a/tools/glib-interfaces-gen.py b/tools/glib-interfaces-gen.py index 410762c..b67d7b4 100644 --- a/tools/glib-interfaces-gen.py +++ b/tools/glib-interfaces-gen.py @@ -3,7 +3,7 @@ from sys import argv, stdout, stderr import xml.dom.minidom -from libtpcodegen import file_set_contents +from libtpcodegen import file_set_contents, u from libglibcodegen import NS_TP, get_docstring, \ get_descendant_text, get_by_path @@ -24,22 +24,22 @@ class Generator(object): self.spec = get_by_path(dom, "spec")[0] def h(self, code): - self.decls.append(code.encode('utf-8')) + self.decls.append(code) def c(self, code): - self.impls.append(code.encode('utf-8')) + self.impls.append(code) def d(self, code): - self.docs.append(code.encode('utf-8')) + self.docs.append(code) def __call__(self): for f in self.h, self.c: self.do_header(f) self.do_body() - file_set_contents(self.implfile, ''.join(self.impls)) - file_set_contents(self.declfile, ''.join(self.decls)) - file_set_contents(self.docfile, ''.join(self.docs)) + file_set_contents(self.implfile, u('').join(self.impls).encode('utf-8')) + file_set_contents(self.declfile, u('').join(self.decls).encode('utf-8')) + file_set_contents(self.docfile, u('').join(self.docs).encode('utf-8')) # Header def do_header(self, f): diff --git a/tools/gobject-foo.py b/tools/gobject-foo.py index 002a290..a2abd76 100644 --- a/tools/gobject-foo.py +++ b/tools/gobject-foo.py @@ -87,4 +87,4 @@ if __name__ == '__main__': head, tail = argv - print '\n'.join(gobject_header(head, tail, as_interface=as_interface)) + print('\n'.join(gobject_header(head, tail, as_interface=as_interface))) diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py index 6a9d214..6cd1a62 100644 --- a/tools/libglibcodegen.py +++ b/tools/libglibcodegen.py @@ -154,7 +154,7 @@ def type_to_gtype(s): return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False) elif s[:2] == 'a{': #some arbitrary hash tables if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'): - raise Exception, "can't index a hashtable off non-basic type " + s + raise Exception("can't index a hashtable off non-basic type " + s) first = type_to_gtype(s[2]) second = type_to_gtype(s[3:-1]) return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False) @@ -169,4 +169,4 @@ def type_to_gtype(s): return ("GValueArray *", gtype, "BOXED", True) # we just don't know .. - raise Exception, "don't know the GType for " + s + raise Exception("don't know the GType for " + s) diff --git a/tools/libtpcodegen.py b/tools/libtpcodegen.py index 7e9eb9a..99de663 100644 --- a/tools/libtpcodegen.py +++ b/tools/libtpcodegen.py @@ -21,6 +21,7 @@ please make any changes there. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os +import sys from string import ascii_letters, digits @@ -28,6 +29,20 @@ NS_TP = "http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0" _ASCII_ALNUM = ascii_letters + digits +if sys.version_info[0] >= 3: + def u(s): + """Return s, which must be a str literal with no non-ASCII characters. + This is like a more restricted form of the Python 2 u'' syntax. + """ + return s.encode('ascii').decode('ascii') +else: + def u(s): + """Return a Unicode version of s, which must be a str literal + (a bytestring) in which each byte is an ASCII character. + This is like a more restricted form of the u'' syntax. + """ + return s.decode('ascii') + def file_set_contents(filename, contents): try: os.remove(filename) @@ -38,13 +53,15 @@ def file_set_contents(filename, contents): except OSError: pass - open(filename + '.tmp', 'w').write(contents) + open(filename + '.tmp', 'wb').write(contents) os.rename(filename + '.tmp', filename) def cmp_by_name(node1, node2): return cmp(node1.getAttributeNode("name").nodeValue, node2.getAttributeNode("name").nodeValue) +def key_by_name(node): + return node.getAttributeNode("name").nodeValue def escape_as_identifier(identifier): """Escape the given string to be a valid D-Bus object path or service @@ -168,6 +185,9 @@ class _SignatureIter: self.remaining = string def next(self): + return self.__next__() + + def __next__(self): if self.remaining == '': raise StopIteration diff --git a/tools/make-version-script.py b/tools/make-version-script.py index 0d30aa3..4ced849 100644 --- a/tools/make-version-script.py +++ b/tools/make-version-script.py @@ -63,9 +63,9 @@ def main(abifiles, symbols=None, unreleased_version=None, if dpkg: assert dpkg_first_line is not None - print dpkg_first_line + print(dpkg_first_line) if dpkg_build_depends_package is not None: - print "* Build-Depends-Package: %s" % dpkg_build_depends_package + print("* Build-Depends-Package: %s" % dpkg_build_depends_package) for filename in abifiles: lines = open(filename, 'r').readlines() @@ -120,8 +120,8 @@ def main(abifiles, symbols=None, unreleased_version=None, lines = lines[cut:] if gnuld: - print "%s {" % version - print " global:" + print("%s {" % version) + print(" global:") for symbol in lines: symbol = symbol.strip() @@ -130,7 +130,7 @@ def main(abifiles, symbols=None, unreleased_version=None, continue if gnuld: - print " %s;" % symbol + print(" %s;" % symbol) elif dpkg: dpkg_symbols.append('%s@%s %s' % (symbol, version, release)) @@ -142,22 +142,22 @@ def main(abifiles, symbols=None, unreleased_version=None, if gnuld: if extends == '-': - print " local:" - print " *;" - print "};" + print(" local:") + print(" *;") + print("};") else: - print "} %s;" % extends - print + print("} %s;" % extends) + print("") if dpkg: dpkg_symbols.sort() dpkg_versions.sort() for x in dpkg_versions: - print " %s" % x + print(" %s" % x) for x in dpkg_symbols: - print " %s" % x + print(" %s" % x) if symbol_set is not None: missing = versioned_symbols - symbol_set @@ -182,13 +182,13 @@ def main(abifiles, symbols=None, unreleased_version=None, raise SystemExit(1) if gnuld: - print "%s {" % unreleased_version - print " global:" + print("%s {" % unreleased_version) + print(" global:") for symbol in unreleased: - print " %s;" % symbol + print(" %s;" % symbol) - print "} %s;" % version + print("} %s;" % version) if __name__ == '__main__': diff --git a/tools/xincludator.py b/tools/xincludator.py index 63e106a..f9ed49c 100644 --- a/tools/xincludator.py +++ b/tools/xincludator.py @@ -1,17 +1,19 @@ #!/usr/bin/python +import sys from sys import argv, stdout, stderr import codecs, locale import os import xml.dom.minidom -stdout = codecs.getwriter('utf-8')(stdout) +if sys.version_info[0] < 3: + stdout = codecs.getwriter('utf-8')(stdout) NS_XI = 'http://www.w3.org/2001/XInclude' def xincludate(dom, base, dropns = []): remove_attrs = [] - for i in xrange(dom.documentElement.attributes.length): + for i in range(dom.documentElement.attributes.length): attr = dom.documentElement.attributes.item(i) if attr.prefix == 'xmlns': if attr.localName in dropns: @@ -34,6 +36,11 @@ if __name__ == '__main__': argv = argv[1:] dom = xml.dom.minidom.parse(argv[0]) xincludate(dom, argv[0]) - xml = dom.toxml() + + if sys.version_info[0] >= 3: + xml = dom.toxml(encoding=None) + else: + xml = dom.toxml() + stdout.write(xml) stdout.write('\n') -- 1.7.10.4