osbot-utils 1.57.0__py3-none-any.whl → 1.58.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.
@@ -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.flow_args, **flow.flow_kwargs) # which is then used by the Task.find_flow method to find it
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.flow_args, **self.flow_kwargs) # if the flow is sync, just execute the flow target
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:
@@ -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
@@ -124,7 +125,7 @@ def dict_remove(data, target):
124
125
 
125
126
  def dict_to_obj(target, class_name="_"):
126
127
  DynamicClass = type(class_name, (SimpleNamespace,), {})
127
- if isinstance(target, dict):
128
+ if isinstance(target, Mapping):
128
129
  new_dict = {}
129
130
  for key, value in target.items():
130
131
  new_dict[key] = dict_to_obj(value, class_name=class_name) # Recursively convert elements in the dict
osbot_utils/version CHANGED
@@ -1 +1 @@
1
- v1.57.0
1
+ v1.58.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.57.0
3
+ Version: 1.58.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
- ![Current Release](https://img.shields.io/badge/release-v1.57.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.58.0-blue)
26
26
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
27
27
 
28
28
 
@@ -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=EpREDUue3OF7KkX2ocGfUT5NGUmqNPzpSv5qFo0rXXY,8914
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=ITR6qFd_BWEFtWJ5wZUFcxq3A3FyN4YzU7_CeIuUph0,4809
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=oiWF75BPahRtBRhFrQi_5Mv4wrqkjJnKAc_diw9CZdk,17321
293
+ osbot_utils/utils/Objects.py,sha256=60OFmwQZgqyfmOGS_WtD59-b0lB7rGhqWoh0tgkBKOc,17367
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=-M9mlli4O3LFg1u4RXSB9HGXK1Oa4UQlFSszYzJo7pc,8
306
- osbot_utils-1.57.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
307
- osbot_utils-1.57.0.dist-info/METADATA,sha256=Y_i8XIlAw6apKcCZkM-wT8Dm-gcCsOkMIfwTUrX6w1I,1266
308
- osbot_utils-1.57.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
309
- osbot_utils-1.57.0.dist-info/RECORD,,
305
+ osbot_utils/version,sha256=3zcuCY19oU6Xohxuk7cSp-mCBuuGU7OwYkdC8RVRMgw,8
306
+ osbot_utils-1.58.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
307
+ osbot_utils-1.58.0.dist-info/METADATA,sha256=jOtdSqjuFy3-p5D93fRccvYUYdAyQuM3irMTOpltDhw,1266
308
+ osbot_utils-1.58.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
309
+ osbot_utils-1.58.0.dist-info/RECORD,,