hotdata 0.11.0__tar.gz → 0.12.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 (302) hide show
  1. {hotdata-0.11.0 → hotdata-0.12.0}/PKG-INFO +32 -3
  2. {hotdata-0.11.0 → hotdata-0.12.0}/README.md +30 -1
  3. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/__init__.py +27 -1
  4. hotdata-0.12.0/hotdata/_workspace.py +84 -0
  5. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/connections_api.py +59 -294
  6. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/databases_api.py +1090 -191
  7. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/indexes_api.py +30 -27
  8. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/information_schema_api.py +3 -0
  9. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/jobs_api.py +18 -15
  10. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/query_api.py +5 -4
  11. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/results_api.py +12 -3
  12. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/uploads_api.py +9 -9
  13. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api_client.py +14 -0
  14. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/configuration.py +14 -2
  15. hotdata-0.12.0/hotdata/loads.py +273 -0
  16. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/__init__.py +6 -0
  17. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/add_managed_schema_request.py +4 -0
  18. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/add_managed_table_decl.py +8 -2
  19. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/add_managed_table_request.py +8 -2
  20. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/attach_database_catalog_request.py +4 -0
  21. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/batch_create_upload_request.py +4 -0
  22. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/bulk_create_databases_request.py +5 -1
  23. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_type_spec.py +4 -0
  24. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_connection_request.py +6 -4
  25. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_database_request.py +8 -2
  26. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_database_response.py +21 -3
  27. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_embedding_provider_request.py +4 -0
  28. hotdata-0.12.0/hotdata/models/create_index_request.py +189 -0
  29. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_saved_query_request.py +4 -0
  30. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_upload_request.py +6 -2
  31. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_workspace_request.py +4 -0
  32. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_default_schema_decl.py +4 -0
  33. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_default_table_decl.py +8 -2
  34. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_detail_response.py +13 -2
  35. hotdata-0.12.0/hotdata/models/database_lineage_response.py +114 -0
  36. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_summary.py +12 -1
  37. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/execute_saved_query_request.py +4 -0
  38. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/finalize_upload_part.py +4 -0
  39. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/finalize_upload_request.py +4 -0
  40. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/fork_database_request.py +12 -1
  41. hotdata-0.12.0/hotdata/models/forked_from_info.py +117 -0
  42. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/get_result_response.py +9 -2
  43. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/index_entry_response.py +12 -3
  44. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/index_info_response.py +33 -4
  45. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/information_schema_response.py +5 -5
  46. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/job_result.py +1 -1
  47. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/job_status.py +1 -1
  48. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/job_status_response.py +1 -1
  49. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/job_type.py +2 -0
  50. hotdata-0.12.0/hotdata/models/lineage_ancestor_info.py +119 -0
  51. hotdata-0.12.0/hotdata/models/lineage_fork_info.py +119 -0
  52. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/load_managed_table_request.py +6 -2
  53. hotdata-0.12.0/hotdata/models/managed_table_constant_per_key_response.py +94 -0
  54. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/mint_upload_parts_request.py +4 -0
  55. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/query_request.py +6 -2
  56. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/query_response.py +1 -1
  57. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/query_run_info.py +1 -1
  58. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/table_info.py +3 -1
  59. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/table_partition_key.py +4 -0
  60. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/table_sort_key.py +4 -0
  61. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/update_embedding_provider_request.py +4 -0
  62. hotdata-0.12.0/hotdata/models/update_managed_table_request.py +92 -0
  63. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/update_saved_query_request.py +4 -0
  64. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/upsert_database_context_request.py +4 -0
  65. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/workspace_usage_response.py +1 -1
  66. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/query.py +57 -6
  67. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata.egg-info/PKG-INFO +32 -3
  68. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata.egg-info/SOURCES.txt +19 -1
  69. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata.egg-info/requires.txt +1 -1
  70. {hotdata-0.11.0 → hotdata-0.12.0}/pyproject.toml +2 -2
  71. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_add_managed_schema_request.py +1 -0
  72. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_add_managed_table_decl.py +1 -0
  73. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_add_managed_table_request.py +1 -0
  74. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_batch_create_upload_request.py +2 -2
  75. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_bulk_create_databases_request.py +1 -0
  76. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_connections_api.py +3 -10
  77. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_connection_request.py +2 -3
  78. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_database_request.py +2 -0
  79. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_database_response.py +7 -0
  80. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_embedding_provider_request.py +1 -1
  81. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_index_request.py +5 -1
  82. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_default_schema_decl.py +1 -0
  83. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_default_table_decl.py +1 -0
  84. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_detail_response.py +6 -0
  85. hotdata-0.12.0/test/test_database_lineage_response.py +95 -0
  86. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_summary.py +6 -0
  87. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_databases_api.py +21 -0
  88. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_fork_database_request.py +1 -0
  89. hotdata-0.12.0/test/test_forked_from_info.py +57 -0
  90. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_get_result_response.py +2 -1
  91. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_index_entry_response.py +4 -0
  92. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_index_info_response.py +5 -1
  93. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_information_schema_response.py +6 -0
  94. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_job_result.py +4 -0
  95. hotdata-0.12.0/test/test_lineage_ancestor_info.py +59 -0
  96. hotdata-0.12.0/test/test_lineage_fork_info.py +59 -0
  97. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_databases_response.py +2 -0
  98. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_indexes_response.py +10 -2
  99. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_load_managed_table_request.py +1 -1
  100. hotdata-0.12.0/test/test_managed_table_constant_per_key_response.py +63 -0
  101. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_query_request.py +1 -1
  102. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_table_info.py +6 -0
  103. hotdata-0.12.0/test/test_update_managed_table_request.py +52 -0
  104. hotdata-0.12.0/tests/test_config_env.py +104 -0
  105. hotdata-0.12.0/tests/test_loads.py +254 -0
  106. hotdata-0.12.0/tests/test_model_extra_forbid.py +110 -0
  107. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_query.py +58 -1
  108. hotdata-0.12.0/tests/test_workspace_guard.py +160 -0
  109. hotdata-0.11.0/hotdata/models/create_index_request.py +0 -147
  110. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/_retry.py +0 -0
  111. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/_upload_watchdog.py +0 -0
  112. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/_useragent.py +0 -0
  113. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/__init__.py +0 -0
  114. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/database_context_api.py +0 -0
  115. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/embedding_providers_api.py +0 -0
  116. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/query_runs_api.py +0 -0
  117. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/saved_queries_api.py +0 -0
  118. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/usage_api.py +0 -0
  119. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api/workspaces_api.py +0 -0
  120. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/api_response.py +0 -0
  121. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/arrow.py +0 -0
  122. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/exceptions.py +0 -0
  123. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/api_error_detail.py +0 -0
  124. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/api_error_response.py +0 -0
  125. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/async_query_response.py +0 -0
  126. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/batch_create_upload_response.py +0 -0
  127. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/boolean_profile_detail.py +0 -0
  128. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/bulk_create_databases_result.py +0 -0
  129. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/categorical_profile_detail.py +0 -0
  130. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/category_value_info.py +0 -0
  131. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_definition.py +0 -0
  132. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_info.py +0 -0
  133. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail.py +0 -0
  134. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail_one_of.py +0 -0
  135. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail_one_of1.py +0 -0
  136. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail_one_of2.py +0 -0
  137. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail_one_of3.py +0 -0
  138. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_detail_one_of4.py +0 -0
  139. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/column_profile_info.py +0 -0
  140. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/connection_info.py +0 -0
  141. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_connection_response.py +0 -0
  142. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_embedding_provider_response.py +0 -0
  143. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/create_workspace_response.py +0 -0
  144. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_attachment_info.py +0 -0
  145. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_batch_response.py +0 -0
  146. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_context_entry.py +0 -0
  147. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/database_count_response.py +0 -0
  148. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/delete_database_batch_response.py +0 -0
  149. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/discovery_status.py +0 -0
  150. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/embedding_provider_response.py +0 -0
  151. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/error.py +0 -0
  152. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/finalize_upload_response.py +0 -0
  153. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/get_connection_response.py +0 -0
  154. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/get_database_context_response.py +0 -0
  155. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/index_status.py +0 -0
  156. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_connections_response.py +0 -0
  157. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_database_contexts_response.py +0 -0
  158. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_databases_response.py +0 -0
  159. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_embedding_providers_response.py +0 -0
  160. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_indexes_page_response.py +0 -0
  161. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_indexes_response.py +0 -0
  162. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_jobs_response.py +0 -0
  163. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_query_runs_response.py +0 -0
  164. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_results_response.py +0 -0
  165. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_saved_queries_response.py +0 -0
  166. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_saved_query_versions_response.py +0 -0
  167. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/list_workspaces_response.py +0 -0
  168. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/load_managed_table_response.py +0 -0
  169. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/managed_schema_response.py +0 -0
  170. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/managed_table_response.py +0 -0
  171. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/mint_upload_parts_response.py +0 -0
  172. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/minted_upload_part_response.py +0 -0
  173. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/numeric_profile_detail.py +0 -0
  174. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/result_info.py +0 -0
  175. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/results_format_query.py +0 -0
  176. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/saved_query_detail.py +0 -0
  177. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/saved_query_summary.py +0 -0
  178. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/saved_query_version_info.py +0 -0
  179. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/submit_job_response.py +0 -0
  180. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/table_profile_response.py +0 -0
  181. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/temporal_profile_detail.py +0 -0
  182. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/text_profile_detail.py +0 -0
  183. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/update_embedding_provider_response.py +0 -0
  184. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/upload_session_response.py +0 -0
  185. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/upsert_database_context_response.py +0 -0
  186. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/workspace_detail.py +0 -0
  187. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/models/workspace_list_item.py +0 -0
  188. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/py.typed +0 -0
  189. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/rest.py +0 -0
  190. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata/uploads.py +0 -0
  191. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata.egg-info/dependency_links.txt +0 -0
  192. {hotdata-0.11.0 → hotdata-0.12.0}/hotdata.egg-info/top_level.txt +0 -0
  193. {hotdata-0.11.0 → hotdata-0.12.0}/setup.cfg +0 -0
  194. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_api_client_close.py +0 -0
  195. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_api_error_detail.py +0 -0
  196. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_api_error_response.py +0 -0
  197. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_async_query_response.py +0 -0
  198. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_attach_database_catalog_request.py +0 -0
  199. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_batch_create_upload_response.py +0 -0
  200. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_boolean_profile_detail.py +0 -0
  201. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_bulk_create_databases_result.py +0 -0
  202. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_categorical_profile_detail.py +0 -0
  203. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_category_value_info.py +0 -0
  204. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_definition.py +0 -0
  205. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_info.py +0 -0
  206. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail.py +0 -0
  207. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail_one_of.py +0 -0
  208. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail_one_of1.py +0 -0
  209. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail_one_of2.py +0 -0
  210. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail_one_of3.py +0 -0
  211. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_detail_one_of4.py +0 -0
  212. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_profile_info.py +0 -0
  213. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_column_type_spec.py +0 -0
  214. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_connection_info.py +0 -0
  215. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_connection_response.py +0 -0
  216. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_embedding_provider_response.py +0 -0
  217. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_saved_query_request.py +0 -0
  218. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_upload_request.py +0 -0
  219. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_workspace_request.py +0 -0
  220. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_create_workspace_response.py +0 -0
  221. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_attachment_info.py +0 -0
  222. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_batch_response.py +0 -0
  223. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_context_api.py +0 -0
  224. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_context_entry.py +0 -0
  225. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_database_count_response.py +0 -0
  226. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_delete_database_batch_response.py +0 -0
  227. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_discovery_status.py +0 -0
  228. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_embedding_provider_response.py +0 -0
  229. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_embedding_providers_api.py +0 -0
  230. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_error.py +0 -0
  231. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_execute_saved_query_request.py +0 -0
  232. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_finalize_upload_part.py +0 -0
  233. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_finalize_upload_request.py +0 -0
  234. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_finalize_upload_response.py +0 -0
  235. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_get_connection_response.py +0 -0
  236. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_get_database_context_response.py +0 -0
  237. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_index_status.py +0 -0
  238. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_indexes_api.py +0 -0
  239. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_information_schema_api.py +0 -0
  240. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_job_status.py +0 -0
  241. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_job_status_response.py +0 -0
  242. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_job_type.py +0 -0
  243. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_jobs_api.py +0 -0
  244. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_connections_response.py +0 -0
  245. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_database_contexts_response.py +0 -0
  246. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_embedding_providers_response.py +0 -0
  247. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_indexes_page_response.py +0 -0
  248. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_jobs_response.py +0 -0
  249. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_query_runs_response.py +0 -0
  250. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_results_response.py +0 -0
  251. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_saved_queries_response.py +0 -0
  252. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_saved_query_versions_response.py +0 -0
  253. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_list_workspaces_response.py +0 -0
  254. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_load_managed_table_response.py +0 -0
  255. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_managed_schema_response.py +0 -0
  256. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_managed_table_response.py +0 -0
  257. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_mint_upload_parts_request.py +0 -0
  258. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_mint_upload_parts_response.py +0 -0
  259. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_minted_upload_part_response.py +0 -0
  260. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_numeric_profile_detail.py +0 -0
  261. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_query_api.py +0 -0
  262. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_query_response.py +0 -0
  263. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_query_run_info.py +0 -0
  264. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_query_runs_api.py +0 -0
  265. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_result_info.py +0 -0
  266. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_results_api.py +0 -0
  267. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_results_format_query.py +0 -0
  268. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_saved_queries_api.py +0 -0
  269. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_saved_query_detail.py +0 -0
  270. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_saved_query_summary.py +0 -0
  271. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_saved_query_version_info.py +0 -0
  272. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_submit_job_response.py +0 -0
  273. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_table_partition_key.py +0 -0
  274. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_table_profile_response.py +0 -0
  275. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_table_sort_key.py +0 -0
  276. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_temporal_profile_detail.py +0 -0
  277. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_text_profile_detail.py +0 -0
  278. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_update_embedding_provider_request.py +0 -0
  279. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_update_embedding_provider_response.py +0 -0
  280. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_update_saved_query_request.py +0 -0
  281. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_upload_session_response.py +0 -0
  282. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_uploads_api.py +0 -0
  283. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_upsert_database_context_request.py +0 -0
  284. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_upsert_database_context_response.py +0 -0
  285. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_usage_api.py +0 -0
  286. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_workspace_detail.py +0 -0
  287. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_workspace_list_item.py +0 -0
  288. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_workspace_usage_response.py +0 -0
  289. {hotdata-0.11.0 → hotdata-0.12.0}/test/test_workspaces_api.py +0 -0
  290. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_api_token_auth.py +0 -0
  291. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_arrow.py +0 -0
  292. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_config_auth_surface.py +0 -0
  293. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_request_defaults.py +0 -0
  294. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_retry.py +0 -0
  295. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_update_changelog.py +0 -0
  296. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_codex_fixes.py +0 -0
  297. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_multipart_resilient.py +0 -0
  298. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_parity_fixes.py +0 -0
  299. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_resilient.py +0 -0
  300. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_retry_policy.py +0 -0
  301. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_upload_watchdog.py +0 -0
  302. {hotdata-0.11.0 → hotdata-0.12.0}/tests/test_uploads.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hotdata
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: Hotdata API
5
5
  Author-email: Hotdata <developers@hotdata.dev>
