exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__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.
Files changed (342) hide show
  1. exonware/__init__.py +2 -1
  2. exonware/conf.py +2 -2
  3. exonware/xwsystem/__init__.py +115 -43
  4. exonware/xwsystem/base.py +30 -0
  5. exonware/xwsystem/caching/__init__.py +39 -13
  6. exonware/xwsystem/caching/base.py +24 -6
  7. exonware/xwsystem/caching/bloom_cache.py +2 -2
  8. exonware/xwsystem/caching/cache_manager.py +2 -1
  9. exonware/xwsystem/caching/conditional.py +2 -2
  10. exonware/xwsystem/caching/contracts.py +85 -139
  11. exonware/xwsystem/caching/decorators.py +6 -19
  12. exonware/xwsystem/caching/defs.py +2 -1
  13. exonware/xwsystem/caching/disk_cache.py +2 -1
  14. exonware/xwsystem/caching/distributed.py +2 -1
  15. exonware/xwsystem/caching/errors.py +2 -1
  16. exonware/xwsystem/caching/events.py +110 -27
  17. exonware/xwsystem/caching/eviction_strategies.py +2 -2
  18. exonware/xwsystem/caching/external_caching_python.py +701 -0
  19. exonware/xwsystem/caching/facade.py +253 -0
  20. exonware/xwsystem/caching/factory.py +300 -0
  21. exonware/xwsystem/caching/fluent.py +14 -12
  22. exonware/xwsystem/caching/integrity.py +21 -6
  23. exonware/xwsystem/caching/lfu_cache.py +2 -1
  24. exonware/xwsystem/caching/lfu_optimized.py +18 -6
  25. exonware/xwsystem/caching/lru_cache.py +7 -4
  26. exonware/xwsystem/caching/memory_bounded.py +2 -2
  27. exonware/xwsystem/caching/metrics_exporter.py +2 -2
  28. exonware/xwsystem/caching/observable_cache.py +2 -2
  29. exonware/xwsystem/caching/pluggable_cache.py +2 -2
  30. exonware/xwsystem/caching/rate_limiter.py +2 -2
  31. exonware/xwsystem/caching/read_through.py +2 -2
  32. exonware/xwsystem/caching/secure_cache.py +81 -28
  33. exonware/xwsystem/caching/serializable.py +9 -7
  34. exonware/xwsystem/caching/stats.py +2 -2
  35. exonware/xwsystem/caching/tagging.py +2 -2
  36. exonware/xwsystem/caching/ttl_cache.py +4 -3
  37. exonware/xwsystem/caching/two_tier_cache.py +6 -3
  38. exonware/xwsystem/caching/utils.py +30 -12
  39. exonware/xwsystem/caching/validation.py +2 -2
  40. exonware/xwsystem/caching/warming.py +6 -3
  41. exonware/xwsystem/caching/write_behind.py +15 -6
  42. exonware/xwsystem/config/__init__.py +11 -17
  43. exonware/xwsystem/config/base.py +5 -5
  44. exonware/xwsystem/config/contracts.py +93 -153
  45. exonware/xwsystem/config/defaults.py +3 -2
  46. exonware/xwsystem/config/defs.py +3 -2
  47. exonware/xwsystem/config/errors.py +2 -5
  48. exonware/xwsystem/config/logging.py +12 -8
  49. exonware/xwsystem/config/logging_setup.py +3 -2
  50. exonware/xwsystem/config/performance.py +73 -391
  51. exonware/xwsystem/config/performance_modes.py +9 -8
  52. exonware/xwsystem/config/version_manager.py +1 -0
  53. exonware/xwsystem/config.py +27 -0
  54. exonware/xwsystem/console/__init__.py +53 -0
  55. exonware/xwsystem/console/base.py +133 -0
  56. exonware/xwsystem/console/cli/__init__.py +61 -0
  57. exonware/xwsystem/{cli → console/cli}/args.py +27 -24
  58. exonware/xwsystem/{cli → console/cli}/base.py +18 -87
  59. exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
  60. exonware/xwsystem/console/cli/console.py +98 -0
  61. exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
  62. exonware/xwsystem/console/cli/defs.py +87 -0
  63. exonware/xwsystem/console/cli/encoding.py +69 -0
  64. exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
  65. exonware/xwsystem/console/cli/event_logger.py +166 -0
  66. exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
  67. exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
  68. exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
  69. exonware/xwsystem/console/contracts.py +113 -0
  70. exonware/xwsystem/console/defs.py +154 -0
  71. exonware/xwsystem/console/errors.py +34 -0
  72. exonware/xwsystem/console/event_logger.py +385 -0
  73. exonware/xwsystem/console/writer.py +132 -0
  74. exonware/xwsystem/contracts.py +28 -0
  75. exonware/xwsystem/data_structures/__init__.py +23 -0
  76. exonware/xwsystem/data_structures/trie.py +34 -0
  77. exonware/xwsystem/data_structures/union_find.py +144 -0
  78. exonware/xwsystem/defs.py +17 -0
  79. exonware/xwsystem/errors.py +23 -0
  80. exonware/xwsystem/facade.py +62 -0
  81. exonware/xwsystem/http_client/__init__.py +22 -1
  82. exonware/xwsystem/http_client/advanced_client.py +8 -5
  83. exonware/xwsystem/http_client/base.py +3 -2
  84. exonware/xwsystem/http_client/client.py +7 -4
  85. exonware/xwsystem/http_client/contracts.py +42 -56
  86. exonware/xwsystem/http_client/defs.py +2 -1
  87. exonware/xwsystem/http_client/errors.py +2 -1
  88. exonware/xwsystem/http_client/facade.py +156 -0
  89. exonware/xwsystem/io/__init__.py +22 -3
  90. exonware/xwsystem/io/archive/__init__.py +8 -2
  91. exonware/xwsystem/io/archive/archive.py +1 -1
  92. exonware/xwsystem/io/archive/archive_files.py +4 -7
  93. exonware/xwsystem/io/archive/archivers.py +120 -10
  94. exonware/xwsystem/io/archive/base.py +4 -5
  95. exonware/xwsystem/io/archive/codec_integration.py +1 -2
  96. exonware/xwsystem/io/archive/compression.py +1 -2
  97. exonware/xwsystem/io/archive/facade.py +263 -0
  98. exonware/xwsystem/io/archive/formats/__init__.py +2 -3
  99. exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
  100. exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
  101. exonware/xwsystem/io/archive/formats/rar.py +11 -5
  102. exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
  103. exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
  104. exonware/xwsystem/io/archive/formats/tar.py +52 -7
  105. exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
  106. exonware/xwsystem/io/archive/formats/zip.py +1 -2
  107. exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
  108. exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
  109. exonware/xwsystem/io/base.py +119 -115
  110. exonware/xwsystem/io/codec/__init__.py +4 -2
  111. exonware/xwsystem/io/codec/base.py +19 -13
  112. exonware/xwsystem/io/codec/contracts.py +59 -2
  113. exonware/xwsystem/io/codec/registry.py +67 -21
  114. exonware/xwsystem/io/common/__init__.py +1 -1
  115. exonware/xwsystem/io/common/atomic.py +29 -16
  116. exonware/xwsystem/io/common/base.py +11 -10
  117. exonware/xwsystem/io/common/lock.py +6 -5
  118. exonware/xwsystem/io/common/path_manager.py +2 -1
  119. exonware/xwsystem/io/common/watcher.py +1 -2
  120. exonware/xwsystem/io/contracts.py +301 -433
  121. exonware/xwsystem/io/contracts_1.py +1180 -0
  122. exonware/xwsystem/io/data_operations.py +279 -14
  123. exonware/xwsystem/io/defs.py +4 -3
  124. exonware/xwsystem/io/errors.py +3 -2
  125. exonware/xwsystem/io/facade.py +87 -61
  126. exonware/xwsystem/io/file/__init__.py +1 -1
  127. exonware/xwsystem/io/file/base.py +8 -9
  128. exonware/xwsystem/io/file/conversion.py +2 -3
  129. exonware/xwsystem/io/file/file.py +61 -18
  130. exonware/xwsystem/io/file/paged_source.py +8 -8
  131. exonware/xwsystem/io/file/paging/__init__.py +1 -2
  132. exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
  133. exonware/xwsystem/io/file/paging/line_paging.py +2 -3
  134. exonware/xwsystem/io/file/paging/record_paging.py +2 -3
  135. exonware/xwsystem/io/file/paging/registry.py +1 -2
  136. exonware/xwsystem/io/file/source.py +13 -17
  137. exonware/xwsystem/io/filesystem/__init__.py +1 -1
  138. exonware/xwsystem/io/filesystem/base.py +1 -2
  139. exonware/xwsystem/io/filesystem/local.py +3 -4
  140. exonware/xwsystem/io/folder/__init__.py +1 -1
  141. exonware/xwsystem/io/folder/base.py +1 -2
  142. exonware/xwsystem/io/folder/folder.py +16 -7
  143. exonware/xwsystem/io/indexing/__init__.py +14 -0
  144. exonware/xwsystem/io/indexing/facade.py +443 -0
  145. exonware/xwsystem/io/path_parser.py +98 -0
  146. exonware/xwsystem/io/serialization/__init__.py +21 -3
  147. exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
  148. exonware/xwsystem/io/serialization/base.py +84 -34
  149. exonware/xwsystem/io/serialization/contracts.py +50 -73
  150. exonware/xwsystem/io/serialization/defs.py +2 -1
  151. exonware/xwsystem/io/serialization/errors.py +2 -1
  152. exonware/xwsystem/io/serialization/flyweight.py +154 -7
  153. exonware/xwsystem/io/serialization/format_detector.py +15 -14
  154. exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
  155. exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
  156. exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
  157. exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
  158. exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
  159. exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
  160. exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
  161. exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
  162. exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
  163. exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
  164. exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
  165. exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
  166. exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
  167. exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
  168. exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
  169. exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
  170. exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
  171. exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
  172. exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
  173. exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
  174. exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
  175. exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
  176. exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
  177. exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
  178. exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
  179. exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
  180. exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
  181. exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
  182. exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
  183. exonware/xwsystem/io/serialization/parsers/base.py +60 -0
  184. exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
  185. exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
  186. exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
  187. exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
  188. exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
  189. exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
  190. exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
  191. exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
  192. exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
  193. exonware/xwsystem/io/serialization/registry.py +4 -4
  194. exonware/xwsystem/io/serialization/serializer.py +168 -79
  195. exonware/xwsystem/io/serialization/universal_options.py +367 -0
  196. exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
  197. exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
  198. exonware/xwsystem/io/source_reader.py +223 -0
  199. exonware/xwsystem/io/stream/__init__.py +1 -1
  200. exonware/xwsystem/io/stream/async_operations.py +61 -14
  201. exonware/xwsystem/io/stream/base.py +1 -2
  202. exonware/xwsystem/io/stream/codec_io.py +6 -7
  203. exonware/xwsystem/ipc/__init__.py +1 -0
  204. exonware/xwsystem/ipc/async_fabric.py +4 -4
  205. exonware/xwsystem/ipc/base.py +6 -5
  206. exonware/xwsystem/ipc/contracts.py +41 -66
  207. exonware/xwsystem/ipc/defs.py +2 -1
  208. exonware/xwsystem/ipc/errors.py +2 -1
  209. exonware/xwsystem/ipc/message_queue.py +5 -2
  210. exonware/xwsystem/ipc/pipes.py +70 -34
  211. exonware/xwsystem/ipc/process_manager.py +7 -5
  212. exonware/xwsystem/ipc/process_pool.py +6 -5
  213. exonware/xwsystem/ipc/shared_memory.py +64 -11
  214. exonware/xwsystem/monitoring/__init__.py +7 -0
  215. exonware/xwsystem/monitoring/base.py +11 -8
  216. exonware/xwsystem/monitoring/contracts.py +86 -144
  217. exonware/xwsystem/monitoring/defs.py +2 -1
  218. exonware/xwsystem/monitoring/error_recovery.py +16 -3
  219. exonware/xwsystem/monitoring/errors.py +2 -1
  220. exonware/xwsystem/monitoring/facade.py +183 -0
  221. exonware/xwsystem/monitoring/memory_monitor.py +1 -0
  222. exonware/xwsystem/monitoring/metrics.py +1 -0
  223. exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
  224. exonware/xwsystem/monitoring/performance_monitor.py +1 -0
  225. exonware/xwsystem/monitoring/performance_validator.py +1 -0
  226. exonware/xwsystem/monitoring/system_monitor.py +6 -5
  227. exonware/xwsystem/monitoring/tracing.py +18 -16
  228. exonware/xwsystem/monitoring/tracker.py +2 -1
  229. exonware/xwsystem/operations/__init__.py +5 -50
  230. exonware/xwsystem/operations/base.py +3 -44
  231. exonware/xwsystem/operations/contracts.py +25 -15
  232. exonware/xwsystem/operations/defs.py +1 -1
  233. exonware/xwsystem/operations/diff.py +5 -4
  234. exonware/xwsystem/operations/errors.py +1 -1
  235. exonware/xwsystem/operations/merge.py +6 -4
  236. exonware/xwsystem/operations/patch.py +5 -4
  237. exonware/xwsystem/patterns/__init__.py +1 -0
  238. exonware/xwsystem/patterns/base.py +2 -1
  239. exonware/xwsystem/patterns/context_manager.py +2 -1
  240. exonware/xwsystem/patterns/contracts.py +215 -256
  241. exonware/xwsystem/patterns/defs.py +2 -1
  242. exonware/xwsystem/patterns/dynamic_facade.py +1 -0
  243. exonware/xwsystem/patterns/errors.py +2 -4
  244. exonware/xwsystem/patterns/handler_factory.py +2 -3
  245. exonware/xwsystem/patterns/import_registry.py +1 -0
  246. exonware/xwsystem/patterns/object_pool.py +1 -0
  247. exonware/xwsystem/patterns/registry.py +4 -43
  248. exonware/xwsystem/plugins/__init__.py +2 -1
  249. exonware/xwsystem/plugins/base.py +6 -5
  250. exonware/xwsystem/plugins/contracts.py +94 -158
  251. exonware/xwsystem/plugins/defs.py +2 -1
  252. exonware/xwsystem/plugins/errors.py +2 -1
  253. exonware/xwsystem/py.typed +3 -0
  254. exonware/xwsystem/query/__init__.py +36 -0
  255. exonware/xwsystem/query/contracts.py +56 -0
  256. exonware/xwsystem/query/errors.py +22 -0
  257. exonware/xwsystem/query/registry.py +128 -0
  258. exonware/xwsystem/runtime/__init__.py +2 -1
  259. exonware/xwsystem/runtime/base.py +4 -3
  260. exonware/xwsystem/runtime/contracts.py +39 -60
  261. exonware/xwsystem/runtime/defs.py +2 -1
  262. exonware/xwsystem/runtime/env.py +11 -9
  263. exonware/xwsystem/runtime/errors.py +2 -1
  264. exonware/xwsystem/runtime/reflection.py +3 -2
  265. exonware/xwsystem/security/__init__.py +68 -11
  266. exonware/xwsystem/security/audit.py +167 -0
  267. exonware/xwsystem/security/base.py +121 -24
  268. exonware/xwsystem/security/contracts.py +91 -146
  269. exonware/xwsystem/security/crypto.py +17 -16
  270. exonware/xwsystem/security/defs.py +2 -1
  271. exonware/xwsystem/security/errors.py +2 -1
  272. exonware/xwsystem/security/facade.py +321 -0
  273. exonware/xwsystem/security/file_security.py +330 -0
  274. exonware/xwsystem/security/hazmat.py +11 -8
  275. exonware/xwsystem/security/monitor.py +372 -0
  276. exonware/xwsystem/security/path_validator.py +140 -18
  277. exonware/xwsystem/security/policy.py +357 -0
  278. exonware/xwsystem/security/resource_limits.py +1 -0
  279. exonware/xwsystem/security/validator.py +455 -0
  280. exonware/xwsystem/shared/__init__.py +14 -1
  281. exonware/xwsystem/shared/base.py +285 -2
  282. exonware/xwsystem/shared/contracts.py +415 -126
  283. exonware/xwsystem/shared/defs.py +2 -1
  284. exonware/xwsystem/shared/errors.py +2 -2
  285. exonware/xwsystem/shared/xwobject.py +316 -0
  286. exonware/xwsystem/structures/__init__.py +1 -0
  287. exonware/xwsystem/structures/base.py +3 -2
  288. exonware/xwsystem/structures/circular_detector.py +15 -14
  289. exonware/xwsystem/structures/contracts.py +53 -76
  290. exonware/xwsystem/structures/defs.py +2 -1
  291. exonware/xwsystem/structures/errors.py +2 -1
  292. exonware/xwsystem/structures/tree_walker.py +2 -1
  293. exonware/xwsystem/threading/__init__.py +21 -4
  294. exonware/xwsystem/threading/async_primitives.py +6 -5
  295. exonware/xwsystem/threading/base.py +3 -2
  296. exonware/xwsystem/threading/contracts.py +87 -143
  297. exonware/xwsystem/threading/defs.py +2 -1
  298. exonware/xwsystem/threading/errors.py +2 -1
  299. exonware/xwsystem/threading/facade.py +175 -0
  300. exonware/xwsystem/threading/locks.py +1 -0
  301. exonware/xwsystem/threading/safe_factory.py +1 -0
  302. exonware/xwsystem/utils/__init__.py +40 -0
  303. exonware/xwsystem/utils/base.py +22 -21
  304. exonware/xwsystem/utils/contracts.py +50 -73
  305. exonware/xwsystem/utils/dt/__init__.py +19 -3
  306. exonware/xwsystem/utils/dt/base.py +5 -4
  307. exonware/xwsystem/utils/dt/contracts.py +22 -29
  308. exonware/xwsystem/utils/dt/defs.py +2 -1
  309. exonware/xwsystem/utils/dt/errors.py +2 -5
  310. exonware/xwsystem/utils/dt/formatting.py +88 -2
  311. exonware/xwsystem/utils/dt/humanize.py +10 -9
  312. exonware/xwsystem/utils/dt/parsing.py +56 -5
  313. exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
  314. exonware/xwsystem/utils/errors.py +2 -4
  315. exonware/xwsystem/utils/paths.py +1 -0
  316. exonware/xwsystem/utils/string.py +49 -0
  317. exonware/xwsystem/utils/test_runner.py +139 -480
  318. exonware/xwsystem/utils/utils_contracts.py +2 -1
  319. exonware/xwsystem/utils/web.py +110 -0
  320. exonware/xwsystem/validation/__init__.py +25 -1
  321. exonware/xwsystem/validation/base.py +6 -5
  322. exonware/xwsystem/validation/contracts.py +29 -41
  323. exonware/xwsystem/validation/data_validator.py +1 -0
  324. exonware/xwsystem/validation/declarative.py +11 -8
  325. exonware/xwsystem/validation/defs.py +2 -1
  326. exonware/xwsystem/validation/errors.py +2 -1
  327. exonware/xwsystem/validation/facade.py +198 -0
  328. exonware/xwsystem/validation/fluent_validator.py +22 -19
  329. exonware/xwsystem/validation/schema_discovery.py +210 -0
  330. exonware/xwsystem/validation/type_safety.py +2 -1
  331. exonware/xwsystem/version.py +4 -4
  332. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
  333. exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
  334. exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
  335. exonware/xwsystem/cli/__init__.py +0 -43
  336. exonware/xwsystem/cli/console.py +0 -113
  337. exonware/xwsystem/cli/defs.py +0 -134
  338. exonware/xwsystem/conf.py +0 -44
  339. exonware/xwsystem/security/auth.py +0 -484
  340. exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
  341. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
  342. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,9 +1,10 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/format_detector.py
