Skip to content

Commit db22830

Browse files
committed
Add complexity check with complexipy
1 parent 1e39db2 commit db22830

File tree

2 files changed

+64
-28
lines changed

2 files changed

+64
-28
lines changed

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ repos:
2424
# Run the formatter
2525
- id: ruff-format
2626
types_or: [python, pyi]
27+
28+
# See https://github.com/rohaquinlop/complexipy
29+
- repo: https://github.com/rohaquinlop/complexipy-pre-commit
30+
rev: v3.0.0 # Use the latest version
31+
hooks:
32+
- id: complexipy

datalayer_core/sdk/decorators.py

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,53 @@
1313
# - incorrect number of args
1414

1515

16+
def _process_args_kwargs_mapping(
17+
func: Callable[..., Any],
18+
args: tuple,
19+
kwargs: dict,
20+
inputs: list[str],
21+
variables: dict[str, Any],
22+
) -> dict[str, Any]:
23+
sig = inspect.signature(func)
24+
mapping = {}
25+
26+
for idx, (name, _param) in enumerate(sig.parameters.items()):
27+
mapping[name] = inputs[idx]
28+
29+
for kwarg, kwarg_value in kwargs.items():
30+
variables[mapping[kwarg]] = kwarg_value
31+
32+
for idx, (arg_value) in enumerate(args):
33+
kwarg = inputs[idx]
34+
variables[kwarg] = arg_value
35+
36+
return variables
37+
38+
39+
def _process_inputs(
40+
func: Callable[..., Any],
41+
inputs_decorated: Optional[list[str]],
42+
variables: dict[str, Any],
43+
) -> tuple[dict[str, Any], list[str]]:
44+
sig = inspect.signature(func)
45+
if inputs_decorated is None:
46+
inputs = []
47+
for name, _param in sig.parameters.items():
48+
inputs.append(name)
49+
variables[name] = (
50+
_param.default
51+
if _param.default is not inspect.Parameter.empty
52+
else None
53+
)
54+
else:
55+
if len(sig.parameters) != len(inputs_decorated):
56+
raise ValueError(
57+
f"Function {func.__name__} has {len(sig.parameters)} parameters, "
58+
f"but {len(inputs_decorated)} inputs were provided."
59+
)
60+
return variables, inputs
61+
62+
1663
def datalayer(
1764
runtime_name: Union[Callable[..., Any], Optional[str]] = None,
1865
inputs: Optional[list[str]] = None,
@@ -65,37 +112,20 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
65112
if output_decorated is None:
66113
output = f"DATALAYER_RUNTIME_OUTPUT_{func.__name__}".upper()
67114

68-
sig = inspect.signature(func)
69-
if inputs_decorated is None:
70-
inputs = []
71-
for name, _param in sig.parameters.items():
72-
inputs.append(name)
73-
variables[name] = (
74-
_param.default
75-
if _param.default is not inspect.Parameter.empty
76-
else None
77-
)
78-
else:
79-
if len(sig.parameters) != len(inputs_decorated):
80-
raise ValueError(
81-
f"Function {func.__name__} has {len(sig.parameters)} parameters, "
82-
f"but {len(inputs_decorated)} inputs were provided."
83-
)
115+
variables, inputs = _process_inputs(
116+
func=func, inputs_decorated=inputs_decorated, variables=variables
117+
)
84118

85119
@functools.wraps(func)
86120
def wrapper(*args: Any, **kwargs: Any) -> Any:
87-
sig = inspect.signature(func)
88-
mapping = {}
89-
for idx, (name, _param) in enumerate(sig.parameters.items()):
90-
mapping[name] = (inputs_decorated or inputs)[idx]
91-
92-
for kwarg, kwarg_value in kwargs.items():
93-
variables[mapping[kwarg]] = kwarg_value
94-
95-
for idx, (arg_value) in enumerate(args):
96-
kwarg = (inputs_decorated or inputs)[idx]
97-
variables[kwarg] = arg_value
98-
121+
# Process args and kwargs to map to inputs
122+
variables = _process_args_kwargs_mapping(
123+
func=func,
124+
args=args,
125+
kwargs=kwargs,
126+
inputs=(inputs_decorated or inputs),
127+
variables=variables,
128+
)
99129
function_call = (
100130
f"{output_decorated or output} = {func.__name__}("
101131
+ ", ".join(inputs_decorated or inputs)

0 commit comments

Comments
 (0)