6
6
  License: MIT
@@ -9,7 +9,7 @@ Project-URL: Repository, https://github.com/hotdata-dev/sdk-python
9
9
  Keywords: hotdata,api-client,data-platform
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: urllib3<3.0.0,>=2.7.0
12
+ Requires-Dist: urllib3<3.0.0,>=2.8.0
13
13
  Requires-Dist: python-dateutil>=2.8.2
14
14
  Requires-Dist: pydantic>=2.4.0
15
15
  Requires-Dist: typing-extensions>=4.7.1
@@ -55,7 +55,17 @@ configuration = hotdata.Configuration(
55
55
  )
56
56
  ```
57
57
 
58
- `host` defaults to `https://api.hotdata.dev`. Override it if you target another environment.
58
+ Each of these can come from the environment instead, the same variables the
59
+ CLI uses: `HOTDATA_API_KEY`, `HOTDATA_WORKSPACE` and `HOTDATA_API_URL` fill in
60
+ `api_key`, `workspace_id` and `host` when the argument is not passed. An
61
+ explicit argument always wins.
62
+
63
+ `host` defaults to `https://api.hotdata.dev`. Override it (or set
64
+ `HOTDATA_API_URL`) if you target another environment.
65
+
66
+ Almost every call is workspace-scoped. If no workspace id is configured, the
67
+ SDK raises `hotdata.MissingWorkspaceError` before sending the request rather
68
+ than letting the server answer with an unexplained 404.
59
69
 
