Skip to content

Commit 6a18a88

Browse files
committed
fix: try remove fromconfig
1 parent e30e4bb commit 6a18a88

3 files changed

Lines changed: 74 additions & 87 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath"
3-
version = "2.2.17"
3+
version = "2.2.18"
44
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"
@@ -15,8 +15,6 @@ dependencies = [
1515
"rich>=14.2.0",
1616
"truststore>=0.10.1",
1717
"mockito>=1.5.4",
18-
"fromconfig>=0.7.2",
19-
"setuptools>=80.9.0",
2018
"pydantic-function-models>=0.1.11",
2119
"pysignalr==1.3.0",
2220
"coverage>=7.8.2",
Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
"""Mockito mocker implementation.
2-
3-
https://mockito-python.readthedocs.io/en/latest/
4-
"""
1+
"""Mockito mocker implementation. https://mockito-python.readthedocs.io/en/latest ."""
52

63
from typing import Any, Callable
74

8-
import fromconfig # type: ignore[import-untyped] # explicit ignore
95
from mockito import ( # type: ignore[import-untyped] # explicit ignore
106
invocation,
117
mocking,
@@ -21,7 +17,6 @@
2117
R,
2218
T,
2319
UiPathMockResponseGenerationError,
24-
UiPathNoMockFoundError,
2520
)
2621

2722

@@ -32,12 +27,50 @@ def __getattr__(self, item):
3227
"""Return a wrapper function that raises an exception."""
3328

3429
def func(*_args, **_kwargs):
35-
"""Not Implemented."""
3630
raise NotImplementedError()
3731

3832
return func
3933

4034

35+
def _resolve_value(config: Any) -> Any:
36+
# Handle {"_attr_": "mockito.any"}
37+
if isinstance(config, dict) and "_attr_" in config:
38+
attr = config["_attr_"]
39+
if attr == "mockito.any":
40+
from mockito import any as mockito_any
41+
42+
return mockito_any()
43+
44+
# Handle {"_target_": "..."}
45+
if isinstance(config, dict) and "_target_" in config:
46+
target = config["_target_"]
47+
module_path, name = target.rsplit(".", 1)
48+
49+
import importlib
50+
51+
module = importlib.import_module(module_path)
52+
obj = getattr(module, name)
53+
54+
args = [_resolve_value(v) for v in config.get("_args_", [])]
55+
kwargs = {
56+
k: _resolve_value(v)
57+
for k, v in config.items()
58+
if k not in ("_target_", "_args_")
59+
}
60+
return obj(*args, **kwargs)
61+
62+
if isinstance(config, dict):
63+
return {k: _resolve_value(v) for k, v in config.items()}
64+
65+
if isinstance(config, list):
66+
return [_resolve_value(v) for v in config]
67+
68+
if isinstance(config, tuple):
69+
return tuple(_resolve_value(v) for v in config)
70+
71+
return config
72+
73+
4174
class MockitoMocker(Mocker):
4275
"""Mockito Mocker."""
4376

@@ -50,34 +83,54 @@ def __init__(self, evaluation_item: EvaluationItem):
5083
mock_obj = mocking.Mock(self.stub)
5184

5285
for behavior in self.evaluation_item.mocking_strategy.behaviors:
86+
resolved_args = _resolve_value(behavior.arguments.args)
87+
resolved_kwargs = _resolve_value(behavior.arguments.kwargs)
88+
89+
args = resolved_args if resolved_args is not None else []
90+
kwargs = resolved_kwargs if resolved_kwargs is not None else {}
91+
5392
stubbed = invocation.StubbedInvocation(mock_obj, behavior.function)(
54-
*fromconfig.fromconfig(behavior.arguments.args),
55-
**fromconfig.fromconfig(behavior.arguments.kwargs),
93+
*args,
94+
**kwargs,
5695
)
96+
5797
for answer in behavior.then:
98+
answer_dict = answer.model_dump()
99+
58100
if answer.type == MockingAnswerType.RETURN:
59-
stubbed = stubbed.thenReturn(
60-
fromconfig.fromconfig(answer.model_dump())["value"]
61-
)
101+
stubbed = stubbed.thenReturn(_resolve_value(answer_dict["value"]))
102+
62103
elif answer.type == MockingAnswerType.RAISE:
63-
stubbed = stubbed.thenRaise(
64-
fromconfig.fromconfig(answer.model_dump())["value"]
65-
)
104+
stubbed = stubbed.thenRaise(_resolve_value(answer_dict["value"]))
66105

67106
async def response(
68107
self, func: Callable[[T], R], params: dict[str, Any], *args: T, **kwargs
69108
) -> R:
70-
"""Respond with mocked response."""
109+
"""Return mocked response or raise appropriate errors."""
71110
if not isinstance(
72111
self.evaluation_item.mocking_strategy, MockitoMockingStrategy
73112
):
74113
raise UiPathMockResponseGenerationError("Mocking strategy misconfigured.")
75-
if not any(
114+
115+
# No behavior configured → call real function
116+
is_mocked = any(
76117
behavior.function == params["name"]
77118
for behavior in self.evaluation_item.mocking_strategy.behaviors
78-
):
79-
raise UiPathNoMockFoundError()
119+
)
120+
121+
if not is_mocked:
122+
import inspect
123+
124+
if inspect.iscoroutinefunction(func):
125+
return await func(*args, **kwargs)
126+
return func(*args, **kwargs)
127+
128+
# Behavioral mocking
80129
try:
81130
return getattr(self.stub, params["name"])(*args, **kwargs)
131+
132+
except NotImplementedError:
133+
raise
134+
82135
except Exception as e:
83136
raise UiPathMockResponseGenerationError() from e

uv.lock

Lines changed: 1 addition & 65 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)