supertable 2.0.8__tar.gz → 2.1.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 (166) hide show
  1. {supertable-2.0.8/supertable.egg-info → supertable-2.1.0}/PKG-INFO +1 -1
  2. {supertable-2.0.8 → supertable-2.1.0}/pyproject.toml +1 -1
  3. {supertable-2.0.8 → supertable-2.1.0}/setup.py +1 -1
  4. {supertable-2.0.8 → supertable-2.1.0}/supertable/__init__.py +1 -1
  5. {supertable-2.0.8 → supertable-2.1.0}/supertable/redis_keys.py +32 -12
  6. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_redis_key_prefix.py +21 -4
  7. {supertable-2.0.8 → supertable-2.1.0/supertable.egg-info}/PKG-INFO +1 -1
  8. {supertable-2.0.8 → supertable-2.1.0}/LICENSE +0 -0
  9. {supertable-2.0.8 → supertable-2.1.0}/README.md +0 -0
  10. {supertable-2.0.8 → supertable-2.1.0}/requirements.txt +0 -0
  11. {supertable-2.0.8 → supertable-2.1.0}/setup.cfg +0 -0
  12. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/__init__.py +0 -0
  13. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/admin.py +0 -0
  14. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/chain.py +0 -0
  15. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/consumers.py +0 -0
  16. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/crypto.py +0 -0
  17. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/events.py +0 -0
  18. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/export.py +0 -0
  19. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/logger.py +0 -0
  20. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/middleware.py +0 -0
  21. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/reader.py +0 -0
  22. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/retention.py +0 -0
  23. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/__init__.py +0 -0
  24. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/test_chain.py +0 -0
  25. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/test_crypto.py +0 -0
  26. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/test_emit.py +0 -0
  27. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/test_events.py +0 -0
  28. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/tests/test_retention.py +0 -0
  29. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/writer_parquet.py +0 -0
  30. {supertable-2.0.8 → supertable-2.1.0}/supertable/audit/writer_redis.py +0 -0
  31. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/__init__.py +0 -0
  32. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/defaults.py +0 -0
  33. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/homedir.py +0 -0
  34. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/settings.py +0 -0
  35. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/tests/__init__.py +0 -0
  36. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/tests/test_defaults.py +0 -0
  37. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/tests/test_homedir.py +0 -0
  38. {supertable-2.0.8 → supertable-2.1.0}/supertable/config/tests/test_settings.py +0 -0
  39. {supertable-2.0.8 → supertable-2.1.0}/supertable/data_classes.py +0 -0
  40. {supertable-2.0.8 → supertable-2.1.0}/supertable/data_reader.py +0 -0
  41. {supertable-2.0.8 → supertable-2.1.0}/supertable/data_writer.py +0 -0
  42. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/__init__.py +0 -0
  43. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/__init__.py +0 -0
  44. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/__main__.py +0 -0
  45. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/check_filter_builder.py +0 -0
  46. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/controller.py +0 -0
  47. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/data_writer_helpers.py +0 -0
  48. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/defaults.py +0 -0
  49. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/dummy_data.py +0 -0
  50. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/read_parquet_header.py +0 -0
  51. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s01_01_01_create_super_table.py +0 -0
  52. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s01_01_02_enable_mirroring_formats.py +0 -0
  53. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s01_02_create_roles.py +0 -0
  54. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s01_03_create_users.py +0 -0
  55. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_01_write_dummy_data.py +0 -0
  56. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_02_write_single_data.py +0 -0
  57. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_03_01_write_staging.py +0 -0
  58. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_03_02_create_pipe.py +0 -0
  59. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_04_01_write_monitoring_simple.py +0 -0
  60. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_04_02_write_monitoring_parallel.py +0 -0
  61. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s02_05_write_tombstone.py +0 -0
  62. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_01_read_data_error.py +0 -0
  63. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_02_01_read_super_data_ok.py +0 -0
  64. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_02_02_read_table_data_ok.py +0 -0
  65. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_03_read_meta.py +0 -0
  66. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_04_read_staging.py +0 -0
  67. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_06_01_read_roles.py +0 -0
  68. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_06_02_read_user.py +0 -0
  69. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_07_01_estimate_read.py +0 -0
  70. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_07_02_estimate_files.py +0 -0
  71. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s03_08_read_snapshot_history.py +0 -0
  72. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s04_01_03_delete_pipe.py +0 -0
  73. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s05_01_delete_table.py +0 -0
  74. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/quickstart/s05_02_delete_super_table.py +0 -0
  75. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/__init__.py +0 -0
  76. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/core.py +0 -0
  77. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/defaults.py +0 -0
  78. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/generate.py +0 -0
  79. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/load.py +0 -0
  80. {supertable-2.0.8 → supertable-2.1.0}/supertable/demo/webshop/topup.py +0 -0
  81. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/__init__.py +0 -0
  82. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/data_estimator.py +0 -0
  83. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/duckdb_lite.py +0 -0
  84. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/duckdb_pro.py +0 -0
  85. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/engine_common.py +0 -0
  86. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/engine_enum.py +0 -0
  87. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/executor.py +0 -0
  88. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/plan_stats.py +0 -0
  89. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/spark_thrift.py +0 -0
  90. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/tests/__init__.py +0 -0
  91. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/tests/conftest.py +0 -0
  92. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/tests/test_dedup_read.py +0 -0
  93. {supertable-2.0.8 → supertable-2.1.0}/supertable/engine/tests/test_engine.py +0 -0
  94. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/__init__.py +0 -0
  95. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/benchmarks/__init__.py +0 -0
  96. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/benchmarks/benchmark_locking.py +0 -0
  97. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/benchmarks/measure_lock_speed.py +0 -0
  98. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/benchmarks/measure_lock_time.py +0 -0
  99. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/file_lock.py +0 -0
  100. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/redis_lock.py +0 -0
  101. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/tests/__init__.py +0 -0
  102. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/tests/test_file_lock.py +0 -0
  103. {supertable-2.0.8 → supertable-2.1.0}/supertable/locking/tests/test_redis_lock.py +0 -0
  104. {supertable-2.0.8 → supertable-2.1.0}/supertable/logging.py +0 -0
  105. {supertable-2.0.8 → supertable-2.1.0}/supertable/meta_reader.py +0 -0
  106. {supertable-2.0.8 → supertable-2.1.0}/supertable/mirroring/__init__.py +0 -0
  107. {supertable-2.0.8 → supertable-2.1.0}/supertable/mirroring/mirror_delta.py +0 -0
  108. {supertable-2.0.8 → supertable-2.1.0}/supertable/mirroring/mirror_formats.py +0 -0
  109. {supertable-2.0.8 → supertable-2.1.0}/supertable/mirroring/mirror_iceberg.py +0 -0
  110. {supertable-2.0.8 → supertable-2.1.0}/supertable/mirroring/mirror_parquet.py +0 -0
  111. {supertable-2.0.8 → supertable-2.1.0}/supertable/monitoring_writer.py +0 -0
  112. {supertable-2.0.8 → supertable-2.1.0}/supertable/plan_extender.py +0 -0
  113. {supertable-2.0.8 → supertable-2.1.0}/supertable/processing.py +0 -0
  114. {supertable-2.0.8 → supertable-2.1.0}/supertable/query_plan_manager.py +0 -0
  115. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/__init__.py +0 -0
  116. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/access_control.py +0 -0
  117. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/filter_builder.py +0 -0
  118. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/permissions.py +0 -0
  119. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/role_manager.py +0 -0
  120. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/row_column_security.py +0 -0
  121. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/tests/test_filter_builder.py +0 -0
  122. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/tests/test_rbac.py +0 -0
  123. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/tests/test_rbac_per_table.py +0 -0
  124. {supertable-2.0.8 → supertable-2.1.0}/supertable/rbac/user_manager.py +0 -0
  125. {supertable-2.0.8 → supertable-2.1.0}/supertable/redis_catalog.py +0 -0
  126. {supertable-2.0.8 → supertable-2.1.0}/supertable/redis_connector.py +0 -0
  127. {supertable-2.0.8 → supertable-2.1.0}/supertable/redis_infra.py +0 -0
  128. {supertable-2.0.8 → supertable-2.1.0}/supertable/simple_table.py +0 -0
  129. {supertable-2.0.8 → supertable-2.1.0}/supertable/staging_area.py +0 -0
  130. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/__init__.py +0 -0
  131. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/azure_storage.py +0 -0
  132. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/gcp_storage.py +0 -0
  133. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/local_storage.py +0 -0
  134. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/minio_storage.py +0 -0
  135. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/s3_storage.py +0 -0
  136. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/storage_factory.py +0 -0
  137. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/storage_interface.py +0 -0
  138. {supertable-2.0.8 → supertable-2.1.0}/supertable/storage/tests/test_storage.py +0 -0
  139. {supertable-2.0.8 → supertable-2.1.0}/supertable/super_pipe.py +0 -0
  140. {supertable-2.0.8 → supertable-2.1.0}/supertable/super_table.py +0 -0
  141. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/__init__.py +0 -0
  142. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_align_to_schema_fix.py +0 -0
  143. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_data_reader.py +0 -0
  144. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_data_writer.py +0 -0
  145. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_data_writer_comprehensive.py +0 -0
  146. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_data_writer_tombstones.py +0 -0
  147. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_dedup_on_read_write.py +0 -0
  148. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_meta_reader.py +0 -0
  149. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_newer_than.py +0 -0
  150. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_process_delete_only.py +0 -0
  151. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_processing.py +0 -0
  152. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_query_sql.py +0 -0
  153. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_simple_table.py +0 -0
  154. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_small_file_compaction.py +0 -0
  155. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_super_table.py +0 -0
  156. {supertable-2.0.8 → supertable-2.1.0}/supertable/tests/test_supertable_all.py +0 -0
  157. {supertable-2.0.8 → supertable-2.1.0}/supertable/utils/__init__.py +0 -0
  158. {supertable-2.0.8 → supertable-2.1.0}/supertable/utils/helper.py +0 -0
  159. {supertable-2.0.8 → supertable-2.1.0}/supertable/utils/sql_parser.py +0 -0
  160. {supertable-2.0.8 → supertable-2.1.0}/supertable/utils/tests/test_sql_parser_columns.py +0 -0
  161. {supertable-2.0.8 → supertable-2.1.0}/supertable/utils/timer.py +0 -0
  162. {supertable-2.0.8 → supertable-2.1.0}/supertable.egg-info/SOURCES.txt +0 -0
  163. {supertable-2.0.8 → supertable-2.1.0}/supertable.egg-info/dependency_links.txt +0 -0
  164. {supertable-2.0.8 → supertable-2.1.0}/supertable.egg-info/entry_points.txt +0 -0
  165. {supertable-2.0.8 → supertable-2.1.0}/supertable.egg-info/requires.txt +0 -0
  166. {supertable-2.0.8 → supertable-2.1.0}/supertable.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supertable