60
70
  ## Usage
61
71
 
@@ -78,6 +88,25 @@ with hotdata.ApiClient(configuration) as api_client:
78
88
 
79
89
  Each `Api` class groups endpoints by resource. Construct the client, then call the typed methods you need.
80
90
 
91
+ ## Loading tables
92
+
93
+ Loads are serialised per table on the server. `hotdata.DatabasesApi` and
94
+ `hotdata.ConnectionsApi` retry a load that hits a table another load still
95
+ holds (HTTP 409, error code `RESOURCE_LOCKED`), honouring the server's
96
+ `Retry-After`, for up to 60s by default:
97
+
98
+ ```python
99
+ from hotdata import DatabasesApi, LoadRetryPolicy, TableLockedError
100
+
101
+ databases = DatabasesApi(api_client, load_retry=LoadRetryPolicy(deadline_s=120))
102
+ try:
103
+ databases.load_database_table(db_id, "public", "events", request)
104
+ except TableLockedError as e:
105
+ print(f"gave up after {e.attempts} attempts: {e.reason}")
106
+ ```
107
+
108
+ Other 409s (`CONFLICT`, `IDEMPOTENCY_KEY_CONFLICT`) are raised immediately.
109
+
81
110
  ## Arrow results
82
111
 
83
112
  Query results can be fetched as an [Apache Arrow](https://arrow.apache.org/) IPC stream instead of JSON, which is faster and far more memory-efficient for large result sets. Install the optional extra:
@@ -37,7 +37,17 @@ configuration = hotdata.Configuration(
37
37
  )
38
38
  ```
39
39
 
40
- `host` defaults to `https://api.hotdata.dev`. Override it if you target another environment.
40
+ Each of these can come from the environment instead, the same variables the
41
+ CLI uses: `HOTDATA_API_KEY`, `HOTDATA_WORKSPACE` and `HOTDATA_API_URL` fill in
42
+ `api_key`, `workspace_id` and `host` when the argument is not passed. An
43
+ explicit argument always wins.
44
+
45
+ `host` defaults to `https://api.hotdata.dev`. Override it (or set
46
+ `HOTDATA_API_URL`) if you target another environment.
47
+
48
+ Almost every call is workspace-scoped. If no workspace id is configured, the
49
+ SDK raises `hotdata.MissingWorkspaceError` before sending the request rather
50
+ than letting the server answer with an unexplained 404.
41
51
 
42
52
  ## Usage
43
53
 
@@ -60,6 +70,25 @@ with hotdata.ApiClient(configuration) as api_client:
60
70
 
61
71
  Each `Api` class groups endpoints by resource. Construct the client, then call the typed methods you need.
62
72
 
73
+ ## Loading tables
74
+
75
+ Loads are serialised per table on the server. `hotdata.DatabasesApi` and
76
+ `hotdata.ConnectionsApi` retry a load that hits a table another load still
77
+ holds (HTTP 409, error code `RESOURCE_LOCKED`), honouring the server's
78
+ `Retry-After`, for up to 60s by default:
79
+
80
+ ```python
81
+ from hotdata import DatabasesApi, LoadRetryPolicy, TableLockedError
82
+
83
+ databases = DatabasesApi(api_client, load_retry=LoadRetryPolicy(deadline_s=120))
84
+ try:
85
+ databases.load_database_table(db_id, "public", "events", request)
86
+ except TableLockedError as e:
87
+ print(f"gave up after {e.attempts} attempts: {e.reason}")
88
+ ```
89
+
90
+ Other 409s (`CONFLICT`, `IDEMPOTENCY_KEY_CONFLICT`) are raised immediately.
91
+
63
92
  ## Arrow results
64
93
 
65
94
  Query results can be fetched as an [Apache Arrow](https://arrow.apache.org/) IPC stream instead of JSON, which is faster and far more memory-efficient for large result sets. Install the optional extra:
@@ -90,6 +90,7 @@ __all__ = [
90
90
  "DatabaseDefaultSchemaDecl",
91
91
  "DatabaseDefaultTableDecl",
92
92
  "DatabaseDetailResponse",
93
+ "DatabaseLineageResponse",
93
94
  "DatabaseSummary",
94
95
  "DeleteDatabaseBatchResponse",
95
96
  "DiscoveryStatus",
@@ -100,6 +101,7 @@ __all__ = [
100
101
  "FinalizeUploadRequest",
101
102
  "FinalizeUploadResponse",
102
103
  "ForkDatabaseRequest",
104
+ "ForkedFromInfo",
103
105
  "GetConnectionResponse",
104
106
  "GetDatabaseContextResponse",
105
107
  "GetResultResponse",
@@ -111,6 +113,8 @@ __all__ = [
111
113
  "JobStatus",
112
114
  "JobStatusResponse",
113
115
  "JobType",
116
+ "LineageAncestorInfo",
117
+ "LineageForkInfo",
114
118
  "ListConnectionsResponse",
115
119
  "ListDatabaseContextsResponse",
116
120
  "ListDatabasesResponse",
@@ -126,6 +130,7 @@ __all__ = [
126
130
  "LoadManagedTableRequest",
127
131
  "LoadManagedTableResponse",
128
132
  "ManagedSchemaResponse",
133
+ "ManagedTableConstantPerKeyResponse",
129
134
  "ManagedTableResponse",
130
135
  "MintUploadPartsRequest",
131
136
  "MintUploadPartsResponse",
@@ -148,6 +153,7 @@ __all__ = [
148
153
  "TextProfileDetail",
149
154
  "UpdateEmbeddingProviderRequest",
150
155
  "UpdateEmbeddingProviderResponse",
156
+ "UpdateManagedTableRequest",
151
157
  "UpdateSavedQueryRequest",
152
158
  "UploadSessionResponse",
153
159
  "UpsertDatabaseContextRequest",
@@ -228,6 +234,7 @@ from hotdata.models.database_count_response import DatabaseCountResponse as Data
228
234
  from hotdata.models.database_default_schema_decl import DatabaseDefaultSchemaDecl as DatabaseDefaultSchemaDecl
229
235
  from hotdata.models.database_default_table_decl import DatabaseDefaultTableDecl as DatabaseDefaultTableDecl
230
236
  from hotdata.models.database_detail_response import DatabaseDetailResponse as DatabaseDetailResponse
237
+ from hotdata.models.database_lineage_response import DatabaseLineageResponse as DatabaseLineageResponse
231
238
  from hotdata.models.database_summary import DatabaseSummary as DatabaseSummary
232
239
  from hotdata.models.delete_database_batch_response import DeleteDatabaseBatchResponse as DeleteDatabaseBatchResponse
233
240
  from hotdata.models.discovery_status import DiscoveryStatus as DiscoveryStatus
@@ -238,6 +245,7 @@ from hotdata.models.finalize_upload_part import FinalizeUploadPart as FinalizeUp
238
245
  from hotdata.models.finalize_upload_request import FinalizeUploadRequest as FinalizeUploadRequest
239
246
  from hotdata.models.finalize_upload_response import FinalizeUploadResponse as FinalizeUploadResponse
240
247
  from hotdata.models.fork_database_request import ForkDatabaseRequest as ForkDatabaseRequest
248
+ from hotdata.models.forked_from_info import ForkedFromInfo as ForkedFromInfo
241
249
  from hotdata.models.get_connection_response import GetConnectionResponse as GetConnectionResponse
242
250
  from hotdata.models.get_database_context_response import GetDatabaseContextResponse as GetDatabaseContextResponse
243
251
  from hotdata.models.get_result_response import GetResultResponse as GetResultResponse
@@ -249,6 +257,8 @@ from hotdata.models.job_result import JobResult as JobResult
249
257
  from hotdata.models.job_status import JobStatus as JobStatus
250
258
  from hotdata.models.job_status_response import JobStatusResponse as JobStatusResponse
251
259
  from hotdata.models.job_type import JobType as JobType
260
+ from hotdata.models.lineage_ancestor_info import LineageAncestorInfo as LineageAncestorInfo
261
+ from hotdata.models.lineage_fork_info import LineageForkInfo as LineageForkInfo
252
262
  from hotdata.models.list_connections_response import ListConnectionsResponse as ListConnectionsResponse
253
263
  from hotdata.models.list_database_contexts_response import ListDatabaseContextsResponse as ListDatabaseContextsResponse
254
264
  from hotdata.models.list_databases_response import ListDatabasesResponse as ListDatabasesResponse
@@ -264,6 +274,7 @@ from hotdata.models.list_workspaces_response import ListWorkspacesResponse as Li
264
274
  from hotdata.models.load_managed_table_request import LoadManagedTableRequest as LoadManagedTableRequest
265
275
  from hotdata.models.load_managed_table_response import LoadManagedTableResponse as LoadManagedTableResponse
266
276
  from hotdata.models.managed_schema_response import ManagedSchemaResponse as ManagedSchemaResponse
277
+ from hotdata.models.managed_table_constant_per_key_response import ManagedTableConstantPerKeyResponse as ManagedTableConstantPerKeyResponse
267
278
  from hotdata.models.managed_table_response import ManagedTableResponse as ManagedTableResponse
268
279
  from hotdata.models.mint_upload_parts_request import MintUploadPartsRequest as MintUploadPartsRequest
269
280
  from hotdata.models.mint_upload_parts_response import MintUploadPartsResponse as MintUploadPartsResponse
@@ -286,6 +297,7 @@ from hotdata.models.temporal_profile_detail import TemporalProfileDetail as Temp
286
297
  from hotdata.models.text_profile_detail import TextProfileDetail as TextProfileDetail
287
298
  from hotdata.models.update_embedding_provider_request import UpdateEmbeddingProviderRequest as UpdateEmbeddingProviderRequest
288
299
  from hotdata.models.update_embedding_provider_response import UpdateEmbeddingProviderResponse as UpdateEmbeddingProviderResponse
300
+ from hotdata.models.update_managed_table_request import UpdateManagedTableRequest as UpdateManagedTableRequest
289
301
  from hotdata.models.update_saved_query_request import UpdateSavedQueryRequest as UpdateSavedQueryRequest
290
302
  from hotdata.models.upload_session_response import UploadSessionResponse as UploadSessionResponse
291
303
  from hotdata.models.upsert_database_context_request import UpsertDatabaseContextRequest as UpsertDatabaseContextRequest
@@ -300,10 +312,21 @@ from hotdata.models.workspace_usage_response import WorkspaceUsageResponse as Wo
300
312
  # hotdata.query.QueryApi adds 429 retry + truncation auto-follow;
301
313
  # hotdata.arrow.ResultsApi adds Arrow IPC result fetch;
302
314
  # hotdata.uploads.UploadsApi adds transparent presigned direct-to-storage
303
- # uploads. The raw generated classes remain importable from hotdata.api.*.
315
+ # uploads; hotdata.loads.DatabasesApi / ConnectionsApi retry table loads
316
+ # while another load holds the table (409 RESOURCE_LOCKED). The raw
317
+ # generated classes remain importable from hotdata.api.*.
304
318
  from hotdata.query import QueryApi as QueryApi # noqa: E402,F811
305
319
  from hotdata.arrow import ResultsApi as ResultsApi # noqa: E402,F811
306
320
  from hotdata.uploads import UploadsApi as UploadsApi # noqa: E402,F811
321
+ from hotdata.loads import DatabasesApi as DatabasesApi # noqa: E402,F811
322
+ from hotdata.loads import ConnectionsApi as ConnectionsApi # noqa: E402,F811
323
+ from hotdata.loads import ( # noqa: E402,F401
324
+ LoadRetryPolicy as LoadRetryPolicy,
325
+ TableLockedError as TableLockedError,
326
+ )
327
+ # Raised client-side (scripts/patch_workspace_guard.py) when a workspace-
328
+ # scoped call has no workspace id configured.
329
+ from hotdata._workspace import MissingWorkspaceError as MissingWorkspaceError # noqa: E402,F401
307
330
  # The upload error hierarchy + option/helper types, so `from hotdata import
308
331
  # UploadError` / `StorageError` / ... works (they otherwise live only under
309
332
  # hotdata.uploads and are invisible to autocomplete on `hotdata.`).
@@ -338,4 +361,7 @@ __all__ += [ # noqa: F405
338
361
  "UploadProgress",
339
362
  "UploadSource",
340
363
  "tqdm_progress",
364
+ "LoadRetryPolicy",
365
+ "TableLockedError",
366
+ "MissingWorkspaceError",
341
367
  ]
@@ -0,0 +1,84 @@
1
+ """Fail fast when a workspace-scoped request has no workspace to go to.
2
+
3
+ Most operations are scoped to a workspace through the ``X-Workspace-Id``
4
+ header (the ``WorkspaceId`` security scheme). The generated client simply
5
+ skips a scheme that has no configured value, so a ``Configuration`` built
6
+ without ``workspace_id`` sends the request anyway and the server answers with
7
+ a bare 404 that says nothing about what was missing.
8
+
9
+ :func:`ensure_workspace` runs before the request is sent (wired into
10
+ ``ApiClient.update_params_for_auth`` by ``scripts/patch_workspace_guard.py``)
11
+ and raises :class:`MissingWorkspaceError` naming the constructor argument and
12
+ the environment variable. Operations whose security does not list
13
+ ``WorkspaceId`` (workspace management itself) are unaffected, as are calls
14
+ that supply the header explicitly or override auth per request.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Iterable, Mapping, Optional
20
+
21
+ from hotdata.exceptions import ApiValueError
22
+
23
+ WORKSPACE_SCHEME = "WorkspaceId"
24
+ WORKSPACE_HEADER = "X-Workspace-Id"
25
+
26
+
27
+ class MissingWorkspaceError(ApiValueError):
28
+ """Raised before sending a workspace-scoped request when no workspace id
29
+ is configured.
30
+
31
+ Pass ``workspace_id=`` to :class:`hotdata.Configuration`, set the
32
+ ``HOTDATA_WORKSPACE`` environment variable, or send the ``X-Workspace-Id``
33
+ header explicitly for the call.
34
+ """
35
+
36
+ def __init__(self, resource_path: str, method: str) -> None:
37
+ self.resource_path = resource_path
38
+ self.method = method
39
+ super().__init__(
40
+ f"{method} {resource_path} is scoped to a workspace but no workspace id "
41
+ "is configured. Pass workspace_id=... to hotdata.Configuration(...), "
42
+ "set the HOTDATA_WORKSPACE environment variable, or send the "
43
+ f"{WORKSPACE_HEADER} header explicitly (_headers=...)."
44
+ )
45
+
46
+
47
+ def ensure_workspace(
48
+ configuration: Any,
49
+ auth_settings: Optional[Iterable[str]],
50
+ headers: Optional[Mapping[str, Any]],
51
+ resource_path: str,
52
+ method: str,
53
+ request_auth: Optional[Mapping[str, Any]] = None,
54
+ ) -> None:
55
+ """Raise :class:`MissingWorkspaceError` if the operation needs a workspace
56
+ id and none would be sent.
57
+
58
+ :param configuration: The client's :class:`hotdata.Configuration`.
59
+ :param auth_settings: The operation's security scheme names.
60
+ :param headers: Header params already assembled for the request.
61
+ :param request_auth: A per-request auth override; when given the
62
+ configuration is bypassed entirely, so the check is skipped.
63
+ """
64
+ if request_auth:
65
+ return
66
+ if not auth_settings or WORKSPACE_SCHEME not in auth_settings:
67
+ return
68
+ if headers and any(
69
+ str(name).lower() == WORKSPACE_HEADER.lower() for name in headers
70
+ ):
71
+ return
72
+ settings = configuration.auth_settings()
73
+ scheme = settings.get(WORKSPACE_SCHEME) if settings else None
74
+ if scheme and scheme.get("value"):
75
+ return
76
+ raise MissingWorkspaceError(resource_path, method)
77
+
78
+
79
+ __all__ = [
80
+ "WORKSPACE_HEADER",
81
+ "WORKSPACE_SCHEME",
82
+ "MissingWorkspaceError",
83
+ "ensure_workspace",
84
+ ]