2018-02-08 20:55:31 +01:00
|
|
|
From 3d847a60ddc9b6310b08c4264d1cbdbee4cfb0ef Mon Sep 17 00:00:00 2001
|
2018-01-26 00:50:30 +01:00
|
|
|
From: "Daniel P. Berrange" <berrange@redhat.com>
|
2018-02-08 20:55:31 +01:00
|
|
|
Date: Tue, 16 Jan 2018 13:42:05 +0000
|
2018-01-26 00:50:30 +01:00
|
|
|
Subject: [PATCH] qapi: use items()/values() intead of iteritems()/itervalues()
|
|
|
|
MIME-Version: 1.0
|
|
|
|
Content-Type: text/plain; charset=UTF-8
|
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
|
|
|
|
The iteritems()/itervalues() methods are gone in py3, but the
|
|
|
|
items()/values() methods are still around. The latter are less
|
|
|
|
efficient than the former in py2, but this has unmeasurably
|
|
|
|
small impact on QEMU build time, so taking portability over
|
|
|
|
efficiency is a net win.
|
|
|
|
|
|
|
|
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
|
|
|
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
2018-02-08 20:55:31 +01:00
|
|
|
Message-Id: <20180116134217.8725-3-berrange@redhat.com>
|
|
|
|
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
|
(cherry picked from commit 2f8480447067d6f42af52a886385284ead052af9)
|
|
|
|
[BR: BSC#1077564 - note that this patch also includes commit
|
|
|
|
ef9d9108917d6d5f903bca31602827e512a51c50 squashed in, which is how
|
|
|
|
I originally included patch. This avoids renaming of the patch queue]
|
|
|
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
2018-01-26 00:50:30 +01:00
|
|
|
---
|
|
|
|
scripts/qapi.py | 24 ++++++++++++------------
|
|
|
|
scripts/qapi2texi.py | 11 ++++++-----
|
|
|
|
tests/qapi-schema/test-qapi.py | 37 +++++++++++++++++++------------------
|
|
|
|
3 files changed, 37 insertions(+), 35 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/scripts/qapi.py b/scripts/qapi.py
|
|
|
|
index 62dc52ed6e..d5ac21ad35 100644
|
|
|
|
--- a/scripts/qapi.py
|
|
|
|
+++ b/scripts/qapi.py
|
|
|
|
@@ -11,6 +11,7 @@
|
|
|
|
# This work is licensed under the terms of the GNU GPL, version 2.
|
|
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
|
|
|
|
+from __future__ import print_function
|
|
|
|
import errno
|
|
|
|
import getopt
|
|
|
|
import os
|
|
|
|
@@ -252,7 +253,7 @@ class QAPIDoc(object):
|
|
|
|
"'Returns:' is only valid for commands")
|
|
|
|
|
|
|
|
def check(self):
|
|
|
|
- bogus = [name for name, section in self.args.iteritems()
|
|
|
|
+ bogus = [name for name, section in self.args.items()
|
|
|
|
if not section.member]
|
|
|
|
if bogus:
|
|
|
|
raise QAPISemError(
|
|
|
|
@@ -308,7 +309,7 @@ class QAPISchemaParser(object):
|
|
|
|
if not isinstance(pragma, dict):
|
|
|
|
raise QAPISemError(
|
|
|
|
info, "Value of 'pragma' must be a dictionary")
|
|
|
|
- for name, value in pragma.iteritems():
|
|
|
|
+ for name, value in pragma.items():
|
|
|
|
self._pragma(name, value, info)
|
|
|
|
else:
|
|
|
|
expr_elem = {'expr': expr,
|
|
|
|
@@ -1476,7 +1477,7 @@ class QAPISchema(object):
|
|
|
|
self._def_exprs()
|
|
|
|
self.check()
|
|
|
|
except QAPIError as err:
|
|
|
|
- print >>sys.stderr, err
|
|
|
|
+ print(err, file=sys.stderr)
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
def _def_entity(self, ent):
|
|
|
|
@@ -1574,7 +1575,7 @@ class QAPISchema(object):
|
|
|
|
|
|
|
|
def _make_members(self, data, info):
|
|
|
|
return [self._make_member(key, value, info)
|
|
|
|
- for (key, value) in data.iteritems()]
|
|
|
|
+ for (key, value) in data.items()]
|
|
|
|
|
|
|
|
def _def_struct_type(self, expr, info, doc):
|
|
|
|
name = expr['struct']
|
|
|
|
@@ -1606,11 +1607,11 @@ class QAPISchema(object):
|
|
|
|
name, info, doc, 'base', self._make_members(base, info)))
|
|
|
|
if tag_name:
|
|
|
|
variants = [self._make_variant(key, value)
|
|
|
|
- for (key, value) in data.iteritems()]
|
|
|
|
+ for (key, value) in data.items()]
|
|
|
|
members = []
|
|
|
|
else:
|
|
|
|
variants = [self._make_simple_variant(key, value, info)
|
|
|
|
- for (key, value) in data.iteritems()]
|
|
|
|
+ for (key, value) in data.items()]
|
|
|
|
typ = self._make_implicit_enum_type(name, info,
|
|
|
|
[v.name for v in variants])
|
|
|
|
tag_member = QAPISchemaObjectTypeMember('type', typ, False)
|
|
|
|
@@ -1625,7 +1626,7 @@ class QAPISchema(object):
|
|
|
|
name = expr['alternate']
|
|
|
|
data = expr['data']
|
|
|
|
variants = [self._make_variant(key, value)
|
|
|
|
- for (key, value) in data.iteritems()]
|
|
|
|
+ for (key, value) in data.items()]
|
|
|
|
tag_member = QAPISchemaObjectTypeMember('type', 'QType', False)
|
|
|
|
self._def_entity(
|
|
|
|
QAPISchemaAlternateType(name, info, doc,
|
|
|
|
@@ -1940,7 +1941,7 @@ def parse_command_line(extra_options='', extra_long_options=[]):
|
|
|
|
['source', 'header', 'prefix=',
|
|
|
|
'output-dir='] + extra_long_options)
|
|
|
|
except getopt.GetoptError as err:
|
|
|
|
- print >>sys.stderr, "%s: %s" % (sys.argv[0], str(err))
|
|
|
|
+ print("%s: %s" % (sys.argv[0], str(err)), file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
output_dir = ''
|
|
|
|
@@ -1954,9 +1955,8 @@ def parse_command_line(extra_options='', extra_long_options=[]):
|
|
|
|
if o in ('-p', '--prefix'):
|
|
|
|
match = re.match(r'([A-Za-z_.-][A-Za-z0-9_.-]*)?', a)
|
|
|
|
if match.end() != len(a):
|
|
|
|
- print >>sys.stderr, \
|
|
|
|
- "%s: 'funny character '%s' in argument of --prefix" \
|
|
|
|
- % (sys.argv[0], a[match.end()])
|
|
|
|
+ print("%s: 'funny character '%s' in argument of --prefix" \
|
|
|
|
+ % (sys.argv[0], a[match.end()]), file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
prefix = a
|
|
|
|
elif o in ('-o', '--output-dir'):
|
|
|
|
@@ -1973,7 +1973,7 @@ def parse_command_line(extra_options='', extra_long_options=[]):
|
|
|
|
do_h = True
|
|
|
|
|
|
|
|
if len(args) != 1:
|
|
|
|
- print >>sys.stderr, "%s: need exactly one argument" % sys.argv[0]
|
|
|
|
+ print("%s: need exactly one argument" % sys.argv[0], file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
fname = args[0]
|
|
|
|
|
|
|
|
diff --git a/scripts/qapi2texi.py b/scripts/qapi2texi.py
|
|
|
|
index a317526e51..a61e88934b 100755
|
|
|
|
--- a/scripts/qapi2texi.py
|
|
|
|
+++ b/scripts/qapi2texi.py
|
|
|
|
@@ -4,6 +4,7 @@
|
|
|
|
# This work is licensed under the terms of the GNU LGPL, version 2+.
|
|
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
"""This script produces the documentation of a qapi schema in texinfo format"""
|
|
|
|
+from __future__ import print_function
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
@@ -147,7 +148,7 @@ def texi_member(member, suffix=''):
|
|
|
|
def texi_members(doc, what, base, variants, member_func):
|
|
|
|
"""Format the table of members"""
|
|
|
|
items = ''
|
|
|
|
- for section in doc.args.itervalues():
|
|
|
|
+ for section in doc.args.values():
|
|
|
|
# TODO Drop fallbacks when undocumented members are outlawed
|
|
|
|
if section.content:
|
|
|
|
desc = texi_format(str(section))
|
|
|
|
@@ -285,15 +286,15 @@ def texi_schema(schema):
|
|
|
|
def main(argv):
|
|
|
|
"""Takes schema argument, prints result to stdout"""
|
|
|
|
if len(argv) != 2:
|
|
|
|
- print >>sys.stderr, "%s: need exactly 1 argument: SCHEMA" % argv[0]
|
|
|
|
+ print("%s: need exactly 1 argument: SCHEMA" % argv[0], file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
schema = qapi.QAPISchema(argv[1])
|
|
|
|
if not qapi.doc_required:
|
|
|
|
- print >>sys.stderr, ("%s: need pragma 'doc-required' "
|
|
|
|
- "to generate documentation" % argv[0])
|
|
|
|
+ print("%s: need pragma 'doc-required' "
|
|
|
|
+ "to generate documentation" % argv[0], file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
- print texi_schema(schema)
|
|
|
|
+ print(texi_schema(schema))
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
|
|
|
|
index c7724d3437..9bbe35daf0 100644
|
|
|
|
--- a/tests/qapi-schema/test-qapi.py
|
|
|
|
+++ b/tests/qapi-schema/test-qapi.py
|
|
|
|
@@ -10,6 +10,7 @@
|
|
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
#
|
|
|
|
|
|
|
|
+from __future__ import print_function
|
|
|
|
from qapi import *
|
|
|
|
from pprint import pprint
|
|
|
|
import os
|
|
|
|
@@ -18,51 +19,51 @@ import sys
|
|
|
|
|
|
|
|
class QAPISchemaTestVisitor(QAPISchemaVisitor):
|
|
|
|
def visit_enum_type(self, name, info, values, prefix):
|
|
|
|
- print 'enum %s %s' % (name, values)
|
|
|
|
+ print('enum %s %s' % (name, values))
|
|
|
|
if prefix:
|
|
|
|
- print ' prefix %s' % prefix
|
|
|
|
+ print(' prefix %s' % prefix)
|
|
|
|
|
|
|
|
def visit_object_type(self, name, info, base, members, variants):
|
|
|
|
- print 'object %s' % name
|
|
|
|
+ print('object %s' % name)
|
|
|
|
if base:
|
|
|
|
- print ' base %s' % base.name
|
|
|
|
+ print(' base %s' % base.name)
|
|
|
|
for m in members:
|
|
|
|
- print ' member %s: %s optional=%s' % \
|
|
|
|
- (m.name, m.type.name, m.optional)
|
|
|
|
+ print(' member %s: %s optional=%s' % \
|
|
|
|
+ (m.name, m.type.name, m.optional))
|
|
|
|
self._print_variants(variants)
|
|
|
|
|
|
|
|
def visit_alternate_type(self, name, info, variants):
|
|
|
|
- print 'alternate %s' % name
|
|
|
|
+ print('alternate %s' % name)
|
|
|
|
self._print_variants(variants)
|
|
|
|
|
|
|
|
def visit_command(self, name, info, arg_type, ret_type,
|
|
|
|
gen, success_response, boxed):
|
|
|
|
- print 'command %s %s -> %s' % \
|
|
|
|
+ print('command %s %s -> %s' % \)
|
|
|
|
(name, arg_type and arg_type.name, ret_type and ret_type.name)
|
|
|
|
- print ' gen=%s success_response=%s boxed=%s' % \
|
|
|
|
+ print(' gen=%s success_response=%s boxed=%s' % \)
|
|
|
|
(gen, success_response, boxed)
|
|
|
|
|
|
|
|
def visit_event(self, name, info, arg_type, boxed):
|
|
|
|
- print 'event %s %s' % (name, arg_type and arg_type.name)
|
|
|
|
- print ' boxed=%s' % boxed
|
|
|
|
+ print('event %s %s' % (name, arg_type and arg_type.name))
|
|
|
|
+ print(' boxed=%s' % boxed)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _print_variants(variants):
|
|
|
|
if variants:
|
|
|
|
- print ' tag %s' % variants.tag_member.name
|
|
|
|
+ print(' tag %s' % variants.tag_member.name)
|
|
|
|
for v in variants.variants:
|
|
|
|
- print ' case %s: %s' % (v.name, v.type.name)
|
|
|
|
+ print(' case %s: %s' % (v.name, v.type.name))
|
|
|
|
|
|
|
|
schema = QAPISchema(sys.argv[1])
|
|
|
|
schema.visit(QAPISchemaTestVisitor())
|
|
|
|
|
|
|
|
for doc in schema.docs:
|
|
|
|
if doc.symbol:
|
|
|
|
- print 'doc symbol=%s' % doc.symbol
|
|
|
|
+ print('doc symbol=%s' % doc.symbol)
|
|
|
|
else:
|
|
|
|
- print 'doc freeform'
|
|
|
|
- print ' body=\n%s' % doc.body
|
|
|
|
+ print('doc freeform')
|
|
|
|
+ print(' body=\n%s' % doc.body)
|
|
|
|
for arg, section in doc.args.iteritems():
|
|
|
|
- print ' arg=%s\n%s' % (arg, section)
|
|
|
|
+ print(' arg=%s\n%s' % (arg, section))
|
|
|
|
for section in doc.sections:
|
|
|
|
- print ' section=%s\n%s' % (section.name, section)
|
|
|
|
+ print(' section=%s\n%s' % (section.name, section))
|