1
2
  #exonware\xwsystem\serialization\format_detector.py
2
3
  """
3
4
  Company: eXonware.com
4
5
  Author: Eng. Muhammad AlShehri
5
6
  Email: connect@exonware.com
6
- Version: 0.0.1.411
7
+ Version: 0.1.0.3
7
8
  Generation Date: September 04, 2025
8
9
 
9
10
  Intelligent format detection for automatic serialization format selection.
@@ -11,7 +12,7 @@ Intelligent format detection for automatic serialization format selection.
11
12
 
12
13
  import re
13
14
  from pathlib import Path
14
- from typing import Any, Optional, Union
15
+ from typing import Any, Optional
15
16
 
16
17
  from ...config.logging_setup import get_logger
17
18
 
@@ -127,7 +128,7 @@ class FormatDetector:
127
128
  ],
128
129
  }
129
130
 
130
- def detect_from_extension(self, file_path: Union[str, Path]) -> list[str]:
131
+ def detect_from_extension(self, file_path: str | Path) -> list[str]:
131
132
  """
132
133
  Detect format from file extension.
133
134
 
@@ -164,7 +165,7 @@ class FormatDetector:
164
165
 
165
166
  return []
166
167
 
167
- def detect_from_content(self, content: Union[str, bytes]) -> dict[str, float]:
168
+ def detect_from_content(self, content: str | bytes) -> dict[str, float]:
168
169
  """
169
170
  Detect format from content analysis with confidence scores.
170
171
 
@@ -208,8 +209,8 @@ class FormatDetector:
208
209
 
209
210
  def detect_format(
210
211
  self,
211
- file_path: Optional[Union[str, Path]] = None,
212
- content: Optional[Union[str, bytes]] = None,
212
+ file_path: Optional[str | Path] = None,
213
+ content: Optional[str | bytes] = None,
213
214
  data: Optional[bytes] = None
214
215
  ) -> dict[str, float]:
215
216
  """
