summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2022-03-24 16:35:13 +0000
committerDaniel P. Berrangé <berrange@redhat.com>2022-04-21 12:32:51 +0100
commit3950e1ddd5eb1040847fa0809c8ea4e2acd4967e (patch)
tree0e94e96262b7897d5de26781eb25e75ede373868
parentc8abe55d4cd7bcf0ac686c2361bad5dba3a661e6 (diff)
downloadlibvirt-python-3950e1ddd5eb1040847fa0809c8ea4e2acd4967e.tar.gz
generator: merge python wrapper generator methods
Instead of having three separate methods for generating python wrappers, merge them all together. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
-rwxr-xr-xgenerator.py302
-rw-r--r--libvirt-qemu-override.py1
2 files changed, 71 insertions, 232 deletions
diff --git a/generator.py b/generator.py
index b958e47..64a884e 100755
--- a/generator.py
+++ b/generator.py
@@ -1190,10 +1190,6 @@ def writeDoc(module: str, name: str, args: List[ArgumentType], indent: str, outp
def buildWrappers(module: str) -> None:
- if not module == "libvirt":
- print("ERROR: Unknown module type: %s" % module)
- return None
-
package = module.replace('-', '_')
if module == "libvirt":
pymod = "libvirtmod"
@@ -1283,15 +1279,19 @@ def buildWrappers(module: str) -> None:
classes.write(" if \"No module named\" in str(cyg_e):\n")
classes.write(" raise lib_e\n\n")
+ if module != "libvirt":
+ classes.write("import libvirt\n")
+ classes.write("\n")
+
if extra:
classes.write("# WARNING WARNING WARNING WARNING\n")
classes.write("#\n")
- classes.write("# Manually written part of python bindings for libvirt\n")
+ classes.write("# Manually written part of python bindings for %s\n" % module)
classes.writelines(extra.readlines())
classes.write("#\n")
classes.write("# WARNING WARNING WARNING WARNING\n")
classes.write("#\n")
- classes.write("# Automatically written part of python bindings for libvirt\n")
+ classes.write("# Automatically written part of python bindings for %s\n" % module)
classes.write("#\n")
classes.write("# WARNING WARNING WARNING WARNING\n")
if extra:
@@ -1384,7 +1384,10 @@ def buildWrappers(module: str) -> None:
classes.write("\n")
- for classname in classes_list:
+ modclasses = []
+ if module == "libvirt":
+ modclasses = classes_list
+ for classname in modclasses:
PARENTS = {
"virConnect": "self._conn",
"virDomain": "self._dom",
@@ -1563,8 +1566,9 @@ def buildWrappers(module: str) -> None:
classes.write("\n")
# Append "<classname>.py" to class def, iff it exists
- try:
- extra = open("libvirt-override-%s.py" % (classname,), "r")
+ class_override = "%s-override-%s.py" % (module, classname)
+ if os.path.exists(class_override):
+ extra = open(class_override, "r")
classes.write(" #\n")
classes.write(" # %s methods from %s.py (hand coded)\n" % (classname, classname))
classes.write(" #\n")
@@ -1609,116 +1613,32 @@ def buildWrappers(module: str) -> None:
classes.writelines(cached)
classes.write("\n")
extra.close()
- except Exception:
- pass
- #
- # Generate enum constants
- #
- def enumsSortKey(data: Tuple[str, EnumValue]) -> Tuple[Union[int, float], str]:
- try:
- value = int(data[1]) # type: Union[int, float]
- except ValueError:
- value = float('inf')
- return value, data[0]
+ direct_functions = {}
+ if module != "libvirt":
+ direct_functions = functions
- # Resolve only one level of reference
- def resolveEnum(enum: EnumType, data: EnumType) -> EnumType:
- for name, val in enum.items():
- try:
- int(val)
- except ValueError:
- enum[name] = data[val] # type: ignore
- return enum
-
- enumvals = list(enums.items())
- # convert list of dicts to one dict
- enumData = {} # type: EnumType
- for type, enum in enumvals:
- enumData.update(enum)
+ classes.write("#\n# Functions from module %s\n#\n\n" % module)
- for type, enum in sorted(enumvals):
- classes.write("# %s\n" % type)
- items = sorted(resolveEnum(enum, enumData).items(), key=enumsSortKey)
- if items[-1][0].endswith('_LAST'):
- del items[-1]
- for name, value in items:
- classes.write("%s = %s\n" % (name, value))
- classes.write("\n")
-
- classes.write("# typed parameter names\n")
- for name, value in params:
- classes.write("%s = \"%s\"\n" % (name, value))
-
- classes.close()
-
-
-def qemuBuildWrappers(module: str) -> None:
- if not module == "libvirt-qemu":
- print("ERROR: only libvirt-qemu is supported")
- return None
-
- extra_file = "%s-override.py" % module
- extra = None
-
- fd = open("build/libvirt_qemu.py", "w")
-
- if os.path.exists(extra_file):
- extra = open(extra_file, "r")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# This file is automatically written by generator.py. Any changes\n")
- fd.write("# made here will be lost.\n")
- fd.write("#\n")
- fd.write("# To change the manually written methods edit %s-override.py\n" % (module,))
- fd.write("# To change the automatically written methods edit generator.py\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# Automatically written part of python bindings for libvirt\n")
- fd.write("#\n")
-
- fd.write("try:\n")
- fd.write(" import libvirtmod_qemu\n")
- fd.write("except ImportError as lib_e:\n")
- fd.write(" try:\n")
- fd.write(" import cygvirtmod_qemu as libvirtmod_qemu\n")
- fd.write(" except ImportError as cyg_e:\n")
- fd.write(" if \"No module named\" in str(cyg_e):\n")
- fd.write(" raise lib_e\n\n")
-
- fd.write("import libvirt\n\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- if extra:
- fd.writelines(extra.readlines())
- fd.write("#\n")
- if extra:
- extra.close()
-
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("#\n# Functions from module %s\n#\n\n" % module)
#
# Generate functions directly, no classes
#
- for name, (desc, ret, args, file, mod, cond) in sorted(functions.items()):
+ for name, (desc, ret, args, file, mod, cond) in sorted(direct_functions.items()):
func = nameFixup(name, 'None', '', '')
- fd.write("def %s(" % func)
+ classes.write("def %s(" % func)
for n, (a_name, a_type, a_info) in enumerate(args):
if n != 0:
- fd.write(", ")
- fd.write("%s" % a_name)
- fd.write("):\n")
- writeDoc(module, name, args, ' ', fd)
+ classes.write(", ")
+ classes.write("%s" % a_name)
+ classes.write("):\n")
+ writeDoc(module, name, args, ' ', classes)
r_type, r_info, r_field = ret
if r_type != "void":
- fd.write(" ret = ")
+ classes.write(" ret = ")
else:
- fd.write(" ")
- fd.write("libvirtmod_qemu.%s(" % name)
+ classes.write(" ")
+ classes.write("%s.%s(" % (pymod, name))
conn = None
@@ -1727,141 +1647,70 @@ def qemuBuildWrappers(module: str) -> None:
conn = a_name
if n != 0:
- fd.write(", ")
+ classes.write(", ")
if a_type in ["virDomainPtr", "virConnectPtr"]:
# FIXME: This might have problem if the function
# has multiple args which are objects.
- fd.write("%s.%s" % (a_name, "_o"))
+ classes.write("%s.%s" % (a_name, "_o"))
else:
- fd.write("%s" % a_name)
- fd.write(")\n")
+ classes.write("%s" % a_name)
+ classes.write(")\n")
if r_type != "void":
- fd.write(" if ret is None:\n"
+ classes.write(" if ret is None:\n"
" raise libvirt.libvirtError('%s() failed')\n" % (name,))
if r_type == "virDomainPtr":
- fd.write(" __tmp = libvirt.virDomain(%s, _obj=ret)\n" % (conn,))
- fd.write(" return __tmp\n")
+ classes.write(" __tmp = libvirt.virDomain(%s, _obj=ret)\n" % (conn,))
+ classes.write(" return __tmp\n")
else:
- fd.write(" return ret\n")
+ classes.write(" return ret\n")
- fd.write("\n")
+ classes.write("\n")
#
# Generate enum constants
#
- for type, enum in sorted(enums.items()):
- fd.write("# %s\n" % type)
- for name, value in sorted(enum.items(), key=lambda i: (int(i[1]), i[0])):
- fd.write("%s = %s\n" % (name, value))
- fd.write("\n")
-
- fd.close()
-
-
-def lxcBuildWrappers(module: str) -> None:
- if not module == "libvirt-lxc":
- print("ERROR: only libvirt-lxc is supported")
- return None
-
- extra_file = "%s-override.py" % module
- extra = None
-
- fd = open("build/libvirt_lxc.py", "w")
-
- if os.path.exists(extra_file):
- extra = open(extra_file, "r")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# This file is automatically written by generator.py. Any changes\n")
- fd.write("# made here will be lost.\n")
- fd.write("#\n")
- fd.write("# To change the manually written methods edit %s-override.py\n" % (module,))
- fd.write("# To change the automatically written methods edit generator.py\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- if extra:
- fd.writelines(extra.readlines())
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# Automatically written part of python bindings for libvirt\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- if extra:
- extra.close()
-
- fd.write("try:\n")
- fd.write(" import libvirtmod_lxc\n")
- fd.write("except ImportError as lib_e:\n")
- fd.write(" try:\n")
- fd.write(" import cygvirtmod_lxc as libvirtmod_lxc\n")
- fd.write(" except ImportError as cyg_e:\n")
- fd.write(" if \"No module named\" in str(cyg_e):\n")
- fd.write(" raise lib_e\n\n")
-
- fd.write("import libvirt\n\n")
- fd.write("#\n# Functions from module %s\n#\n\n" % module)
- #
- # Generate functions directly, no classes
- #
- for name, (desc, ret, args, file, mod, cond) in sorted(functions.items()):
- func = nameFixup(name, 'None', '', '')
- fd.write("def %s(" % func)
- for n, (a_name, a_type, a_info) in enumerate(args):
- if n != 0:
- fd.write(", ")
- fd.write("%s" % a_name)
- fd.write("):\n")
- writeDoc(module, name, args, ' ', fd)
-
- r_type, r_info, r_field = ret
- if r_type != "void":
- fd.write(" ret = ")
- else:
- fd.write(" ")
- fd.write("libvirtmod_lxc.%s(" % name)
-
- conn = None
-
- for n, (a_name, a_type, a_info) in enumerate(args):
- if a_type == "virConnectPtr":
- conn = a_name
+ def enumsSortKey(data: Tuple[str, EnumValue]) -> Tuple[Union[int, float], str]:
+ try:
+ value = int(data[1]) # type: Union[int, float]
+ except ValueError:
+ value = float('inf')
+ return value, data[0]
- if n != 0:
- fd.write(", ")
- if a_type in ["virDomainPtr", "virConnectPtr"]:
- # FIXME: This might have problem if the function
- # has multiple args which are objects.
- fd.write("%s.%s" % (a_name, "_o"))
- else:
- fd.write("%s" % a_name)
- fd.write(")\n")
+ # Resolve only one level of reference
+ def resolveEnum(enum: EnumType, data: EnumType) -> EnumType:
+ for name, val in enum.items():
+ try:
+ int(val)
+ except ValueError:
+ enum[name] = data[val] # type: ignore
+ return enum
- if r_type != "void":
- fd.write(" if ret is None:\n"
- " raise libvirt.libvirtError('%s() failed')\n" % (name,))
- if r_type == "virDomainPtr":
- fd.write(" __tmp = libvirt.virDomain(%s, _obj=ret)\n" % (conn,))
- fd.write(" return __tmp\n")
- else:
- fd.write(" return ret\n")
+ enumvals = list(enums.items())
+ # convert list of dicts to one dict
+ enumData = {} # type: EnumType
+ for type, enum in enumvals:
+ enumData.update(enum)
- fd.write("\n")
+ for type, enum in sorted(enumvals):
+ classes.write("# %s\n" % type)
+ items = sorted(resolveEnum(enum, enumData).items(), key=enumsSortKey)
+ if items[-1][0].endswith('_LAST'):
+ del items[-1]
+ for name, value in items:
+ classes.write("%s = %s\n" % (name, value))
+ classes.write("\n")
- #
- # Generate enum constants
- #
- for type, enum in sorted(enums.items()):
- fd.write("# %s\n" % type)
- for name, value in sorted(enum.items(), key=lambda i: (int(i[1]), i[0])):
- fd.write("%s = %s\n" % (name, value))
- fd.write("\n")
+ if params:
+ classes.write("# typed parameter names\n")
+ for name, value in params:
+ classes.write("%s = \"%s\"\n" % (name, value))
- fd.close()
+ classes.close()
+if sys.argv[1] not in ["libvirt", "libvirt-lxc", "libvirt-qemu"]:
+ print("ERROR: unknown module %s" % sys.argv[1])
+ sys.exit(1)
quiet = False
if not os.path.exists("build"):
@@ -1870,14 +1719,5 @@ if not os.path.exists("build"):
if buildStubs(sys.argv[1], sys.argv[2]) < 0:
sys.exit(1)
-if sys.argv[1] == "libvirt":
- buildWrappers(sys.argv[1])
-elif sys.argv[1] == "libvirt-lxc":
- lxcBuildWrappers(sys.argv[1])
-elif sys.argv[1] == "libvirt-qemu":
- qemuBuildWrappers(sys.argv[1])
-else:
- print("ERROR: unknown module %s" % sys.argv[1])
- sys.exit(1)
-
+buildWrappers(sys.argv[1])
sys.exit(0)
diff --git a/libvirt-qemu-override.py b/libvirt-qemu-override.py
index 600dc30..127651f 100644
--- a/libvirt-qemu-override.py
+++ b/libvirt-qemu-override.py
@@ -1,4 +1,3 @@
-# Manually written part of python bindings for libvirt-qemu
from typing import Any, Callable, Dict, List, IO