def _wrap_higher_order(func, test): # NOTE: builtin housekeeping: # map(None, ...) is much faster than map(identity, ...), # also map(None, ...) works as zip() for multiple seqs builtin = PY2 and func in set([map, filter, imap, ifilter, ifilterfalse]) # We are going to construct function using eval to preserve signature. # So we need to inspect it first. try: spec = getargspec(func) except TypeError: spec = ArgSpec(('f', ), 'seqs', None, None) # HACK: due to bug in python 3.4 - http://bugs.python.org/issue22203 if not spec.args: spec = ArgSpec(('f', ), 'seqs', None, None) # Slicing with [1:-1] to get rid of parentheses spec_str = formatargspec(*spec)[1:-1] rest = ArgSpec(spec.args[1:], *spec[1:]) rest_str = formatargspec(*rest)[1:-1] # We use nested lambda to make func and make_func locals which are faster func_str = "lambda __func, __make_func: " \ "lambda {spec}: __func(__make_func({f}, {builtin}, {test}), {rest})" \ .format(spec=spec_str, f=spec.args[0], rest=rest_str, builtin=builtin, test=test) wrapper = eval(func_str, {}, {})(func, make_func) return wraps(func)(wrapper)
def _getargspec_init(method): try: return inspect.getargspec(method) except TypeError: if method is object.__init__: return ArgSpec(["self"], None, None, None) else: return ArgSpec(["self"], "args", "kwargs", None)
def _getargspec_init(method): try: return inspect.getargspec(method) except TypeError: if method is object.__init__: return ArgSpec(['self'], None, None, None) else: return ArgSpec(['self'], 'args', 'kwargs', None)
def setUpClass(cls): cls.aspec = ArgSpec(args=["hello", "world"], varargs=None, keywords=None, defaults=False) cls.bspec = ArgSpec(args=[], varargs="names", keywords="kwargs", defaults=None)
def setUpClass(cls): cls.aspec = ArgSpec(args=['hello', 'world'], varargs=None, keywords=None, defaults=False) cls.bspec = ArgSpec(args=[], varargs='names', keywords='kwargs', defaults=None)
def getconfigargspec(obj): if isinstance(obj, ThreadedSegment): args = ['interval'] defaults = [getattr(obj, 'interval', 1)] if obj.update_first: args.append('update_first') defaults.append(True) methods = ['render', 'set_state'] if isinstance(obj, KwThreadedSegment): methods += ['key', 'render_one'] for method in methods: if hasattr(obj, method): # Note: on <python-2.6 it may return simple tuple, not # ArgSpec instance. argspec = getargspec(getattr(obj, method)) for i, arg in zip(count(1), reversed(argspec.args)): if (arg == 'self' or (arg == 'segment_info' and getattr(obj, 'powerline_requires_segment_info', None)) or (arg == 'pl') or (method.startswith('render') and (1 if argspec.args[0] == 'self' else 0) + i == len(argspec.args)) or arg in args): continue if argspec.defaults and len(argspec.defaults) >= i: default = argspec.defaults[-i] defaults.append(default) args.append(arg) else: args.insert(0, arg) argspec = ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults)) else: if hasattr(obj, 'powerline_origin'): obj = obj.powerline_origin else: obj = obj argspec = getargspec(obj) args = [] defaults = [] for i, arg in zip(count(1), reversed(argspec.args)): if ((arg == 'segment_info' and getattr(obj, 'powerline_requires_segment_info', None)) or arg == 'pl'): continue if argspec.defaults and len(argspec.defaults) >= i: default = argspec.defaults[-i] defaults.append(default) args.append(arg) else: args.insert(0, arg) argspec = ArgSpec(args=args, varargs=argspec.varargs, keywords=argspec.keywords, defaults=tuple(defaults)) return argspec
class ModuleStateTest(TestCase): ''' Tests module state (salt/states/module.py) ''' aspec = ArgSpec(args=['hello', 'world'], varargs=None, keywords=None, defaults=False) bspec = ArgSpec(args=[], varargs='names', keywords='kwargs', defaults=None) def test_module_run_module_not_available(self): ''' Tests the return of module.run state when the module function name isn't available ''' with patch.dict(module.__salt__, {}): cmd = 'hello.world' ret = module.run(cmd) comment = 'Module function {0} is not available'.format(cmd) self.assertEqual(ret['comment'], comment) self.assertFalse(ret['result']) def test_module_run_test_true(self): ''' Tests the return of module.run state when test=True is passed in ''' with patch.dict(module.__opts__, {'test': True}): ret = module.run(CMD) comment = 'Module function {0} is set to execute'.format(CMD) self.assertEqual(ret['comment'], comment) @patch('salt.utils.args.get_function_argspec', MagicMock(return_value=aspec)) def test_module_run_missing_arg(self): ''' Tests the return of module.run state when arguments are missing ''' ret = module.run(CMD) comment = 'The following arguments are missing: world hello' self.assertEqual(ret['comment'], comment) @patch('salt.utils.args.get_function_argspec', MagicMock(return_value=bspec)) def test_module_run_hidden_varargs(self): ''' Tests the return of module.run state when hidden varargs are used with wrong type. ''' ret = module.run(CMD, m_names='anyname') comment = "'names' must be a list." self.assertEqual(ret['comment'], comment)
def test_defaults(self): ''' positional args with defaults ''' def f2(x, y=1): return x, y f2_a = fix_args(f2, x=0) as_a = ArgSpec(['y'], None, None, (1, )) assert as_a == getargspec(f2_a) assert f2_a() == (0, 1) assert f2_a(2) == (0, 2) f2_b = fix_args(f2, y=1) as_b = ArgSpec(['x'], None, None, None) assert as_b == getargspec(f2_b) assert f2_b(0) == (0, 1)
def test_signature_justify(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'value'], varargs=None, keywords=None, defaults=('L', )) assert getargspec(ThermalPrinter.justify) == sig
def test_signature___init__(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'port', 'baudrate'], varargs=None, keywords='kwargs', defaults=('/dev/ttyAMA0', 19200)) assert getargspec(ThermalPrinter.__init__) == sig
def test_signature_codepage(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'codepage'], varargs=None, keywords=None, defaults=(CodePage.CP437, )) assert getargspec(ThermalPrinter.codepage) == sig
def test_signature_chinese_format(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'fmt'], varargs=None, keywords=None, defaults=(Chinese.GBK, )) assert getargspec(ThermalPrinter.chinese_format) == sig
def argspec(): argspec = sage_getargspec(func) args = ((argspec.args if not argspec.args is None else []) + list(self.options)) defaults = (argspec.defaults or ()) + tuple(self.options.values()) # Note: argspec.defaults is not always a tuple for some reason return ArgSpec(args, argspec.varargs, argspec.keywords, defaults)
def test_signature_left_margin(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'margin'], varargs=None, keywords=None, defaults=(0, )) assert getargspec(ThermalPrinter.left_margin) == sig
def test_signature_line_spacing(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'spacing'], varargs=None, keywords=None, defaults=(30, )) assert getargspec(ThermalPrinter.line_spacing) == sig
def test_signature_bold(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'state'], varargs=None, keywords=None, defaults=(False, )) assert getargspec(ThermalPrinter.bold) == sig
def test_signature_charset(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'charset'], varargs=None, keywords=None, defaults=(CharSet.USA, )) assert getargspec(ThermalPrinter.charset) == sig
def test_signature_barcode_position(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'position'], varargs=None, keywords=None, defaults=(BarCodePosition.HIDDEN, )) assert getargspec(ThermalPrinter.barcode_position) == sig
def test_signature_barcode_width(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'width'], varargs=None, keywords=None, defaults=(3, )) assert getargspec(ThermalPrinter.barcode_width) == sig
def test_signature_underline(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'weight'], varargs=None, keywords=None, defaults=(0, )) assert getargspec(ThermalPrinter.underline) == sig
def test_signature_to_bytes(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'data'], varargs=None, keywords=None, defaults=None) assert getargspec(ThermalPrinter.to_bytes) == sig
def test_signature_sleep(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'seconds'], varargs=None, keywords=None, defaults=(1, )) assert getargspec(ThermalPrinter.sleep) == sig
def test_signature_out(methods): methods.remove(extract_stack(None, 2)[1][2].replace('test_signature_', '')) sig = ArgSpec(args=['self', 'data', 'line_feed'], varargs=None, keywords='kwargs', defaults=(True, )) assert getargspec(ThermalPrinter.out) == sig
def _drop_self(spec): """ Take an argspec and return a new one without the 'self'. """ args, varargs, varkw, defaults = spec if args[0:1] == ['self']: args = args[1:] return ArgSpec(args, varargs, varkw, defaults)
def argspec(): from sageinspect import sage_getargspec argspec = sage_getargspec(func) args = (argspec.args if not argspec.args is None else []) + self.options.keys() defaults = tuple(argspec.defaults if not argspec.defaults is None else ()) \ + tuple(self.options.values()) #Note: argspec.defaults is not always a tuple for some reason return ArgSpec(args, argspec.varargs, argspec.keywords, defaults)
def test_mixed(self): def f7(x, y=1, *args, **kwargs): return x, y, args, kwargs f7_a = fix_args(f7, x=0) as_a = ArgSpec(['y'], 'args', 'kwargs', (1, )) assert as_a == getargspec(f7_a) assert f7_a() == (0, 1, (), {}) assert f7_a(1, 2, z=3) == (0, 1, (2, ), {'z': 3})
def patched_inspect_getargspec(func: Callable[[Any], ArgSpec]) -> ArgSpec: spec = getfullargspec(func) return ArgSpec( args=spec.args, varargs=spec.varargs or "", keywords=spec.varkw or "", defaults=spec.defaults or (), )
def test_decorator(self): class C9: @fix_args(y=1) def f(self, x, y): return x, y c9 = C9() as_a = ArgSpec(['self', 'x'], None, None, None) assert as_a == getargspec(c9.f) assert c9.f(0) == (0, 1)
def test_posargs(self): ''' positional args only ''' def f1(x, y): return x, y f1_a = fix_args(f1, x=0) as_a = ArgSpec(['y'], None, None, None) assert as_a == getargspec(f1_a) assert f1_a(1) == (0, 1) f1_b = fix_args(f1, y=1) as_b = ArgSpec(['x'], None, None, None) assert as_b == getargspec(f1_b) assert f1_b(0) == (0, 1) f1_c = fix_args(f1, x=0, y=1) as_c = ArgSpec([], None, None, None) assert as_c == getargspec(f1_c) assert f1_c() == (0, 1) with raises(ValueError): fix_args(f1, z=2)
def getconfigargspec(obj): if hasattr(obj, 'powerline_origin'): obj = obj.powerline_origin else: obj = obj args = [] defaults = [] if isinstance(obj, Segment): additional_args = obj.additional_args() argspecobjs = obj.argspecobjs() get_omitted_args = obj.omitted_args else: additional_args = () argspecobjs = ((None, obj),) get_omitted_args = lambda *args: () for arg in additional_args: args.append(arg[0]) if len(arg) > 1: defaults.append(arg[1]) requires_segment_info = hasattr(obj, 'powerline_requires_segment_info') requires_filesystem_watcher = hasattr(obj, 'powerline_requires_filesystem_watcher') for name, method in argspecobjs: argspec = getargspec(method) omitted_args = get_omitted_args(name, method) largs = len(argspec.args) for i, arg in enumerate(reversed(argspec.args)): if ( largs - (i + 1) in omitted_args or arg in omitted_args or arg == 'pl' or arg == 'self' or (arg == 'create_watcher' and requires_filesystem_watcher) or (arg == 'segment_info' and requires_segment_info) ): continue if argspec.defaults and len(argspec.defaults) > i: if arg in args: idx = args.index(arg) if len(args) - idx > len(defaults): args.pop(idx) else: continue default = argspec.defaults[-(i + 1)] defaults.append(default) args.append(arg) else: if arg not in args: args.insert(0, arg) return ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults))