From 34c37bd110f3324bbd30a7961ea141477b947a67 Mon Sep 17 00:00:00 2001 From: Pavel Rybalko Date: Thu, 11 Sep 2014 18:44:07 +0200 Subject: [PATCH] fixed units checking for @expects don't check function arguments as long it's not Numeric instance or Device class --- concert/helpers.py | 17 ++++++++++------- concert/processes.py | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/concert/helpers.py b/concert/helpers.py index d53b70cb2..82bd2ad91 100644 --- a/concert/helpers.py +++ b/concert/helpers.py @@ -1,4 +1,5 @@ import inspect +import functools class Command(object): @@ -76,7 +77,6 @@ def __init__(self, func, e_args, f_args, f_defaults, e_keywords): self.outputs = e_keywords['output'] self.e_keywords = e_keywords self._isfunction = True - self.__name__ = func.__name__ def __call__(self, *args, **kwargs): self._check_args(*args, **kwargs) @@ -103,16 +103,18 @@ def _check_args(self, *args, **kwargs): def _check_type_correctness(self, arg_name, expected, given): from concert.devices.base import Device + import inspect if expected is not None: if isinstance(expected, Numeric): self._check_numeric(arg_name, expected, given) - elif issubclass(expected, Device) and not isinstance(given, expected): - raise TypeError( - 'Sorry, argument "{}" expected to get {}, but got {}'.format( - arg_name, - expected.__name__, - given.__class__.__name__)) + elif inspect.isclass(expected): + if issubclass(expected, Device) and not isinstance(given, expected): + raise TypeError( + 'Sorry, argument "{}" expected to get {}, but got {}'.format( + arg_name, + expected.__name__, + given.__class__.__name__)) def _check_numeric(self, arg_name, expected, given): if (expected.units is not None) ^ hasattr(given, 'units'): @@ -176,6 +178,7 @@ def __call__(self, f): f_args, f_defaults, self.e_keywords) + functools.update_wrapper(self.func, f) return self.func diff --git a/concert/processes.py b/concert/processes.py index 681545d7f..5efc386e5 100644 --- a/concert/processes.py +++ b/concert/processes.py @@ -175,7 +175,7 @@ def dscan(parameter_list, n_intervals, handler): return ascan(parameter_list, n_intervals, handler, initial_values) -@expects(Camera, LinearMotor, measure=np.std, opt_kwargs=None, +@expects(Camera, LinearMotor, measure=None, opt_kwargs=None, plot_consumer=None, frame_consumer=None, output=Numeric(1)) def focus(camera, motor, measure=np.std, opt_kwargs=None, plot_consumer=None, frame_consumer=None):