@@ -252,8 +253,8 @@ class FormatDetector:
252
253
 
253
254
  def get_best_format(
254
255
  self,
255
- file_path: Optional[Union[str, Path]] = None,
256
- content: Optional[Union[str, bytes]] = None,
256
+ file_path: Optional[str | Path] = None,
257
+ content: Optional[str | bytes] = None,
257
258
  data: Optional[bytes] = None
258
259
  ) -> Optional[str]:
259
260
  """
@@ -283,8 +284,8 @@ class FormatDetector:
283
284
 
284
285
  def get_format_suggestions(
285
286
  self,
286
- file_path: Optional[Union[str, Path]] = None,
287
- content: Optional[Union[str, bytes]] = None,
287
+ file_path: Optional[str | Path] = None,
288
+ content: Optional[str | bytes] = None,
288
289
  data: Optional[bytes] = None,
289
290
  max_suggestions: int = 3
290
291
  ) -> list[tuple[str, float]]:
@@ -342,8 +343,8 @@ class FormatDetector:
342
343
  _global_detector = FormatDetector()
343
344
 
344
345
  def detect_format(
345
- file_path: Optional[Union[str, Path]] = None,
346
- content: Optional[Union[str, bytes]] = None,
346
+ file_path: Optional[str | Path] = None,
347
+ content: Optional[str | bytes] = None,
347
348
  data: Optional[bytes] = None
348
349
  ) -> Optional[str]:
349
350
  """
