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.
- {supertable-2.4.0/supertable.egg-info → supertable-2.5.0}/PKG-INFO +22 -13
- {supertable-2.4.0 → supertable-2.5.0}/README.md +14 -7
- supertable-2.5.0/pyproject.toml +89 -0
- {supertable-2.4.0 → supertable-2.5.0}/requirements.txt +5 -3
- {supertable-2.4.0 → supertable-2.5.0}/setup.py +11 -3
- supertable-2.5.0/supertable/__init__.py +112 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/__init__.py +60 -3
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/events.py +1 -0
- supertable-2.5.0/supertable/audit/privileged.py +964 -0
- supertable-2.5.0/supertable/audit/privileged_outbox.py +3689 -0
- supertable-2.5.0/supertable/audit/privileged_worker.py +1553 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_events.py +6 -1
- supertable-2.5.0/supertable/audit/tests/test_privileged.py +385 -0
- supertable-2.5.0/supertable/audit/tests/test_privileged_outbox.py +1822 -0
- supertable-2.5.0/supertable/audit/tests/test_privileged_worker.py +934 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_retention.py +6 -2
- supertable-2.5.0/supertable/benchmarks/benchmark_random_write_trace.py +1207 -0
- supertable-2.5.0/supertable/benchmarks/benchmark_tombstone_compaction.py +1575 -0
- supertable-2.5.0/supertable/benchmarks/benchmark_write_path.py +113 -0
- supertable-2.5.0/supertable/benchmarks/benchmark_write_probe.py +497 -0
- supertable-2.5.0/supertable/benchmarks/write_campaign.py +1049 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/defaults.py +2 -0
- supertable-2.5.0/supertable/config/homedir.py +141 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/settings.py +267 -20
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/test_defaults.py +4 -0
- supertable-2.5.0/supertable/config/tests/test_homedir.py +254 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/test_settings.py +213 -3
- supertable-2.5.0/supertable/data_classes.py +490 -0
- supertable-2.5.0/supertable/data_reader.py +1834 -0
- supertable-2.5.0/supertable/data_writer.py +3949 -0
- supertable-2.5.0/supertable/demo/medcenter/__init__.py +43 -0
- supertable-2.5.0/supertable/demo/medcenter/core.py +328 -0
- supertable-2.5.0/supertable/demo/medcenter/defaults.py +143 -0
- supertable-2.5.0/supertable/demo/medcenter/export_accounting.py +238 -0
- supertable-2.5.0/supertable/demo/medcenter/finance_sources.py +825 -0
- supertable-2.5.0/supertable/demo/medcenter/generate.py +186 -0
- supertable-2.5.0/supertable/demo/medcenter/helpers.py +37 -0
- supertable-2.5.0/supertable/demo/medcenter/load.py +104 -0
- supertable-2.5.0/supertable/demo/medcenter/quality.py +379 -0
- supertable-2.5.0/supertable/demo/medcenter/run.py +231 -0
- supertable-2.5.0/supertable/demo/medcenter/transform.py +355 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/core.py +3 -1
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/generate.py +2 -1
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/load.py +2 -1
- supertable-2.5.0/supertable/demo/webshop/stream_demo.py +758 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/topup.py +2 -1
- supertable-2.5.0/supertable/engine/__init__.py +57 -0
- supertable-2.5.0/supertable/engine/adaptive_router.py +642 -0
- supertable-2.5.0/supertable/engine/benchmarks/__init__.py +10 -0
- supertable-2.5.0/supertable/engine/benchmarks/__main__.py +7 -0
- supertable-2.5.0/supertable/engine/benchmarks/_worker.py +18 -0
- supertable-2.5.0/supertable/engine/benchmarks/bounded_spill_gate.py +1102 -0
- supertable-2.5.0/supertable/engine/benchmarks/container_runner.py +1242 -0
- supertable-2.5.0/supertable/engine/benchmarks/container_worker.py +114 -0
- supertable-2.5.0/supertable/engine/benchmarks/corpus.py +1083 -0
- supertable-2.5.0/supertable/engine/benchmarks/islanddb.py +479 -0
- supertable-2.5.0/supertable/engine/benchmarks/real_spill_gate.py +927 -0
- supertable-2.5.0/supertable/engine/benchmarks/real_spill_worker.py +615 -0
- supertable-2.5.0/supertable/engine/benchmarks/runner.py +1616 -0
- supertable-2.5.0/supertable/engine/benchmarks/spill_gate.py +1082 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/__init__.py +1 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/test_bounded_spill_gate.py +419 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/test_container_runner.py +403 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/test_islanddb_benchmark.py +855 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/test_real_spill_gate.py +339 -0
- supertable-2.5.0/supertable/engine/benchmarks/tests/test_spill_gate.py +299 -0
- supertable-2.5.0/supertable/engine/data_estimator.py +2185 -0
- supertable-2.5.0/supertable/engine/duckdb_engine.py +964 -0
- supertable-2.5.0/supertable/engine/engine_common.py +4147 -0
- supertable-2.5.0/supertable/engine/engine_config.py +414 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/engine_enum.py +4 -2
- supertable-2.5.0/supertable/engine/executor.py +1196 -0
- supertable-2.5.0/supertable/engine/file_cache.py +1651 -0
- supertable-2.5.0/supertable/engine/island_resources.py +1130 -0
- supertable-2.5.0/supertable/engine/island_spill.py +2160 -0
- supertable-2.5.0/supertable/engine/islanddb.py +5252 -0
- supertable-2.5.0/supertable/engine/join_pruner.py +1183 -0
- supertable-2.5.0/supertable/engine/query_observations.py +1115 -0
- supertable-2.5.0/supertable/engine/range_cache.py +2211 -0
- supertable-2.5.0/supertable/engine/spark_thrift.py +2182 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/conftest.py +1 -2
- supertable-2.5.0/supertable/engine/tests/test_adaptive_router.py +374 -0
- supertable-2.5.0/supertable/engine/tests/test_duckdb_query_sandbox.py +779 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/test_engine.py +1292 -304
- supertable-2.5.0/supertable/engine/tests/test_engine_config.py +161 -0
- supertable-2.5.0/supertable/engine/tests/test_engine_routing.py +491 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/test_engine_spill.py +3 -3
- supertable-2.5.0/supertable/engine/tests/test_executor_safety_regressions.py +904 -0
- supertable-2.5.0/supertable/engine/tests/test_file_cache.py +756 -0
- supertable-2.5.0/supertable/engine/tests/test_island_resources.py +708 -0
- supertable-2.5.0/supertable/engine/tests/test_island_spill_primitives.py +1187 -0
- supertable-2.5.0/supertable/engine/tests/test_island_spill_redteam.py +140 -0
- supertable-2.5.0/supertable/engine/tests/test_islanddb.py +3623 -0
- supertable-2.5.0/supertable/engine/tests/test_query_observations.py +514 -0
- supertable-2.5.0/supertable/engine/tests/test_range_cache.py +877 -0
- supertable-2.5.0/supertable/engine/tests/test_spark_security.py +673 -0
- supertable-2.5.0/supertable/engine/tests/test_tombstone_source_rowid_integrity.py +95 -0
- supertable-2.5.0/supertable/engine/tests/test_tombstone_v3_reader.py +181 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/errors.py +31 -0
- supertable-2.5.0/supertable/locking/file_lock.py +585 -0
- supertable-2.5.0/supertable/locking/redis_lock.py +540 -0
- supertable-2.5.0/supertable/locking/tests/test_file_lock.py +516 -0
- supertable-2.5.0/supertable/locking/tests/test_redis_lock.py +733 -0
- supertable-2.5.0/supertable/meta_reader.py +972 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/mirror_delta.py +267 -69
- supertable-2.5.0/supertable/mirroring/mirror_formats.py +511 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/mirror_iceberg.py +339 -60
- supertable-2.5.0/supertable/mirroring/mirror_parquet.py +261 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/monitoring/__init__.py +33 -8
- {supertable-2.4.0 → supertable-2.5.0}/supertable/monitoring/partitions.py +406 -99
- supertable-2.5.0/supertable/monitoring_writer.py +1398 -0
- supertable-2.5.0/supertable/plan_extender.py +263 -0
- supertable-2.5.0/supertable/processing.py +9231 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/quality/__init__.py +16 -4
- supertable-2.5.0/supertable/quality/anomaly.py +967 -0
- supertable-2.5.0/supertable/quality/checker.py +1727 -0
- supertable-2.5.0/supertable/quality/config.py +1227 -0
- supertable-2.5.0/supertable/quality/cron.py +79 -0
- supertable-2.5.0/supertable/quality/execution.py +201 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/quality/history.py +78 -9
- supertable-2.5.0/supertable/quality/scheduler.py +5903 -0
- supertable-2.5.0/supertable/quality/serialization.py +316 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/query_plan_manager.py +30 -10
- supertable-2.5.0/supertable/rbac/access_control.py +547 -0
- supertable-2.5.0/supertable/rbac/filter_builder.py +233 -0
- supertable-2.5.0/supertable/rbac/role_manager.py +446 -0
- supertable-2.5.0/supertable/rbac/row_column_security.py +390 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/tests/test_filter_builder.py +17 -16
- supertable-2.5.0/supertable/rbac/tests/test_rbac.py +4030 -0
- supertable-2.5.0/supertable/rbac/tests/test_rbac_exclusions_adversarial.py +1584 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/tests/test_rbac_per_table.py +105 -1
- supertable-2.5.0/supertable/rbac/tests/test_rbac_privileged_audit.py +1825 -0
- supertable-2.5.0/supertable/rbac/tests/test_rbac_privileged_audit_real_redis.py +151 -0
- supertable-2.5.0/supertable/rbac/user_manager.py +520 -0
- supertable-2.5.0/supertable/recovery/__init__.py +21 -0
- supertable-2.5.0/supertable/recovery/redis_rebuild.py +2298 -0
- supertable-2.5.0/supertable/redis_catalog.py +13663 -0
- supertable-2.5.0/supertable/redis_connector.py +521 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/redis_infra.py +17 -172
- {supertable-2.4.0 → supertable-2.5.0}/supertable/redis_keys.py +331 -6
- supertable-2.5.0/supertable/simple_table.py +809 -0
- supertable-2.5.0/supertable/staging_area.py +708 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/azure_storage.py +182 -14
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/gcp_storage.py +180 -19
- supertable-2.5.0/supertable/storage/local_storage.py +1594 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/minio_storage.py +226 -16
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/s3_storage.py +249 -31
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/storage_factory.py +8 -1
- supertable-2.5.0/supertable/storage/storage_interface.py +625 -0
- supertable-2.5.0/supertable/storage/tests/test_local_storage_durability_cache.py +159 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/tests/test_storage.py +902 -4
- supertable-2.5.0/supertable/storage/tests/test_storage_streaming.py +551 -0
- supertable-2.5.0/supertable/super_pipe.py +303 -0
- supertable-2.5.0/supertable/super_table.py +418 -0
- supertable-2.5.0/supertable/tests/test_benchmark_random_write_trace.py +131 -0
- supertable-2.5.0/supertable/tests/test_benchmark_tombstone_compaction.py +200 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_compaction_selection.py +14 -6
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_create_if_missing.py +8 -2
- supertable-2.5.0/supertable/tests/test_data_estimator_join_pruning.py +302 -0
- supertable-2.5.0/supertable/tests/test_data_estimator_join_safety.py +363 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_estimator_projection.py +143 -3
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_reader.py +494 -40
- supertable-2.5.0/supertable/tests/test_data_reader_pruning_gate.py +170 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer.py +159 -57
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer_compact.py +451 -161
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_writer_comprehensive.py +1027 -27
- supertable-2.5.0/supertable/tests/test_deletion_intent_fencing.py +610 -0
- supertable-2.5.0/supertable/tests/test_demo_cli_app_home.py +78 -0
- supertable-2.5.0/supertable/tests/test_demo_medcenter_generator.py +330 -0
- supertable-2.5.0/supertable/tests/test_fused_tombstone_compaction_contract.py +1097 -0
- supertable-2.5.0/supertable/tests/test_initial_compact_begin.py +568 -0
- supertable-2.5.0/supertable/tests/test_join_pruner_work_queue.py +521 -0
- supertable-2.5.0/supertable/tests/test_join_pruning.py +511 -0
- supertable-2.5.0/supertable/tests/test_join_pruning_directionality_oracle.py +334 -0
- supertable-2.5.0/supertable/tests/test_join_pruning_parenthesized_outer.py +123 -0
- supertable-2.5.0/supertable/tests/test_join_pruning_soundness.py +568 -0
- supertable-2.5.0/supertable/tests/test_join_pruning_type_safety.py +232 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_meta_reader.py +490 -174
- supertable-2.5.0/supertable/tests/test_mirror_tombstone_safety.py +346 -0
- supertable-2.5.0/supertable/tests/test_monitoring_delivery.py +117 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_monitoring_partitions.py +224 -53
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_monitoring_sink_guard.py +74 -0
- supertable-2.5.0/supertable/tests/test_monitoring_spool.py +433 -0
- supertable-2.5.0/supertable/tests/test_native_parquet_codec.py +572 -0
- supertable-2.5.0/supertable/tests/test_parquet_statistics.py +203 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing.py +29 -2
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing_compact_resources.py +222 -15
- supertable-2.5.0/supertable/tests/test_processing_stats_safety_boundaries.py +395 -0
- supertable-2.5.0/supertable/tests/test_quality_checker.py +593 -0
- supertable-2.5.0/supertable/tests/test_quality_config.py +892 -0
- supertable-2.5.0/supertable/tests/test_quality_evaluators.py +537 -0
- supertable-2.5.0/supertable/tests/test_quality_execution.py +243 -0
- supertable-2.5.0/supertable/tests/test_quality_scheduler_correctness.py +2582 -0
- supertable-2.5.0/supertable/tests/test_quality_scheduler_durability.py +1919 -0
- supertable-2.5.0/supertable/tests/test_quality_serialization.py +349 -0
- supertable-2.5.0/supertable/tests/test_rbac_write_storage_regressions.py +1133 -0
- supertable-2.5.0/supertable/tests/test_read_error_redaction.py +31 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_read_pruning_integration.py +25 -4
- supertable-2.5.0/supertable/tests/test_redis_catalog_atomic_updates.py +1381 -0
- supertable-2.5.0/supertable/tests/test_redis_catalog_tombstone_v3.py +481 -0
- supertable-2.5.0/supertable/tests/test_redis_connector_acl.py +289 -0
- supertable-2.5.0/supertable/tests/test_redis_infra_hardening.py +183 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_redis_key_prefix.py +29 -0
- supertable-2.5.0/supertable/tests/test_redis_recovery.py +1126 -0
- supertable-2.5.0/supertable/tests/test_release_audit_query_auth_regressions.py +767 -0
- supertable-2.5.0/supertable/tests/test_release_audit_storage_mirroring.py +985 -0
- supertable-2.5.0/supertable/tests/test_resolve_overwrite_writes.py +901 -0
- supertable-2.5.0/supertable/tests/test_resource_object_seals.py +216 -0
- supertable-2.5.0/supertable/tests/test_row_group_selection.py +588 -0
- supertable-2.5.0/supertable/tests/test_select_pruning_conservative_lanes.py +448 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_simple_table.py +189 -41
- supertable-2.5.0/supertable/tests/test_snapshot_artifact_references.py +349 -0
- supertable-2.5.0/supertable/tests/test_snapshot_commit_fencing.py +3495 -0
- supertable-2.5.0/supertable/tests/test_spark_file_resolution.py +187 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_cache.py +92 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_pruning.py +19 -15
- supertable-2.5.0/supertable/tests/test_stats_resource_seals.py +340 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_stats_schema_snapshot.py +4 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_super_table.py +73 -34
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_supertable_all.py +270 -59
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_tombstone_cache.py +153 -1
- supertable-2.5.0/supertable/tests/test_tombstone_manifest_v2.py +429 -0
- supertable-2.5.0/supertable/tests/test_tombstone_manifest_v2_reader.py +1550 -0
- supertable-2.5.0/supertable/tests/test_tombstone_snapshot_pinning.py +1035 -0
- supertable-2.5.0/supertable/tests/test_tombstone_v2_writer.py +675 -0
- supertable-2.5.0/supertable/tests/test_tombstone_v3_writer.py +445 -0
- supertable-2.5.0/supertable/tests/test_tombstone_write_safety.py +996 -0
- supertable-2.5.0/supertable/tests/test_write_campaign.py +331 -0
- supertable-2.5.0/supertable/tests/test_write_probe_gate.py +424 -0
- supertable-2.5.0/supertable/tests/test_writer_artifact_cache_identity.py +246 -0
- supertable-2.5.0/supertable/tombstone_manifest_v2.py +797 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/helper.py +20 -5
- supertable-2.5.0/supertable/utils/snapshot.py +507 -0
- supertable-2.5.0/supertable/utils/spark_security.py +144 -0
- supertable-2.5.0/supertable/utils/sql_parser.py +2087 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/tests/test_sql_parser_columns.py +186 -115
- {supertable-2.4.0 → supertable-2.5.0/supertable.egg-info}/PKG-INFO +22 -13
- {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/SOURCES.txt +128 -3
- supertable-2.5.0/supertable.egg-info/entry_points.txt +13 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/requires.txt +5 -3
- supertable-2.5.0/tests/test_mypy_release_gate.py +146 -0
- supertable-2.4.0/pyproject.toml +0 -53
- supertable-2.4.0/supertable/__init__.py +0 -66
- supertable-2.4.0/supertable/config/homedir.py +0 -96
- supertable-2.4.0/supertable/config/tests/test_homedir.py +0 -127
- supertable-2.4.0/supertable/data_classes.py +0 -90
- supertable-2.4.0/supertable/data_reader.py +0 -502
- supertable-2.4.0/supertable/data_writer.py +0 -1669
- supertable-2.4.0/supertable/engine/__init__.py +0 -16
- supertable-2.4.0/supertable/engine/data_estimator.py +0 -684
- supertable-2.4.0/supertable/engine/duckdb_lite.py +0 -291
- supertable-2.4.0/supertable/engine/duckdb_pro.py +0 -466
- supertable-2.4.0/supertable/engine/engine_common.py +0 -1539
- supertable-2.4.0/supertable/engine/engine_config.py +0 -271
- supertable-2.4.0/supertable/engine/executor.py +0 -254
- supertable-2.4.0/supertable/engine/spark_thrift.py +0 -1100
- supertable-2.4.0/supertable/engine/tests/test_engine_config.py +0 -81
- supertable-2.4.0/supertable/engine/tests/test_engine_routing.py +0 -192
- supertable-2.4.0/supertable/locking/file_lock.py +0 -302
- supertable-2.4.0/supertable/locking/redis_lock.py +0 -249
- supertable-2.4.0/supertable/locking/tests/test_file_lock.py +0 -231
- supertable-2.4.0/supertable/locking/tests/test_redis_lock.py +0 -328
- supertable-2.4.0/supertable/meta_reader.py +0 -579
- supertable-2.4.0/supertable/mirroring/mirror_formats.py +0 -118
- supertable-2.4.0/supertable/mirroring/mirror_parquet.py +0 -184
- supertable-2.4.0/supertable/monitoring_writer.py +0 -642
- supertable-2.4.0/supertable/plan_extender.py +0 -173
- supertable-2.4.0/supertable/processing.py +0 -2475
- supertable-2.4.0/supertable/quality/anomaly.py +0 -250
- supertable-2.4.0/supertable/quality/checker.py +0 -499
- supertable-2.4.0/supertable/quality/config.py +0 -401
- supertable-2.4.0/supertable/quality/scheduler.py +0 -757
- supertable-2.4.0/supertable/rbac/access_control.py +0 -340
- supertable-2.4.0/supertable/rbac/filter_builder.py +0 -108
- supertable-2.4.0/supertable/rbac/role_manager.py +0 -270
- supertable-2.4.0/supertable/rbac/row_column_security.py +0 -92
- supertable-2.4.0/supertable/rbac/tests/test_rbac.py +0 -1903
- supertable-2.4.0/supertable/rbac/user_manager.py +0 -217
- supertable-2.4.0/supertable/redis_catalog.py +0 -1773
- supertable-2.4.0/supertable/redis_connector.py +0 -278
- supertable-2.4.0/supertable/simple_table.py +0 -395
- supertable-2.4.0/supertable/staging_area.py +0 -291
- supertable-2.4.0/supertable/storage/local_storage.py +0 -241
- supertable-2.4.0/supertable/storage/storage_interface.py +0 -194
- supertable-2.4.0/supertable/super_pipe.py +0 -149
- supertable-2.4.0/supertable/super_table.py +0 -136
- supertable-2.4.0/supertable/tests/test_parquet_statistics.py +0 -86
- supertable-2.4.0/supertable/tests/test_quality_checker.py +0 -120
- supertable-2.4.0/supertable/tests/test_resolve_overwrite_writes.py +0 -256
- supertable-2.4.0/supertable/tests/test_spark_file_resolution.py +0 -148
- supertable-2.4.0/supertable/tests/test_write_probe_gate.py +0 -130
- supertable-2.4.0/supertable/utils/sql_parser.py +0 -829
- supertable-2.4.0/supertable.egg-info/entry_points.txt +0 -5
- {supertable-2.4.0 → supertable-2.5.0}/LICENSE +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/setup.cfg +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/admin.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/chain.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/consumers.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/crypto.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/export.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/logger.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/middleware.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/reader.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/retention.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_chain.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_crypto.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/tests/test_emit.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/writer_parquet.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/audit/writer_redis.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/config/tests/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/__main__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/check_filter_builder.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/controller.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/data_writer_helpers.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/defaults.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/dummy_data.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/read_parquet_header.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_01_01_create_super_table.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_01_02_enable_mirroring_formats.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_02_create_roles.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s01_03_create_users.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_01_write_dummy_data.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_02_write_single_data.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_03_01_write_staging.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_03_02_create_pipe.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_04_01_write_monitoring_simple.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_04_02_write_monitoring_parallel.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s02_05_write_tombstone.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_01_read_data_error.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_02_01_read_super_data_ok.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_02_02_read_table_data_ok.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_03_read_meta.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_04_read_staging.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_06_01_read_roles.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_06_02_read_user.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_07_01_estimate_read.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_07_02_estimate_files.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s03_08_read_snapshot_history.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s04_01_03_delete_pipe.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s05_01_delete_table.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/quickstart/s05_02_delete_super_table.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/demo/webshop/defaults.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/plan_stats.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/engine/tests/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/benchmark_locking.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/measure_lock_speed.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/benchmarks/measure_lock_time.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/locking/tests/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/logging.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/mirroring/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/rbac/permissions.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/storage/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/system_query.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_align_to_schema_fix.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_data_reader_preflight.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_errors.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_metadata_partitioning.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_newer_than.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_processing_stats.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_query_sql.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_read_pruning_differential.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/tests/test_system_query.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/__init__.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/profiler.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/tests/test_hourly_partition.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable/utils/timer.py +0 -0
- {supertable-2.4.0 → supertable-2.5.0}/supertable.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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:
|
|
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 ::
|
|
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:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
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
|

|
|
47
49
|

|
|
48
|
-

|
|
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
|
|
70
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|

|
|
4
4
|

|
|
5
|
-

|
|
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
|
|
27
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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="
|
|
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 ::
|
|
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
|
|
6
|
-
|
|
7
|
-
|
|
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
|
# ---------------------------------------------------------------------------
|