def test_show_graph(self): f = SomeFactor() p = Pipeline(columns={"f": SomeFactor()}) # The real display_graph call shells out to GraphViz, which isn't a # requirement, so patch it out for testing. def mock_display_graph(g, format="svg", include_asset_exists=False): return (g, format, include_asset_exists) self.assertEqual( getargspec(display_graph), getargspec(mock_display_graph), msg="Mock signature doesn't match signature for display_graph.", ) patch_display_graph = patch( "zipline.pipeline.graph.display_graph", mock_display_graph, ) with patch_display_graph: graph, format, include_asset_exists = p.show_graph() self.assertIs(graph.outputs["f"], f) # '' is a sentinel used for screen if it's not supplied. self.assertEqual( sorted(graph.outputs.keys()), ["f", graph.screen_name], ) self.assertEqual(format, "svg") self.assertEqual(include_asset_exists, False) with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format="png") self.assertIs(graph.outputs["f"], f) # '' is a sentinel used for screen if it's not supplied. self.assertEqual(sorted(graph.outputs.keys()), ["f", graph.screen_name]) self.assertEqual(format, "png") self.assertEqual(include_asset_exists, False) with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format="jpeg") self.assertIs(graph.outputs["f"], f) self.assertEqual(sorted(graph.outputs.keys()), ["f", graph.screen_name]) self.assertEqual(format, "jpeg") self.assertEqual(include_asset_exists, False) expected = (r".*\.show_graph\(\) expected a value in " r"\('svg', 'png', 'jpeg'\) for argument 'format', " r"but got 'fizzbuzz' instead.") with self.assertRaisesRegex(ValueError, expected): p.show_graph(format="fizzbuzz")
def test_show_graph(self): f = SomeFactor() p = Pipeline(columns={"f": SomeFactor()}) # The real display_graph call shells out to GraphViz, which isn't a # requirement, so patch it out for testing. def mock_display_graph(g, format="svg", include_asset_exists=False): return (g, format, include_asset_exists) assert getargspec(display_graph) == getargspec( mock_display_graph ), "Mock signature doesn't match signature for display_graph." patch_display_graph = patch( "zipline.pipeline.graph.display_graph", mock_display_graph, ) with patch_display_graph: graph, format, include_asset_exists = p.show_graph() assert graph.outputs["f"] is f # '' is a sentinel used for screen if it's not supplied. assert sorted(graph.outputs.keys()) == ["f", graph.screen_name] assert format == "svg" assert include_asset_exists is False with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format="png") assert graph.outputs["f"] is f # '' is a sentinel used for screen if it's not supplied. assert sorted(graph.outputs.keys()) == ["f", graph.screen_name] assert format == "png" assert include_asset_exists is False with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format="jpeg") assert graph.outputs["f"] is f assert sorted(graph.outputs.keys()) == ["f", graph.screen_name] assert format == "jpeg" assert include_asset_exists is False expected = ( r".*\.show_graph\(\) expected a value in " r"\('svg', 'png', 'jpeg'\) for argument 'format', " r"but got 'fizzbuzz' instead." ) with pytest.raises(ValueError, match=expected): p.show_graph(format="fizzbuzz")
def _decorator(f): args, varargs, varkw, defaults = argspec = getargspec(f) if defaults is None: defaults = () no_defaults = (NO_DEFAULT, ) * (len(args) - len(defaults)) args_defaults = list(zip(args, no_defaults + defaults)) if varargs: args_defaults.append((varargs, NO_DEFAULT)) if varkw: args_defaults.append((varkw, NO_DEFAULT)) argset = set(args) | {varargs, varkw} - {None} # Arguments can be declared as tuples in Python 2. if not all(isinstance(arg, str) for arg in args): raise TypeError( "Can't validate functions using tuple unpacking: %s" % (argspec, )) # Ensure that all processors map to valid names. bad_names = processors.keys() - argset if bad_names: raise TypeError("Got processors for unknown arguments: %s." % bad_names) return _build_preprocessed_function( f, processors, args_defaults, varargs, varkw, )
def parse_argspec(callable_): """ Takes a callable and returns a tuple with the list of Argument objects, the name of *args, and the name of **kwargs. If *args or **kwargs is not present, it will be None. This returns a namedtuple called Argspec that has three fields named: args, starargs, and kwargs. """ args, varargs, keywords, defaults = getargspec(callable_) defaults = list(defaults or []) if getattr(callable_, '__self__', None) is not None: # This is a bound method, drop the self param. args = args[1:] first_default = len(args) - len(defaults) return Argspec( [ Argument( arg, Argument.no_default if n < first_default else defaults[n - first_default]) for n, arg in enumerate(args) ], varargs, keywords, )
def _decorator(f): args, varargs, varkw, defaults = argspec = getargspec(f) if defaults is None: defaults = () no_defaults = (NO_DEFAULT,) * (len(args) - len(defaults)) args_defaults = list(zip(args, no_defaults + defaults)) if varargs: args_defaults.append((varargs, NO_DEFAULT)) if varkw: args_defaults.append((varkw, NO_DEFAULT)) argset = set(args) | {varargs, varkw} - {None} # Arguments can be declared as tuples in Python 2. if not all(isinstance(arg, str) for arg in args): raise TypeError( "Can't validate functions using tuple unpacking: %s" % (argspec,) ) # Ensure that all processors map to valid names. bad_names = viewkeys(processors) - argset if bad_names: raise TypeError( "Got processors for unknown arguments: %s." % bad_names ) return _build_preprocessed_function( f, processors, args_defaults, varargs, varkw, )
def decorator(f): argspec = getargspec(f) if argspec.varargs: raise AssertionError("parameter_space() doesn't support *args") if argspec.keywords: raise AssertionError("parameter_space() doesn't support **kwargs") if argspec.defaults: raise AssertionError("parameter_space() doesn't support defaults.") # Skip over implicit self. argnames = argspec.args if argnames[0] == 'self': argnames = argnames[1:] extra = set(params) - set(argnames) if extra: raise AssertionError( "Keywords %s supplied to parameter_space() are " "not in function signature." % extra ) unspecified = set(argnames) - set(params) if unspecified: raise AssertionError( "Function arguments %s were not " "supplied to parameter_space()." % unspecified ) def make_param_sets(): return product(*(params[name] for name in argnames)) def clean_f(self, *args, **kwargs): try: f(self, *args, **kwargs) finally: self.tearDown() self.setUp() if __fail_fast: @wraps(f) def wrapped(self): for args in make_param_sets(): clean_f(self, *args) return wrapped else: @wraps(f) def wrapped(*args, **kwargs): subtest(make_param_sets(), *argnames)(clean_f)(*args, **kwargs) return wrapped
def keywords(func): """Get the argument names of a function >>> def f(x, y=2): ... pass >>> keywords(f) ['x', 'y'] Notes ----- Taken from odo.utils """ if isinstance(func, type): return keywords(func.__init__) elif isinstance(func, partial): return keywords(func.func) return getargspec(func).args
def parse_argspec(callable_): """ Takes a callable and returns a tuple with the list of Argument objects, the name of *args, and the name of **kwargs. If *args or **kwargs is not present, it will be None. This returns a namedtuple called Argspec that has three fields named: args, starargs, and kwargs. """ args, varargs, keywords, defaults = getargspec(callable_) defaults = list(defaults or []) if getattr(callable_, '__self__', None) is not None: # This is a bound method, drop the self param. args = args[1:] first_default = len(args) - len(defaults) return Argspec( [Argument(arg, Argument.no_default if n < first_default else defaults[n - first_default]) for n, arg in enumerate(args)], varargs, keywords, )
def test_show_graph(self): f = SomeFactor() p = Pipeline(columns={'f': SomeFactor()}) # The real display_graph call shells out to GraphViz, which isn't a # requirement, so patch it out for testing. def mock_display_graph(g, format='svg', include_asset_exists=False): return (g, format, include_asset_exists) self.assertEqual( getargspec(display_graph), getargspec(mock_display_graph), msg="Mock signature doesn't match signature for display_graph." ) patch_display_graph = patch( 'zipline.pipeline.graph.display_graph', mock_display_graph, ) with patch_display_graph: graph, format, include_asset_exists = p.show_graph() self.assertIs(graph.outputs['f'], f) # '' is a sentinel used for screen if it's not supplied. self.assertEqual( sorted(graph.outputs.keys()), ['f', graph.screen_name], ) self.assertEqual(format, 'svg') self.assertEqual(include_asset_exists, False) with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format='png') self.assertIs(graph.outputs['f'], f) # '' is a sentinel used for screen if it's not supplied. self.assertEqual( sorted(graph.outputs.keys()), ['f', graph.screen_name] ) self.assertEqual(format, 'png') self.assertEqual(include_asset_exists, False) with patch_display_graph: graph, format, include_asset_exists = p.show_graph(format='jpeg') self.assertIs(graph.outputs['f'], f) self.assertEqual( sorted(graph.outputs.keys()), ['f', graph.screen_name] ) self.assertEqual(format, 'jpeg') self.assertEqual(include_asset_exists, False) expected = ( r".*\.show_graph\(\) expected a value in " r"\('svg', 'png', 'jpeg'\) for argument 'format', " r"but got 'fizzbuzz' instead." ) with self.assertRaisesRegexp(ValueError, expected): p.show_graph(format='fizzbuzz')