@@ -360,8 +361,8 @@ def detect_format(
360
361
  return _global_detector.get_best_format(file_path, content, data)
361
362
 
362
363
  def get_format_suggestions(
363
- file_path: Optional[Union[str, Path]] = None,
364
- content: Optional[Union[str, bytes]] = None,
364
+ file_path: Optional[str | Path] = None,
365
+ content: Optional[str | bytes] = None,
365
366
  data: Optional[bytes] = None,
366
367
  max_suggestions: int = 3
367
368
  ) -> list[tuple[str, float]]:
@@ -1,13 +1,16 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/__init__.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
- Serialization formats - All format implementations.
9
- """
9
+ Serialization formats - Format subpackages.
10
10
 
11
- # Will be populated during migration
12
- __all__ = []
11
+ Subpackages: .text, .binary, .database, .tabular (pandas). Tabular is not
12
+ imported here so that .text / .binary / .database load without pandas.
13
+ Import tabular explicitly: from ...formats.tabular import ExcelSerializer, ...
14
+ """
13
15
 
16
+ __all__: list[str] = []
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/bson.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  BSON serialization - Binary JSON format (MongoDB).
@@ -14,7 +15,7 @@ Following I→A pattern:
14
15
  """
15
16
 
16
17
  from importlib import import_module
17
- from typing import Any, Optional, Union
18
+ from typing import Any, Optional
18
19
 
19
20
  from ...base import ASerialization
20
21
  from ....contracts import EncodeOptions, DecodeOptions
@@ -102,7 +103,7 @@ class BsonSerializer(ASerialization):
102
103
  # CORE ENCODE/DECODE (Using bson library)
103
104
  # ========================================================================
104
105
 
105
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
106
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
106
107
  """
107
108
  Encode data to BSON bytes.
108
109
 
@@ -135,7 +136,7 @@ class BsonSerializer(ASerialization):
135
136
  original_error=e
136
137
  )
