osbot-utils 2.84.0__tar.gz → 2.86.0__tar.gz
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-2.84.0 → osbot_utils-2.86.0}/PKG-INFO +2 -2
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/README.md +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +6 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py +9 -9
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +4 -4
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +8 -4
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +3 -3
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +4 -4
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +1 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +8 -3
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +2 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +17 -2
- osbot_utils-2.86.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +74 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +6 -2
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +17 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Objects.py +10 -6
- osbot_utils-2.86.0/osbot_utils/version +1 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/pyproject.toml +1 -1
- osbot_utils-2.84.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +0 -41
- osbot_utils-2.84.0/osbot_utils/version +0 -1
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/LICENSE +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/async_invoke.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/classes/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/classes/singleton.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/group_by.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/index_by.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/catch.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/context.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/Fluent_List.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/CFormat.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/CPrint.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Local_Cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Local_Caches.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Obj_Id.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Print_Table.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Python_Audit.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Random_Seed.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Type_Registry.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/Duration.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/Flow.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/Task.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Base.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Body.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Div.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__H.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__HR.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Head.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Html.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Link.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Style.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Text.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/CSS_Dict__To__Css.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Document.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Tags.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Document__To__Html_Dict.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Dict.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Document.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Tag.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/utils/Html__Query.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/utils/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/open_ai/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/transformers/Dict__To__Toml.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Catch.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Hook_Method.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Log_To_String.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Logging.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Patch_Print.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Profiler.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Pytest.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Stderr.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Stdout.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_File.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Folder.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Zip.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Unit_Test.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Unzip_File.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/test_data/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/test_data/const__test__data__html.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Engineering.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Money.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Percentage_Exact.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/Safe_Int.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text__Dangerous.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Html.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__IP_Address.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Url.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Byte.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__FileSize.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/decorators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/decorators/type_safe.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/Type_Safe__Method.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/type_safe_property.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Annotations.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/__init__.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Assert.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Call_Stack.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Csv.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Dev.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Env.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Exceptions.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Files.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Functions.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Http.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Int.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Json.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Json_Cache.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Lists.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Misc.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Png.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Process.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Python_Logger.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Regex.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Status.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Str.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Threads.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Toml.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Version.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Zip.py +0 -0
- {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/__init__.py +0 -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
|

|
@@ -1,6 +1,6 @@
|
|
1
1
|
# OSBot-Utils
|
2
2
|
|
3
|
-

|
4
4
|

|
5
5
|

|
6
6
|

|
@@ -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
|
{osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py
RENAMED
@@ -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
|
@@ -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):
|
@@ -0,0 +1,74 @@
|
|
1
|
+
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
|
2
|
+
|
3
|
+
class Type_Safe__Tuple(Type_Safe__Base, tuple):
|
4
|
+
|
5
|
+
def __new__(cls, expected_types, items=None):
|
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)
|
11
|
+
instance.expected_types = expected_types
|
12
|
+
return instance
|
13
|
+
|
14
|
+
def __init__(self, expected_types, items=None):
|
15
|
+
if 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)
|
44
|
+
|
45
|
+
def validate_items(self, items):
|
46
|
+
if len(items) != len(self.expected_types):
|
47
|
+
raise ValueError(f"Expected {len(self.expected_types)} elements, got {len(items)}")
|
48
|
+
for item, expected_type in zip(items, self.expected_types):
|
49
|
+
try:
|
50
|
+
self.is_instance_of_type(item, expected_type)
|
51
|
+
except TypeError as e:
|
52
|
+
raise TypeError(f"In Type_Safe__Tuple: Invalid type for item: {e}")
|
53
|
+
|
54
|
+
def __repr__(self):
|
55
|
+
types_str = ', '.join(type_str(t) for t in self.expected_types)
|
56
|
+
return f"tuple[{types_str}] with {len(self)} elements"
|
57
|
+
|
58
|
+
def json(self):
|
59
|
+
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
60
|
+
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
|
61
|
+
|
62
|
+
result = []
|
63
|
+
for item in self:
|
64
|
+
if isinstance(item, Type_Safe):
|
65
|
+
result.append(item.json())
|
66
|
+
elif isinstance(item, Type_Safe__Primitive):
|
67
|
+
result.append(item.__to_primitive__()) # Convert primitives to base types
|
68
|
+
elif isinstance(item, (list, tuple)):
|
69
|
+
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
|
70
|
+
elif isinstance(item, dict):
|
71
|
+
result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
|
72
|
+
else:
|
73
|
+
result.append(item)
|
74
|
+
return result
|
@@ -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)
|
@@ -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
|
@@ -0,0 +1 @@
|
|
1
|
+
v2.86.0
|
@@ -1,41 +0,0 @@
|
|
1
|
-
from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
|
2
|
-
|
3
|
-
class Type_Safe__Tuple(Type_Safe__Base, tuple):
|
4
|
-
|
5
|
-
def __new__(cls, expected_types, items=None):
|
6
|
-
items = items or tuple()
|
7
|
-
instance = super().__new__(cls, items)
|
8
|
-
instance.expected_types = expected_types
|
9
|
-
return instance
|
10
|
-
|
11
|
-
def __init__(self, expected_types, items=None): # todo: see if we should be assigning expected_types to self here
|
12
|
-
if items:
|
13
|
-
self.validate_items(items)
|
14
|
-
|
15
|
-
def validate_items(self, items):
|
16
|
-
if len(items) != len(self.expected_types):
|
17
|
-
raise ValueError(f"Expected {len(self.expected_types)} elements, got {len(items)}")
|
18
|
-
for item, expected_type in zip(items, self.expected_types):
|
19
|
-
try:
|
20
|
-
self.is_instance_of_type(item, expected_type)
|
21
|
-
except TypeError as e:
|
22
|
-
raise TypeError(f"In Type_Safe__Tuple: Invalid type for item: {e}")
|
23
|
-
|
24
|
-
def __repr__(self):
|
25
|
-
types_str = ', '.join(type_str(t) for t in self.expected_types)
|
26
|
-
return f"tuple[{types_str}] with {len(self)} elements"
|
27
|
-
|
28
|
-
def json(self):
|
29
|
-
from osbot_utils.type_safe.Type_Safe import Type_Safe
|
30
|
-
|
31
|
-
result = []
|
32
|
-
for item in self:
|
33
|
-
if isinstance(item, Type_Safe):
|
34
|
-
result.append(item.json())
|
35
|
-
elif isinstance(item, (list, tuple)):
|
36
|
-
result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
|
37
|
-
elif isinstance(item, dict):
|
38
|
-
result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
|
39
|
-
else:
|
40
|
-
result.append(item)
|
41
|
-
return result
|
@@ -1 +0,0 @@
|
|
1
|
-
v2.84.0
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/disable_root_loggers.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|