osbot-utils 1.86.0__py3-none-any.whl → 1.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.
@@ -0,0 +1,18 @@
1
+ import uuid
2
+
3
+ from osbot_utils.utils.Misc import is_guid
4
+
5
+ GUID__NAMESPACE = uuid.UUID('2cfec064-537a-4ff7-8fdc-2fc9e2606f3d')
6
+
7
+ class Guid(str):
8
+ def __new__(cls, value: str):
9
+ if not isinstance(value, str): # Check if the value is a string
10
+ raise ValueError(f'in Guid: value provided was not a string: {value}') # if not raise a ValueError
11
+ if is_guid(value):
12
+ guid = value
13
+ else:
14
+ guid = uuid.uuid5(GUID__NAMESPACE, value) # Generate a UUID5 using the namespace and value
15
+ return super().__new__(cls, str(guid)) # Return a new instance of Guid initialized with the string version of the UUID
16
+
17
+ def __str__(self):
18
+ return self
@@ -11,4 +11,4 @@ class Random_Guid(str):
11
11
  raise ValueError(f'in Random_Guid: value provided was not a Guid: {value}')
12
12
 
13
13
  def __str__(self):
14
- return self
14
+ return self
@@ -2,10 +2,10 @@ from osbot_utils.utils.Misc import random_id_short
2
2
  from osbot_utils.utils.Str import safe_id
3
3
 
4
4
  class Safe_Id(str):
5
- def __new__(cls, value=None):
5
+ def __new__(cls, value=None, max_length=36):
6
6
  if value is None:
7
7
  value = safe_id(random_id_short('safe-id'))
8
- sanitized_value = safe_id(value)
8
+ sanitized_value = safe_id(value, max_length=max_length)
9
9
  return str.__new__(cls, sanitized_value)
10
10
 
11
11
  def __str__(self):
@@ -0,0 +1,22 @@
1
+ import re
2
+
3
+ REGEX__ASCII_VALUE = re.compile(r'[^a-zA-Z0-9_\s!@#$%^&*()\[\]{}\-+=:;,.?]')
4
+
5
+ class Str_ASCII(str):
6
+ """
7
+ A string subclass that ensures values only contain safe ASCII characters.
8
+ Replaces any unsafe characters with underscores.
9
+ """
10
+ def __new__(cls, value=None, max_length=None):
11
+ if value is None:
12
+ value = ""
13
+
14
+ if not isinstance(value, str):
15
+ value = str(value)
16
+
17
+ if max_length and len(value) > max_length:
18
+ raise ValueError(f"Value length exceeds maximum of {max_length} characters (was {len(value)})")
19
+
20
+ sanitized_value = REGEX__ASCII_VALUE.sub('_', value)
21
+
22
+ return super().__new__(cls, sanitized_value)
osbot_utils/utils/Misc.py CHANGED
@@ -178,7 +178,6 @@ def is_guid(value):
178
178
  except Exception:
179
179
  return False
180
180
 
181
-
182
181
  def ignore_warning__unclosed_ssl():
183
182
  import warnings
184
183
  warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<ssl.SSLSocket.*>")
@@ -109,11 +109,13 @@ def convert_dict_to_value_from_obj_annotation(target, attr_name, value):
109
109
 
110
110
  def convert_to_value_from_obj_annotation(target, attr_name, value): # todo: see the side effects of doing this for all ints and floats
111
111
 
112
- from osbot_utils.helpers.Safe_Id import Safe_Id
112
+ from osbot_utils.helpers.Guid import Guid
113
113
  from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
114
114
  from osbot_utils.helpers.Random_Guid import Random_Guid
115
+ from osbot_utils.helpers.Safe_Id import Safe_Id
116
+ from osbot_utils.helpers.Str_ASCII import Str_ASCII
115
117
 
116
- TYPE_SAFE__CONVERT_VALUE__SUPPORTED_TYPES = [Safe_Id, Random_Guid, Timestamp_Now]
118
+ TYPE_SAFE__CONVERT_VALUE__SUPPORTED_TYPES = [Guid, Random_Guid, Safe_Id, Str_ASCII, Timestamp_Now]
117
119
 
118
120
  if target is not None and attr_name is not None:
119
121
  if hasattr(target, '__annotations__'):
@@ -437,6 +439,7 @@ json_to_obj = str_to_obj
437
439
 