137
138
 
138
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
139
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
139
140
  """
140
141
  Decode BSON bytes to data.
141
142
 
@@ -146,7 +147,7 @@ class BsonSerializer(ASerialization):
146
147
  options: BSON options
147
148
 
148
149
  Returns:
149
- Decoded dict
150
+ Decoded dict or list (if originally a list, unwrapped from {"data": [...]})
150
151
 
151
152
  Raises:
152
153
  SerializationError: If decoding fails
@@ -159,6 +160,13 @@ class BsonSerializer(ASerialization):
159
160
  # Decode from BSON bytes
160
161
  data = self._bson.decode(repr)
161
162
 
163
+ # BSON only supports dicts, so lists are wrapped as {"data": [...]}
164
+ # Unwrap if we detect this pattern to restore original list structure
165
+ if isinstance(data, dict) and len(data) == 1 and "data" in data:
166
+ value = data["data"]
167
+ if isinstance(value, list):
168
+ return value
169
+
162
170
  return data
163
171
 
164
172
  except Exception as e:
@@ -167,4 +175,5 @@ class BsonSerializer(ASerialization):
167
175
  format_name=self.format_name,
168
176
  original_error=e
169
177
  )
170
-
178
+
179
+ # Note: File operations (save_file, load_file) are inherited from ASerialization base class
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/cbor.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  CBOR serialization - Concise Binary Object Representation.
@@ -13,7 +14,7 @@ Following I→A pattern:
13
14
  - Concrete: CborSerializer
14
15
  """
