osbot-utils 1.57.0__py3-none-any.whl → 1.59.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- osbot_utils/base_classes/Type_Safe.py +5 -2
- osbot_utils/helpers/flows/Flow.py +14 -2
- osbot_utils/helpers/flows/Task.py +3 -1
- osbot_utils/utils/Objects.py +11 -7
- osbot_utils/version +1 -1
- {osbot_utils-1.57.0.dist-info → osbot_utils-1.59.0.dist-info}/METADATA +2 -2
- {osbot_utils-1.57.0.dist-info → osbot_utils-1.59.0.dist-info}/RECORD +9 -9
- {osbot_utils-1.57.0.dist-info → osbot_utils-1.59.0.dist-info}/LICENSE +0 -0
- {osbot_utils-1.57.0.dist-info → osbot_utils-1.59.0.dist-info}/WHEEL +0 -0
@@ -14,10 +14,10 @@ from osbot_utils.helpers.Random_Guid import Random_Guid
|
|
14
14
|
from osbot_utils.utils.Dev import pprint
|
15
15
|
from osbot_utils.utils.Json import json_parse
|
16
16
|
from osbot_utils.utils.Misc import list_set
|
17
|
-
from osbot_utils.utils.Objects
|
17
|
+
from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
|
18
18
|
raise_exception_on_obj_type_annotation_mismatch, obj_is_attribute_annotation_of_type, enum_from_value, \
|
19
19
|
obj_is_type_union_compatible, value_type_matches_obj_annotation_for_union_attr, \
|
20
|
-
convert_dict_to_value_from_obj_annotation
|
20
|
+
convert_dict_to_value_from_obj_annotation, dict_to_obj
|
21
21
|
|
22
22
|
# Backport implementations of get_origin and get_args for Python 3.7
|
23
23
|
if sys.version_info < (3, 8): # pragma: no cover
|
@@ -272,6 +272,9 @@ class Type_Safe:
|
|
272
272
|
|
273
273
|
return self
|
274
274
|
|
275
|
+
def obj(self):
|
276
|
+
return dict_to_obj(self.json())
|
277
|
+
|
275
278
|
def serialize_to_dict(self): # todo: see if we need this method or if the .json() is enough
|
276
279
|
return serialize_to_dict(self)
|
277
280
|
|
@@ -2,6 +2,8 @@ import asyncio
|
|
2
2
|
import logging
|
3
3
|
import typing
|
4
4
|
|
5
|
+
from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
|
6
|
+
|
5
7
|
from osbot_utils.base_classes.Type_Safe import Type_Safe
|
6
8
|
from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
|
7
9
|
from osbot_utils.helpers.flows.models.Flow__Config import Flow__Config
|
@@ -33,6 +35,8 @@ class Flow(Type_Safe):
|
|
33
35
|
logger : Python_Logger
|
34
36
|
cformat : CFormat
|
35
37
|
executed_tasks : typing.List
|
38
|
+
resolved_args : tuple
|
39
|
+
resolved_kwargs : dict
|
36
40
|
|
37
41
|
def add_flow_artifact(self, description=None, key=None, data=None, artifact_type=None): # todo: figure out how to make this work since at the moment most are showing an unknown type
|
38
42
|
result_data = dict(flow_run_id = self.flow_id,
|
@@ -69,6 +73,7 @@ class Flow(Type_Safe):
|
|
69
73
|
self.logger.add_memory_logger() # todo: move to method that does pre-execute tasks
|
70
74
|
|
71
75
|
self.log_debug(f"Executing flow run '{self.f__flow_id()}'")
|
76
|
+
self.resolve_args_and_kwargs()
|
72
77
|
try:
|
73
78
|
with Stdout() as stdout:
|
74
79
|
self.invoke_flow_target()
|
@@ -93,14 +98,14 @@ class Flow(Type_Safe):
|
|
93
98
|
|
94
99
|
|
95
100
|
async def invoke_flow_target__thread(self, flow): # this is a REALLY important method which is used to pin the flow object to the call stack
|
96
|
-
return await flow.flow_target(*flow.
|
101
|
+
return await flow.flow_target(*flow.resolved_args, **flow.resolved_kwargs) # which is then used by the Task.find_flow method to find it
|
97
102
|
|
98
103
|
def invoke_flow_target(self):
|
99
104
|
if asyncio.iscoroutinefunction(self.flow_target):
|
100
105
|
async_coroutine = self.invoke_flow_target__thread(self) # use this special method to pin the flow object to the call stack
|
101
106
|
self.flow_return_value = invoke_in_new_event_loop(async_coroutine) # this will start a complete new thread to execute the flow (which is exactly what we want)
|
102
107
|
else:
|
103
|
-
self.flow_return_value = self.flow_target(*self.
|
108
|
+
self.flow_return_value = self.flow_target(*self.resolved_args, **self.resolved_kwargs) # if the flow is sync, just execute the flow target
|
104
109
|
|
105
110
|
def f__flow_id(self):
|
106
111
|
return self.cformat.green(self.flow_id)
|
@@ -178,6 +183,13 @@ class Flow(Type_Safe):
|
|
178
183
|
def random_flow_name(self):
|
179
184
|
return lower(random_id(prefix=FLOW__RANDOM_NAME__PREFIX))
|
180
185
|
|
186
|
+
def resolve_args_and_kwargs(self):
|
187
|
+
dependency_manager = Dependency_Manager()
|
188
|
+
dependency_manager.add_dependency('this_flow', self)
|
189
|
+
dependency_manager.add_dependency('flow_data', self.data)
|
190
|
+
self.resolved_args, self.resolved_kwargs = dependency_manager.resolve_dependencies(self.flow_target,
|
191
|
+
*self.flow_args,
|
192
|
+
**self.flow_kwargs)
|
181
193
|
|
182
194
|
def set_flow_target(self, target, *args, **kwargs):
|
183
195
|
self.flow_target = target
|
@@ -61,6 +61,9 @@ class Task(Type_Safe):
|
|
61
61
|
|
62
62
|
self.task_flow.executed_tasks.append(self)
|
63
63
|
self.log_debug(f"Executing task '{f_blue(self.task_name)}'")
|
64
|
+
self.resolve_args_and_kwargs()
|
65
|
+
|
66
|
+
def resolve_args_and_kwargs(self):
|
64
67
|
dependency_manager = Dependency_Manager()
|
65
68
|
dependency_manager.add_dependency('this_task', self )
|
66
69
|
dependency_manager.add_dependency('this_flow', self.task_flow )
|
@@ -68,7 +71,6 @@ class Task(Type_Safe):
|
|
68
71
|
dependency_manager.add_dependency('flow_data', self.task_flow.data)
|
69
72
|
self.resolved_args, self.resolved_kwargs = dependency_manager.resolve_dependencies(self.task_target, *self.task_args, **self.task_kwargs)
|
70
73
|
|
71
|
-
|
72
74
|
def execute__task_target__sync(self):
|
73
75
|
try:
|
74
76
|
with Stdout() as stdout:
|
osbot_utils/utils/Objects.py
CHANGED
@@ -4,6 +4,7 @@ import pickle
|
|
4
4
|
import sys
|
5
5
|
import types
|
6
6
|
import typing
|
7
|
+
from collections.abc import Mapping
|
7
8
|
|
8
9
|
from typing import Union
|
9
10
|
from types import SimpleNamespace
|
@@ -121,18 +122,21 @@ def dict_remove(data, target):
|
|
121
122
|
del data[target]
|
122
123
|
return data
|
123
124
|
|
125
|
+
class __(SimpleNamespace):
|
126
|
+
pass
|
124
127
|
|
125
|
-
def dict_to_obj(target
|
126
|
-
|
127
|
-
if isinstance(target, dict):
|
128
|
+
def dict_to_obj(target):
|
129
|
+
if isinstance(target, Mapping):
|
128
130
|
new_dict = {}
|
129
131
|
for key, value in target.items():
|
130
|
-
new_dict[key] = dict_to_obj(value
|
131
|
-
return
|
132
|
+
new_dict[key] = dict_to_obj(value) # Recursively convert elements in the dict
|
133
|
+
return __(**new_dict)
|
132
134
|
elif isinstance(target, list): # Recursively convert elements in the list
|
133
|
-
return [dict_to_obj(item
|
135
|
+
return [dict_to_obj(item) for item in target]
|
134
136
|
elif isinstance(target, tuple): # Recursively convert elements in the tuple
|
135
|
-
return tuple(dict_to_obj(item
|
137
|
+
return tuple(dict_to_obj(item) for item in target)
|
138
|
+
# elif hasattr(target, 'json'): # todo: see if we need this. I don't like the idea of adding this extra hidden behaviour to this class
|
139
|
+
# return dict_to_obj(target.json())
|
136
140
|
|
137
141
|
return target
|
138
142
|
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v1.
|
1
|
+
v1.59.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.59.0
|
4
4
|
Summary: OWASP Security Bot - Utils
|
5
5
|
Home-page: https://github.com/owasp-sbot/OSBot-Utils
|
6
6
|
License: MIT
|
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
|
|
22
22
|
|
23
23
|
Powerful Python util methods and classes that simplify common apis and tasks.
|
24
24
|
|
25
|
-

|
26
26
|
[](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
|
27
27
|
|
28
28
|
|
@@ -2,7 +2,7 @@ osbot_utils/__init__.py,sha256=DdJDmQc9zbQUlPVyTJOww6Ixrn9n4bD3ami5ItQfzJI,16
|
|
2
2
|
osbot_utils/base_classes/Cache_Pickle.py,sha256=kPCwrgUbf_dEdxUz7vW1GuvIPwlNXxuRhb-H3AbSpII,5884
|
3
3
|
osbot_utils/base_classes/Kwargs_To_Disk.py,sha256=HHoy05NC_w35WcT-OnSKoSIV_cLqaU9rdjH0_KNTM0E,1096
|
4
4
|
osbot_utils/base_classes/Kwargs_To_Self.py,sha256=weFNsBfBNV9W_qBkN-IdBD4yYcJV_zgTxBRO-ZlcPS4,141
|
5
|
-
osbot_utils/base_classes/Type_Safe.py,sha256=
|
5
|
+
osbot_utils/base_classes/Type_Safe.py,sha256=SwgDhPKeC2jUWNmihUXwvDoXFhnZPOSrrsu1YnCyyx0,17961
|
6
6
|
osbot_utils/base_classes/Type_Safe__List.py,sha256=-80C9OhsK6iDR2dAG8yNLAZV0qg5x3faqvSUigFCMJw,517
|
7
7
|
osbot_utils/base_classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
osbot_utils/context_managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -154,9 +154,9 @@ osbot_utils/helpers/cache_requests/Cache__Requests__Row.py,sha256=h-yc7NkpScbHww
|
|
154
154
|
osbot_utils/helpers/cache_requests/Cache__Requests__Table.py,sha256=RgxAYhm-FIrXXteQRtD91pOLq8JXhSzxb51Jb6MTUdY,391
|
155
155
|
osbot_utils/helpers/cache_requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
156
156
|
osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py,sha256=xgx_oExxkcvRwQN1UCobimECIMUKGoIX5oGdCmp8Nyw,243
|
157
|
-
osbot_utils/helpers/flows/Flow.py,sha256=
|
157
|
+
osbot_utils/helpers/flows/Flow.py,sha256=m5j9OxR_xDgMh2z9u2FVQN_cQTQV_juJjbbNiNS8BuI,9645
|
158
158
|
osbot_utils/helpers/flows/Flow__Events.py,sha256=u9GzVNd08Hr49ZRIpoRDhwJnAHUFB-XzFzmNw-r3_Q0,2535
|
159
|
-
osbot_utils/helpers/flows/Task.py,sha256=
|
159
|
+
osbot_utils/helpers/flows/Task.py,sha256=ifPm0aqUG4sWAUTaYwT7ig-7Y9JmG9YTiNyC3dOX5sw,4887
|
160
160
|
osbot_utils/helpers/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
161
161
|
osbot_utils/helpers/flows/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
162
162
|
osbot_utils/helpers/flows/decorators/flow.py,sha256=LUL7bHjZ_lC3QoTNh-KsDZHzjE2u4mU-5EpZnfsEGuc,738
|
@@ -290,7 +290,7 @@ osbot_utils/utils/Json.py,sha256=7COxBlZRnpxtpNqpmzMPYkcKTnCok-s686nT27oiKEQ,648
|
|
290
290
|
osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
|
291
291
|
osbot_utils/utils/Lists.py,sha256=tPz5x5s3sRO97WZ_nsxREBPC5cwaHrhgaYBhsrffTT8,5599
|
292
292
|
osbot_utils/utils/Misc.py,sha256=nODZT6p44B4xYiIiqfEeKYEErQiKR9SGthhGtZWGhkI,16804
|
293
|
-
osbot_utils/utils/Objects.py,sha256=
|
293
|
+
osbot_utils/utils/Objects.py,sha256=0XKssf_aGarfWI-2Gl-XXUb2tYglTfCBkiKa5zTF0O4,17498
|
294
294
|
osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
|
295
295
|
osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
|
296
296
|
osbot_utils/utils/Python_Logger.py,sha256=tx8N6wRKL3RDHboDRKZn8SirSJdSAE9cACyJkxrThZ8,12792
|
@@ -302,8 +302,8 @@ osbot_utils/utils/Toml.py,sha256=SD6IA4-mrtoBXcI0dIGKV9POMQNd6WYKvmDQq7GQ6ZQ,143
|
|
302
302
|
osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
|
303
303
|
osbot_utils/utils/Zip.py,sha256=G6Hk_hDcm9yvWzhTKzhT0R_6f0NBIAchHqMxGb3kfh4,14037
|
304
304
|
osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
305
|
-
osbot_utils/version,sha256
|
306
|
-
osbot_utils-1.
|
307
|
-
osbot_utils-1.
|
308
|
-
osbot_utils-1.
|
309
|
-
osbot_utils-1.
|
305
|
+
osbot_utils/version,sha256=EhXG92o5KIntEa30a4LpsRMDYwjYTabNawYRJaxsOiI,8
|
306
|
+
osbot_utils-1.59.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
307
|
+
osbot_utils-1.59.0.dist-info/METADATA,sha256=DdvKFldlZVnDRyR4XMvON5CIAjR_-MNMAKm2e4XeDHY,1266
|
308
|
+
osbot_utils-1.59.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
309
|
+
osbot_utils-1.59.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|