Skip to content

Commit 39aaf17

Browse files
committed
Merge dev into main
2 parents 976d36a + d25ce87 commit 39aaf17

File tree

15 files changed

+962
-68
lines changed

15 files changed

+962
-68
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# OSBot-Utils
22

3-
![Current Release](https://img.shields.io/badge/release-v3.24.0-blue)
3+
![Current Release](https://img.shields.io/badge/release-v3.24.1-blue)
44
![Python](https://img.shields.io/badge/python-3.8+-green)
55
![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
66
![Caching](https://img.shields.io/badge/Caching-Built--In-orange)

osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
44
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
55
from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
6-
from osbot_utils.utils.Objects import class_full_name
6+
from osbot_utils.utils.Objects import class_full_name, serialize_to_dict
77

88

99
class Type_Safe__Dict(Type_Safe__Base, dict):
@@ -54,7 +54,7 @@ def serialize_value(v):
5454
elif isinstance(v, dict):
5555
# Recursively handle nested dictionaries
5656
return {k2: serialize_value(v2) for k2, v2 in v.items()}
57-
elif isinstance(v, (list, tuple, set)):
57+
elif isinstance(v, (list, tuple, set, frozenset)):
5858
# Recursively handle sequences
5959
serialized = [serialize_value(item) for item in v]
6060
if isinstance(v, list):
@@ -64,7 +64,8 @@ def serialize_value(v):
6464
else: # set
6565
return set(serialized)
6666
else:
67-
return v
67+
return serialize_to_dict(v) # Use serialize_to_dict for unknown types (so that we don't return a non json object)
68+
6869

6970
result = {}
7071
for key, value in self.items():

osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from enum import Enum
22
from typing import Type
3-
from osbot_utils.utils.Objects import class_full_name
3+
from osbot_utils.utils.Objects import class_full_name, serialize_to_dict
44
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
55
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
66

@@ -82,12 +82,14 @@ def json(self): # Convert the list to a JSON-serializable format.
8282
result.append(item.json())
8383
elif isinstance(item, Type_Safe__Primitive):
8484
result.append(item.__to_primitive__())
85-
elif isinstance(item, (list, tuple)):
86-
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
85+
elif isinstance(item, (list, tuple, frozenset)):
86+
result.append([x.json() if isinstance(x, Type_Safe) else serialize_to_dict(x) for x in item])
87+
#result.append([x.json() if isinstance(x, Type_Safe) else x for x in item]) # BUG here
8788
elif isinstance(item, dict):
88-
result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
89+
result.append(serialize_to_dict(item)) # leverage serialize_to_dict since that method already knows how to handle
90+
#result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
8991
elif isinstance(item, type):
9092
result.append(class_full_name(item))
9193
else:
92-
result.append(item)
94+
result.append(serialize_to_dict(item)) # also Use serialize_to_dict for unknown types (so that we don't return a non json object)
9395
return result

osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from osbot_utils.utils.Objects import class_full_name
1+
from osbot_utils.utils.Objects import class_full_name, serialize_to_dict
22
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
33
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
44

@@ -52,14 +52,14 @@ def json(self):
5252
result.append(item.json())
5353
elif isinstance(item, Type_Safe__Primitive):
5454
result.append(item.__to_primitive__())
55-
elif isinstance(item, (list, tuple, set)):
56-
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
57-
elif isinstance(item, dict):
58-
result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
55+
elif isinstance(item, (list, tuple, set, frozenset)):
56+
result.append([x.json() if isinstance(x, Type_Safe) else serialize_to_dict(x) for x in item])
57+
# elif isinstance(item, dict):
58+
# result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
5959
elif isinstance(item, type):
6060
result.append(class_full_name(item))
6161
else:
62-
result.append(item)
62+
result.append(serialize_to_dict(item)) # Use serialize_to_dict for unknown types (so that we don't return a non json object)
6363
return result
6464

6565
def __eq__(self, other): # todo: see if this is needed

osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from osbot_utils.utils.Objects import class_full_name
1+
from osbot_utils.utils.Objects import class_full_name, serialize_to_dict
22
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
33

44
class Type_Safe__Tuple(Type_Safe__Base, tuple):
@@ -66,12 +66,12 @@ def json(self):
6666
result.append(item.json())
6767
elif isinstance(item, Type_Safe__Primitive):
6868
result.append(item.__to_primitive__()) # Convert primitives to base types
69-
elif isinstance(item, (list, tuple)):
70-
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
69+
elif isinstance(item, (list, tuple, frozenset)):
70+
result.append([x.json() if isinstance(x, Type_Safe) else serialize_to_dict(x) for x in item])
7171
elif isinstance(item, dict):
72-
result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
72+
result.append(serialize_to_dict(item))
7373
elif isinstance(item, type):
7474
result.append(class_full_name(item))
7575
else:
76-
result.append(item)
76+
result.append(serialize_to_dict(item)) # Use serialize_to_dict for unknown types (so that we don't return a non json object)
7777
return result

osbot_utils/utils/Objects.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def serialize_to_dict(obj):
275275
elif isinstance(obj, Enum):
276276
if isinstance(obj.value, (str, int, float, bool, type(None))): # Check if the enum value is directly serializable
277277
return obj.value
278-
elif isinstance(obj.value, (list, tuple, dict, set)): # Recursively serialize complex values
278+
elif isinstance(obj.value, (list, tuple, dict, set, frozenset)): # Recursively serialize complex values
279279
return serialize_to_dict(obj.value)
280280
else:
281281
return obj.name # Fallback to name for non-serializable values
@@ -285,7 +285,7 @@ def serialize_to_dict(obj):
285285
return f"{obj.__module__}.{obj.__name__}" # save the full type name
286286
elif isinstance(obj, (list, tuple, List)): # Added tuple here
287287
return [serialize_to_dict(item) for item in obj]
288-
elif isinstance(obj, set):
288+
elif isinstance(obj, (set, frozenset)):
289289
return [serialize_to_dict(item) for item in obj]
290290
elif isinstance(obj, dict):
291291
serialized_dict = {} # todo: refactor to separate method
@@ -310,7 +310,8 @@ def serialize_to_dict(obj):
310310
data[key] = serialize_to_dict(value) # Recursive call for complex types
311311
return data
312312
else:
313-
raise TypeError(f"Type {type(obj)} not serializable")
313+
#raise TypeError(f"Type {type(obj)} not serializable") # Breaking change (we don't raise exception any more)
314+
return None # just return None
314315

315316

316317

osbot_utils/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v3.24.0
1+
v3.24.1

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "osbot_utils"
3-
version = "v3.24.0"
3+
version = "v3.24.1"
44
description = "OWASP Security Bot - Utils"
55
authors = ["Dinis Cruz <[email protected]>"]
66
license = "MIT"

0 commit comments

Comments
 (0)