15
16
 
16
- from typing import Any, Optional, Union
17
+ from typing import Any, Optional
17
18
  from pathlib import Path
18
19
 
19
20
  from ...base import ASerialization
@@ -103,7 +104,7 @@ class CborSerializer(ASerialization):
103
104
  # CORE ENCODE/DECODE (Using cbor2 library)
104
105
  # ========================================================================
105
106
 
106
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
107
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
107
108
  """
108
109
  Encode data to CBOR bytes.
109
110
 
@@ -138,7 +139,7 @@ class CborSerializer(ASerialization):
138
139
  original_error=e
139
140
  )
140
141
 
141
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
142
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
142
143
  """
143
144
  Decode CBOR bytes to data.
144
145
 
@@ -170,4 +171,3 @@ class CborSerializer(ASerialization):
170
171
  format_name=self.format_name,
171
172
  original_error=e
172
173
  )
173
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/marshal.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  Marshal serialization - Python internal serialization.
@@ -14,7 +15,7 @@ Following I→A pattern:
14
15
  """
15
16
 
16
17
  import marshal
17
- from typing import Any, Optional, Union
18
+ from typing import Any, Optional
18
19
  from pathlib import Path
19
20
 
20
21
  from ...base import ASerialization
@@ -95,7 +96,7 @@ class MarshalSerializer(ASerialization):
95
96
  # CORE ENCODE/DECODE (Using marshal module)
96
97
  # ========================================================================
97
98
 
98
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
99
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
99
100
  """
100
101
  Encode data to Marshal bytes.
101
102
 
@@ -127,7 +128,7 @@ class MarshalSerializer(ASerialization):
127
128
  original_error=e
128
129
  )
129
130
 
130
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
131
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
131
132
  """
132
133
  Decode Marshal bytes to data.
133
134
 
@@ -159,4 +160,3 @@ class MarshalSerializer(ASerialization):
159
160
  format_name=self.format_name,
160
161
  original_error=e
161
162
  )
162
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/msgpack.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  MessagePack serialization - Efficient binary serialization.
@@ -13,7 +14,7 @@ Following I→A pattern:
13
14
  - Concrete: MsgPackSerializer
14
15
  """
15
16
 
16
- from typing import Any, Optional, Union
17
+ from typing import Any, Optional
17
18
  from pathlib import Path
18
19
 
19
20
  from ...base import ASerialization
@@ -109,7 +110,7 @@ class MsgPackSerializer(ASerialization):
109
110
  # CORE ENCODE/DECODE (Using msgpack library)
110
111
  # ========================================================================
111
112
 
112
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
113
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
113
114
  """
114
115
  Encode data to MessagePack bytes.
115
116
 
@@ -145,7 +146,7 @@ class MsgPackSerializer(ASerialization):
145
146
  original_error=e
146
147
  )
147
148
 
148
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
149
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
149
150
  """
150
151
  Decode MessagePack bytes to data.
151
152
 
@@ -184,4 +185,3 @@ class MsgPackSerializer(ASerialization):
184
185
  format_name=self.format_name,
185
186
  original_error=e
186
187
  )
187
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/pickle.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  Pickle serialization - Python object serialization.
@@ -14,7 +15,7 @@ Following I→A pattern:
14
15
  """
15
16
 
16
17
  import pickle
17
- from typing import Any, Optional, Union
18
+ from typing import Any, Optional
18
19
  from pathlib import Path
19
20
 
20
21
  from ...base import ASerialization
@@ -101,7 +102,7 @@ class PickleSerializer(ASerialization):
101
102
  # CORE ENCODE/DECODE (Using pickle module)
102
103
  # ========================================================================
103
104
 
104
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
105
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
105
106
  """
106
107
  Encode data to Pickle bytes.
107
108
 
@@ -136,7 +137,7 @@ class PickleSerializer(ASerialization):
136
137
  original_error=e
137
138
  )
138
139
 
139
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
140
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
140
141
  """
141
142
  Decode Pickle bytes to data.
142
143
 
@@ -177,4 +178,3 @@ class PickleSerializer(ASerialization):
177
178
  format_name=self.format_name,
178
179
  original_error=e
179
180
  )
180
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/plistlib.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  Plist serialization - Apple property list format.
@@ -14,7 +15,7 @@ Following I→A pattern:
14
15
  """
15
16
 
16
17
  import plistlib
17
- from typing import Any, Optional, Union
18
+ from typing import Any, Optional
18
19
  from pathlib import Path
19
20
 
20
21
  from ...base import ASerialization
@@ -98,7 +99,7 @@ class PlistSerializer(ASerialization):
98
99
  # CORE ENCODE/DECODE (Using plistlib module)
99
100
  # ========================================================================
100
101
 
101
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
102
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
102
103
  """
103
104
  Encode data to Plist bytes.
104
105
 
@@ -139,7 +140,7 @@ class PlistSerializer(ASerialization):
139
140
  original_error=e
140
141
  )
141
142
 
142
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
143
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
143
144
  """
