1*e1fe3e4aSElliott Hughes"""Private utility methods used by the subset modules""" 2*e1fe3e4aSElliott Hughes 3*e1fe3e4aSElliott Hughes 4*e1fe3e4aSElliott Hughesdef _add_method(*clazzes): 5*e1fe3e4aSElliott Hughes """Returns a decorator function that adds a new method to one or 6*e1fe3e4aSElliott Hughes more classes.""" 7*e1fe3e4aSElliott Hughes 8*e1fe3e4aSElliott Hughes def wrapper(method): 9*e1fe3e4aSElliott Hughes done = [] 10*e1fe3e4aSElliott Hughes for clazz in clazzes: 11*e1fe3e4aSElliott Hughes if clazz in done: 12*e1fe3e4aSElliott Hughes continue # Support multiple names of a clazz 13*e1fe3e4aSElliott Hughes done.append(clazz) 14*e1fe3e4aSElliott Hughes assert clazz.__name__ != "DefaultTable", "Oops, table class not found." 15*e1fe3e4aSElliott Hughes assert not hasattr( 16*e1fe3e4aSElliott Hughes clazz, method.__name__ 17*e1fe3e4aSElliott Hughes ), "Oops, class '%s' has method '%s'." % (clazz.__name__, method.__name__) 18*e1fe3e4aSElliott Hughes setattr(clazz, method.__name__, method) 19*e1fe3e4aSElliott Hughes return None 20*e1fe3e4aSElliott Hughes 21*e1fe3e4aSElliott Hughes return wrapper 22*e1fe3e4aSElliott Hughes 23*e1fe3e4aSElliott Hughes 24*e1fe3e4aSElliott Hughesdef _uniq_sort(l): 25*e1fe3e4aSElliott Hughes return sorted(set(l)) 26