osbot-utils 2.85.0__py3-none-any.whl → 2.86.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/type_safe/Type_Safe__Primitive.py +6 -1
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +8 -3
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +2 -0
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +17 -2
- osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +38 -5
- osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +6 -2
- osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +17 -1
- osbot_utils/utils/Objects.py +10 -6
- osbot_utils/version +1 -1
- {osbot_utils-2.85.0.dist-info → osbot_utils-2.86.0.dist-info}/METADATA +2 -2
- {osbot_utils-2.85.0.dist-info → osbot_utils-2.86.0.dist-info}/RECORD +13 -13
- {osbot_utils-2.85.0.dist-info → osbot_utils-2.86.0.dist-info}/LICENSE +0 -0
- {osbot_utils-2.85.0.dist-info → osbot_utils-2.86.0.dist-info}/WHEEL +0 -0
@@ -67,4 +67,9 @@ class Type_Safe__Primitive:
|
|
67
67
|
if self.__primitive_base__ is str:
|
68
68
|
return f"{type(self).__name__}('{value_str}')"
|
69
69
|
else:
|
70
|
-
return f"{type(self).__name__}({value_str})"
|
70
|
+
return f"{type(self).__name__}({value_str})"
|
71
|
+
|
72
|
+
def __to_primitive__(self): # Convert this Type_Safe__Primitive instance to its base primitive type.
|
73
|
+
if self.__primitive_base__:
|
74
|
+
return self.__primitive_base__(self)
|
75
|
+
return str(self) # fallback
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from typing import Type
|
2
2
|
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
|
3
4
|
from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
|
4
5
|
|
5
6
|
|
@@ -35,7 +36,8 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
|
|
35
36
|
|
36
37
|
if isinstance(key, (type, Type)): # Handle Type objects as keys
|
37
38
|
key = f"{key.__module__}.{key.__name__}"
|
38
|
-
|
39
|
+
elif isinstance(key, Type_Safe__Primitive):
|
40
|
+
key = key.__to_primitive__()
|
39
41
|
if isinstance(value, Type_Safe): # Handle Type_Safe objects in values
|
40
42
|
result[key] = value.json()
|
41
43
|
elif isinstance(value, (list, tuple)): # Handle lists/tuples that might contain Type_Safe objects
|
@@ -44,8 +46,11 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
|
|
44
46
|
elif isinstance(value, dict): # Handle nested dictionaries that might contain Type_Safe objects
|
45
47
|
result[key] = {k: v.json() if isinstance(v, Type_Safe) else v
|
46
48
|
for k, v in value.items()}
|
47
|
-
else:
|
48
|
-
|
49
|
+
else:
|
50
|
+
if isinstance(value, Type_Safe__Primitive):
|
51
|
+
result[key] = value.__to_primitive__()
|
52
|
+
else:
|
53
|
+
result[key] = value
|
49
54
|
return result
|
50
55
|
|
51
56
|
def keys(self) -> Type_Safe__List:
|
@@ -50,6 +50,8 @@ class Type_Safe__List(Type_Safe__Base, list):
|
|
50
50
|
for item in self:
|
51
51
|
if isinstance(item, Type_Safe):
|
52
52
|
result.append(item.json())
|
53
|
+
elif isinstance(item, Type_Safe__Primitive):
|
54
|
+
result.append(item.__to_primitive__())
|
53
55
|
elif isinstance(item, (list, tuple)):
|
54
56
|
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
|
55
57
|
elif isinstance(item, dict):
|
@@ -1,4 +1,6 @@
|
|
1
1
|
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
|
2
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
3
|
+
|
2
4
|
|
3
5
|
class Type_Safe__Set(Type_Safe__Base, set):
|
4
6
|
def __init__(self, expected_type, *args):
|
@@ -10,10 +12,21 @@ class Type_Safe__Set(Type_Safe__Base, set):
|
|
10
12
|
return f"set[{expected_type_name}] with {len(self)} elements"
|
11
13
|
|
12
14
|
def add(self, item):
|
13
|
-
|
15
|
+
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
16
|
+
if type(self.expected_type) is type and issubclass(self.expected_type, Type_Safe) and type(item) is dict: # Handle Type_Safe objects from dicts
|
17
|
+
item = self.expected_type.from_json(item)
|
18
|
+
elif type(self.expected_type) is type and issubclass(self.expected_type, Type_Safe__Primitive): # Handle Type_Safe__Primitive conversions (str -> Safe_Str, etc.)
|
19
|
+
if not isinstance(item, self.expected_type):
|
20
|
+
try:
|
21
|
+
item = self.expected_type(item)
|
22
|
+
except (ValueError, TypeError) as e:
|
23
|
+
raise TypeError(f"In Type_Safe__Set: Could not convert {type(item).__name__} to {self.expected_type.__name__}: {e}") from None
|
24
|
+
|
25
|
+
try: # Now validate the (possibly converted) item
|
14
26
|
self.is_instance_of_type(item, self.expected_type)
|
15
27
|
except TypeError as e:
|
16
|
-
raise TypeError(f"In Type_Safe__Set: Invalid type for item: {e}")
|
28
|
+
raise TypeError(f"In Type_Safe__Set: Invalid type for item: {e}") from None
|
29
|
+
|
17
30
|
super().add(item)
|
18
31
|
|
19
32
|
def json(self):
|
@@ -23,6 +36,8 @@ class Type_Safe__Set(Type_Safe__Base, set):
|
|
23
36
|
for item in self:
|
24
37
|
if isinstance(item, Type_Safe):
|
25
38
|
result.append(item.json())
|
39
|
+
elif isinstance(item, Type_Safe__Primitive):
|
40
|
+
result.append(item.__to_primitive__())
|
26
41
|
elif isinstance(item, (list, tuple, set)):
|
27
42
|
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
|
28
43
|
elif isinstance(item, dict):
|
@@ -3,14 +3,44 @@ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
|
|
3
3
|
class Type_Safe__Tuple(Type_Safe__Base, tuple):
|
4
4
|
|
5
5
|
def __new__(cls, expected_types, items=None):
|
6
|
-
items
|
7
|
-
|
6
|
+
items = items or tuple()
|
7
|
+
|
8
|
+
converted_items = cls.convert_items(expected_types, items) # Convert items BEFORE creating the tuple
|
9
|
+
|
10
|
+
instance = super().__new__(cls, converted_items)
|
8
11
|
instance.expected_types = expected_types
|
9
12
|
return instance
|
10
13
|
|
11
|
-
def __init__(self, expected_types, items=None):
|
14
|
+
def __init__(self, expected_types, items=None):
|
12
15
|
if items:
|
13
|
-
self.validate_items(items
|
16
|
+
self.validate_items(self) # Validate the already-converted items
|
17
|
+
|
18
|
+
@classmethod
|
19
|
+
def convert_items(cls, expected_types, items): # Convert items to expected types before creating the tuple.
|
20
|
+
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
21
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
22
|
+
|
23
|
+
if not items:
|
24
|
+
return tuple()
|
25
|
+
|
26
|
+
if len(items) != len(expected_types):
|
27
|
+
raise ValueError(f"Expected {len(expected_types)} elements, got {len(items)}")
|
28
|
+
|
29
|
+
|
30
|
+
converted = []
|
31
|
+
for item, expected_type in zip(items, expected_types):
|
32
|
+
if type(expected_type) is type and issubclass(expected_type, Type_Safe) and type(item) is dict: # Handle Type_Safe objects from dicts
|
33
|
+
item = expected_type.from_json(item)
|
34
|
+
elif type(expected_type) is type and issubclass(expected_type, Type_Safe__Primitive): # Handle Type_Safe__Primitive conversions
|
35
|
+
if not isinstance(item, expected_type):
|
36
|
+
try:
|
37
|
+
item = expected_type(item)
|
38
|
+
except (ValueError, TypeError) as e:
|
39
|
+
raise TypeError(f"In Type_Safe__Tuple: Could not convert {type(item).__name__} to {expected_type.__name__}: {e}") from None
|
40
|
+
|
41
|
+
converted.append(item)
|
42
|
+
|
43
|
+
return tuple(converted)
|
14
44
|
|
15
45
|
def validate_items(self, items):
|
16
46
|
if len(items) != len(self.expected_types):
|
@@ -26,12 +56,15 @@ class Type_Safe__Tuple(Type_Safe__Base, tuple):
|
|
26
56
|
return f"tuple[{types_str}] with {len(self)} elements"
|
27
57
|
|
28
58
|
def json(self):
|
29
|
-
from osbot_utils.type_safe.Type_Safe
|
59
|
+
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
60
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
30
61
|
|
31
62
|
result = []
|
32
63
|
for item in self:
|
33
64
|
if isinstance(item, Type_Safe):
|
34
65
|
result.append(item.json())
|
66
|
+
elif isinstance(item, Type_Safe__Primitive):
|
67
|
+
result.append(item.__to_primitive__()) # Convert primitives to base types
|
35
68
|
elif isinstance(item, (list, tuple)):
|
36
69
|
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
|
37
70
|
elif isinstance(item, dict):
|
@@ -10,6 +10,7 @@ from osbot_utils.type_safe.primitives.safe_str.cryptography.hashes.Safe_Str__Has
|
|
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
|
12
12
|
from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Set import Type_Safe__Set
|
13
|
+
from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Tuple import Type_Safe__Tuple
|
13
14
|
from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Annotations import type_safe_annotations
|
14
15
|
from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Cache import type_safe_cache
|
15
16
|
from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Convert import type_safe_convert
|
@@ -60,8 +61,11 @@ class Type_Safe__Step__From_Json:
|
|
60
61
|
elif annotation_origin == type: # Handle type objects inside ForwardRef
|
61
62
|
value = self.deserialize_type__using_value(value)
|
62
63
|
if annotation_origin is tuple and isinstance(value, list):
|
63
|
-
|
64
|
-
|
64
|
+
item_types = get_args(annotation)
|
65
|
+
if item_types:
|
66
|
+
value = Type_Safe__Tuple(expected_types=item_types, items=value) # Create a Type_Safe__Tuple with proper type conversion
|
67
|
+
else:
|
68
|
+
value = tuple(value)
|
65
69
|
elif type_safe_annotations.obj_is_attribute_annotation_of_type(_self, key, dict): # handle the case when the value is a dict
|
66
70
|
value = self.deserialize_dict__using_key_value_annotations(_self, key, value)
|
67
71
|
elif type_safe_annotations.obj_is_attribute_annotation_of_type(_self, key, set): # handle the case when the value is a list
|
@@ -13,6 +13,8 @@ class Type_Safe__Step__Set_Attr:
|
|
13
13
|
value = self.resolve_value__dict(_self, name, value)
|
14
14
|
elif type(value) is list:
|
15
15
|
value = self.resolve_value__list(_self, name, value)
|
16
|
+
elif type(value) is tuple:
|
17
|
+
value = self.resolve_value__tuple(_self, name, value)
|
16
18
|
elif isinstance(annotations.get(name), type) and issubclass(annotations.get(name), Type_Safe__Primitive) and type(value) in (int, str, float):
|
17
19
|
return annotations.get(name)(value)
|
18
20
|
elif type(value) in (int, str): # for now only a small number of str and int classes are supported (until we understand the full implications of this)
|
@@ -53,6 +55,20 @@ class Type_Safe__Step__Set_Attr:
|
|
53
55
|
return type_safe_list
|
54
56
|
|
55
57
|
return value
|
58
|
+
|
59
|
+
def resolve_value__tuple(self, _self, name, value): # Convert regular tuples to Type_Safe__Tuple instances
|
60
|
+
annotations = type_safe_cache.get_obj_annotations(_self)
|
61
|
+
annotation = annotations.get(name)
|
62
|
+
|
63
|
+
if annotation:
|
64
|
+
origin = type_safe_cache.get_origin(annotation)
|
65
|
+
if origin is tuple:
|
66
|
+
args = get_args(annotation)
|
67
|
+
if args:
|
68
|
+
from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Tuple import Type_Safe__Tuple
|
69
|
+
return Type_Safe__Tuple(expected_types=args, items=value)
|
70
|
+
|
71
|
+
return value
|
56
72
|
def resolve_value__from_origin(self, value):
|
57
73
|
#origin = type_safe_cache.get_origin(value) # todo: figure out why this is the only place that the type_safe_cache.get_origin doesn't work (due to WeakKeyDictionary key error on value)
|
58
74
|
origin = get_origin(value)
|
@@ -106,7 +122,7 @@ class Type_Safe__Step__Set_Attr:
|
|
106
122
|
return _super.__setattr__(name, value)
|
107
123
|
|
108
124
|
if value is not None:
|
109
|
-
value = self.resolve_value
|
125
|
+
value = self.resolve_value (_self, annotations, name, value)
|
110
126
|
value = self.handle_get_class(_self, annotations, name, value)
|
111
127
|
else:
|
112
128
|
type_safe_validation.validate_if_value_has_been_set(_self, annotations, name, value)
|
osbot_utils/utils/Objects.py
CHANGED
@@ -265,14 +265,18 @@ def pickle_load_from_bytes(pickled_data: bytes):
|
|
265
265
|
return {}
|
266
266
|
|
267
267
|
# todo: see if it is possible to add recursive protection to this logic
|
268
|
+
# todo: we should move this method to the type_safe classes and folders
|
268
269
|
def serialize_to_dict(obj):
|
269
|
-
from decimal
|
270
|
-
from enum
|
271
|
-
from typing
|
272
|
-
|
273
|
-
|
270
|
+
from decimal import Decimal
|
271
|
+
from enum import Enum
|
272
|
+
from typing import List
|
273
|
+
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
|
274
|
+
|
275
|
+
if isinstance(obj, Type_Safe__Base) and hasattr(obj, 'json'): # if it is one of these Type_Safe__Base classes
|
276
|
+
return obj.json() # use the provided .json() method, which handles the type conversions more specifically to those types (dict, list, set and tuple)
|
277
|
+
elif hasattr(obj, '__primitive_base__') and isinstance(obj, (str, int, float)):
|
274
278
|
return obj.__primitive_base__(obj)
|
275
|
-
elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None:
|
279
|
+
elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None: # todo: add support for objects like datetime
|
276
280
|
return obj
|
277
281
|
elif isinstance(obj, Enum):
|
278
282
|
return obj.name
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v2.
|
1
|
+
v2.86.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.86.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
|
-

|
25
25
|

|
26
26
|

|
27
27
|

|
@@ -351,7 +351,7 @@ osbot_utils/testing/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
|
|
351
351
|
osbot_utils/testing/test_data/const__test__data__html.py,sha256=_DmA7OoCwvl1xxxn2aS8mfvf3Ct4bOt1KTUyTDqtwaQ,1718
|
352
352
|
osbot_utils/type_safe/Type_Safe.py,sha256=G0HCBk52ehaJGhLYnt4cKUBsqfnxyRDxrY7_7YhktZg,6390
|
353
353
|
osbot_utils/type_safe/Type_Safe__Base.py,sha256=cui8fIzUGaPsb-fnANj8nw9cYrVikdx1XZ8in3Y_-QU,9174
|
354
|
-
osbot_utils/type_safe/Type_Safe__Primitive.py,sha256
|
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
|
356
356
|
osbot_utils/type_safe/primitives/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
357
357
|
osbot_utils/type_safe/primitives/safe_float/Safe_Float.py,sha256=qgmO8S8wFHXA4O3hm4bdamFZ0HkaN_r59hSbUNevHhc,6687
|
@@ -411,10 +411,10 @@ 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=
|
415
|
-
osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py,sha256=
|
416
|
-
osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py,sha256=
|
417
|
-
osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py,sha256=
|
414
|
+
osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py,sha256=IM_5I_cMw6PhJk2bIRZ6siRAh5GR3QwuHCqzuELPzFs,3371
|
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
|
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
|
420
420
|
osbot_utils/type_safe/type_safe_core/decorators/type_safe.py,sha256=wOTMvZBl5hWMz-HuIRZpPBGN0oSbXWd9wH5xxZkfLlA,1796
|
@@ -434,9 +434,9 @@ osbot_utils/type_safe/type_safe_core/shared/__init__.py,sha256=47DEQpj8HBSa-_TIm
|
|
434
434
|
osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py,sha256=BbMPfCv5-RUZzh-TbyLBvykXZkdkR91jCGJoZ4R697g,8237
|
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=
|
437
|
+
osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py,sha256=caRTpPbzvBbV18oGHf6MDiazxGfg4tvf4Ik9sc_ikIo,15747
|
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=
|
439
|
+
osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py,sha256=ywUYo97jcZkHZ7BJ7GTTuici2obz-Nwch4TcM6ilDcY,9237
|
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
|
@@ -458,7 +458,7 @@ osbot_utils/utils/Json.py,sha256=TvfDoXwOkWzWH-9KMnme5C7iFsMZOleAeue92qmkH6g,883
|
|
458
458
|
osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
|
459
459
|
osbot_utils/utils/Lists.py,sha256=tPz5x5s3sRO97WZ_nsxREBPC5cwaHrhgaYBhsrffTT8,5599
|
460
460
|
osbot_utils/utils/Misc.py,sha256=H_xexJgiTxB3jDeDiW8efGQbO0Zuy8MM0iQ7qXC92JI,17363
|
461
|
-
osbot_utils/utils/Objects.py,sha256=
|
461
|
+
osbot_utils/utils/Objects.py,sha256=fLwnB0bv0vqGBE7uGYUxB4IUNEXjn-rjakYz8mp3VVY,14198
|
462
462
|
osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
|
463
463
|
osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
|
464
464
|
osbot_utils/utils/Python_Logger.py,sha256=M9Oi62LxfnRSlCN8GhaiwiBINvcSdGy39FCWjyDD-Xg,12792
|
@@ -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=
|
474
|
-
osbot_utils-2.
|
475
|
-
osbot_utils-2.
|
476
|
-
osbot_utils-2.
|
477
|
-
osbot_utils-2.
|
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,,
|
File without changes
|
File without changes
|