144
145
  Decode Plist bytes to data.
145
146
 
@@ -171,4 +172,3 @@ class PlistSerializer(ASerialization):
171
172
  format_name=self.format_name,
172
173
  original_error=e
173
174
  )
174
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/dbm.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  DBM serialization - Unix database manager.
@@ -15,7 +16,7 @@ Following I→A pattern:
15
16
 
16
17
  import json
17
18
  import dbm
18
- from typing import Any, Optional, Union
19
+ from typing import Any, Optional
19
20
  from pathlib import Path
20
21
 
21
22
  from ...base import ASerialization
@@ -63,11 +64,11 @@ class DbmSerializer(ASerialization):
63
64
  def aliases(self) -> list[str]:
64
65
  return ["dbm", "DBM"]
65
66
 
66
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
67
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
67
68
  """DBM encode requires file path - use save_file() instead."""
68
69
  raise NotImplementedError("DBM requires file-based operations - use save_file()")
69
70
 
70
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
71
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
71
72
  """DBM decode requires file path - use load_file() instead."""
72
73
  raise NotImplementedError("DBM requires file-based operations - use load_file()")
73
74
 
@@ -75,7 +76,7 @@ class DbmSerializer(ASerialization):
75
76
  # FILE-BASED OPERATIONS
76
77
  # ---------------------------------------------------------------------
77
78
 
78
- def save_file(self, data: Any, file_path: Union[str, Path], **options: Any) -> None:
79
+ def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
79
80
  """
80
81
  Save Python data into a DBM database file.
81
82
 
@@ -98,7 +99,7 @@ class DbmSerializer(ASerialization):
98
99
  original_error=e,
99
100
  ) from e
100
101
 
101
- def load_file(self, file_path: Union[str, Path], **options: Any) -> Any:
102
+ def load_file(self, file_path: str | Path, **options: Any) -> Any:
102
103
  """
103
104
  Load Python data from a DBM database file.
104
105
 
@@ -121,4 +122,3 @@ class DbmSerializer(ASerialization):
121
122
  format_name=self.format_name,
122
123
  original_error=e,
123
124
  ) from e
124
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/shelve.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  Shelve serialization - Persistent dictionary storage.
@@ -14,7 +15,7 @@ Following I→A pattern:
14
15
  """
15
16
 
16
17
  import shelve
17
- from typing import Any, Optional, Union
18
+ from typing import Any, Optional
18
19
  from pathlib import Path
19
20
 
20
21
  from ...base import ASerialization
@@ -62,11 +63,11 @@ class ShelveSerializer(ASerialization):
62
63
  def aliases(self) -> list[str]:
63
64
  return ["shelve", "Shelve"]
64
65
 
65
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
66
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
66
67
  """Shelve encode requires file path - use save_file() instead."""
67
68
  raise NotImplementedError("Shelve requires file-based operations - use save_file()")
68
69
 
69
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
70
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
70
71
  """Shelve decode requires file path - use load_file() instead."""
71
72
  raise NotImplementedError("Shelve requires file-based operations - use load_file()")
72
73
 
@@ -74,7 +75,7 @@ class ShelveSerializer(ASerialization):
74
75
  # FILE-BASED OPERATIONS
75
76
  # ---------------------------------------------------------------------
76
77
 
77
- def save_file(self, data: Any, file_path: Union[str, Path], **options: Any) -> None:
78
+ def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
78
79
  """
79
80
  Save Python data into a shelve database file.
80
81
 
@@ -94,7 +95,7 @@ class ShelveSerializer(ASerialization):
94
95
  original_error=e,
95
96
  ) from e
96
97
 
97
- def load_file(self, file_path: Union[str, Path], **options: Any) -> Any:
98
+ def load_file(self, file_path: str | Path, **options: Any) -> Any:
98
99
  """
99
100
  Load Python data from a shelve database file.
100
101
 
@@ -116,4 +117,3 @@ class ShelveSerializer(ASerialization):
116
117
  format_name=self.format_name,
117
118
  original_error=e,
118
119
  ) from e
119
-
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/sqlite3.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: November 2, 2025
7
8
 
8
9
  SQLite3 serialization - Embedded database storage.
@@ -15,7 +16,7 @@ Following I→A pattern:
15
16
 
16
17
  import json
17
18
  import sqlite3
18
- from typing import Any, Optional, Union
19
+ from typing import Any, Optional
19
20
  from pathlib import Path
20
21
 
21
22
  from ...base import ASerialization
@@ -63,11 +64,11 @@ class Sqlite3Serializer(ASerialization):
63
64
  def aliases(self) -> list[str]:
64
65
  return ["sqlite3", "sqlite", "db"]
65
66
 
66
- def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> Union[bytes, str]:
67
+ def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
67
68
  """SQLite3 encode requires file path - use save_file() instead."""
68
69
  raise NotImplementedError("SQLite3 requires file-based operations - use save_file()")
69
70
 
70
- def decode(self, repr: Union[bytes, str], *, options: Optional[DecodeOptions] = None) -> Any:
71
+ def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
71
72
  """SQLite3 decode requires file path - use load_file() instead."""
72
73
  raise NotImplementedError("SQLite3 requires file-based operations - use load_file()")
73
74
 
@@ -75,7 +76,7 @@ class Sqlite3Serializer(ASerialization):
75
76
  # FILE-BASED OPERATIONS (override ASerialization defaults)
76
77
  # ---------------------------------------------------------------------
77
78
 
78
- def save_file(self, data: Any, file_path: Union[str, Path], **options: Any) -> None:
79
+ def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
79
80
  """
