osbot-utils 2.84.0__py3-none-any.whl → 2.85.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/primitives/safe_str/Safe_Str.py +9 -9
- osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +4 -4
- osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +1 -1
- osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +8 -4
- osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +3 -3
- osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +4 -4
- osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +1 -1
- osbot_utils/version +1 -1
- {osbot_utils-2.84.0.dist-info → osbot_utils-2.85.0.dist-info}/METADATA +2 -2
- {osbot_utils-2.84.0.dist-info → osbot_utils-2.85.0.dist-info}/RECORD +19 -19
- {osbot_utils-2.84.0.dist-info → osbot_utils-2.85.0.dist-info}/LICENSE +0 -0
- {osbot_utils-2.84.0.dist-info → osbot_utils-2.85.0.dist-info}/WHEEL +0 -0
@@ -12,7 +12,7 @@ class Safe_Str(Type_Safe__Primitive, str):
|
|
12
12
|
regex : re.Pattern = TYPE_SAFE__STR__REGEX__SAFE_STR
|
13
13
|
regex_mode : Enum__Safe_Str__Regex_Mode = Enum__Safe_Str__Regex_Mode.REPLACE
|
14
14
|
replacement_char : str = '_'
|
15
|
-
allow_empty : bool = True
|
15
|
+
allow_empty : bool = True # note: making this False does cause some side effects on .json() on cases like auto serialization in environments like FastAPI (like it requires more explict value setting), so all have now been converted into a value of True
|
16
16
|
trim_whitespace : bool = False
|
17
17
|
allow_all_replacement_char: bool = True
|
18
18
|
strict_validation : bool = False # If True, don't replace invalid chars, raise an error instead
|
@@ -34,12 +34,12 @@ class Safe_Str(Type_Safe__Primitive, str):
|
|
34
34
|
value = value.strip()
|
35
35
|
|
36
36
|
if not cls.allow_empty and (value is None or value == ""): # Check for empty string if not allowed
|
37
|
-
raise ValueError("
|
37
|
+
raise ValueError(f"in {cls.__name__}, value cannot be empty when allow_empty is False")
|
38
38
|
|
39
|
-
if cls.exact_length and len(value) != cls.max_length:
|
40
|
-
raise ValueError(f"
|
39
|
+
if cls.exact_length and len(value) and len(value) != cls.max_length:
|
40
|
+
raise ValueError(f"in {cls.__name__}, value must be exactly {cls.max_length} characters long (was {len(value)})")
|
41
41
|
elif not cls.exact_length and len(value) > cls.max_length: # Check max length
|
42
|
-
raise ValueError(f"
|
42
|
+
raise ValueError(f"in {cls.__name__}, value exceeds maximum length of {cls.max_length} characters (was {len(value)})")
|
43
43
|
|
44
44
|
if cls.allow_empty and value =='':
|
45
45
|
return str.__new__(cls, '')
|
@@ -54,22 +54,22 @@ class Safe_Str(Type_Safe__Primitive, str):
|
|
54
54
|
if cls.strict_validation:
|
55
55
|
if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # For 'match' mode, regex defines the valid pattern (like version numbers)
|
56
56
|
if not cls.regex.match(value):
|
57
|
-
raise ValueError(f"
|
57
|
+
raise ValueError(f"in {cls.__name__}, value does not match required pattern: {cls.regex.pattern}")
|
58
58
|
return value
|
59
59
|
elif cls.regex_mode == Enum__Safe_Str__Regex_Mode.REPLACE: # For 'replace' mode, regex defines invalid characters to replace
|
60
60
|
if cls.regex.search(value) is not None:
|
61
|
-
raise ValueError(f"
|
61
|
+
raise ValueError(f"in {cls.__name__}, value contains invalid characters (must not match pattern: {cls.regex.pattern})")
|
62
62
|
return value
|
63
63
|
else:
|
64
64
|
raise ValueError(f"in {cls.__name__}, regex_mode value cannot be None when strict_validation is True")
|
65
65
|
else:
|
66
66
|
if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # Cannot do replacement when regex defines valid pattern
|
67
|
-
raise ValueError(f"
|
67
|
+
raise ValueError(f"in {cls.__name__}, cannot use regex_mode='match' without strict_validation=True")
|
68
68
|
else: # assume the default Enum__Safe_Str__Regex_Mode.MATCH
|
69
69
|
sanitized_value = cls.regex.sub(cls.replacement_char, value)
|
70
70
|
|
71
71
|
if not cls.allow_all_replacement_char and set(sanitized_value) == {
|
72
72
|
cls.replacement_char} and sanitized_value:
|
73
|
-
raise ValueError(f"
|
73
|
+
raise ValueError(f"in {cls.__name__}, sanitized value consists entirely of '{cls.replacement_char}' characters")
|
74
74
|
|
75
75
|
return sanitized_value
|
@@ -10,10 +10,10 @@ TYPE_SAFE_STR__HASH__REGEX = re.compile(r'[^a-fA-F0-9]') # Only a
|
|
10
10
|
class Safe_Str__Hash(Safe_Str):
|
11
11
|
regex = TYPE_SAFE_STR__HASH__REGEX
|
12
12
|
max_length = SIZE__VALUE_HASH
|
13
|
-
allow_empty =
|
14
|
-
trim_whitespace = True
|
15
|
-
strict_validation = True
|
16
|
-
exact_length = True
|
13
|
+
allow_empty = True # Don't allow empty hash values
|
14
|
+
trim_whitespace = True # Trim any whitespace
|
15
|
+
strict_validation = True # Enable strict validation - new attribute
|
16
|
+
exact_length = True # Require exact length match - new attribute
|
17
17
|
|
18
18
|
def safe_str_hash(value: Any) -> Safe_Str__Hash:
|
19
19
|
if isinstance(value, str):
|
@@ -19,6 +19,6 @@ class Safe_Str__SHA1__Short(Safe_Str):
|
|
19
19
|
regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
|
20
20
|
max_length = TYPE_SAFE_STR__GITHUB__SHA_SHORT__LENGTH
|
21
21
|
exact_length = True
|
22
|
-
allow_empty =
|
22
|
+
allow_empty = True
|
23
23
|
trim_whitespace = True
|
24
24
|
strict_validation = True
|
@@ -22,6 +22,6 @@ class Safe_Str__NaCl__Private_Key(Safe_Str):
|
|
22
22
|
regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
|
23
23
|
max_length = TYPE_SAFE_STR__NACL__PRIVATE_KEY__LENGTH
|
24
24
|
exact_length = True
|
25
|
-
allow_empty =
|
25
|
+
allow_empty = True
|
26
26
|
trim_whitespace = True
|
27
27
|
strict_validation = True
|
@@ -23,6 +23,6 @@ class Safe_Str__NaCl__Public_Key(Safe_Str):
|
|
23
23
|
regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
|
24
24
|
max_length = TYPE_SAFE_STR__NACL__PUBLIC_KEY__LENGTH
|
25
25
|
exact_length = True
|
26
|
-
allow_empty =
|
26
|
+
allow_empty = True
|
27
27
|
trim_whitespace = True
|
28
28
|
strict_validation = True
|
@@ -9,7 +9,7 @@ class Safe_Str__Version(Safe_Str):
|
|
9
9
|
regex = TYPE_SAFE_STR__VERSION__REGEX
|
10
10
|
regex_mode = Enum__Safe_Str__Regex_Mode.MATCH # in this case we need an exact match of the version regex
|
11
11
|
max_length = TYPE_SAFE_STR__VERSION__MAX_LENGTH
|
12
|
-
allow_empty =
|
12
|
+
allow_empty = True
|
13
13
|
trim_whitespace = True
|
14
14
|
strict_validation = True # Ensure the value exactly matches the regex
|
15
15
|
|
@@ -20,7 +20,7 @@ class Safe_Str__GitHub__Repo(Safe_Str):
|
|
20
20
|
"""
|
21
21
|
regex = TYPE_SAFE_STR__GITHUB__REPO__REGEX
|
22
22
|
max_length = TYPE_SAFE_STR__GITHUB__REPO__MAX_LENGTH
|
23
|
-
allow_empty =
|
23
|
+
allow_empty = True
|
24
24
|
trim_whitespace = True
|
25
25
|
allow_all_replacement_char = False
|
26
26
|
repo_owner : Safe_Str__GitHub__Repo_Owner = None # note: due to the str override these will not show in the Pycharm code hints (but they will work)
|
@@ -31,16 +31,20 @@ class Safe_Str__GitHub__Repo(Safe_Str):
|
|
31
31
|
|
32
32
|
if result:
|
33
33
|
if '/' not in result: # Check for the required forward slash
|
34
|
-
raise ValueError(f"
|
34
|
+
raise ValueError(f"in {cls.__name__}, gitHub repository must be in 'owner/repo' format: {result}")
|
35
35
|
|
36
36
|
|
37
37
|
parts = result.split('/') # Split and validate components using the dedicated classes
|
38
38
|
if len(parts) != 2:
|
39
|
-
raise ValueError(f"
|
39
|
+
raise ValueError(f"in {cls.__name__}, gitHub repository must be in 'owner/repo' format: {result}")
|
40
40
|
|
41
41
|
owner_part, repo_part = parts
|
42
42
|
|
43
43
|
result.repo_owner = Safe_Str__GitHub__Repo_Owner(owner_part) # Validate using the dedicated classes (and store the references)
|
44
|
-
result.repo_name = Safe_Str__GitHub__Repo_Name(repo_part )
|
44
|
+
result.repo_name = Safe_Str__GitHub__Repo_Name(repo_part )
|
45
|
+
if not result.repo_owner:
|
46
|
+
raise ValueError(f"in {cls.__name__}, missing owner, gitHub repository must be in 'owner/repo' format: {result}")
|
47
|
+
if not result.repo_name:
|
48
|
+
raise ValueError(f"in {cls.__name__}, missing name, gitHub repository must be in 'owner/repo' format: {result}")
|
45
49
|
|
46
50
|
return result
|
@@ -15,7 +15,7 @@ class Safe_Str__GitHub__Repo_Name(Safe_Str):
|
|
15
15
|
"""
|
16
16
|
regex = TYPE_SAFE_STR__GITHUB__REPO_NAME__REGEX
|
17
17
|
max_length = TYPE_SAFE_STR__GITHUB__REPO_NAME__MAX_LENGTH
|
18
|
-
allow_empty =
|
18
|
+
allow_empty = True
|
19
19
|
trim_whitespace = True
|
20
20
|
allow_all_replacement_char = False
|
21
21
|
|
@@ -26,10 +26,10 @@ class Safe_Str__GitHub__Repo_Name(Safe_Str):
|
|
26
26
|
if result:
|
27
27
|
# Check if it's just periods (reserved names)
|
28
28
|
if result in ['.', '..']:
|
29
|
-
raise ValueError(f"
|
29
|
+
raise ValueError(f"in {cls.__name__}, invalid repository name: {result}")
|
30
30
|
|
31
31
|
# Check for all replacement characters
|
32
32
|
if set(result) == {'_'} and len(result) > 0:
|
33
|
-
raise ValueError(f"
|
33
|
+
raise ValueError(f"in {cls.__name__}, invalid repository name: {result}")
|
34
34
|
|
35
35
|
return result
|
@@ -16,7 +16,7 @@ class Safe_Str__GitHub__Repo_Owner(Safe_Str):
|
|
16
16
|
"""
|
17
17
|
regex = TYPE_SAFE_STR__GITHUB__REPO_OWNER__REGEX
|
18
18
|
max_length = TYPE_SAFE_STR__GITHUB__REPO_OWNER__MAX_LENGTH
|
19
|
-
allow_empty =
|
19
|
+
allow_empty = True
|
20
20
|
trim_whitespace = True
|
21
21
|
allow_all_replacement_char = False
|
22
22
|
|
@@ -26,13 +26,13 @@ class Safe_Str__GitHub__Repo_Owner(Safe_Str):
|
|
26
26
|
|
27
27
|
if result: # Additional GitHub-specific validation
|
28
28
|
if result.startswith('-') or result.endswith('-'): # Check for leading/trailing hyphens
|
29
|
-
raise ValueError(f"
|
29
|
+
raise ValueError(f"in {cls.__name__}, gitHub owner name cannot start or end with a hyphen: {result}")
|
30
30
|
|
31
31
|
if '--' in result: # Check for consecutive hyphens
|
32
|
-
raise ValueError(f"
|
32
|
+
raise ValueError(f"in {cls.__name__}, gitHub owner name cannot contain consecutive hyphens: {result}")
|
33
33
|
|
34
34
|
if result.replace('_', '') == '': # Check for all underscores (sanitized invalid input)
|
35
|
-
raise ValueError(f"
|
35
|
+
raise ValueError(f"in {cls.__name__}, invalid GitHub owner name: {result}")
|
36
36
|
|
37
37
|
return result
|
38
38
|
|
@@ -7,6 +7,6 @@ TYPE_SAFE_STR__HTTP__CONTENT_TYPE__MAX_LENGTH = 256
|
|
7
7
|
class Safe_Str__Http__Content_Type(Safe_Str):
|
8
8
|
regex = TYPE_SAFE_STR__HTTP__CONTENT_TYPE__REGEX
|
9
9
|
max_length = TYPE_SAFE_STR__HTTP__CONTENT_TYPE__MAX_LENGTH
|
10
|
-
allow_empty =
|
10
|
+
allow_empty = True
|
11
11
|
trim_whitespace = True
|
12
12
|
allow_all_replacement_char = False
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v2.
|
1
|
+
v2.85.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.85.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
|

|
@@ -363,31 +363,31 @@ osbot_utils/type_safe/primitives/safe_int/Safe_Int.py,sha256=IB_ZVtuQlAfRWZH1teZ
|
|
363
363
|
osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py,sha256=OZwSwmYA1pZAnVglpx2lBL5t8Pu_HxzmYdNEJnmTqKI,536
|
364
364
|
osbot_utils/type_safe/primitives/safe_int/__init__.py,sha256=Prle-pyYi8l4hjbzGACVxX89Uc5aAhYjGRojywWysQM,323
|
365
365
|
osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py,sha256=15y_afYIf_LsweutaVVdIJ0qClbVITJGWNEqfRKapNI,120
|
366
|
-
osbot_utils/type_safe/primitives/safe_str/Safe_Str.py,sha256=
|
366
|
+
osbot_utils/type_safe/primitives/safe_str/Safe_Str.py,sha256=u6AWM9CCVBxo2s_QmjgC-91m3N9mA3FJzmXcwneTwPg,5022
|
367
367
|
osbot_utils/type_safe/primitives/safe_str/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
368
368
|
osbot_utils/type_safe/primitives/safe_str/cryptography/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
369
|
-
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py,sha256=
|
370
|
-
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py,sha256=
|
371
|
-
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py,sha256=
|
369
|
+
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py,sha256=zmARKnR6k0d7zg2DESPSZU8Qj91nx-qrnNrXln6UcYk,1287
|
370
|
+
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py,sha256=4GspFCkrBM9I-9Myb7I4dYUQ726LahwepWfuasFhD_M,899
|
371
|
+
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py,sha256=UISofo58uSm3iAMA-css_inp1EKBqJrGMoS5m8ik7b4,824
|
372
372
|
osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
373
|
-
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py,sha256=
|
374
|
-
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py,sha256=
|
373
|
+
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py,sha256=4h3kPDP0hwQkn-USHZYPJZB2QeHPOkK-CD7fOc_Pddg,1204
|
374
|
+
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py,sha256=OGmdTsuvwLl61omKNcgX3fe8rRXmlPL6g5Xy0HSBjPY,1306
|
375
375
|
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py,sha256=jYFBpUHZ94ouW0yHsEO3mUKnmSif9jB71kNNH1oA-2I,507
|
376
376
|
osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
377
|
-
osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py,sha256=
|
377
|
+
osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py,sha256=xQWoqqs-ZXU6o2iROOvd62P15B5EulDMiAlYCQg2tOY,370
|
378
378
|
osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py,sha256=bOihPzsLce2mv-g6BpsfhfLaQ3UEoYXaK8FbdpMGuYs,563
|
379
379
|
osbot_utils/type_safe/primitives/safe_str/filesystem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
380
380
|
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py,sha256=npoKUzforQCLqblCWfx2H_hZtq0CCybg5O_3RpZkOXE,870
|
381
|
-
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py,sha256=
|
382
|
-
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py,sha256=
|
381
|
+
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py,sha256=MmBHnwLyS-typs9ObzqHU05aoDx6jUBK7BpijcFibws,3132
|
382
|
+
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py,sha256=MZYYk4_Tn7BlyvXFVPIOCCAdYlzPszxxTvltUB_37AQ,3274
|
383
383
|
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py,sha256=imUY7CkrJ_aBJ0tIuV5OSD6eqF7aSzPERfEhdaWejbY,440
|
384
|
-
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py,sha256=
|
384
|
+
osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py,sha256=fuhNy7Q0cc_LD53Cyu8Q8emMXDT42if3YQqn2PpNJBY,1396
|
385
385
|
osbot_utils/type_safe/primitives/safe_str/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
386
|
-
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py,sha256=
|
387
|
-
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py,sha256=
|
388
|
-
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py,sha256=
|
386
|
+
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py,sha256=Ww_wfV_VJSC9go3ZUxt9wXaOFAc-uYlq3oUbjn6QfAo,2754
|
387
|
+
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py,sha256=kOzDDVBsgiL6itQzxqGmFLs_a9GY9nENsF37TdV4m4s,1305
|
388
|
+
osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py,sha256=x69rNmVrjg_RCjUcZAOL0_Hv84-zGyy27kwp1pRx4Zc,1840
|
389
389
|
osbot_utils/type_safe/primitives/safe_str/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
390
|
-
osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py,sha256=
|
390
|
+
osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py,sha256=pdgTuzmd8vqr0h1J99GRl8LUDQOpB68iEtuG1_9s_gE,528
|
391
391
|
osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py,sha256=9dOX5mGCBaKmrgIp6uXFCpVyyhel42mUQgbLyN5cKMk,490
|
392
392
|
osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py,sha256=LfA6ayIXaSjwVGrZUO4HIV1gbFXKc54omDJAZ_ZPtjI,451
|
393
393
|
osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py,sha256=miVh53YT6VJla5XiZjzsgVSoMWiYXy-tml3a8HG8yM8,1801
|
@@ -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=Fzq3NVCIMMQXS5Ax5-ZrDEOOQhtNlHqqT--cg6GdXic,8
|
474
|
+
osbot_utils-2.85.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
475
|
+
osbot_utils-2.85.0.dist-info/METADATA,sha256=bQaAW7ALWwWNyVCPZRbHVdPZJjch-N7pvoxbl5nEqTI,7918
|
476
|
+
osbot_utils-2.85.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
477
|
+
osbot_utils-2.85.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|