3
- Version: 2.0.8
3
+ Version: 2.1.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>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "supertable"
7
- version = "2.0.8"
7
+ version = "2.1.0"
8
8
  description = "SuperTable — versioned data lake library for SQL analytics on Parquet + Redis."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -19,7 +19,7 @@ long_description = readme.read_text(encoding="utf-8") if readme.exists() else ""
19
19
 
20
20
  setup(
21
21
  name="supertable",
22
- version="2.0.8",
22
+ version="2.1.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",
@@ -25,7 +25,7 @@ See the ``supertable.demo`` package for runnable end-to-end demos and the
25
25
  project documentation for the full API surface.
26
26
  """
27
27
 
28
- __version__ = "2.0.8"
28
+ __version__ = "2.1.0"
29
29
 
30
30
  # Re-export the core public surface so users can do ``from supertable import …``
31
31
  # instead of remembering submodule paths.
@@ -152,15 +152,35 @@ _RECOGNISED_PREFIXES: FrozenSet[str] = frozenset(
152
152
  # Naming rules (regexes)
153
153
  # --------------------------------------------------------------------------- #
154
154
 
155
- # A sentinel is any name wrapped in underscores. Sentinels are reserved
156
- # across every user-supplied identifier (org, sup, simple, staging_name,
157
- # pipe_name, app_name, share_id, link_id, user_id, role_id, role_type,
158
- # instance_id).
155
+ # A sentinel is a *single*-underscore-wrapped name (e.g. ``_apps_``,
156
+ # ``_system_``). Sentinels are reserved across every user-supplied
157
+ # identifier (org, sup, simple, staging_name, pipe_name, app_name,
158
+ # share_id, link_id, user_id, role_id, role_type, instance_id).
159
+ #
160
+ # Note: this regex deliberately requires ``[a-z0-9]`` immediately
161
+ # after the leading underscore, so *double*-underscore-wrapped names
162
+ # (e.g. ``__data_quality__``) do NOT match. Double-underscore wrap is
163
+ # the SDK-internal-table convention — those names are allowed by
164
+ # ``_SAFE_SEGMENT`` below and hidden from user-facing feeds by the
165
+ # OData handler's shape detection.
159
166
  SENTINEL_RE: re.Pattern[str] = re.compile(r"^_[a-z0-9][a-z0-9_-]*_$")
160
167
 
161
- # The universal safe-segment regex. Constructors call ``_safe(label,
162
- # value)`` for every user-supplied segment.
163
- _SAFE_SEGMENT: re.Pattern[str] = re.compile(r"^[a-z0-9][a-z0-9_-]{0,63}$")
168
+ # Universal safe-segment regex used by every key constructor.
169
+ #
170
+ # Accepts either:
171
+ # * a plain identifier ``[a-z0-9][a-z0-9_-]{0,63}`` — the common case
172
+ # for user-supplied names (org, sup, simple table, staging, pipe,
173
+ # user_id, role_id, etc.), and
174
+ # * a *double*-underscore-wrapped name ``__[a-z0-9][a-z0-9_-]{0,59}__``
175
+ # — the convention for SDK-internal tables (e.g. ``__data_quality__``)
176
+ # that users normally would not create but the SDK needs to write to.
177
+ #
178
+ # Single-underscore-wrapped names (``_foo_``) match SENTINEL_RE and are
179
+ # rejected explicitly by ``_safe()``; they are reserved for SDK
180
+ # sentinels at fixed positions (``_apps_`` under ``dataisland:``).
181
+ _SAFE_SEGMENT: re.Pattern[str] = re.compile(
182
+ r"^(__[a-z0-9][a-z0-9_-]{0,59}__|[a-z0-9][a-z0-9_-]{0,63})$"
183
+ )
164
184
 
165
185
  # --------------------------------------------------------------------------- #
166
186
  # Explicit reservations
@@ -709,13 +729,13 @@ def linked_share_doc(org: str, sup: str, link_id: str) -> str:
709
729
  )
710
730
 
711
731
 
712
- # --- Data Quality (dataisland-core dq module owns its sub-structure) ----- #
732
+ # --- Data Quality (dataisland-core quality module owns its sub-structure) #
713
733
 
714
- def dq_prefix(org: str, sup: str) -> str:
734
+ def quality_prefix(org: str, sup: str) -> str:
715
735
  """Per-supertable data-quality namespace prefix (with trailing colon).
716
736
 
717
- The dataisland-core dq module appends its own sub-keys to this
718
- prefix (e.g. ``config:__global__``, ``rules:index``,
737
+ The dataisland-core quality module appends its own sub-keys to
738
+ this prefix (e.g. ``config:__global__``, ``rules:index``,
719
739
  ``rules:doc:{rule_id}``, ``schedule:{table}``, ``latest:{table}``,
720
740
  ``history``, ``pending:{table}``, ``running:{table}``,
721
741
  ``cooldown:{table}``, ``run-all-progress``).
@@ -725,7 +745,7 @@ def dq_prefix(org: str, sup: str) -> str:
725
745
  """
726
746
  return (
727
747
  f"{SUPERTABLE_PREFIX}:{_safe('org', org)}:{LAKES_SCOPE}"
728
- f":{_safe('sup', sup)}:dq:"
748
+ f":{_safe('sup', sup)}:quality:"
729
749
  )
730
750
 
731
751
 
@@ -124,7 +124,7 @@ def _all_helpers() -> list[tuple[str, str, str]]:
124
124
  # ---- Linked shares ---------------------------------------------
125
125
  ("linked_share_index", RK.linked_share_index(ORG, SUP), f"{lake_pre}:linked_shares:index"),
126
126
  ("linked_share_doc", RK.linked_share_doc(ORG, SUP, LINK), f"{lake_pre}:linked_shares:doc:{LINK}"),
127
- ("dq_prefix", RK.dq_prefix(ORG, SUP), f"{lake_pre}:dq:"),
127
+ ("quality_prefix", RK.quality_prefix(ORG, SUP), f"{lake_pre}:quality:"),
128
128
 
129
129
  # ---- Monitoring (org-level, closed set) ------------------------
130
130
  ("monitor", RK.monitor(ORG, "plans"), f"supertable:{ORG}:monitor:plans"),
@@ -256,7 +256,22 @@ def test_reserved_super_names_accepts_normal_names():
256
256
  # ---------------------------------------------------------------------------
257
257
 
258
258
  @pytest.mark.parametrize(
259
- "good", ["acme", "my-org", "tenant_1", "a", "abc123", "x" * 64]
259
+ "good",
260
+ [
261
+ "acme",
262
+ "my-org",
263
+ "tenant_1",
264
+ "a",
265
+ "abc123",
266
+ "x" * 64,
267
+ # Double-underscore-wrapped names are the SDK-internal-table
268
+ # convention (e.g. __data_quality__). _safe() accepts them so
269
+ # the SDK can write to internal tables; single-underscore
270
+ # sentinels (_apps_) are still rejected below.
271
+ "__data_quality__",
272
+ "__audit__",
273
+ "__a__",
274
+ ],
260
275
  )
261
276
  def test_safe_accepts_good_segments(good):
262
277
  assert RK._safe("test", good) == good
@@ -271,10 +286,12 @@ def test_safe_accepts_good_segments(good):
271
286
  "ac:me", # colon
272
287
  "ac/me", # slash
273
288
  "ac.me", # dot
274
- "_system_", # sentinel
289
+ "_system_", # sentinel (single-underscore-wrap)
275
290
  "_foo_", # sentinel
276
291
  "-leading-hyphen", # starts with hyphen
277
- "_leading", # starts with underscore (sentinel territory)
292
+ "_leading", # starts with single underscore (not wrapped)
293
+ "__leading", # starts with double underscore but no closing wrap
294
+ "____", # only underscores, no name body
278
295
  "x" * 65, # too long
279
296
  ]
280
297
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supertable
3
- Version: 2.0.8
3
+ Version: 2.1.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>
File without changes
File without changes
File without changes
File without changes