1#!/usr/bin/python3 2 3import sys 4import xml.etree.ElementTree as ET 5 6from pyvips import ffi, values_for_enum, vips_lib, \ 7 type_map, type_name, type_from_name 8 9# This file generates enums.py -- the set of classes giving the permissible 10# values for the pyvips enums. Run with something like: 11# 12# ./gen-enums.py ~/GIT/libvips/libvips/Vips-8.0.gir > enums.py 13# mv enums.py ../pyvips 14 15# The GIR file 16root = ET.parse(sys.argv[1]).getroot() 17namespace = { 18 "goi": "http://www.gtk.org/introspection/core/1.0" 19} 20 21# find all the enumerations and make a dict for them 22xml_enums = {} 23for node in root.findall("goi:namespace/goi:enumeration", namespace): 24 xml_enums[node.get('name')] = node 25 26 27def remove_prefix(enum_str): 28 prefix = 'Vips' 29 30 if enum_str.startswith(prefix): 31 return enum_str[len(prefix):] 32 33 return enum_str 34 35 36def generate_enums(): 37 # otherwise we're missing some enums 38 vips_lib.vips_token_get_type() 39 vips_lib.vips_saveable_get_type() 40 vips_lib.vips_image_type_get_type() 41 42 all_enums = [] 43 44 def add_enum(gtype, a, b): 45 nickname = type_name(gtype) 46 all_enums.append(nickname) 47 48 type_map(gtype, add_enum) 49 50 return ffi.NULL 51 52 type_map(type_from_name('GEnum'), add_enum) 53 54 for name in all_enums: 55 gtype = type_from_name(name) 56 python_name = remove_prefix(name) 57 if python_name not in xml_enums: 58 continue 59 60 node = xml_enums[python_name] 61 enum_doc = node.find("goi:doc", namespace) 62 63 print('') 64 print('') 65 print(f'class {python_name}(object):') 66 print(f' """{python_name}.') 67 if enum_doc is not None: 68 print('') 69 print(f'{enum_doc.text}') 70 print('') 71 print('Attributes:') 72 print('') 73 for value in values_for_enum(gtype): 74 python_name = value.replace('-', '_') 75 member = node.find(f"goi:member[@name='{python_name}']", namespace) 76 member_doc = member.find("goi:doc", namespace) 77 if member_doc is not None: 78 text = member_doc.text 79 print(f' {python_name.upper()} (str): {text}') 80 print('') 81 print(' """') 82 print('') 83 84 for value in values_for_enum(gtype): 85 python_name = value.replace('-', '_').upper() 86 print(f' {python_name} = \'{value}\'') 87 88 89if __name__ == "__main__": 90 print('# libvips enums -- this file is generated automatically') 91 generate_enums() 92