diff --git a/python/Vips.py b/python/Vips.py index 9989a39c..dbe169e8 100644 --- a/python/Vips.py +++ b/python/Vips.py @@ -616,51 +616,9 @@ class Image(Vips.Image): def exp10(self): return self.math(Vips.OperationMath.EXP10) -Image = override(Image) -__all__.append('Image') +# add operators which needs to be class methods -# Search for all VipsOperation which don't have an input image object ... these -# become class methods - -# This is slow :-( - -def vips_image_class_method(name, args, kwargs): - logging.debug('vips_image_class_method %s' % name) - - # the first arg is the class we are called from ... drop it - args = tuple(list(args)[1::]) - - return _call_base(name, args, kwargs) - -def define_class_methods(cls): - if not cls.is_abstract(): - op = Vips.Operation.new(cls.name) - - found = False - for prop in op.props: - flags = op.get_argument_flags(prop.name) - if flags & Vips.ArgumentFlags.INPUT and flags & Vips.ArgumentFlags.REQUIRED: - if GObject.type_is_a(vips_type_image, prop.value_type): - found = True - break - - if not found: - gtype = Vips.type_find("VipsOperation", cls.name) - nickname = Vips.nickname_find(gtype) - logging.debug('adding %s as a class method' % nickname) - method = lambda *args, **kwargs: vips_image_class_method(nickname, args, kwargs) - setattr(Vips.Image, nickname, classmethod(method)) - - if len(cls.children) > 0: - for child in cls.children: - # not easy to get at the deprecated flag in an abtract type? - if cls.name != 'VipsWrap7': - define_class_methods(child) - -# for speed, only run this occasionally ... we add class methods from the list -# below - -# define_class_methods(vips_type_operation) +# use find_class_methods.py to generate this list class_methods = [ "system", @@ -711,6 +669,17 @@ class_methods = [ "fitsload", "openexrload"] +def generate_class_method(name): + @classmethod + def class_method(cls, *args, **kwargs): + return _call_base(name, args, kwargs) + + return class_method + for nickname in class_methods: - method = lambda *args, **kwargs: vips_image_class_method(nickname, args, kwargs) - setattr(Vips.Image, nickname, classmethod(method)) + logging.debug('adding %s as a class method' % nickname) + method = generate_class_method(nickname) + setattr(Vips.Image, nickname, method) + +Image = override(Image) +__all__.append('Image') diff --git a/python/find_class_methods.py b/python/find_class_methods.py new file mode 100755 index 00000000..9b10f98a --- /dev/null +++ b/python/find_class_methods.py @@ -0,0 +1,47 @@ +#!/usr/bin/python + +import sys + +import logging +#logging.basicConfig(level = logging.DEBUG) + +from gi.repository import Vips, GObject + +# Search for all VipsOperation which don't have an input image object ... these +# should be class methods and need to have their names pasted into Vips.py + +# This is slow :-( so we don't do this dynamically + +vips_type_image = GObject.GType.from_name("VipsImage") +vips_type_operation = GObject.GType.from_name("VipsOperation") + +def find_class_methods(cls): + if not cls.is_abstract(): + op = Vips.Operation.new(cls.name) + + found = False + for prop in op.props: + flags = op.get_argument_flags(prop.name) + if not flags & Vips.ArgumentFlags.INPUT: + continue + if not flags & Vips.ArgumentFlags.REQUIRED: + continue + if GObject.type_is_a(vips_type_image, prop.value_type): + found = True + break + + if not found: + gtype = Vips.type_find("VipsOperation", cls.name) + nickname = Vips.nickname_find(gtype) + print ' "%s",' % nickname + + if len(cls.children) > 0: + for child in cls.children: + # not easy to get at the deprecated flag in an abtract type? + if cls.name != 'VipsWrap7': + find_class_methods(child) + +print 'found class methods:' + +find_class_methods(vips_type_operation) +