1
0
mirror of https://gitlab.com/libvirt/libvirt-python.git synced 2024-10-26 07:55:06 +03:00

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>
This commit is contained in:
Daniel P. Berrangé 2022-03-24 16:35:13 +00:00
parent c8abe55d4c
commit 3950e1ddd5
2 changed files with 74 additions and 235 deletions

View File

@ -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,8 +1613,59 @@ def buildWrappers(module: str) -> None:
classes.writelines(cached)
classes.write("\n")
extra.close()
except Exception:
pass
direct_functions = {}
if module != "libvirt":
direct_functions = functions
classes.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(direct_functions.items()):
func = nameFixup(name, 'None', '', '')
classes.write("def %s(" % func)
for n, (a_name, a_type, a_info) in enumerate(args):
if n != 0:
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":
classes.write(" ret = ")
else:
classes.write(" ")
classes.write("%s.%s(" % (pymod, name))
conn = None
for n, (a_name, a_type, a_info) in enumerate(args):
if a_type == "virConnectPtr":
conn = a_name
if n != 0:
classes.write(", ")
if a_type in ["virDomainPtr", "virConnectPtr"]:
# FIXME: This might have problem if the function
# has multiple args which are objects.
classes.write("%s.%s" % (a_name, "_o"))
else:
classes.write("%s" % a_name)
classes.write(")\n")
if r_type != "void":
classes.write(" if ret is None:\n"
" raise libvirt.libvirtError('%s() failed')\n" % (name,))
if r_type == "virDomainPtr":
classes.write(" __tmp = libvirt.virDomain(%s, _obj=ret)\n" % (conn,))
classes.write(" return __tmp\n")
else:
classes.write(" return ret\n")
classes.write("\n")
#
# Generate enum constants
@ -1646,222 +1701,16 @@ def buildWrappers(module: str) -> None:
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))
if params:
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()):
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_qemu.%s(" % name)
conn = None
for n, (a_name, a_type, a_info) in enumerate(args):
if a_type == "virConnectPtr":
conn = a_name
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")
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")
fd.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
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")
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")
fd.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()
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)

View File

@ -1,4 +1,3 @@
# Manually written part of python bindings for libvirt-qemu
from typing import Any, Callable, Dict, List, IO