osbot-utils 2.61.0__py3-none-any.whl → 2.62.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/helpers/Random_Guid.py +4 -4
- osbot_utils/helpers/Safe_Id.py +7 -3
- osbot_utils/helpers/Timestamp_Now.py +2 -1
- osbot_utils/helpers/safe_float/Safe_Float.py +5 -3
- osbot_utils/helpers/safe_int/Safe_Int.py +4 -4
- osbot_utils/helpers/safe_str/Safe_Str.py +3 -2
- osbot_utils/type_safe/Type_Safe__Base.py +19 -2
- osbot_utils/type_safe/Type_Safe__Dict.py +19 -5
- osbot_utils/type_safe/Type_Safe__List.py +3 -0
- osbot_utils/type_safe/Type_Safe__Primitive.py +28 -0
- osbot_utils/type_safe/shared/Type_Safe__Validation.py +5 -1
- osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py +4 -1
- osbot_utils/utils/Objects.py +3 -1
- osbot_utils/version +1 -1
- {osbot_utils-2.61.0.dist-info → osbot_utils-2.62.0.dist-info}/METADATA +2 -2
- {osbot_utils-2.61.0.dist-info → osbot_utils-2.62.0.dist-info}/RECORD +18 -17
- {osbot_utils-2.61.0.dist-info → osbot_utils-2.62.0.dist-info}/LICENSE +0 -0
- {osbot_utils-2.61.0.dist-info → osbot_utils-2.62.0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
1
2
|
|
2
|
-
|
3
|
-
class Random_Guid(str):
|
3
|
+
class Random_Guid(Type_Safe__Primitive, str):
|
4
4
|
def __new__(cls, value=None):
|
5
5
|
from osbot_utils.utils.Misc import random_guid, is_guid
|
6
6
|
|
@@ -10,5 +10,5 @@ class Random_Guid(str):
|
|
10
10
|
return str.__new__(cls, value)
|
11
11
|
raise ValueError(f'in Random_Guid: value provided was not a Guid: {value}')
|
12
12
|
|
13
|
-
def __str__(self):
|
14
|
-
|
13
|
+
# def __str__(self):
|
14
|
+
# return self
|
osbot_utils/helpers/Safe_Id.py
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
1
2
|
from osbot_utils.utils.Misc import random_id_short
|
2
3
|
from osbot_utils.utils.Str import safe_id
|
3
4
|
|
4
5
|
SAFE_ID__MAX_LENGTH = 512
|
5
6
|
|
6
|
-
class Safe_Id(str):
|
7
|
+
class Safe_Id(Type_Safe__Primitive, str):
|
7
8
|
def __new__(cls, value=None, max_length=SAFE_ID__MAX_LENGTH):
|
8
9
|
if value is None:
|
9
10
|
value = safe_id(random_id_short('safe-id'))
|
10
11
|
sanitized_value = safe_id(value, max_length=max_length)
|
11
12
|
return str.__new__(cls, sanitized_value)
|
12
13
|
|
13
|
-
def __str__(self):
|
14
|
-
|
14
|
+
# def __str__(self):
|
15
|
+
# return self
|
16
|
+
|
17
|
+
|
18
|
+
# note: here is the regex applied on safe_id: REGEX__SAFE_ID_REGEX = re.compile(r'[^a-zA-Z0-9_-]')
|
@@ -1,8 +1,10 @@
|
|
1
1
|
import math
|
2
|
-
from decimal
|
3
|
-
from typing
|
2
|
+
from decimal import Decimal, ROUND_HALF_UP, InvalidOperation
|
3
|
+
from typing import Optional, Union
|
4
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
4
5
|
|
5
|
-
|
6
|
+
|
7
|
+
class Safe_Float(Type_Safe__Primitive, float): # Base class for type-safe floats with validation rules
|
6
8
|
|
7
9
|
min_value : Optional[float] = None
|
8
10
|
max_value : Optional[float] = None
|
@@ -1,9 +1,9 @@
|
|
1
|
-
from typing
|
1
|
+
from typing import Optional, Union
|
2
|
+
from osbot_utils.helpers.safe_float.Safe_Float import Safe_Float
|
3
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
2
4
|
|
3
|
-
from osbot_utils.helpers.safe_float.Safe_Float import Safe_Float
|
4
5
|
|
5
|
-
|
6
|
-
class Safe_Int(int): # Base class for type-safe integers with validation rules
|
6
|
+
class Safe_Int(Type_Safe__Primitive, int): # Base class for type-safe integers with validation rules
|
7
7
|
|
8
8
|
min_value : Optional[int] = None # Minimum allowed value (inclusive)
|
9
9
|
max_value : Optional[int] = None # Maximum allowed value (inclusive)
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import re
|
2
|
-
from typing
|
2
|
+
from typing import Optional
|
3
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
3
4
|
|
4
5
|
TYPE_SAFE__STR__REGEX__SAFE_STR = re.compile(r'[^a-zA-Z0-9]') # Only allow alphanumerics and numbers
|
5
6
|
TYPE_SAFE__STR__MAX_LENGTH = 512
|
6
7
|
|
7
|
-
class Safe_Str(str):
|
8
|
+
class Safe_Str(Type_Safe__Primitive, str):
|
8
9
|
max_length : int = TYPE_SAFE__STR__MAX_LENGTH
|
9
10
|
regex : re.Pattern = TYPE_SAFE__STR__REGEX__SAFE_STR
|
10
11
|
replacement_char : str = '_'
|
@@ -104,8 +104,25 @@ class Type_Safe__Base:
|
|
104
104
|
actual_type_name = type_str(type(item))
|
105
105
|
raise TypeError(f"Expected '{expected_type_name}', but got '{actual_type_name}'")
|
106
106
|
|
107
|
-
|
108
|
-
|
107
|
+
def try_convert(self, value, expected_type): # Try to convert value to expected type using Type_Safe conversion logic.
|
108
|
+
|
109
|
+
if expected_type is Any: # Handle Any type
|
110
|
+
return value
|
111
|
+
|
112
|
+
origin = type_safe_cache.get_origin(expected_type) # Handle subscripted generics (like Callable, Union, etc.)
|
113
|
+
if origin is not None:
|
114
|
+
return value # Can't convert generic types, let type check handle it
|
115
|
+
|
116
|
+
if isinstance(value, expected_type): # If already correct type, return as-is
|
117
|
+
return value
|
118
|
+
|
119
|
+
if isinstance(expected_type, type) and type(value) in [str, int, float]: # For types that are subclasses of built-ins (like Safe_Id extends str)
|
120
|
+
if issubclass(expected_type, type(value)): # Only convert if the value's type is a base class of expected_type. e.g., str → Safe_Id (ok), but not int → str (not ok)
|
121
|
+
return expected_type(value) # convert value to expected_type
|
122
|
+
|
123
|
+
|
124
|
+
# Return original if no conversion possible
|
125
|
+
return value
|
109
126
|
|
110
127
|
# todo: see if we should/can move this to the Objects.py file
|
111
128
|
def type_str(tp):
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from typing import Type
|
2
|
+
from osbot_utils.type_safe.Type_Safe__List import Type_Safe__List
|
2
3
|
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
|
3
4
|
|
4
5
|
class Type_Safe__Dict(Type_Safe__Base, dict):
|
@@ -8,15 +9,22 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
|
|
8
9
|
self.expected_key_type = expected_key_type
|
9
10
|
self.expected_value_type = expected_value_type
|
10
11
|
|
11
|
-
def
|
12
|
+
def __getitem__(self, key):
|
13
|
+
try:
|
14
|
+
return super().__getitem__(key) # First try direct lookup
|
15
|
+
except KeyError:
|
16
|
+
converted_key = self.try_convert(key, self.expected_key_type) # Try converting the key
|
17
|
+
return super().__getitem__(converted_key) # and compare again
|
18
|
+
|
19
|
+
def __setitem__(self, key, value): # Check type-safety before allowing assignment.
|
20
|
+
key = self.try_convert(key , self.expected_key_type )
|
21
|
+
value = self.try_convert(value, self.expected_value_type)
|
12
22
|
self.is_instance_of_type(key , self.expected_key_type)
|
13
23
|
self.is_instance_of_type(value, self.expected_value_type)
|
14
24
|
super().__setitem__(key, value)
|
15
25
|
|
16
|
-
|
17
|
-
|
18
|
-
# value_type_name = type_str(self.expected_value_type)
|
19
|
-
# return f"dict[{key_type_name}, {value_type_name}] with {len(self)} entries"
|
26
|
+
def __enter__(self): return self
|
27
|
+
def __exit__ (self, type, value, traceback): pass
|
20
28
|
|
21
29
|
def json(self): # Convert the dictionary to a JSON-serializable format.
|
22
30
|
from osbot_utils.type_safe.Type_Safe import Type_Safe # can only import this here to avoid circular imports
|
@@ -38,3 +46,9 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
|
|
38
46
|
else: # Regular values can be used as-is
|
39
47
|
result[key] = value
|
40
48
|
return result
|
49
|
+
|
50
|
+
def keys(self) -> Type_Safe__List:
|
51
|
+
return Type_Safe__List(self.expected_key_type, super().keys())
|
52
|
+
|
53
|
+
def values(self) -> Type_Safe__List:
|
54
|
+
return Type_Safe__List(self.expected_value_type, super().values())
|
@@ -10,6 +10,9 @@ class Type_Safe__List(Type_Safe__Base, list):
|
|
10
10
|
expected_type_name = type_str(self.expected_type)
|
11
11
|
return f"list[{expected_type_name}] with {len(self)} elements"
|
12
12
|
|
13
|
+
def __enter__(self): return self
|
14
|
+
def __exit__ (self, type, value, traceback): pass
|
15
|
+
|
13
16
|
def append(self, item):
|
14
17
|
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
15
18
|
if type(self.expected_type) is type and issubclass(self.expected_type, Type_Safe) and type(item) is dict: # if self.expected_type is Type_Safe and we have a dict
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Type_Safe__Primitive:
|
2
|
+
|
3
|
+
__primitive_base__ = None # Cache the primitive base type at class level
|
4
|
+
|
5
|
+
def __init_subclass__(cls, **kwargs):
|
6
|
+
super().__init_subclass__(**kwargs)
|
7
|
+
for base in cls.__mro__: # Find and cache the primitive base type when the class is created
|
8
|
+
if base in (str, int, float): # for now, we only support str, int, float
|
9
|
+
cls.__primitive_base__ = base
|
10
|
+
break
|
11
|
+
|
12
|
+
def __eq__(self, other):
|
13
|
+
if type(self) is type(other): # Same type → compare values
|
14
|
+
return super().__eq__(other)
|
15
|
+
if self.__primitive_base__ and type(other) is self.__primitive_base__: # Compare with cached primitive base type
|
16
|
+
return super().__eq__(other)
|
17
|
+
return False # Different types → not equal
|
18
|
+
|
19
|
+
def __ne__(self, other):
|
20
|
+
return not self.__eq__(other)
|
21
|
+
|
22
|
+
def __hash__(self): # Include type in hash to maintain hash/eq contract , This works for str, int, float subclasses
|
23
|
+
return hash((type(self).__name__, super().__hash__()))
|
24
|
+
|
25
|
+
def __repr__(self): # Enhanced repr to show type information in assertions
|
26
|
+
value_repr = super().__repr__()
|
27
|
+
return f"{type(self).__name__}({value_repr})"
|
28
|
+
|
@@ -4,6 +4,7 @@ import types
|
|
4
4
|
import typing
|
5
5
|
from enum import EnumMeta
|
6
6
|
from typing import Any, Annotated, Optional, get_args, get_origin, ForwardRef, Type, Dict, _GenericAlias
|
7
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
7
8
|
from osbot_utils.type_safe.shared.Type_Safe__Annotations import type_safe_annotations
|
8
9
|
from osbot_utils.type_safe.shared.Type_Safe__Cache import type_safe_cache
|
9
10
|
from osbot_utils.type_safe.shared.Type_Safe__Shared__Variables import IMMUTABLE_TYPES
|
@@ -33,6 +34,9 @@ class Type_Safe__Validation:
|
|
33
34
|
return True
|
34
35
|
if target_type is typing.Any:
|
35
36
|
return True
|
37
|
+
if isinstance(target_type, type) and issubclass(target_type,Type_Safe__Primitive):
|
38
|
+
if source_type in (int, float, str):
|
39
|
+
return True
|
36
40
|
return False
|
37
41
|
|
38
42
|
def are_types_magic_mock(self, source_type, target_type):
|
@@ -277,7 +281,7 @@ class Type_Safe__Validation:
|
|
277
281
|
actual_type = value
|
278
282
|
else:
|
279
283
|
actual_type = type(value)
|
280
|
-
raise ValueError(f"Invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'")
|
284
|
+
raise ValueError(f"Invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'") from None
|
281
285
|
|
282
286
|
# todo: see if need to add cache support to this method (it looks like this method is not called very often)
|
283
287
|
def validate_type_immutability(self, var_name: str, var_type: Any) -> None: # Validates that type is immutable or in supported format
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from typing import get_origin, Annotated, get_args
|
2
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
2
3
|
from osbot_utils.type_safe.shared.Type_Safe__Cache import type_safe_cache
|
3
4
|
from osbot_utils.type_safe.shared.Type_Safe__Convert import type_safe_convert
|
4
5
|
from osbot_utils.type_safe.shared.Type_Safe__Validation import type_safe_validation
|
@@ -9,7 +10,9 @@ class Type_Safe__Step__Set_Attr:
|
|
9
10
|
def resolve_value(self, _self, annotations, name, value):
|
10
11
|
if type(value) is dict:
|
11
12
|
value = self.resolve_value__dict(_self, name, value)
|
12
|
-
elif
|
13
|
+
elif isinstance(annotations.get(name), type) and issubclass(annotations.get(name), Type_Safe__Primitive) and type(value) in (int, str, float):
|
14
|
+
return annotations.get(name)(value)
|
15
|
+
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)
|
13
16
|
value = self.resolve_value__int_str(_self, name, value)
|
14
17
|
else:
|
15
18
|
value = self.resolve_value__from_origin(value)
|
osbot_utils/utils/Objects.py
CHANGED
@@ -272,7 +272,9 @@ def serialize_to_dict(obj):
|
|
272
272
|
from enum import Enum
|
273
273
|
from typing import List
|
274
274
|
|
275
|
-
if isinstance(obj, (str, int, float
|
275
|
+
if hasattr(obj, '__primitive_base__') and isinstance(obj, (str, int, float)):
|
276
|
+
return obj.__primitive_base__(obj)
|
277
|
+
elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None: # todo: add support for objects like datetime
|
276
278
|
return obj
|
277
279
|
elif isinstance(obj, Enum):
|
278
280
|
return obj.name
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v2.
|
1
|
+
v2.62.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.62.0
|
4
4
|
Summary: OWASP Security Bot - Utils
|
5
5
|
License: MIT
|
6
6
|
Author: Dinis Cruz
|
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
|
|
23
23
|
|
24
24
|
Powerful Python util methods and classes that simplify common apis and tasks.
|
25
25
|
|
26
|
-

|
27
27
|
[](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
|
28
28
|
|
29
29
|
|
@@ -41,12 +41,12 @@ osbot_utils/helpers/Local_Caches.py,sha256=LUeNJX07Ccnp1SIhYvhqqQFVF6r_Ez7bWha8s
|
|
41
41
|
osbot_utils/helpers/Obj_Id.py,sha256=sdKlSmEUpie0kn9X4pnM0MjUr6sLu4WZLSNqsD8ynBg,926
|
42
42
|
osbot_utils/helpers/Print_Table.py,sha256=LEXbyqGg_6WSraI4cob4bNNSu18ddqvALp1zGK7bPhs,19126
|
43
43
|
osbot_utils/helpers/Python_Audit.py,sha256=shpZlluJwqJBAlad6xN01FkgC1TsQ48RLvR5ZjmrKa4,1539
|
44
|
-
osbot_utils/helpers/Random_Guid.py,sha256=
|
44
|
+
osbot_utils/helpers/Random_Guid.py,sha256=86xnlevsiitCzFB-VjjBmXXV14pbcKd67YWEDsYTCFk,483
|
45
45
|
osbot_utils/helpers/Random_Guid_Short.py,sha256=YP_k5OLuYvXWGU2OEnQHk_OGViBQofTWKm3pUdQaJao,404
|
46
46
|
osbot_utils/helpers/Random_Seed.py,sha256=14btja8LDN9cMGWaz4fCNcMRU_eyx49gas-_PQvHgy4,634
|
47
|
-
osbot_utils/helpers/Safe_Id.py,sha256=
|
47
|
+
osbot_utils/helpers/Safe_Id.py,sha256=C7IcE8GwyvLbhzc6ImIafmdlCcR6vV7aQU9-oq-kIJE,656
|
48
48
|
osbot_utils/helpers/Str_ASCII.py,sha256=PRqyu449XnKrLn6b9Miii1Hv-GO5OAa1UhhgvlRcC2M,704
|
49
|
-
osbot_utils/helpers/Timestamp_Now.py,sha256=
|
49
|
+
osbot_utils/helpers/Timestamp_Now.py,sha256=OZwSwmYA1pZAnVglpx2lBL5t8Pu_HxzmYdNEJnmTqKI,536
|
50
50
|
osbot_utils/helpers/Type_Registry.py,sha256=Ajk3SyMSKDi2g9SJYUtTgg7PZkAgydaHcpbGuEN3S94,311
|
51
51
|
osbot_utils/helpers/Zip_Bytes.py,sha256=Bf17NPS_yxrzI_4FsCxkjlhS9ELJK3kisY-jHQPQVgw,4287
|
52
52
|
osbot_utils/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -241,19 +241,19 @@ osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py,sha256=yOQSn4o1bIsE
|
|
241
241
|
osbot_utils/helpers/pubsub/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
242
242
|
osbot_utils/helpers/python_compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
243
243
|
osbot_utils/helpers/python_compatibility/python_3_8.py,sha256=kh846vs3ir8xD0RSARJBOL0xufnt3L_Td3K45lDfqng,161
|
244
|
-
osbot_utils/helpers/safe_float/Safe_Float.py,sha256=
|
244
|
+
osbot_utils/helpers/safe_float/Safe_Float.py,sha256=qgmO8S8wFHXA4O3hm4bdamFZ0HkaN_r59hSbUNevHhc,6687
|
245
245
|
osbot_utils/helpers/safe_float/Safe_Float__Engineering.py,sha256=2XLh8sLs49WXqyRUzPbZnTQGok-CKR6jjxZCXi5py2A,330
|
246
246
|
osbot_utils/helpers/safe_float/Safe_Float__Money.py,sha256=Abh_CX8849rtKgAu-hCxwVxBytb7-I9-chkbYXpQr74,378
|
247
247
|
osbot_utils/helpers/safe_float/Safe_Float__Percentage_Exact.py,sha256=l_nGfa2-VCgdBeUXYQAR2wawc4362A9GsCOpWZ3Sdd4,286
|
248
248
|
osbot_utils/helpers/safe_float/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
249
|
-
osbot_utils/helpers/safe_int/Safe_Int.py,sha256=
|
249
|
+
osbot_utils/helpers/safe_int/Safe_Int.py,sha256=Bx_PDuGoLqNgjKMIdmMObAv7u4fw1ISWJlSNkK9kbXI,3168
|
250
250
|
osbot_utils/helpers/safe_int/Safe_UInt.py,sha256=lU8TiNNpa9Vwg-FK0btk_bRaV_GYcGpBjHjFAdw5f08,317
|
251
251
|
osbot_utils/helpers/safe_int/Safe_UInt__Byte.py,sha256=850zWYmowGE7NlkVocNewphWGXzBeWtVRV_zs2XFrxI,328
|
252
252
|
osbot_utils/helpers/safe_int/Safe_UInt__FileSize.py,sha256=pj1_Gf48JVXbnnvx5-YqbQfUsyV_PChVzh1Nnk7PuBY,602
|
253
253
|
osbot_utils/helpers/safe_int/Safe_UInt__Percentage.py,sha256=Ck-jiu6NK57Y3ruAjIJ0k-maiKcB2Q7M3t9nKf-8ga8,357
|
254
254
|
osbot_utils/helpers/safe_int/Safe_UInt__Port.py,sha256=uISrh8VKXiEQULQ1POU9YK8Di6z_vr0HWjCTpjA0YaY,482
|
255
255
|
osbot_utils/helpers/safe_int/__init__.py,sha256=kMU2WMsdQmayBEZugxnJV_wRW3O90bc118sx6iIm_mQ,310
|
256
|
-
osbot_utils/helpers/safe_str/Safe_Str.py,sha256=
|
256
|
+
osbot_utils/helpers/safe_str/Safe_Str.py,sha256=qR2RDh5cehP_wDDeV5TQahNBwmfcizPFyStALBKD5dw,3509
|
257
257
|
osbot_utils/helpers/safe_str/Safe_Str__File__Name.py,sha256=ncjkQ2hAhw0a3UulrCuQsA9ytrFwg5CT1XRJIGChMpY,289
|
258
258
|
osbot_utils/helpers/safe_str/Safe_Str__File__Path.py,sha256=K0yBcvH_Ncqiw7tMqjGqaNyWQh1Zs9qxZ-TR8nEIAow,550
|
259
259
|
osbot_utils/helpers/safe_str/Safe_Str__Hash.py,sha256=Tb2QeVpVDNWpCJGHNFjZPCQ_ZTaI7Z5BDzi19LiO_cI,952
|
@@ -365,10 +365,11 @@ osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.p
|
|
365
365
|
osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py,sha256=k9HJYNLmW6sjRVsfpduSxHFiVANc1zmYtO_Oz9azpW8,755
|
366
366
|
osbot_utils/testing/performance/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
367
367
|
osbot_utils/type_safe/Type_Safe.py,sha256=LOWRGOGpnRU2iTRLP47vUoyalK0vjFrWlnaghBIogWg,6267
|
368
|
-
osbot_utils/type_safe/Type_Safe__Base.py,sha256=
|
369
|
-
osbot_utils/type_safe/Type_Safe__Dict.py,sha256=
|
370
|
-
osbot_utils/type_safe/Type_Safe__List.py,sha256=
|
368
|
+
osbot_utils/type_safe/Type_Safe__Base.py,sha256=UTMipTL6mXoetAEUCI5hs8RqXp4NDYOvoAiYoFOt5jg,8807
|
369
|
+
osbot_utils/type_safe/Type_Safe__Dict.py,sha256=QB200L5eNWT3FnUv8sm5kncj1wXJsJ9uRycNFl9xb6Y,3077
|
370
|
+
osbot_utils/type_safe/Type_Safe__List.py,sha256=KyK_DpRM-ACHWPhIaqrNh0cNZhLC9vcsEhcxMi1UF9s,1799
|
371
371
|
osbot_utils/type_safe/Type_Safe__Method.py,sha256=PRV4enbwuD81QKP_5UtUA3OAp0m0xSiUhwkCoseZoq4,15687
|
372
|
+
osbot_utils/type_safe/Type_Safe__Primitive.py,sha256=RpogRqGJF2qzlsXsgDhyXkez_SjY_IsVIJBn7mmkSiU,1569
|
372
373
|
osbot_utils/type_safe/Type_Safe__Set.py,sha256=j12fc8cbd9-s_a13ysaz723rNEW4Dt6hObCd0S-AjIg,1432
|
373
374
|
osbot_utils/type_safe/Type_Safe__Tuple.py,sha256=Kx7C4YfHybRbMmVMcmV6yFLi4T48pb592vEZfjjyLxo,1710
|
374
375
|
osbot_utils/type_safe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -384,14 +385,14 @@ osbot_utils/type_safe/shared/Type_Safe__Json_Compressor__Type_Registry.py,sha256
|
|
384
385
|
osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py,sha256=25FAl6SOLxdStco_rm9tgOYLfuKyBWheGdl7vVa56UU,800
|
385
386
|
osbot_utils/type_safe/shared/Type_Safe__Raise_Exception.py,sha256=pbru8k8CTQMNUfmFBndiJhg2KkqEYzFvJAPcNZHeHfQ,829
|
386
387
|
osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py,sha256=SuZGl9LryQX6IpOE0I_lbzClT-h17UNylC__-M8ltTY,129
|
387
|
-
osbot_utils/type_safe/shared/Type_Safe__Validation.py,sha256=
|
388
|
+
osbot_utils/type_safe/shared/Type_Safe__Validation.py,sha256=xkpcj04owSap5DSG9m9FM1bnTje2I_xRFUfsH-R6mrQ,19509
|
388
389
|
osbot_utils/type_safe/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
389
390
|
osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py,sha256=snoyJKvZ1crgF2fp0zexwNPnV_E63RfyRIsMAZdrKNY,6995
|
390
391
|
osbot_utils/type_safe/steps/Type_Safe__Step__Default_Kwargs.py,sha256=tzKXDUc0HVP5QvCWsmcPuuZodNvQZ9FeMDNI2x00Ngw,1943
|
391
392
|
osbot_utils/type_safe/steps/Type_Safe__Step__Default_Value.py,sha256=b5vsgM8eg9yq2KM0wRMntVHma6OhN_HnU76LxhEIpoA,4483
|
392
393
|
osbot_utils/type_safe/steps/Type_Safe__Step__From_Json.py,sha256=AguNcZwKKnyNY87bSAF1xLwYW5h_IDfUad70QqIiK3I,14622
|
393
394
|
osbot_utils/type_safe/steps/Type_Safe__Step__Init.py,sha256=dQRwFxEMdmoW2ogmYZ6ZxLOvt1XnALx41LPpIB6yp3s,4473
|
394
|
-
osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py,sha256=
|
395
|
+
osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py,sha256=Nm1cleC-IDez6HFDejTfMprrnOfTvmEopO_pW6w1vFM,5507
|
395
396
|
osbot_utils/type_safe/steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
396
397
|
osbot_utils/type_safe/validators/Type_Safe__Validator.py,sha256=cJIPSBarjV716SZUOLvz7Mthjk-aUYKUQtRDtKUBmN4,779
|
397
398
|
osbot_utils/type_safe/validators/Validator__Max.py,sha256=pCvYF5Jb_cBgn1ArGhf6FNUB-NGCXPq3D36oYDCyAzg,1275
|
@@ -413,7 +414,7 @@ osbot_utils/utils/Json.py,sha256=TvfDoXwOkWzWH-9KMnme5C7iFsMZOleAeue92qmkH6g,883
|
|
413
414
|
osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
|
414
415
|
osbot_utils/utils/Lists.py,sha256=tPz5x5s3sRO97WZ_nsxREBPC5cwaHrhgaYBhsrffTT8,5599
|
415
416
|
osbot_utils/utils/Misc.py,sha256=H_xexJgiTxB3jDeDiW8efGQbO0Zuy8MM0iQ7qXC92JI,17363
|
416
|
-
osbot_utils/utils/Objects.py,sha256=
|
417
|
+
osbot_utils/utils/Objects.py,sha256=HFYcTM8o53ongj_Ih5Iw4C043DdHnDg7cOCd20JDG70,13587
|
417
418
|
osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
|
418
419
|
osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
|
419
420
|
osbot_utils/utils/Python_Logger.py,sha256=M9Oi62LxfnRSlCN8GhaiwiBINvcSdGy39FCWjyDD-Xg,12792
|
@@ -425,8 +426,8 @@ osbot_utils/utils/Toml.py,sha256=Rxl8gx7mni5CvBAK-Ai02EKw-GwtJdd3yeHT2kMloik,166
|
|
425
426
|
osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
|
426
427
|
osbot_utils/utils/Zip.py,sha256=pR6sKliUY0KZXmqNzKY2frfW-YVQEVbLKiyqQX_lc-8,14052
|
427
428
|
osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
428
|
-
osbot_utils/version,sha256=
|
429
|
-
osbot_utils-2.
|
430
|
-
osbot_utils-2.
|
431
|
-
osbot_utils-2.
|
432
|
-
osbot_utils-2.
|
429
|
+
osbot_utils/version,sha256=D2jMsR4GCqKXka6mERWlFlF_-L6bTp87Q1u4_8a3Gac,8
|
430
|
+
osbot_utils-2.62.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
431
|
+
osbot_utils-2.62.0.dist-info/METADATA,sha256=Tv5eyV42q8-AugMV48XSad5KlGiBsNe-V__dipVAkko,1329
|
432
|
+
osbot_utils-2.62.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
433
|
+
osbot_utils-2.62.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|