supertable 2.4.0__tar.gz → 2.5.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.
Files changed (377) hide show
  1. {supertable-2.4.0/supertable.egg-info → supertable-2.5.0}/PKG-INFO +22 -13
  2. {supertable-2.4.0 → supertable-2.5.0}/README.md +14 -7
  3. supertable-2.5.0/pyproject.toml +89 -0
  4. {supertable-2.4.0 → supertable-2.5.0}/requirements.txt +5 -3
  5. {supertable-2.4.0 → supertable-2.5.0}/setup.py +11 -3
  6. supertable-2.5.0/supertable/__init__.py +112 -0
  7. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/__init__.py +60 -3
  8. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/events.py +1 -0
  9. supertable-2.5.0/supertable/audit/privileged.py +964 -0
  10. supertable-2.5.0/supertable/audit/privileged_outbox.py +3689 -0
  11. supertable-2.5.0/supertable/audit/privileged_worker.py +1553 -0
  12. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_events.py +6 -1
  13. supertable-2.5.0/supertable/audit/tests/test_privileged.py +385 -0
  14. supertable-2.5.0/supertable/audit/tests/test_privileged_outbox.py +1822 -0
  15. supertable-2.5.0/supertable/audit/tests/test_privileged_worker.py +934 -0
  16. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_retention.py +6 -2
  17. supertable-2.5.0/supertable/benchmarks/benchmark_random_write_trace.py +1207 -0
  18. supertable-2.5.0/supertable/benchmarks/benchmark_tombstone_compaction.py +1575 -0
  19. supertable-2.5.0/supertable/benchmarks/benchmark_write_path.py +113 -0
  20. supertable-2.5.0/supertable/benchmarks/benchmark_write_probe.py +497 -0
  21. supertable-2.5.0/supertable/benchmarks/write_campaign.py +1049 -0
  22. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/defaults.py +2 -0
  23. supertable-2.5.0/supertable/config/homedir.py +141 -0
  24. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/settings.py +267 -20
  25. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/test_defaults.py +4 -0
  26. supertable-2.5.0/supertable/config/tests/test_homedir.py +254 -0
  27. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/test_settings.py +213 -3
  28. supertable-2.5.0/supertable/data_classes.py +490 -0
  29. supertable-2.5.0/supertable/data_reader.py +1834 -0
  30. supertable-2.5.0/supertable/data_writer.py +3949 -0
  31. supertable-2.5.0/supertable/demo/medcenter/__init__.py +43 -0
  32. supertable-2.5.0/supertable/demo/medcenter/core.py +328 -0
  33. supertable-2.5.0/supertable/demo/medcenter/defaults.py +143 -0
  34. supertable-2.5.0/supertable/demo/medcenter/export_accounting.py +238 -0
  35. supertable-2.5.0/supertable/demo/medcenter/finance_sources.py +825 -0
  36. supertable-2.5.0/supertable/demo/medcenter/generate.py +186 -0
  37. supertable-2.5.0/supertable/demo/medcenter/helpers.py +37 -0
  38. supertable-2.5.0/supertable/demo/medcenter/load.py +104 -0
  39. supertable-2.5.0/supertable/demo/medcenter/quality.py +379 -0
  40. supertable-2.5.0/supertable/demo/medcenter/run.py +231 -0
  41. supertable-2.5.0/supertable/demo/medcenter/transform.py +355 -0
  42. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/core.py +3 -1
  43. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/generate.py +2 -1
  44. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/load.py +2 -1
  45. supertable-2.5.0/supertable/demo/webshop/stream_demo.py +758 -0
  46. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/topup.py +2 -1
  47. supertable-2.5.0/supertable/engine/__init__.py +57 -0
  48. supertable-2.5.0/supertable/engine/adaptive_router.py +642 -0
  49. supertable-2.5.0/supertable/engine/benchmarks/__init__.py +10 -0
  50. supertable-2.5.0/supertable/engine/benchmarks/__main__.py +7 -0
  51. supertable-2.5.0/supertable/engine/benchmarks/_worker.py +18 -0
  52. supertable-2.5.0/supertable/engine/benchmarks/bounded_spill_gate.py +1102 -0
  53. supertable-2.5.0/supertable/engine/benchmarks/container_runner.py +1242 -0
  54. supertable-2.5.0/supertable/engine/benchmarks/container_worker.py +114 -0
  55. supertable-2.5.0/supertable/engine/benchmarks/corpus.py +1083 -0
  56. supertable-2.5.0/supertable/engine/benchmarks/islanddb.py +479 -0
  57. supertable-2.5.0/supertable/engine/benchmarks/real_spill_gate.py +927 -0
  58. supertable-2.5.0/supertable/engine/benchmarks/real_spill_worker.py +615 -0
  59. supertable-2.5.0/supertable/engine/benchmarks/runner.py +1616 -0
  60. supertable-2.5.0/supertable/engine/benchmarks/spill_gate.py +1082 -0
  61. supertable-2.5.0/supertable/engine/benchmarks/tests/__init__.py +1 -0
  62. supertable-2.5.0/supertable/engine/benchmarks/tests/test_bounded_spill_gate.py +419 -0
  63. supertable-2.5.0/supertable/engine/benchmarks/tests/test_container_runner.py +403 -0
  64. supertable-2.5.0/supertable/engine/benchmarks/tests/test_islanddb_benchmark.py +855 -0
  65. supertable-2.5.0/supertable/engine/benchmarks/tests/test_real_spill_gate.py +339 -0
  66. supertable-2.5.0/supertable/engine/benchmarks/tests/test_spill_gate.py +299 -0
  67. supertable-2.5.0/supertable/engine/data_estimator.py +2185 -0
  68. supertable-2.5.0/supertable/engine/duckdb_engine.py +964 -0
  69. supertable-2.5.0/supertable/engine/engine_common.py +4147 -0
  70. supertable-2.5.0/supertable/engine/engine_config.py +414 -0
  71. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/engine_enum.py +4 -2
  72. supertable-2.5.0/supertable/engine/executor.py +1196 -0
  73. supertable-2.5.0/supertable/engine/file_cache.py +1651 -0
  74. supertable-2.5.0/supertable/engine/island_resources.py +1130 -0
  75. supertable-2.5.0/supertable/engine/island_spill.py +2160 -0
  76. supertable-2.5.0/supertable/engine/islanddb.py +5252 -0
  77. supertable-2.5.0/supertable/engine/join_pruner.py +1183 -0
  78. supertable-2.5.0/supertable/engine/query_observations.py +1115 -0
  79. supertable-2.5.0/supertable/engine/range_cache.py +2211 -0
  80. supertable-2.5.0/supertable/engine/spark_thrift.py +2182 -0
  81. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/conftest.py +1 -2
  82. supertable-2.5.0/supertable/engine/tests/test_adaptive_router.py +374 -0
  83. supertable-2.5.0/supertable/engine/tests/test_duckdb_query_sandbox.py +779 -0
  84. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/test_engine.py +1292 -304
  85. supertable-2.5.0/supertable/engine/tests/test_engine_config.py +161 -0
  86. supertable-2.5.0/supertable/engine/tests/test_engine_routing.py +491 -0
  87. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/test_engine_spill.py +3 -3
  88. supertable-2.5.0/supertable/engine/tests/test_executor_safety_regressions.py +904 -0
  89. supertable-2.5.0/supertable/engine/tests/test_file_cache.py +756 -0
  90. supertable-2.5.0/supertable/engine/tests/test_island_resources.py +708 -0
  91. supertable-2.5.0/supertable/engine/tests/test_island_spill_primitives.py +1187 -0
  92. supertable-2.5.0/supertable/engine/tests/test_island_spill_redteam.py +140 -0
  93. supertable-2.5.0/supertable/engine/tests/test_islanddb.py +3623 -0
  94. supertable-2.5.0/supertable/engine/tests/test_query_observations.py +514 -0
  95. supertable-2.5.0/supertable/engine/tests/test_range_cache.py +877 -0
  96. supertable-2.5.0/supertable/engine/tests/test_spark_security.py +673 -0
  97. supertable-2.5.0/supertable/engine/tests/test_tombstone_source_rowid_integrity.py +95 -0
  98. supertable-2.5.0/supertable/engine/tests/test_tombstone_v3_reader.py +181 -0
  99. {supertable-2.4.0 → supertable-2.5.0}/supertable/errors.py +31 -0
  100. supertable-2.5.0/supertable/locking/file_lock.py +585 -0
  101. supertable-2.5.0/supertable/locking/redis_lock.py +540 -0
  102. supertable-2.5.0/supertable/locking/tests/test_file_lock.py +516 -0
  103. supertable-2.5.0/supertable/locking/tests/test_redis_lock.py +733 -0
  104. supertable-2.5.0/supertable/meta_reader.py +972 -0
  105. {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/mirror_delta.py +267 -69
  106. supertable-2.5.0/supertable/mirroring/mirror_formats.py +511 -0
  107. {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/mirror_iceberg.py +339 -60
  108. supertable-2.5.0/supertable/mirroring/mirror_parquet.py +261 -0
  109. {supertable-2.4.0 → supertable-2.5.0}/supertable/monitoring/__init__.py +33 -8
  110. {supertable-2.4.0 → supertable-2.5.0}/supertable/monitoring/partitions.py +406 -99
  111. supertable-2.5.0/supertable/monitoring_writer.py +1398 -0
  112. supertable-2.5.0/supertable/plan_extender.py +263 -0
  113. supertable-2.5.0/supertable/processing.py +9231 -0
  114. {supertable-2.4.0 → supertable-2.5.0}/supertable/quality/__init__.py +16 -4
  115. supertable-2.5.0/supertable/quality/anomaly.py +967 -0
  116. supertable-2.5.0/supertable/quality/checker.py +1727 -0
  117. supertable-2.5.0/supertable/quality/config.py +1227 -0
  118. supertable-2.5.0/supertable/quality/cron.py +79 -0
  119. supertable-2.5.0/supertable/quality/execution.py +201 -0
  120. {supertable-2.4.0 → supertable-2.5.0}/supertable/quality/history.py +78 -9
  121. supertable-2.5.0/supertable/quality/scheduler.py +5903 -0
  122. supertable-2.5.0/supertable/quality/serialization.py +316 -0
  123. {supertable-2.4.0 → supertable-2.5.0}/supertable/query_plan_manager.py +30 -10
  124. supertable-2.5.0/supertable/rbac/access_control.py +547 -0
  125. supertable-2.5.0/supertable/rbac/filter_builder.py +233 -0
  126. supertable-2.5.0/supertable/rbac/role_manager.py +446 -0
  127. supertable-2.5.0/supertable/rbac/row_column_security.py +390 -0
  128. {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/tests/test_filter_builder.py +17 -16
  129. supertable-2.5.0/supertable/rbac/tests/test_rbac.py +4030 -0
  130. supertable-2.5.0/supertable/rbac/tests/test_rbac_exclusions_adversarial.py +1584 -0
  131. {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/tests/test_rbac_per_table.py +105 -1
  132. supertable-2.5.0/supertable/rbac/tests/test_rbac_privileged_audit.py +1825 -0
  133. supertable-2.5.0/supertable/rbac/tests/test_rbac_privileged_audit_real_redis.py +151 -0
  134. supertable-2.5.0/supertable/rbac/user_manager.py +520 -0
  135. supertable-2.5.0/supertable/recovery/__init__.py +21 -0
  136. supertable-2.5.0/supertable/recovery/redis_rebuild.py +2298 -0
  137. supertable-2.5.0/supertable/redis_catalog.py +13663 -0
  138. supertable-2.5.0/supertable/redis_connector.py +521 -0
  139. {supertable-2.4.0 → supertable-2.5.0}/supertable/redis_infra.py +17 -172
  140. {supertable-2.4.0 → supertable-2.5.0}/supertable/redis_keys.py +331 -6
  141. supertable-2.5.0/supertable/simple_table.py +809 -0
  142. supertable-2.5.0/supertable/staging_area.py +708 -0
  143. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/azure_storage.py +182 -14
  144. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/gcp_storage.py +180 -19
  145. supertable-2.5.0/supertable/storage/local_storage.py +1594 -0
  146. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/minio_storage.py +226 -16
  147. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/s3_storage.py +249 -31
  148. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/storage_factory.py +8 -1
  149. supertable-2.5.0/supertable/storage/storage_interface.py +625 -0
  150. supertable-2.5.0/supertable/storage/tests/test_local_storage_durability_cache.py +159 -0
  151. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/tests/test_storage.py +902 -4
  152. supertable-2.5.0/supertable/storage/tests/test_storage_streaming.py +551 -0
  153. supertable-2.5.0/supertable/super_pipe.py +303 -0
  154. supertable-2.5.0/supertable/super_table.py +418 -0
  155. supertable-2.5.0/supertable/tests/test_benchmark_random_write_trace.py +131 -0
  156. supertable-2.5.0/supertable/tests/test_benchmark_tombstone_compaction.py +200 -0
  157. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_compaction_selection.py +14 -6
  158. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_create_if_missing.py +8 -2
  159. supertable-2.5.0/supertable/tests/test_data_estimator_join_pruning.py +302 -0
  160. supertable-2.5.0/supertable/tests/test_data_estimator_join_safety.py +363 -0
  161. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_estimator_projection.py +143 -3
  162. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_reader.py +494 -40
  163. supertable-2.5.0/supertable/tests/test_data_reader_pruning_gate.py +170 -0
  164. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer.py +159 -57
  165. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer_compact.py +451 -161
  166. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer_comprehensive.py +1027 -27
  167. supertable-2.5.0/supertable/tests/test_deletion_intent_fencing.py +610 -0
  168. supertable-2.5.0/supertable/tests/test_demo_cli_app_home.py +78 -0
  169. supertable-2.5.0/supertable/tests/test_demo_medcenter_generator.py +330 -0
  170. supertable-2.5.0/supertable/tests/test_fused_tombstone_compaction_contract.py +1097 -0
  171. supertable-2.5.0/supertable/tests/test_initial_compact_begin.py +568 -0
  172. supertable-2.5.0/supertable/tests/test_join_pruner_work_queue.py +521 -0
  173. supertable-2.5.0/supertable/tests/test_join_pruning.py +511 -0
  174. supertable-2.5.0/supertable/tests/test_join_pruning_directionality_oracle.py +334 -0
  175. supertable-2.5.0/supertable/tests/test_join_pruning_parenthesized_outer.py +123 -0
  176. supertable-2.5.0/supertable/tests/test_join_pruning_soundness.py +568 -0
  177. supertable-2.5.0/supertable/tests/test_join_pruning_type_safety.py +232 -0
  178. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_meta_reader.py +490 -174
  179. supertable-2.5.0/supertable/tests/test_mirror_tombstone_safety.py +346 -0
  180. supertable-2.5.0/supertable/tests/test_monitoring_delivery.py +117 -0
  181. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_monitoring_partitions.py +224 -53
  182. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_monitoring_sink_guard.py +74 -0
  183. supertable-2.5.0/supertable/tests/test_monitoring_spool.py +433 -0
  184. supertable-2.5.0/supertable/tests/test_native_parquet_codec.py +572 -0
  185. supertable-2.5.0/supertable/tests/test_parquet_statistics.py +203 -0
  186. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing.py +29 -2
  187. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing_compact_resources.py +222 -15
  188. supertable-2.5.0/supertable/tests/test_processing_stats_safety_boundaries.py +395 -0
  189. supertable-2.5.0/supertable/tests/test_quality_checker.py +593 -0
  190. supertable-2.5.0/supertable/tests/test_quality_config.py +892 -0
  191. supertable-2.5.0/supertable/tests/test_quality_evaluators.py +537 -0
  192. supertable-2.5.0/supertable/tests/test_quality_execution.py +243 -0
  193. supertable-2.5.0/supertable/tests/test_quality_scheduler_correctness.py +2582 -0
  194. supertable-2.5.0/supertable/tests/test_quality_scheduler_durability.py +1919 -0
  195. supertable-2.5.0/supertable/tests/test_quality_serialization.py +349 -0
  196. supertable-2.5.0/supertable/tests/test_rbac_write_storage_regressions.py +1133 -0
  197. supertable-2.5.0/supertable/tests/test_read_error_redaction.py +31 -0
  198. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_read_pruning_integration.py +25 -4
  199. supertable-2.5.0/supertable/tests/test_redis_catalog_atomic_updates.py +1381 -0
  200. supertable-2.5.0/supertable/tests/test_redis_catalog_tombstone_v3.py +481 -0
  201. supertable-2.5.0/supertable/tests/test_redis_connector_acl.py +289 -0
  202. supertable-2.5.0/supertable/tests/test_redis_infra_hardening.py +183 -0
  203. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_redis_key_prefix.py +29 -0
  204. supertable-2.5.0/supertable/tests/test_redis_recovery.py +1126 -0
  205. supertable-2.5.0/supertable/tests/test_release_audit_query_auth_regressions.py +767 -0
  206. supertable-2.5.0/supertable/tests/test_release_audit_storage_mirroring.py +985 -0
  207. supertable-2.5.0/supertable/tests/test_resolve_overwrite_writes.py +901 -0
  208. supertable-2.5.0/supertable/tests/test_resource_object_seals.py +216 -0
  209. supertable-2.5.0/supertable/tests/test_row_group_selection.py +588 -0
  210. supertable-2.5.0/supertable/tests/test_select_pruning_conservative_lanes.py +448 -0
  211. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_simple_table.py +189 -41
  212. supertable-2.5.0/supertable/tests/test_snapshot_artifact_references.py +349 -0
  213. supertable-2.5.0/supertable/tests/test_snapshot_commit_fencing.py +3495 -0
  214. supertable-2.5.0/supertable/tests/test_spark_file_resolution.py +187 -0
  215. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_cache.py +92 -0
  216. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_pruning.py +19 -15
  217. supertable-2.5.0/supertable/tests/test_stats_resource_seals.py +340 -0
  218. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_schema_snapshot.py +4 -0
  219. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_super_table.py +73 -34
  220. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_supertable_all.py +270 -59
  221. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_tombstone_cache.py +153 -1
  222. supertable-2.5.0/supertable/tests/test_tombstone_manifest_v2.py +429 -0
  223. supertable-2.5.0/supertable/tests/test_tombstone_manifest_v2_reader.py +1550 -0
  224. supertable-2.5.0/supertable/tests/test_tombstone_snapshot_pinning.py +1035 -0
  225. supertable-2.5.0/supertable/tests/test_tombstone_v2_writer.py +675 -0
  226. supertable-2.5.0/supertable/tests/test_tombstone_v3_writer.py +445 -0
  227. supertable-2.5.0/supertable/tests/test_tombstone_write_safety.py +996 -0
  228. supertable-2.5.0/supertable/tests/test_write_campaign.py +331 -0
  229. supertable-2.5.0/supertable/tests/test_write_probe_gate.py +424 -0
  230. supertable-2.5.0/supertable/tests/test_writer_artifact_cache_identity.py +246 -0
  231. supertable-2.5.0/supertable/tombstone_manifest_v2.py +797 -0
  232. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/helper.py +20 -5
  233. supertable-2.5.0/supertable/utils/snapshot.py +507 -0
  234. supertable-2.5.0/supertable/utils/spark_security.py +144 -0
  235. supertable-2.5.0/supertable/utils/sql_parser.py +2087 -0
  236. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/tests/test_sql_parser_columns.py +186 -115
  237. {supertable-2.4.0 → supertable-2.5.0/supertable.egg-info}/PKG-INFO +22 -13
  238. {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/SOURCES.txt +128 -3
  239. supertable-2.5.0/supertable.egg-info/entry_points.txt +13 -0
  240. {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/requires.txt +5 -3
  241. supertable-2.5.0/tests/test_mypy_release_gate.py +146 -0
  242. supertable-2.4.0/pyproject.toml +0 -53
  243. supertable-2.4.0/supertable/__init__.py +0 -66
  244. supertable-2.4.0/supertable/config/homedir.py +0 -96
  245. supertable-2.4.0/supertable/config/tests/test_homedir.py +0 -127
  246. supertable-2.4.0/supertable/data_classes.py +0 -90
  247. supertable-2.4.0/supertable/data_reader.py +0 -502
  248. supertable-2.4.0/supertable/data_writer.py +0 -1669
  249. supertable-2.4.0/supertable/engine/__init__.py +0 -16
  250. supertable-2.4.0/supertable/engine/data_estimator.py +0 -684
  251. supertable-2.4.0/supertable/engine/duckdb_lite.py +0 -291
  252. supertable-2.4.0/supertable/engine/duckdb_pro.py +0 -466
  253. supertable-2.4.0/supertable/engine/engine_common.py +0 -1539
  254. supertable-2.4.0/supertable/engine/engine_config.py +0 -271
  255. supertable-2.4.0/supertable/engine/executor.py +0 -254
  256. supertable-2.4.0/supertable/engine/spark_thrift.py +0 -1100
  257. supertable-2.4.0/supertable/engine/tests/test_engine_config.py +0 -81
  258. supertable-2.4.0/supertable/engine/tests/test_engine_routing.py +0 -192
  259. supertable-2.4.0/supertable/locking/file_lock.py +0 -302
  260. supertable-2.4.0/supertable/locking/redis_lock.py +0 -249
  261. supertable-2.4.0/supertable/locking/tests/test_file_lock.py +0 -231
  262. supertable-2.4.0/supertable/locking/tests/test_redis_lock.py +0 -328
  263. supertable-2.4.0/supertable/meta_reader.py +0 -579
  264. supertable-2.4.0/supertable/mirroring/mirror_formats.py +0 -118
  265. supertable-2.4.0/supertable/mirroring/mirror_parquet.py +0 -184
  266. supertable-2.4.0/supertable/monitoring_writer.py +0 -642
  267. supertable-2.4.0/supertable/plan_extender.py +0 -173
  268. supertable-2.4.0/supertable/processing.py +0 -2475
  269. supertable-2.4.0/supertable/quality/anomaly.py +0 -250
  270. supertable-2.4.0/supertable/quality/checker.py +0 -499
  271. supertable-2.4.0/supertable/quality/config.py +0 -401
  272. supertable-2.4.0/supertable/quality/scheduler.py +0 -757
  273. supertable-2.4.0/supertable/rbac/access_control.py +0 -340
  274. supertable-2.4.0/supertable/rbac/filter_builder.py +0 -108
  275. supertable-2.4.0/supertable/rbac/role_manager.py +0 -270
  276. supertable-2.4.0/supertable/rbac/row_column_security.py +0 -92
  277. supertable-2.4.0/supertable/rbac/tests/test_rbac.py +0 -1903
  278. supertable-2.4.0/supertable/rbac/user_manager.py +0 -217
  279. supertable-2.4.0/supertable/redis_catalog.py +0 -1773
  280. supertable-2.4.0/supertable/redis_connector.py +0 -278
  281. supertable-2.4.0/supertable/simple_table.py +0 -395
  282. supertable-2.4.0/supertable/staging_area.py +0 -291
  283. supertable-2.4.0/supertable/storage/local_storage.py +0 -241
  284. supertable-2.4.0/supertable/storage/storage_interface.py +0 -194
  285. supertable-2.4.0/supertable/super_pipe.py +0 -149
  286. supertable-2.4.0/supertable/super_table.py +0 -136
  287. supertable-2.4.0/supertable/tests/test_parquet_statistics.py +0 -86
  288. supertable-2.4.0/supertable/tests/test_quality_checker.py +0 -120
  289. supertable-2.4.0/supertable/tests/test_resolve_overwrite_writes.py +0 -256
  290. supertable-2.4.0/supertable/tests/test_spark_file_resolution.py +0 -148
  291. supertable-2.4.0/supertable/tests/test_write_probe_gate.py +0 -130
  292. supertable-2.4.0/supertable/utils/sql_parser.py +0 -829
  293. supertable-2.4.0/supertable.egg-info/entry_points.txt +0 -5
  294. {supertable-2.4.0 → supertable-2.5.0}/LICENSE +0 -0
  295. {supertable-2.4.0 → supertable-2.5.0}/setup.cfg +0 -0
  296. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/admin.py +0 -0
  297. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/chain.py +0 -0
  298. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/consumers.py +0 -0
  299. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/crypto.py +0 -0
  300. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/export.py +0 -0
  301. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/logger.py +0 -0
  302. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/middleware.py +0 -0
  303. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/reader.py +0 -0
  304. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/retention.py +0 -0
  305. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/__init__.py +0 -0
  306. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_chain.py +0 -0
  307. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_crypto.py +0 -0
  308. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_emit.py +0 -0
  309. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/writer_parquet.py +0 -0
  310. {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/writer_redis.py +0 -0
  311. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/__init__.py +0 -0
  312. {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/__init__.py +0 -0
  313. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/__init__.py +0 -0
  314. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/__init__.py +0 -0
  315. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/__main__.py +0 -0
  316. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/check_filter_builder.py +0 -0
  317. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/controller.py +0 -0
  318. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/data_writer_helpers.py +0 -0
  319. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/defaults.py +0 -0
  320. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/dummy_data.py +0 -0
  321. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/read_parquet_header.py +0 -0
  322. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_01_01_create_super_table.py +0 -0
  323. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_01_02_enable_mirroring_formats.py +0 -0
  324. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_02_create_roles.py +0 -0
  325. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_03_create_users.py +0 -0
  326. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_01_write_dummy_data.py +0 -0
  327. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_02_write_single_data.py +0 -0
  328. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_03_01_write_staging.py +0 -0
  329. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_03_02_create_pipe.py +0 -0
  330. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_04_01_write_monitoring_simple.py +0 -0
  331. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_04_02_write_monitoring_parallel.py +0 -0
  332. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_05_write_tombstone.py +0 -0
  333. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_01_read_data_error.py +0 -0
  334. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_02_01_read_super_data_ok.py +0 -0
  335. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_02_02_read_table_data_ok.py +0 -0
  336. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_03_read_meta.py +0 -0
  337. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_04_read_staging.py +0 -0
  338. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_06_01_read_roles.py +0 -0
  339. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_06_02_read_user.py +0 -0
  340. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_07_01_estimate_read.py +0 -0
  341. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_07_02_estimate_files.py +0 -0
  342. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_08_read_snapshot_history.py +0 -0
  343. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s04_01_03_delete_pipe.py +0 -0
  344. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s05_01_delete_table.py +0 -0
  345. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s05_02_delete_super_table.py +0 -0
  346. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/__init__.py +0 -0
  347. {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/defaults.py +0 -0
  348. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/plan_stats.py +0 -0
  349. {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/__init__.py +0 -0
  350. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/__init__.py +0 -0
  351. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/__init__.py +0 -0
  352. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/benchmark_locking.py +0 -0
  353. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/measure_lock_speed.py +0 -0
  354. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/measure_lock_time.py +0 -0
  355. {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/tests/__init__.py +0 -0
  356. {supertable-2.4.0 → supertable-2.5.0}/supertable/logging.py +0 -0
  357. {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/__init__.py +0 -0
  358. {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/__init__.py +0 -0
  359. {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/permissions.py +0 -0
  360. {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/__init__.py +0 -0
  361. {supertable-2.4.0 → supertable-2.5.0}/supertable/system_query.py +0 -0
  362. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/__init__.py +0 -0
  363. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_align_to_schema_fix.py +0 -0
  364. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_reader_preflight.py +0 -0
  365. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_errors.py +0 -0
  366. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_metadata_partitioning.py +0 -0
  367. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_newer_than.py +0 -0
  368. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing_stats.py +0 -0
  369. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_query_sql.py +0 -0
  370. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_read_pruning_differential.py +0 -0
  371. {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_system_query.py +0 -0
  372. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/__init__.py +0 -0
  373. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/profiler.py +0 -0
  374. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/tests/test_hourly_partition.py +0 -0
  375. {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/timer.py +0 -0
  376. {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/dependency_links.txt +0 -0
  377. {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supertable
3
- Version: 2.4.0
3
+ Version: 2.5.0
4
4
  Summary: SuperTable — versioned data lake library for SQL analytics on Parquet + Redis.
5
5
  Author: Levente Kupas
6
6
  Author-email: Levente Kupas <lkupas@kladnasoft.com>
7
- License: Super Table Public Use License (STPUL) v1.0
7
+ License: FSL-1.1-ALv2
8
8
  Project-URL: Homepage, https://github.com/kladnasoft/supertable
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3 :: Only
11
11
  Classifier: License :: Other/Proprietary License
12
- Classifier: Operating System :: OS Independent
12
+ Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.10
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
@@ -18,10 +18,12 @@ Requires-Dist: pandas<2.3,>=2.1
18
18
  Requires-Dist: pyarrow<19,>=16
19
19
  Requires-Dist: pytz>=2023.3
20
20
  Requires-Dist: tzdata>=2023.3
21
- Requires-Dist: duckdb<2.0,>=1.1
22
- Requires-Dist: polars<2.0,>=1.6
23
- Requires-Dist: sqlglot<27,>=26
21
+ Requires-Dist: apscheduler<4.0,>=3.11.3
22
+ Requires-Dist: duckdb<2.0,>=1.5.1
23
+ Requires-Dist: polars<2.0,>=1.36.1
24
+ Requires-Dist: sqlglot<27,>=26.33
24
25
  Requires-Dist: colorlog<7.0,>=6.9
26
+ Requires-Dist: tqdm<5.0,>=4.66
25
27
  Requires-Dist: python-dotenv<2.0,>=1.0
26
28
  Requires-Dist: setuptools>=68
27
29
  Requires-Dist: redis<6.0,>=5.0
@@ -45,7 +47,7 @@ Dynamic: requires-python
45
47
 
46
48
  ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
47
49
  ![License](https://img.shields.io/badge/license-FSL--1.1--ALv2-orange)
48
- ![Version](https://img.shields.io/badge/version-2.0.0-brightgreen)
50
+ ![Version](https://img.shields.io/badge/version-2.5.0-brightgreen)
49
51
 
50
52
  **SuperTable — versioned data lake library for SQL analytics.**
51
53
 
@@ -66,8 +68,9 @@ pip install "supertable[gcp]" # Google Cloud Storage
66
68
  pip install "supertable[all]" # everything
67
69
  ```
68
70
 
69
- Requirements: Python 3.10+, a reachable Redis 6+, and a configured storage
70
- backend (or local disk for development). See
71
+ Requirements: Python 3.10+, a POSIX host (the durable monitoring spool uses
72
+ `fcntl` locking), a reachable Redis 6+, and a configured storage backend (or
73
+ local disk for development). See
71
74
  [docs/02_configuration.md](docs/02_configuration.md) for environment
72
75
  variables.
73
76
 
@@ -140,7 +143,7 @@ df, status, message = dr.execute(role_name="superadmin", engine=engine.AUTO)
140
143
 
141
144
  ## Demos
142
145
 
143
- The package ships two runnable demos under `supertable.demo`:
146
+ The package ships three runnable demos under `supertable.demo`:
144
147
 
145
148
  ```bash
146
149
  # Numbered tutorial — runs the full lifecycle end-to-end.
@@ -152,9 +155,13 @@ python -m supertable.demo.quickstart
152
155
  supertable-demo-webshop-generate # build ~1.2M rows on disk
153
156
  supertable-demo-webshop-load # load them into SuperTable
154
157
  supertable-demo-webshop-topup # continuous incremental refresh
158
+
159
+ # Medical-center finance demo (raw → staging → mart, fully synthetic).
160
+ supertable-demo-medcenter-run # generate → load → transform → tests →
161
+ # accounting export → idempotency proof
155
162
  ```
156
163
 
157
- Both demos are also runnable as module steps. Examples:
164
+ All demos are also runnable as module steps. Examples:
158
165
 
159
166
  ```bash
160
167
  python -m supertable.demo.quickstart.s01_01_01_create_super_table
@@ -171,7 +178,7 @@ script index.
171
178
 
172
179
  - **Versioned tables** with snapshot isolation, upsert (`overwrite_columns`),
173
180
  soft deletes (`delete_only=True`), schema evolution, and staleness filtering
174
- - **DuckDB query engine** — embedded, zero-copy reads from object storage
181
+ - **DuckDB and IslandDB query engines** — embedded reads with adaptive selection
175
182
  - **Spark SQL via Thrift** — for queries exceeding DuckDB memory limits
176
183
  - **RBAC** — role types (superadmin, admin, writer, reader, meta) with
177
184
  row-level and column-level security enforced through view chains
@@ -202,13 +209,15 @@ See [docs/00_index.md](docs/00_index.md) for the full table of contents.
202
209
  | 06 | [Data Writer](docs/06_data_writer.md) | Write pipeline, locking, dedup, tombstones |
203
210
  | 07 | [Ingestion & Pipes](docs/07_ingestion.md) | Staging areas, automated ingestion pipes |
204
211
  | 08 | [Distributed Locking](docs/08_locking.md) | Redis locks, file locks, deadlock prevention |
205
- | 09 | [Query Engine](docs/09_query_engine.md) | DuckDB Lite/Pro, Spark SQL, auto selection |
212
+ | 09 | [Query Engine](docs/09_query_engine.md) | DuckDB, IslandDB, Spark SQL, auto selection |
206
213
  | 10 | [Data Reader](docs/10_data_reader.md) | Read facade, snapshot history, view chain |
207
214
  | 11 | [RBAC & Access Control](docs/11_rbac.md) | Roles, users, row/column security |
208
215
  | 12 | [Audit Logging](docs/12_audit.md) | SHA-256 hash chain, DORA/SOC 2, SIEM |
209
216
  | 13 | [Table Mirroring](docs/13_mirroring.md) | Delta Lake, Iceberg, Parquet export |
210
217
  | 14 | [Monitoring](docs/14_monitoring.md) | Metrics writer, structured logging |
211
218
  | 15 | [Python SDK](docs/15_python_sdk.md) | Core classes, demos, example index |
219
+ | 16 | [Redis Key Layout](docs/16_redis_layout.md) | Canonical key namespaces and validation rules |
220
+ | 17 | [Privileged Audit Worker](docs/17_privileged_audit_worker.md) | Supervised deployment, durability preflight, safe trimming, probes, failure policy |
212
221
 
213
222
  ---
214
223
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
4
4
  ![License](https://img.shields.io/badge/license-FSL--1.1--ALv2-orange)
5
- ![Version](https://img.shields.io/badge/version-2.0.0-brightgreen)
5
+ ![Version](https://img.shields.io/badge/version-2.5.0-brightgreen)
6
6
 
7
7
  **SuperTable — versioned data lake library for SQL analytics.**
8
8
 
@@ -23,8 +23,9 @@ pip install "supertable[gcp]" # Google Cloud Storage
23
23
  pip install "supertable[all]" # everything
24
24
  ```
25
25
 
26
- Requirements: Python 3.10+, a reachable Redis 6+, and a configured storage
27
- backend (or local disk for development). See
26
+ Requirements: Python 3.10+, a POSIX host (the durable monitoring spool uses
27
+ `fcntl` locking), a reachable Redis 6+, and a configured storage backend (or
28
+ local disk for development). See
28
29
  [docs/02_configuration.md](docs/02_configuration.md) for environment
29
30
  variables.
30
31
 
@@ -97,7 +98,7 @@ df, status, message = dr.execute(role_name="superadmin", engine=engine.AUTO)
97
98
 
98
99
  ## Demos
99
100
 
100
- The package ships two runnable demos under `supertable.demo`:
101
+ The package ships three runnable demos under `supertable.demo`:
101
102
 
102
103
  ```bash
103
104
  # Numbered tutorial — runs the full lifecycle end-to-end.
@@ -109,9 +110,13 @@ python -m supertable.demo.quickstart
109
110
  supertable-demo-webshop-generate # build ~1.2M rows on disk
110
111
  supertable-demo-webshop-load # load them into SuperTable
111
112
  supertable-demo-webshop-topup # continuous incremental refresh
113
+
114
+ # Medical-center finance demo (raw → staging → mart, fully synthetic).
115
+ supertable-demo-medcenter-run # generate → load → transform → tests →
116
+ # accounting export → idempotency proof
112
117
  ```
113
118
 
114
- Both demos are also runnable as module steps. Examples:
119
+ All demos are also runnable as module steps. Examples:
115
120
 
116
121
  ```bash
117
122
  python -m supertable.demo.quickstart.s01_01_01_create_super_table
@@ -128,7 +133,7 @@ script index.
128
133
 
129
134
  - **Versioned tables** with snapshot isolation, upsert (`overwrite_columns`),
130
135
  soft deletes (`delete_only=True`), schema evolution, and staleness filtering
131
- - **DuckDB query engine** — embedded, zero-copy reads from object storage
136
+ - **DuckDB and IslandDB query engines** — embedded reads with adaptive selection
132
137
  - **Spark SQL via Thrift** — for queries exceeding DuckDB memory limits
133
138
  - **RBAC** — role types (superadmin, admin, writer, reader, meta) with
134
139
  row-level and column-level security enforced through view chains
@@ -159,13 +164,15 @@ See [docs/00_index.md](docs/00_index.md) for the full table of contents.
159
164
  | 06 | [Data Writer](docs/06_data_writer.md) | Write pipeline, locking, dedup, tombstones |
160
165
  | 07 | [Ingestion & Pipes](docs/07_ingestion.md) | Staging areas, automated ingestion pipes |
161
166
  | 08 | [Distributed Locking](docs/08_locking.md) | Redis locks, file locks, deadlock prevention |
162
- | 09 | [Query Engine](docs/09_query_engine.md) | DuckDB Lite/Pro, Spark SQL, auto selection |
167
+ | 09 | [Query Engine](docs/09_query_engine.md) | DuckDB, IslandDB, Spark SQL, auto selection |
163
168
  | 10 | [Data Reader](docs/10_data_reader.md) | Read facade, snapshot history, view chain |
164
169
  | 11 | [RBAC & Access Control](docs/11_rbac.md) | Roles, users, row/column security |
165
170
  | 12 | [Audit Logging](docs/12_audit.md) | SHA-256 hash chain, DORA/SOC 2, SIEM |
166
171
  | 13 | [Table Mirroring](docs/13_mirroring.md) | Delta Lake, Iceberg, Parquet export |
167
172
  | 14 | [Monitoring](docs/14_monitoring.md) | Metrics writer, structured logging |
168
173
  | 15 | [Python SDK](docs/15_python_sdk.md) | Core classes, demos, example index |
174
+ | 16 | [Redis Key Layout](docs/16_redis_layout.md) | Canonical key namespaces and validation rules |
175
+ | 17 | [Privileged Audit Worker](docs/17_privileged_audit_worker.md) | Supervised deployment, durability preflight, safe trimming, probes, failure policy |
169
176
 
170
177
  ---
171
178
 
@@ -0,0 +1,89 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "supertable"
7
+ version = "2.5.0"
8
+ description = "SuperTable — versioned data lake library for SQL analytics on Parquet + Redis."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "FSL-1.1-ALv2" }
12
+ authors = [{ name = "Levente Kupas", email = "lkupas@kladnasoft.com" }]
13
+ classifiers = [
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3 :: Only",
16
+ "License :: Other/Proprietary License",
17
+ "Operating System :: POSIX"
18
+ ]
19
+
20
+ # Read runtime deps from requirements.txt to keep a single source of truth
21
+ dynamic = ["dependencies"]
22
+
23
+ [tool.setuptools.dynamic]
24
+ dependencies = { file = ["requirements.txt"] }
25
+
26
+ [project.optional-dependencies]
27
+ # Storage backends (pick what you deploy on)
28
+ s3 = ["boto3>=1.34,<2.0"]
29
+ minio = ["minio>=7.2,<8.0"]
30
+ azure = ["azure-storage-blob>=12.26.0"]
31
+ gcp = ["google-cloud-storage>=3.1.0"]
32
+ all-cloud = ["supertable[s3,minio,azure,gcp]"]
33
+
34
+ # Everything
35
+ all = ["supertable[all-cloud]"]
36
+
37
+ [project.urls]
38
+ Homepage = "https://github.com/kladnasoft/supertable"
39
+
40
+ [project.scripts]
41
+ supertable-privileged-audit-worker = "supertable.audit.privileged_worker:main"
42
+ supertable-redis-recovery = "supertable.recovery.redis_rebuild:main"
43
+ supertable-demo-quickstart = "supertable.demo.quickstart.controller:main"
44
+ supertable-demo-webshop-generate = "supertable.demo.webshop.generate:main"
45
+ supertable-demo-webshop-load = "supertable.demo.webshop.load:main"
46
+ supertable-demo-webshop-topup = "supertable.demo.webshop.topup:main"
47
+ supertable-demo-medcenter-generate = "supertable.demo.medcenter.generate:main"
48
+ supertable-demo-medcenter-load = "supertable.demo.medcenter.load:main"
49
+ supertable-demo-medcenter-transform = "supertable.demo.medcenter.transform:main"
50
+ supertable-demo-medcenter-quality = "supertable.demo.medcenter.quality:main"
51
+ supertable-demo-medcenter-export = "supertable.demo.medcenter.export_accounting:main"
52
+ supertable-demo-medcenter-run = "supertable.demo.medcenter.run:main"
53
+
54
+ [tool.setuptools]
55
+ include-package-data = true
56
+
57
+ [tool.setuptools.packages.find]
58
+ include = ["supertable", "supertable.*"]
59
+
60
+ [tool.pytest.ini_options]
61
+ asyncio_default_fixture_loop_scope = "function"
62
+ markers = [
63
+ "integration: requires an explicitly configured disposable external service",
64
+ ]
65
+
66
+ [tool.ruff.lint]
67
+ # Start with correctness rules that can never be waived by formatting taste:
68
+ # syntax errors, invalid control flow, and undefined names. Broader rule groups
69
+ # can be enabled incrementally without weakening this release-blocking baseline.
70
+ select = ["E9", "F63", "F7", "F82"]
71
+
72
+ [tool.mypy]
73
+ python_version = "3.10"
74
+ files = ["supertable"]
75
+ # Tests and benchmarks have their own runtime gates. Every shipped production
76
+ # module (including demos/console entry points) remains inside the mypy target.
77
+ exclude = [
78
+ "^supertable/(?:[^/]+/)*(?:tests|benchmarks)/",
79
+ ]
80
+ follow_imports = "skip"
81
+ ignore_missing_imports = true
82
+ # Keep the debt baseline reproducible across the minimum/latest dependency
83
+ # jobs; runtime compatibility is exercised by pytest, while this gate checks
84
+ # SuperTable's own modules against one pinned mypy/typeshed version.
85
+ no_site_packages = true
86
+ check_untyped_defs = true
87
+ incremental = false
88
+ show_error_codes = true
89
+ warn_unused_ignores = true
@@ -4,12 +4,14 @@ pandas>=2.1,<2.3
4
4
  pyarrow>=16,<19
5
5
  pytz>=2023.3
6
6
  tzdata>=2023.3
7
+ apscheduler>=3.11.3,<4.0
7
8
 
8
9
  # -------- Engine / query / utils --------
9
- duckdb>=1.1,<2.0
10
- polars>=1.6,<2.0
11
- sqlglot>=26,<27
10
+ duckdb>=1.5.1,<2.0
11
+ polars>=1.36.1,<2.0
12
+ sqlglot>=26.33,<27
12
13
  colorlog>=6.9,<7.0
14
+ tqdm>=4.66,<5.0
13
15
  python-dotenv>=1.0,<2.0
14
16
  setuptools>=68
15
17
 
@@ -19,13 +19,13 @@ long_description = readme.read_text(encoding="utf-8") if readme.exists() else ""
19
19
 
20
20
  setup(
21
21
  name="supertable",
22
- version="2.4.0",
22
+ version="2.5.0",
23
23
  description="SuperTable — versioned data lake library for SQL analytics on Parquet + Redis.",
24
24
  long_description=long_description,
25
25
  long_description_content_type="text/markdown",
26
26
  author="Levente Kupas",
27
27
  author_email="lkupas@kladnasoft.com",
28
- license="Super Table Public Use License (STPUL) v1.0",
28
+ license="FSL-1.1-ALv2",
29
29
  python_requires=">=3.10",
30
30
  packages=find_packages(include=["supertable", "supertable.*"]),
31
31
  include_package_data=True,
@@ -34,7 +34,7 @@ setup(
34
34
  "Programming Language :: Python :: 3",
35
35
  "Programming Language :: Python :: 3 :: Only",
36
36
  "License :: Other/Proprietary License",
37
- "Operating System :: OS Independent",
37
+ "Operating System :: POSIX",
38
38
  ],
39
39
  extras_require={
40
40
  "s3": ["boto3>=1.34,<2.0"],
@@ -56,10 +56,18 @@ setup(
56
56
  },
57
57
  entry_points={
58
58
  "console_scripts": [
59
+ "supertable-privileged-audit-worker=supertable.audit.privileged_worker:main",
60
+ "supertable-redis-recovery=supertable.recovery.redis_rebuild:main",
59
61
  "supertable-demo-quickstart=supertable.demo.quickstart.controller:main",
60
62
  "supertable-demo-webshop-generate=supertable.demo.webshop.generate:main",
61
63
  "supertable-demo-webshop-load=supertable.demo.webshop.load:main",
62
64
  "supertable-demo-webshop-topup=supertable.demo.webshop.topup:main",
65
+ "supertable-demo-medcenter-generate=supertable.demo.medcenter.generate:main",
66
+ "supertable-demo-medcenter-load=supertable.demo.medcenter.load:main",
67
+ "supertable-demo-medcenter-transform=supertable.demo.medcenter.transform:main",
68
+ "supertable-demo-medcenter-quality=supertable.demo.medcenter.quality:main",
69
+ "supertable-demo-medcenter-export=supertable.demo.medcenter.export_accounting:main",
70
+ "supertable-demo-medcenter-run=supertable.demo.medcenter.run:main",
63
71
  ],
64
72
  },
65
73
  )
@@ -0,0 +1,112 @@
1
+ """SuperTable — versioned data lake library for SQL analytics.
2
+
3
+ SuperTable stores structured data as versioned Parquet snapshots on object
4
+ storage (S3, MinIO, Azure Blob, GCP Cloud Storage, or local disk), keeps
5
+ metadata and locks in Redis, and queries everything through DuckDB or
6
+ IslandDB, with Spark SQL for fleet-scale workloads.
7
+
8
+ Quick reference
9
+ ---------------
10
+
11
+ >>> from supertable import SuperTable, DataWriter, DataReader, engine
12
+ >>> st = SuperTable(super_name="example", organization="my-org")
13
+ >>> dw = DataWriter(super_name="example", organization="my-org")
14
+ >>> _, _, inserted, deleted = dw.write(
15
+ ... role_name="superadmin",
16
+ ... simple_name="facts",
17
+ ... data=arrow_table,
18
+ ... overwrite_columns=["day"],
19
+ ... )
20
+ >>> dr = DataReader(super_name="example", organization="my-org",
21
+ ... query="SELECT count(*) FROM facts")
22
+ >>> df, status, message = dr.execute(role_name="superadmin", engine=engine.AUTO)
23
+
24
+ See the ``supertable.demo`` package for runnable end-to-end demos and the
25
+ project documentation for the full API surface.
26
+ """
27
+
28
+ __version__ = "2.5.0"
29
+
30
+ from importlib import import_module
31
+ from typing import TYPE_CHECKING, Any
32
+
33
+ # This public alias predates the ``supertable.engine`` implementation package.
34
+ # Importing the tiny enum after the now-lazy package is initialized ensures
35
+ # later imports of engine submodules cannot replace ``supertable.engine`` with
36
+ # the package object and break ``engine.AUTO``.
37
+ from supertable.engine.engine_enum import Engine as engine
38
+
39
+
40
+ # Importing the package is intentionally cheap and side-effect-free. The
41
+ # public convenience exports are loaded on first use (PEP 562) so importing
42
+ # ``supertable`` does not import PyArrow/Polars, connect to Redis, probe the
43
+ # filesystem, or initialise an application home.
44
+ _LAZY_EXPORTS = {
45
+ "SuperTable": ("supertable.super_table", "SuperTable"),
46
+ "SimpleTable": ("supertable.simple_table", "SimpleTable"),
47
+ "DataWriter": ("supertable.data_writer", "DataWriter"),
48
+ "DataReader": ("supertable.data_reader", "DataReader"),
49
+ "MetaReader": ("supertable.meta_reader", "MetaReader"),
50
+ "list_supers": ("supertable.meta_reader", "list_supers"),
51
+ "list_tables": ("supertable.meta_reader", "list_tables"),
52
+ "Staging": ("supertable.staging_area", "Staging"),
53
+ "SuperPipe": ("supertable.super_pipe", "SuperPipe"),
54
+ "RedisCatalog": ("supertable.redis_catalog", "RedisCatalog"),
55
+ "RoleManager": ("supertable.rbac.role_manager", "RoleManager"),
56
+ "UserManager": ("supertable.rbac.user_manager", "UserManager"),
57
+ "SupertableLookupError": ("supertable.errors", "SupertableLookupError"),
58
+ "SuperTableNotFoundError": ("supertable.errors", "SuperTableNotFoundError"),
59
+ "TableNotFoundError": ("supertable.errors", "TableNotFoundError"),
60
+ }
61
+
62
+
63
+ def __getattr__(name: str) -> Any:
64
+ target = _LAZY_EXPORTS.get(name)
65
+ if target is None:
66
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
67
+ module_name, attribute = target
68
+ value = getattr(import_module(module_name), attribute)
69
+ globals()[name] = value
70
+ return value
71
+
72
+
73
+ def __dir__() -> list[str]:
74
+ return sorted(set(globals()) | set(_LAZY_EXPORTS))
75
+
76
+
77
+ if TYPE_CHECKING:
78
+ from supertable.data_reader import DataReader
79
+ from supertable.data_writer import DataWriter
80
+ from supertable.errors import (
81
+ SuperTableNotFoundError,
82
+ SupertableLookupError,
83
+ TableNotFoundError,
84
+ )
85
+ from supertable.meta_reader import MetaReader, list_supers, list_tables
86
+ from supertable.rbac.role_manager import RoleManager
87
+ from supertable.rbac.user_manager import UserManager
88
+ from supertable.redis_catalog import RedisCatalog
89
+ from supertable.simple_table import SimpleTable
90
+ from supertable.staging_area import Staging
91
+ from supertable.super_pipe import SuperPipe
92
+ from supertable.super_table import SuperTable
93
+
94
+ __all__ = [
95
+ "__version__",
96
+ "SuperTable",
97
+ "SimpleTable",
98
+ "DataWriter",
99
+ "DataReader",
100
+ "engine",
101
+ "MetaReader",
102
+ "list_supers",
103
+ "list_tables",
104
+ "Staging",
105
+ "SuperPipe",
106
+ "RedisCatalog",
107
+ "RoleManager",
108
+ "UserManager",
109
+ "SupertableLookupError",
110
+ "SuperTableNotFoundError",
111
+ "TableNotFoundError",
112
+ ]
@@ -2,9 +2,16 @@
2
2
  """
3
3
  Audit logging module for Data Island Core.
4
4
 
5
- Provides an immutable, append-only audit trail for every security-relevant
6
- action. Dual-tier storage (Redis Streams + Parquet), tamper-evident hash
7
- chaining, and external SIEM integration via consumer groups.
5
+ Provides two deliberately different audit lanes:
6
+
7
+ * general security/telemetry events use the non-blocking, configurable logger;
8
+ * RBAC role, user, and assignment mutations plus organization auth-token
9
+ create/delete use a mandatory Redis outbox committed atomically with the
10
+ state change and a verified Parquet archive. Token IDs and metadata digests,
11
+ never plaintext tokens, enter this ledger.
12
+
13
+ The second lane is never disabled by general audit configuration and never
14
+ silently drops a privileged state transition.
8
15
 
9
16
  Quick start:
10
17
 
@@ -48,6 +55,18 @@ from supertable.audit.logger import (
48
55
  get_audit_logger,
49
56
  shutdown_all,
50
57
  )
58
+ from supertable.audit.privileged import (
59
+ PrivilegedActionContext,
60
+ PrivilegedAuditRecord,
61
+ build_record as build_privileged_record,
62
+ verify_records as verify_privileged_records,
63
+ )
64
+ from supertable.audit.privileged_outbox import (
65
+ CascadeEvidenceRow,
66
+ CascadeManifest,
67
+ PrivilegedAuditOutbox,
68
+ PrivilegedOutboxError,
69
+ )
51
70
 
52
71
  logger = logging.getLogger(__name__)
53
72
 
@@ -63,9 +82,47 @@ __all__ = [
63
82
  "ActorType",
64
83
  "Actions",
65
84
  "make_detail",
85
+ "PrivilegedActionContext",
86
+ "PrivilegedAuditRecord",
87
+ "PrivilegedAuditOutbox",
88
+ "CascadeEvidenceRow",
89
+ "CascadeManifest",
90
+ "PrivilegedOutboxError",
91
+ "build_privileged_record",
92
+ "verify_privileged_records",
93
+ "get_privileged_audit_outbox",
66
94
  ]
67
95
 
68
96
 
97
+ def get_privileged_audit_outbox(
98
+ organization: str,
99
+ *,
100
+ redis_client=None,
101
+ storage=None,
102
+ ) -> PrivilegedAuditOutbox:
103
+ """Construct the mandatory privileged control-plane WAL reader/archiver.
104
+
105
+ This is intentionally separate from :func:`get_audit_logger`: runtime
106
+ audit configuration can disable the best-effort event logger, but it can
107
+ never disable or redirect the privileged mutation ledger.
108
+ """
109
+ if not organization:
110
+ raise ValueError("organization is required")
111
+ if redis_client is None:
112
+ from supertable.redis_connector import RedisConnector
113
+
114
+ redis_client = RedisConnector().r
115
+ from supertable import redis_keys as RK
116
+ from supertable.audit.writer_parquet import ParquetAuditWriter
117
+
118
+ return PrivilegedAuditOutbox(
119
+ redis_client,
120
+ stream_key=RK.audit_privileged_outbox(organization),
121
+ delivery_ledger_key=RK.audit_privileged_delivery(organization),
122
+ parquet_writer=ParquetAuditWriter(storage=storage),
123
+ )
124
+
125
+
69
126
  # ---------------------------------------------------------------------------
70
127
  # Convenience emit() — the primary public API
71
128
  # ---------------------------------------------------------------------------
@@ -51,6 +51,7 @@ class Outcome(str, Enum):
51
51
  SUCCESS = "success"
52
52
  FAILURE = "failure"
53
53
  DENIED = "denied"
54
+ NO_CHANGE = "no_change"
54
55
 
55
56
 
56
57
  class ActorType(str, Enum):