osbot-utils 2.86.0__py3-none-any.whl → 2.88.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.
@@ -1,8 +1,8 @@
1
1
  # todo: find a way to add these documentations strings to a separate location so that
2
2
  # the data is available in IDE's code complete
3
- from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Validation import type_safe_validation
3
+ from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Validation import type_safe_validation
4
4
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Class_Kwargs import type_safe_step_class_kwargs
5
- from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Kwargs import type_safe_step_default_kwargs
5
+ from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Kwargs import type_safe_step_default_kwargs
6
6
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Value import type_safe_step_default_value
7
7
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Init import type_safe_step_init
8
8
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Set_Attr import type_safe_step_set_attr
@@ -88,7 +88,7 @@ class Type_Safe:
88
88
  if value is not None:
89
89
  if hasattr(self,'__annotations__'): # can only do type safety checks if the class does not have annotations
90
90
  if type_safe_validation.check_if__type_matches__obj_annotation__for_attr(self, key, value) is False:
91
- raise ValueError(f"Invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
91
+ raise ValueError(f"On {self.__class__.__name__} invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
92
92
  setattr(self, key, value)
93
93
  return self
94
94
 
@@ -1,8 +1,8 @@
1
- # todo add to osbot utils
2
- from osbot_utils.utils.Misc import random_guid_short
1
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
2
+ from osbot_utils.utils.Misc import random_guid_short
3
3
 
4
4
 
5
- class Random_Guid_Short(str):
5
+ class Random_Guid_Short(Type_Safe__Primitive, str):
6
6
  def __new__(cls, value=None):
7
7
  if value is None:
8
8
  value = random_guid_short()
@@ -1,7 +1,9 @@
1
1
  from typing import Type
2
+ from osbot_utils.testing.__ import __
2
3
  from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
3
- from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
4
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
4
5
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
6
+ from osbot_utils.utils.Objects import dict_to_obj
5
7
 
6
8
 
7
9
  class Type_Safe__Dict(Type_Safe__Base, dict):
@@ -28,33 +30,54 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
28
30
  def __enter__(self): return self
29
31
  def __exit__ (self, type, value, traceback): pass
30
32
 
31
- def json(self): # Convert the dictionary to a JSON-serializable format.
32
- from osbot_utils.type_safe.Type_Safe import Type_Safe # can only import this here to avoid circular imports
33
+ def json(self):
34
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
35
+
36
+ def serialize_value(v):
37
+ """Recursively serialize values, handling nested structures"""
38
+ if isinstance(v, Type_Safe):
39
+ return v.json()
40
+ elif isinstance(v, Type_Safe__Primitive):
41
+ return v.__to_primitive__()
42
+ elif isinstance(v, dict):
43
+ # Recursively handle nested dictionaries
44
+ return {k2: serialize_value(v2) for k2, v2 in v.items()}
45
+ elif isinstance(v, (list, tuple, set)):
46
+ # Recursively handle sequences
47
+ serialized = [serialize_value(item) for item in v]
48
+ if isinstance(v, list):
49
+ return serialized
50
+ elif isinstance(v, tuple):
51
+ return tuple(serialized)
52
+ else: # set
53
+ return set(serialized)
54
+ else:
55
+ return v
33
56
 
34
57
  result = {}
35
58
  for key, value in self.items():
36
-
37
- if isinstance(key, (type, Type)): # Handle Type objects as keys
59
+ # Handle Type objects as keys
60
+ if isinstance(key, (type, Type)):
38
61
  key = f"{key.__module__}.{key.__name__}"
39
62
  elif isinstance(key, Type_Safe__Primitive):
40
63
  key = key.__to_primitive__()
41
- if isinstance(value, Type_Safe): # Handle Type_Safe objects in values
42
- result[key] = value.json()
43
- elif isinstance(value, (list, tuple)): # Handle lists/tuples that might contain Type_Safe objects
44
- result[key] = [item.json() if isinstance(item, Type_Safe) else item
45
- for item in value]
46
- elif isinstance(value, dict): # Handle nested dictionaries that might contain Type_Safe objects
47
- result[key] = {k: v.json() if isinstance(v, Type_Safe) else v
48
- for k, v in value.items()}
49
- else:
50
- if isinstance(value, Type_Safe__Primitive):
51
- result[key] = value.__to_primitive__()
52
- else:
53
- result[key] = value
64
+
65
+ # Use recursive serialization for values
66
+ result[key] = serialize_value(value)
67
+
54
68
  return result
55
69
 
70
+ def get(self, key, default=None): # this makes it consistent with the modified behaviour of __get__item
71
+ try:
72
+ return self[key] # Use __getitem__ with conversion
73
+ except KeyError:
74
+ return default # Return default instead of raising
75
+
56
76
  def keys(self) -> Type_Safe__List:
57
77
  return Type_Safe__List(self.expected_key_type, super().keys())
58
78
 
79
+ def obj(self) -> __:
80
+ return dict_to_obj(self.json())
81
+
59
82
  def values(self) -> Type_Safe__List:
60
83
  return Type_Safe__List(self.expected_value_type, super().values())
@@ -1,4 +1,4 @@
1
- from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
1
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
2
2
  from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
3
3
 
4
4
 
@@ -3,8 +3,12 @@ from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Shared__Variables im
3
3
 
4
4
  class Type_Safe__Raise_Exception:
5
5
 
6
- def type_mismatch_error(self, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
7
- exception_message = f"Invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
6
+ def type_mismatch_error__on_instance(self, _self, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
7
+ exception_message = f"On {_self.__class__.__name__}, invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
8
+ raise ValueError(exception_message) from None
9
+
10
+ def type_mismatch_error__on_type(self, cls, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
11
+ exception_message = f"On {cls.__name__}, invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
8
12
  raise ValueError(exception_message) from None
9
13
 
10
14
  def immutable_type_error(self, var_name, var_type):
@@ -270,11 +270,11 @@ class Type_Safe__Validation:
270
270
  def validate_if_value_has_been_set(self, _self, annotations, name, value):
271
271
  if hasattr(_self, name) and annotations.get(name) : # don't allow previously set variables to be set to None
272
272
  if getattr(_self, name) is not None: # unless it is already set to None
273
- raise ValueError(f"Can't set None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{_self.__annotations__.get(name)}' but got '{type(value)}'")
273
+ raise ValueError(f"On {_self.__class__.__name__}, can't be set to None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{_self.__annotations__.get(name)}' but got '{type(value)}'")
274
274
 
275
- def validate_if__types_are_compatible_for_assigment(self, name, current_type, expected_type):
275
+ def validate_if__types_are_compatible_for_assigment(self, _self, name, current_type, expected_type):
276
276
  if not type_safe_validation.are_types_compatible_for_assigment(current_type, expected_type):
277
- type_safe_raise_exception.type_mismatch_error(name, expected_type, current_type)
277
+ type_safe_raise_exception.type_mismatch_error__on_instance(_self, name, expected_type, current_type)
278
278
 
279
279
  def validate_type_compatibility(self, target : Any , # Target object to validate
280
280
  annotations : Dict[str, Any] , # Type annotations
@@ -295,7 +295,7 @@ class Type_Safe__Validation:
295
295
  actual_type = value
296
296
  else:
297
297
  actual_type = type(value)
298
- raise ValueError(f"Invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'") from None
298
+ raise ValueError(f"On {target.__class__.__name__}, invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'") from None
299
299
 
300
300
  # todo: see if need to add cache support to this method (it looks like this method is not called very often)
301
301
  def validate_type_immutability(self, var_name: str, var_type: Any) -> None: # Validates that type is immutable or in supported format
@@ -321,8 +321,8 @@ class Type_Safe__Validation:
321
321
  # if not (isinstance(var_type, type) and issubclass(var_type, (int,str, float))):
322
322
  # type_safe_raise_exception.immutable_type_error(var_name, var_type)
323
323
 
324
- def validate_variable_type(self, var_name, var_type, var_value): # Validate type compatibility
324
+ def validate_variable_type(self, base_cls, var_name, var_type, var_value): # Validate type compatibility
325
325
  if type(var_type) is type and not isinstance(var_value, var_type):
326
- type_safe_raise_exception.type_mismatch_error(var_name, var_type, type(var_value))
326
+ type_safe_raise_exception.type_mismatch_error__on_type(base_cls, var_name, var_type, type(var_value))
327
327
 
328
328
  type_safe_validation = Type_Safe__Validation()
@@ -96,7 +96,7 @@ class Type_Safe__Step__Class_Kwargs:
96
96
  # If conversion fails, let the original validation handle it
97
97
  pass
98
98
 
99
- type_safe_validation.validate_variable_type(var_name, var_type, var_value)
99
+ type_safe_validation.validate_variable_type(base_cls, var_name, var_type, var_value)
100
100
  type_safe_validation.validate_type_immutability(var_name, var_type)
101
101
 
102
102
  def process_annotation(self, cls : Type , # Process single annotation
@@ -5,7 +5,7 @@ from enum
5
5
  from osbot_utils.helpers.Obj_Id import Obj_Id
6
6
  from osbot_utils.type_safe.Type_Safe import Type_Safe
7
7
  from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid import Random_Guid
8
- from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid_Short import Random_Guid_Short
8
+ from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid_Short import Random_Guid_Short
9
9
  from osbot_utils.type_safe.primitives.safe_str.cryptography.hashes.Safe_Str__Hash import Safe_Str__Hash
10
10
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Dict import Type_Safe__Dict
11
11
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
@@ -16,7 +16,7 @@ from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Cache
16
16
  from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Convert import type_safe_convert
17
17
  from osbot_utils.utils.Objects import enum_from_value
18
18
  from osbot_utils.type_safe.primitives.safe_str.identifiers.Safe_Id import Safe_Id
19
- from osbot_utils.type_safe.primitives.safe_int.Timestamp_Now import Timestamp_Now
19
+ from osbot_utils.type_safe.primitives.safe_int.Timestamp_Now import Timestamp_Now
20
20
 
21
21
  # todo; refactor all this python compatibility into the python_3_8 class
22
22
  if sys.version_info < (3, 8): # pragma: no cover
@@ -22,7 +22,7 @@ class Type_Safe__Step__Set_Attr:
22
22
  else:
23
23
  value = self.resolve_value__from_origin(value)
24
24
 
25
- self.validate_literal_value(annotations, name, value) # Check Literal value constraints before generic type checking
25
+ self.validate_literal_value(_self, annotations, name, value) # Check Literal value constraints before generic type checking
26
26
 
27
27
  type_safe_validation.validate_type_compatibility(_self, annotations, name, value)
28
28
  return value
@@ -106,7 +106,7 @@ class Type_Safe__Step__Set_Attr:
106
106
  if name in immutable_vars:
107
107
  expected_type = immutable_vars[name]
108
108
  current_type = type if value is type else type(value)
109
- type_safe_validation.validate_if__types_are_compatible_for_assigment(name, current_type, expected_type)
109
+ type_safe_validation.validate_if__types_are_compatible_for_assigment(_self, name, current_type, expected_type)
110
110
  _super.__setattr__(name, value)
111
111
  return True
112
112
  return False
@@ -129,7 +129,7 @@ class Type_Safe__Step__Set_Attr:
129
129
 
130
130
  _super.__setattr__(name, value)
131
131
 
132
- def validate_literal_value(self, annotations, name, value): # Check if a value is valid for a Literal type annotation
132
+ def validate_literal_value(self, _self, annotations, name, value): # Check if a value is valid for a Literal type annotation
133
133
 
134
134
  annotation = annotations.get(name)
135
135
  if not annotation:
@@ -145,7 +145,7 @@ class Type_Safe__Step__Set_Attr:
145
145
  allowed_values = get_args(arg) # Found Literal inside Optional
146
146
  if value is not None and value not in allowed_values:
147
147
  allowed_str = ', '.join(repr(v) for v in allowed_values)
148
- raise ValueError(f"Invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
148
+ raise ValueError(f"On {_self.__class__.__name__}, invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
149
149
  return
150
150
 
151
151
 
@@ -153,7 +153,7 @@ class Type_Safe__Step__Set_Attr:
153
153
  allowed_values = get_args(annotation)
154
154
  if value not in allowed_values:
155
155
  allowed_str = ', '.join(repr(v) for v in allowed_values)
156
- raise ValueError(f"Invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
156
+ raise ValueError(f"On {_self.__class__.__name__}, invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
157
157
 
158
158
 
159
159
  type_safe_step_set_attr = Type_Safe__Step__Set_Attr()
osbot_utils/version CHANGED
@@ -1 +1 @@
1
- v2.86.0
1
+ v2.88.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.86.0
3
+ Version: 2.88.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # OSBot-Utils
23
23
 
24
- ![Current Release](https://img.shields.io/badge/release-v2.86.0-blue)
24
+ ![Current Release](https://img.shields.io/badge/release-v2.88.0-blue)
25
25
  ![Python](https://img.shields.io/badge/python-3.8+-green)
26
26
  ![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
27
27
  ![Caching](https://img.shields.io/badge/Caching-Built--In-orange)
@@ -349,7 +349,7 @@ osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py,sha
349
349
  osbot_utils/testing/performance/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
350
350
  osbot_utils/testing/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
351
  osbot_utils/testing/test_data/const__test__data__html.py,sha256=_DmA7OoCwvl1xxxn2aS8mfvf3Ct4bOt1KTUyTDqtwaQ,1718
352
- osbot_utils/type_safe/Type_Safe.py,sha256=G0HCBk52ehaJGhLYnt4cKUBsqfnxyRDxrY7_7YhktZg,6390
352
+ osbot_utils/type_safe/Type_Safe.py,sha256=2rlOJuB0fNiiefKqIKUw34vs1hGWms-Ah_SaIg7tj28,6427
353
353
  osbot_utils/type_safe/Type_Safe__Base.py,sha256=cui8fIzUGaPsb-fnANj8nw9cYrVikdx1XZ8in3Y_-QU,9174
354
354
  osbot_utils/type_safe/Type_Safe__Primitive.py,sha256=Eufm1CSenInqW8gAgULhUAXV_lMmA4UY4A5U9v8qmnU,4135
355
355
  osbot_utils/type_safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -394,7 +394,7 @@ osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py,sha256=mi
394
394
  osbot_utils/type_safe/primitives/safe_str/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
395
395
  osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py,sha256=-WeQzrNj98ay-8rWCBuM-FnhccmygDzZKW1LZ0Frm3M,945
396
396
  osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py,sha256=86xnlevsiitCzFB-VjjBmXXV14pbcKd67YWEDsYTCFk,483
397
- osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py,sha256=YP_k5OLuYvXWGU2OEnQHk_OGViBQofTWKm3pUdQaJao,404
397
+ osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py,sha256=cXye_Bo5cco24FOyXwyN0qotXHc-X4-eQ-ZgOaQrocE,496
398
398
  osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py,sha256=Mj66QVcEHqUKDFb0cdl7cbMOlQKxfFuRxnupmKo6UG8,696
399
399
  osbot_utils/type_safe/primitives/safe_str/identifiers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
400
400
  osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py,sha256=95E4ALhah2AEfL-m5JB7XpUOkyxQ0lJQM139RPQJjv4,327
@@ -411,9 +411,9 @@ osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py,sha256=MKD2A
411
411
  osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py,sha256=gcqi3UaWaFNSktqUTrfdgRKVI5JKWnqxcpi5FlX75J0,496
412
412
  osbot_utils/type_safe/primitives/safe_uint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
413
413
  osbot_utils/type_safe/type_safe_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py,sha256=IM_5I_cMw6PhJk2bIRZ6siRAh5GR3QwuHCqzuELPzFs,3371
414
+ osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py,sha256=1heFE2F7kLUNOKFMZ2eG7DMidcogsaf6dDruHLFGOr4,3734
415
415
  osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py,sha256=os5dOU7iKnjKoWt00SLj0Wy_X1RL2iGEErsYvg04tto,2719
416
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py,sha256=AqaimwY8Ba-GRI9xsCCZwLmAjMHK3HLV_tJiKXEp7Sc,2575
416
+ osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py,sha256=jbKLz5Kqo527JWY5Xa4k1c7wqonNz8BYXw22b2O2ov4,2580
417
417
  osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py,sha256=MEUHVwPDVqPmnZsvxwAhQAQY9JwFsMe2R42z4tWKRN4,3445
418
418
  osbot_utils/type_safe/type_safe_core/collections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
419
419
  osbot_utils/type_safe/type_safe_core/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -427,16 +427,16 @@ osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py,sha256=g2lo_11
427
427
  osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py,sha256=L5EiMPP-7vvzesW-Zs1YRPv1C544NiMTMag2saUnPrc,5522
428
428
  osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py,sha256=wYOCg7F1nTrRn8HlnZvrs_8A8WL4gxRYRLnXZpGIiuk,1119
429
429
  osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py,sha256=25FAl6SOLxdStco_rm9tgOYLfuKyBWheGdl7vVa56UU,800
430
- osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py,sha256=lEwW5bhOKnOB8KfuMkheLQy1Xb7iDtTOXIvActRDtD0,911
430
+ osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py,sha256=UCLEJpJPL4wnuX6f7YxawqArMtfWdLfuhFMfB7Z0yq4,1355
431
431
  osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py,sha256=SuZGl9LryQX6IpOE0I_lbzClT-h17UNylC__-M8ltTY,129
432
- osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py,sha256=cVfGNeZ7eriAghCpPTtS2bXqZT9GHLY9DK1uWMTSUdE,21124
432
+ osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py,sha256=tAH09G0b-xN3J2yNOcvHR03viM8zlMRBuuLQx3JY_yw,21249
433
433
  osbot_utils/type_safe/type_safe_core/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
434
- osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py,sha256=BbMPfCv5-RUZzh-TbyLBvykXZkdkR91jCGJoZ4R697g,8237
434
+ osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py,sha256=t3hsy_Q0eS_9hYsEd1_bhVvSybwcq26DKcjK8_11P9Q,8247
435
435
  osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py,sha256=tzKXDUc0HVP5QvCWsmcPuuZodNvQZ9FeMDNI2x00Ngw,1943
436
436
  osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py,sha256=mRu0yV3w7Ch1H8SOfXMRqMBp3ooY95yR_oni7JafJBc,4603
437
- osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py,sha256=caRTpPbzvBbV18oGHf6MDiazxGfg4tvf4Ik9sc_ikIo,15747
437
+ osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py,sha256=QDVf-cN7aK8_xYdkHS74seSrMYyhurd_MEzgTlUyStg,15712
438
438
  osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py,sha256=lZpQCCTNt6JcqyWwDoj-9Zgrq10vHXIUBh9lx37vRkE,4990
439
- osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py,sha256=ywUYo97jcZkHZ7BJ7GTTuici2obz-Nwch4TcM6ilDcY,9237
439
+ osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py,sha256=OLAzZ6FUfTYk4tqIRe_JGvBR_WZqPZFqM2aD_AMKb0c,9320
440
440
  osbot_utils/type_safe/type_safe_core/steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
441
441
  osbot_utils/type_safe/validators/Type_Safe__Validator.py,sha256=cJIPSBarjV716SZUOLvz7Mthjk-aUYKUQtRDtKUBmN4,779
442
442
  osbot_utils/type_safe/validators/Validator__Max.py,sha256=pCvYF5Jb_cBgn1ArGhf6FNUB-NGCXPq3D36oYDCyAzg,1275
@@ -470,8 +470,8 @@ osbot_utils/utils/Toml.py,sha256=grjWkVPIMVkawJ499FVIJKxQp8FJ2wcsd0Z3YIR4drM,114
470
470
  osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
471
471
  osbot_utils/utils/Zip.py,sha256=mG42lgTY0tnm14T3P1-DSAIZKkTiYoO3odZ1aOUdc1I,14394
472
472
  osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
473
- osbot_utils/version,sha256=6Cn7UOgy_SJPSb16yrGhCgZKuq2nwG2aj2B0loLVsZc,8
474
- osbot_utils-2.86.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
475
- osbot_utils-2.86.0.dist-info/METADATA,sha256=hVm2edAsrGB02PyLzWfO5xAOPsvFMntpGOGLCFV4AT4,7918
476
- osbot_utils-2.86.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
477
- osbot_utils-2.86.0.dist-info/RECORD,,
473
+ osbot_utils/version,sha256=u1LBWyu3twx83JpD3wK_Gaq_Qp9K5LjWM2VKJa6aO50,8
474
+ osbot_utils-2.88.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
475
+ osbot_utils-2.88.0.dist-info/METADATA,sha256=nnRNyYqN_GhoIZJE0Al-lCnDdCNWQ3bB4dqbDIeoHhU,7918
476
+ osbot_utils-2.88.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
477
+ osbot_utils-2.88.0.dist-info/RECORD,,