438
440
  full_type_name = class_full_name
439
441
 
442
+ obj = dict_to_obj
440
443
  obj_list_set = obj_keys
441
444
  obj_info = print_object_members
442
445
  obj_methods = print_object_methods
osbot_utils/utils/Str.py CHANGED
@@ -34,14 +34,14 @@ def strip_quotes(value: str): # Remove surrounding quo
34
34
  return value[1:-1]
35
35
  return value
36
36
 
37
- def safe_id(value):
37
+ def safe_id(value, max_length=36):
38
38
  if value is None or value == "":
39
39
  raise ValueError("Invalid ID: The ID must not be empty.")
40
40
 
41
41
  if not isinstance(value, str):
42
42
  value = str(value)
43
43
 
44
- if len(value) > 36:
44
+ if len(value) > max_length:
45
45
  raise ValueError(f"Invalid ID: The ID must not exceed 36 characters (was {len(value)}).")
46
46
 
47
47
  sanitized_value = REGEX__SAFE_ID_REGEX.sub('_', value)
osbot_utils/version CHANGED
@@ -1 +1 @@
1
- v1.86.0
1
+ v1.88.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.86.0
3
+ Version: 1.88.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -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
- ![Current Release](https://img.shields.io/badge/release-v1.86.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v1.88.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -61,15 +61,17 @@ osbot_utils/helpers/CFormat.py,sha256=1_XvqGwgU6qC97MbzcKF0o7s9mCXpU5Kq9Yf-1ixUw
61
61
  osbot_utils/helpers/CPrint.py,sha256=ztKPNmT8BGxeyPXSQKRs63PqqbgxKDz_BiZmzFMup9g,1413
62
62
  osbot_utils/helpers/Dependency_Manager.py,sha256=79YRYnVfchewq8iSMJ5dzwW2D5u8chWcIqYE-G9YrSo,1337
63
63
  osbot_utils/helpers/Dict_To_Attr.py,sha256=NdhXl5mJH7-NaBk213amzc5Nfy3tJgW-N_uYIRE4hoc,208
64
+ osbot_utils/helpers/Guid.py,sha256=22oNPpugnzOkc7swHzw6_duc3PyzXQg5f5mnBXLC-Jw,832
64
65
  osbot_utils/helpers/Hashicorp_Secrets.py,sha256=zjXa_dQvfR9L1uoulWJ8nYYaDvznV6o_QPPS4zmb6mo,4235
65
66
  osbot_utils/helpers/Local_Cache.py,sha256=0JZZX3fFImcwtbBvxAQl-EbBegSNJRhRMYF6ovTH6zY,3141
66
67
  osbot_utils/helpers/Local_Caches.py,sha256=aQmi1HSM0TH6WQPedG2fbz4KCCJ3DQTU9d18rB1jR0M,1885
67
68
  osbot_utils/helpers/Print_Table.py,sha256=LEXbyqGg_6WSraI4cob4bNNSu18ddqvALp1zGK7bPhs,19126
68
69
  osbot_utils/helpers/Python_Audit.py,sha256=shpZlluJwqJBAlad6xN01FkgC1TsQ48RLvR5ZjmrKa4,1539
69
- osbot_utils/helpers/Random_Guid.py,sha256=GBh3lQ854c0_DICRJE8dDRNH81DiO8F6bxNu0YkzUrU,383
70
+ osbot_utils/helpers/Random_Guid.py,sha256=COu9hcP51vzjk-ErECTFFaOWuOmW0eGJyMu8HXhaRXQ,382
70
71
  osbot_utils/helpers/Random_Guid_Short.py,sha256=YP_k5OLuYvXWGU2OEnQHk_OGViBQofTWKm3pUdQaJao,404
71
72
  osbot_utils/helpers/Random_Seed.py,sha256=14btja8LDN9cMGWaz4fCNcMRU_eyx49gas-_PQvHgy4,634
72
- osbot_utils/helpers/Safe_Id.py,sha256=JbpBWF57Inoq8MgSx1NUy_fjQdpXDjYEp00_MrS5yjs,364
73
+ osbot_utils/helpers/Safe_Id.py,sha256=iwIrWXfSARyr6JkihNhh1soOdjeCGVf3wkXSkSP8zDw,402
74
+ osbot_utils/helpers/Str_ASCII.py,sha256=PRqyu449XnKrLn6b9Miii1Hv-GO5OAa1UhhgvlRcC2M,704
73
75
  osbot_utils/helpers/Timestamp_Now.py,sha256=k3-SUGYx2jLTXvgZYeECqPRJhVxqWPmW7co1l6r12jk,438
74
76
  osbot_utils/helpers/Type_Registry.py,sha256=Ajk3SyMSKDi2g9SJYUtTgg7PZkAgydaHcpbGuEN3S94,311
75
77
  osbot_utils/helpers/Type_Safe_Method.py,sha256=8E88of__An9_ZhJKz6Kp22C1mb9WLED0jWNLOII3fJs,10489
@@ -300,21 +302,21 @@ osbot_utils/utils/Int.py,sha256=PmlUdU4lSwf4gJdmTVdqclulkEp7KPCVUDO6AcISMF4,116
300
302
  osbot_utils/utils/Json.py,sha256=0DZGlCU7Nqte5n0r7ctPXFybqA5MRfSrTz5zuK_6UFk,7095
301
303
  osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
302
304
  osbot_utils/utils/Lists.py,sha256=tPz5x5s3sRO97WZ_nsxREBPC5cwaHrhgaYBhsrffTT8,5599
303
- osbot_utils/utils/Misc.py,sha256=VT-utruCLnZNER5-gYhoGjqe3t-H57SuXcShsJnUSaM,17364
304
- osbot_utils/utils/Objects.py,sha256=hanzmc1WR8i3I3btE4uAM0vWTGnnjwEKABbBXdqSeT8,19449
305
+ osbot_utils/utils/Misc.py,sha256=H_xexJgiTxB3jDeDiW8efGQbO0Zuy8MM0iQ7qXC92JI,17363
306
+ osbot_utils/utils/Objects.py,sha256=iuNNp_u9aOiHtAXwkSo-8FikXWcqZczaZqNwHKKQEcM,19617
305
307
  osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
306
308
  osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
307
309
  osbot_utils/utils/Python_Logger.py,sha256=tx8N6wRKL3RDHboDRKZn8SirSJdSAE9cACyJkxrThZ8,12792
308
310
  osbot_utils/utils/Regex.py,sha256=0ubgp8HKsS3PNe2H6XlzMIcUuV7jhga3VkQVDNOJWuA,866
309
311
  osbot_utils/utils/Status.py,sha256=Yq4s0TelXgn0i2QjCP9V8mP30GabXp_UL-jjM6Iwiw4,4305
310
- osbot_utils/utils/Str.py,sha256=pHcPE3xZ0aBz35aXIW2hdA5WN6vhRqsNT8A-7MNNIY0,3252
312
+ osbot_utils/utils/Str.py,sha256=Y05F46m6s3_H7KoPdeasc1LRaU7R4YifIbsHNQYDEeg,3275
311
313
  osbot_utils/utils/Threads.py,sha256=lnh4doZWYUIoWBZRU_780QPeAIKGDh7INuqmU8Fzmdc,3042
312
314
  osbot_utils/utils/Toml.py,sha256=Rxl8gx7mni5CvBAK-Ai02EKw-GwtJdd3yeHT2kMloik,1667
313
315
  osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
314
316
  osbot_utils/utils/Zip.py,sha256=pR6sKliUY0KZXmqNzKY2frfW-YVQEVbLKiyqQX_lc-8,14052
315
317
  osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
316
- osbot_utils/version,sha256=FICmlAgRudMlQWbhrWHgE2FJhfMxxoZDQKJx3Vb_bCg,8
317
- osbot_utils-1.86.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
318
- osbot_utils-1.86.0.dist-info/METADATA,sha256=UzS_UAyqMxFY7sHUJaADcG-n2JX4ch7LJoSeiGKzGhA,1317
319
- osbot_utils-1.86.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
320
- osbot_utils-1.86.0.dist-info/RECORD,,
318
+ osbot_utils/version,sha256=D0MVxZOCQlRSLSl_5l6QLAIYIlH9b7vBFCZn_V3Z2WY,8
319
+ osbot_utils-1.88.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
320
+ osbot_utils-1.88.0.dist-info/METADATA,sha256=KAjZ52Wxr8Kq06sTXHWU8RzvgSGltoSiT7BWLDPKTRg,1317
321
+ osbot_utils-1.88.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
322
+ osbot_utils-1.88.0.dist-info/RECORD,,