80
81
  Save Python data into a SQLite3 database file.
81
82
 
@@ -119,7 +120,7 @@ class Sqlite3Serializer(ASerialization):
119
120
  original_error=e,
120
121
  ) from e
121
122
 
122
- def load_file(self, file_path: Union[str, Path], **options: Any) -> Any:
123
+ def load_file(self, file_path: str | Path, **options: Any) -> Any:
123
124
  """
124
125
  Load Python data from a SQLite3 database file.
125
126
 
@@ -153,4 +154,3 @@ class Sqlite3Serializer(ASerialization):
153
154
  format_name=self.format_name,
154
155
  original_error=e,
155
156
  ) from e
156
-
@@ -0,0 +1,27 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/tabular/__init__.py
2
+ """
3
+ Company: eXonware.com
4
+ Author: Eng. Muhammad AlShehri
5
+ Email: connect@exonware.com
6
+ Version: 0.1.0.3
7
+ Generation Date: January 2025
8
+
9
+ Tabular serialization formats - Excel, CSV, Google Sheets, DataFrame.
10
+
11
+ All tabular formats extend ATabularSerialization which provides
12
+ DataFrame conversion capabilities (to_df/from_df methods).
13
+ """
14
+
15
+ from .base import ATabularSerialization
16
+ from .excel import ExcelSerializer
17
+ from .csv import CsvSerializer
18
+ from .googlesheets import GoogleSheetsSerializer
19
+ from .df import DataFrameSerializer
20
+
21
+ __all__ = [
22
+ 'ATabularSerialization',
23
+ 'ExcelSerializer',
24
+ 'CsvSerializer',
25
+ 'GoogleSheetsSerializer',
26
+ 'DataFrameSerializer',
27
+ ]
@@ -0,0 +1,89 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/tabular/base.py
2
+ """
3
+ Company: eXonware.com
4
+ Author: Eng. Muhammad AlShehri
5
+ Email: connect@exonware.com
6
+ Version: 0.1.0.3
7
+ Generation Date: January 2025
8
+
9
+ Tabular serialization base class - ATabularSerialization.
10
+
11
+ Extends ASerialization to provide DataFrame conversion capabilities.
12
+ All tabular formats (Excel, CSV, Google Sheets, DataFrame) extend this.
13
+ """
14
+
15
+ from abc import ABC, abstractmethod
16
+ from typing import Optional, Any
17
+ import pandas as pd
18
+
19
+ from ...base import ASerialization
20
+ from ....contracts import EncodeOptions, DecodeOptions
21
+
22
+
23
+ class ATabularSerialization(ASerialization, ABC):
24
+ """
25
+ Abstract base class for tabular data formats.
26
+
27
+ Extends ASerialization to provide DataFrame conversion capabilities.
28
+ All tabular formats (Excel, CSV, Google Sheets, DataFrame) extend this.
29
+
30
+ Key features:
31
+ - Convert to/from pandas DataFrame(s)
32
+ - Support multiple sheets (returns dict of sheet_name: DataFrame)
33
+ - Integrate with xwsystem serialization framework
34
+
35
+ Examples:
36
+ >>> # Excel serializer
37
+ >>> excel_serializer = ExcelSerializer()
38
+ >>> df = excel_serializer.to_df(excel_bytes)
39
+ >>> excel_bytes = excel_serializer.from_df(df)
40
+
41
+ >>> # CSV serializer
42
+ >>> csv_serializer = CsvSerializer()
43
+ >>> df = csv_serializer.to_df(csv_str)
44
+ >>> csv_str = csv_serializer.from_df(df)
45
+ """
46
+
47
+ @abstractmethod
48
+ def to_df(
49
+ self,
50
+ data: bytes | str | dict,
51
+ sheet_name: Optional[str | list[str]] = None,
52
+ **options
53
+ ) -> pd.DataFrame | dict[str, pd.DataFrame]:
54
+ """
55
+ Convert tabular data to DataFrame(s).
56
+
57
+ Args:
58
+ data: Input data (bytes, str, or dict depending on format)
59
+ sheet_name: Specific sheet name(s) to load, or None for all sheets
60
+ **options: Format-specific options
61
+
62
+ Returns:
63
+ Single DataFrame if one sheet, or dict of {sheet_name: DataFrame} if multiple
64
+
65
+ Raises:
66
+ SerializationError: If conversion fails
67
+ """
68
+ pass
69
+
70
+ @abstractmethod
71
+ def from_df(
72
+ self,
73
+ df: pd.DataFrame | dict[str, pd.DataFrame],
74
+ **options
75
+ ) -> bytes | str:
76
+ """
77
+ Convert DataFrame(s) to tabular format.
78
+
79
+ Args:
80
+ df: Single DataFrame or dict of {sheet_name: DataFrame}
81
+ **options: Format-specific options
82
+
83
+ Returns:
84
+ Serialized data (bytes for binary formats, str for text formats)
85
+
86
+ Raises:
87
+ SerializationError: If conversion fails
88
+ """
89
+ pass