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