honeycomb-api 0.1.0__py3-none-any.whl → 0.5.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. honeycomb/__init__.py +9 -0
  2. honeycomb/_generated/api/auth/get_auth.py +2 -5
  3. honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
  4. honeycomb/_generated/api/boards/create_board.py +6 -5
  5. honeycomb/_generated/api/boards/create_board_view.py +14 -9
  6. honeycomb/_generated/api/boards/delete_board.py +2 -5
  7. honeycomb/_generated/api/boards/delete_board_view.py +2 -5
  8. honeycomb/_generated/api/boards/get_board.py +2 -5
  9. honeycomb/_generated/api/boards/get_board_view.py +2 -5
  10. honeycomb/_generated/api/boards/list_board_views.py +10 -9
  11. honeycomb/_generated/api/boards/list_boards.py +2 -5
  12. honeycomb/_generated/api/boards/update_board.py +10 -5
  13. honeycomb/_generated/api/boards/update_board_view.py +2 -5
  14. honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
  15. honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
  16. honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
  17. honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
  18. honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
  19. honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
  20. honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
  21. honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
  22. honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
  23. honeycomb/_generated/api/columns/create_column.py +2 -5
  24. honeycomb/_generated/api/columns/delete_column.py +2 -5
  25. honeycomb/_generated/api/columns/get_column.py +2 -5
  26. honeycomb/_generated/api/columns/list_columns.py +2 -8
  27. honeycomb/_generated/api/columns/update_column.py +2 -5
  28. honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
  29. honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
  30. honeycomb/_generated/api/datasets/create_dataset.py +2 -5
  31. honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
  32. honeycomb/_generated/api/datasets/get_dataset.py +2 -5
  33. honeycomb/_generated/api/datasets/list_datasets.py +2 -5
  34. honeycomb/_generated/api/datasets/update_dataset.py +2 -5
  35. honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
  36. honeycomb/_generated/api/environments/create_environment.py +2 -5
  37. honeycomb/_generated/api/environments/delete_environment.py +2 -5
  38. honeycomb/_generated/api/environments/get_environment.py +2 -5
  39. honeycomb/_generated/api/environments/list_environments.py +2 -7
  40. honeycomb/_generated/api/environments/update_environment.py +2 -5
  41. honeycomb/_generated/api/events/create_event.py +2 -7
  42. honeycomb/_generated/api/events/create_events.py +7 -11
  43. honeycomb/_generated/api/key_management/create_api_key.py +2 -5
  44. honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
  45. honeycomb/_generated/api/key_management/get_api_key.py +2 -5
  46. honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
  47. honeycomb/_generated/api/key_management/update_api_key.py +2 -5
  48. honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
  49. honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
  50. honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
  51. honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
  52. honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
  53. honeycomb/_generated/api/markers/create_marker.py +2 -5
  54. honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
  55. honeycomb/_generated/api/markers/delete_marker.py +2 -5
  56. honeycomb/_generated/api/markers/get_marker.py +2 -5
  57. honeycomb/_generated/api/markers/update_marker.py +2 -5
  58. honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
  59. honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
  60. honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
  61. honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
  62. honeycomb/_generated/api/queries/create_query.py +2 -5
  63. honeycomb/_generated/api/queries/get_query.py +2 -5
  64. honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
  65. honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
  66. honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
  67. honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
  68. honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
  69. honeycomb/_generated/api/query_data/create_query_result.py +2 -5
  70. honeycomb/_generated/api/query_data/get_query_result.py +2 -5
  71. honeycomb/_generated/api/recipients/create_recipient.py +2 -6
  72. honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
  73. honeycomb/_generated/api/recipients/get_recipient.py +2 -6
  74. honeycomb/_generated/api/recipients/list_recipients.py +2 -6
  75. honeycomb/_generated/api/recipients/update_recipient.py +2 -6
  76. honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
  77. honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
  78. honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
  79. honeycomb/_generated/api/sl_os/create_slo.py +2 -5
  80. honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
  81. honeycomb/_generated/api/sl_os/get_slo.py +2 -8
  82. honeycomb/_generated/api/sl_os/list_slos.py +2 -5
  83. honeycomb/_generated/api/sl_os/update_slo.py +2 -5
  84. honeycomb/_generated/api/triggers/create_trigger.py +2 -6
  85. honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
  86. honeycomb/_generated/api/triggers/get_trigger.py +2 -5
  87. honeycomb/_generated/api/triggers/list_triggers.py +2 -5
  88. honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
  89. honeycomb/_generated/api/triggers/update_trigger.py +2 -5
  90. honeycomb/_generated/client.py +2 -5
  91. honeycomb/_generated/models/__init__.py +195 -88
  92. honeycomb/_generated/models/api_key_create_request.py +6 -5
  93. honeycomb/_generated/models/api_key_create_request_data.py +15 -11
  94. honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
  95. honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
  96. honeycomb/_generated/models/api_key_list_response.py +2 -5
  97. honeycomb/_generated/models/api_key_object.py +14 -14
  98. honeycomb/_generated/models/api_key_object_links.py +2 -9
  99. honeycomb/_generated/models/api_key_object_relationships.py +5 -9
  100. honeycomb/_generated/models/api_key_object_type.py +1 -0
  101. honeycomb/_generated/models/api_key_response.py +2 -3
  102. honeycomb/_generated/models/api_key_update_request.py +15 -17
  103. honeycomb/_generated/models/auth.py +2 -5
  104. honeycomb/_generated/models/auth_api_key_access.py +2 -9
  105. honeycomb/_generated/models/auth_environment.py +2 -9
  106. honeycomb/_generated/models/auth_team.py +2 -9
  107. honeycomb/_generated/models/auth_type.py +1 -0
  108. honeycomb/_generated/models/auth_v2_response.py +5 -8
  109. honeycomb/_generated/models/auth_v2_response_data.py +14 -11
  110. honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
  111. honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
  112. honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
  113. honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
  114. honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
  115. honeycomb/_generated/models/base_trigger.py +21 -18
  116. honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
  117. honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
  118. honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
  119. honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
  120. honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
  121. honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
  122. honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
  123. honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
  124. honeycomb/_generated/models/base_trigger_threshold.py +2 -9
  125. honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
  126. honeycomb/_generated/models/batch_event.py +2 -5
  127. honeycomb/_generated/models/board.py +15 -17
  128. honeycomb/_generated/models/board_layout_generation.py +1 -0
  129. honeycomb/_generated/models/board_links.py +2 -9
  130. honeycomb/_generated/models/board_panel_position.py +2 -9
  131. honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
  132. honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
  133. honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
  134. honeycomb/_generated/models/board_type.py +1 -0
  135. honeycomb/_generated/models/board_view_filter.py +2 -9
  136. honeycomb/_generated/models/board_view_filter_operation.py +1 -0
  137. honeycomb/_generated/models/board_view_response.py +2 -5
  138. honeycomb/_generated/models/budget_rate.py +4 -12
  139. honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
  140. honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
  141. honeycomb/_generated/models/calculated_field.py +2 -9
  142. honeycomb/_generated/models/configuration_key_attributes.py +16 -12
  143. honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
  144. honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
  145. honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
  146. honeycomb/_generated/models/configuration_key_request.py +101 -0
  147. honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
  148. honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
  149. honeycomb/_generated/models/configuration_key_request_type.py +8 -0
  150. honeycomb/_generated/models/create_board_view_request.py +2 -3
  151. honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
  152. honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
  153. honeycomb/_generated/models/create_column.py +2 -9
  154. honeycomb/_generated/models/create_column_type.py +1 -0
  155. honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
  156. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
  157. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
  158. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
  159. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  160. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  161. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  162. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  163. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  164. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  165. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  166. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  167. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
  168. honeycomb/_generated/models/create_environment_request.py +8 -6
  169. honeycomb/_generated/models/create_environment_request_data.py +10 -7
  170. honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
  171. honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
  172. honeycomb/_generated/models/create_events_content_encoding.py +1 -0
  173. honeycomb/_generated/models/create_events_response_200_item.py +2 -9
  174. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
  175. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
  176. honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
  177. honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
  178. honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
  179. honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
  180. honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
  181. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
  182. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
  183. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  184. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  185. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  186. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  187. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  188. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  189. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  190. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  191. honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
  192. honeycomb/_generated/models/create_query_result_request.py +2 -9
  193. honeycomb/_generated/models/dataset.py +2 -6
  194. honeycomb/_generated/models/dataset_creation_payload.py +2 -9
  195. honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
  196. honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
  197. honeycomb/_generated/models/dataset_definitions.py +2 -6
  198. honeycomb/_generated/models/dataset_relationship.py +2 -3
  199. honeycomb/_generated/models/dataset_relationship_data.py +2 -8
  200. honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
  201. honeycomb/_generated/models/dataset_settings.py +2 -9
  202. honeycomb/_generated/models/dataset_update_payload.py +8 -8
  203. honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
  204. honeycomb/_generated/models/detailed_error.py +2 -9
  205. honeycomb/_generated/models/email_recipient.py +4 -7
  206. honeycomb/_generated/models/email_recipient_details.py +1 -7
  207. honeycomb/_generated/models/email_recipient_type.py +1 -0
  208. honeycomb/_generated/models/environment.py +6 -7
  209. honeycomb/_generated/models/environment_attributes.py +11 -9
  210. honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
  211. honeycomb/_generated/models/environment_attributes_settings.py +1 -7
  212. honeycomb/_generated/models/environment_color.py +1 -0
  213. honeycomb/_generated/models/environment_links.py +1 -7
  214. honeycomb/_generated/models/environment_list_response.py +2 -5
  215. honeycomb/_generated/models/environment_relationship.py +8 -6
  216. honeycomb/_generated/models/environment_relationship_data.py +3 -8
  217. honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
  218. honeycomb/_generated/models/environment_response.py +2 -3
  219. honeycomb/_generated/models/environment_type.py +1 -0
  220. honeycomb/_generated/models/error.py +2 -9
  221. honeycomb/_generated/models/event.py +2 -8
  222. honeycomb/_generated/models/exhaustion_time.py +4 -12
  223. honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
  224. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
  225. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
  226. honeycomb/_generated/models/filter_op.py +1 -0
  227. honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
  228. honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
  229. honeycomb/_generated/models/having_calculate_op.py +1 -0
  230. honeycomb/_generated/models/having_op.py +1 -0
  231. honeycomb/_generated/models/included_resource.py +6 -7
  232. honeycomb/_generated/models/included_resource_attributes.py +1 -7
  233. honeycomb/_generated/models/ingest_key_attributes.py +14 -11
  234. honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
  235. honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
  236. honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
  237. honeycomb/_generated/models/ingest_key_request.py +100 -0
  238. honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
  239. honeycomb/_generated/models/ingest_key_request_type.py +8 -0
  240. honeycomb/_generated/models/ingest_key_type.py +2 -9
  241. honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
  242. honeycomb/_generated/models/jsonapi_error_source.py +2 -9
  243. honeycomb/_generated/models/kinesis_event.py +2 -5
  244. honeycomb/_generated/models/kinesis_event_record.py +2 -9
  245. honeycomb/_generated/models/kinesis_response.py +2 -9
  246. honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
  247. honeycomb/_generated/models/map_dependency.py +2 -5
  248. honeycomb/_generated/models/map_node.py +2 -9
  249. honeycomb/_generated/models/map_node_type.py +1 -0
  250. honeycomb/_generated/models/marker.py +2 -9
  251. honeycomb/_generated/models/marker_create_request.py +2 -3
  252. honeycomb/_generated/models/marker_create_request_data.py +16 -10
  253. honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
  254. honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
  255. honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
  256. honeycomb/_generated/models/marker_object.py +7 -8
  257. honeycomb/_generated/models/marker_object_attributes.py +8 -8
  258. honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
  259. honeycomb/_generated/models/marker_object_links.py +2 -9
  260. honeycomb/_generated/models/marker_object_relationships.py +8 -8
  261. honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
  262. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
  263. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
  264. honeycomb/_generated/models/marker_object_type.py +1 -0
  265. honeycomb/_generated/models/marker_response.py +2 -3
  266. honeycomb/_generated/models/marker_setting.py +2 -10
  267. honeycomb/_generated/models/marker_update_request.py +2 -3
  268. honeycomb/_generated/models/marker_update_request_data.py +16 -10
  269. honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
  270. honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
  271. honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
  272. honeycomb/_generated/models/ms_teams_recipient.py +4 -7
  273. honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
  274. honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
  275. honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
  276. honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
  277. honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
  278. honeycomb/_generated/models/notification_recipient.py +8 -8
  279. honeycomb/_generated/models/notification_recipient_details.py +10 -9
  280. honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
  281. honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
  282. honeycomb/_generated/models/pager_duty_recipient.py +8 -9
  283. honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
  284. honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
  285. honeycomb/_generated/models/pagination_links.py +2 -8
  286. honeycomb/_generated/models/payload_template.py +2 -9
  287. honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
  288. honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
  289. honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
  290. honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
  291. honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
  292. honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
  293. honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
  294. honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
  295. honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
  296. honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
  297. honeycomb/_generated/models/preset_filter.py +1 -7
  298. honeycomb/_generated/models/query.py +11 -11
  299. honeycomb/_generated/models/query_annotation.py +4 -12
  300. honeycomb/_generated/models/query_annotation_source.py +1 -0
  301. honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
  302. honeycomb/_generated/models/query_calculations_item.py +2 -10
  303. honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
  304. honeycomb/_generated/models/query_filter_combination.py +1 -0
  305. honeycomb/_generated/models/query_filters_item.py +2 -11
  306. honeycomb/_generated/models/query_havings_item.py +2 -10
  307. honeycomb/_generated/models/query_op.py +1 -0
  308. honeycomb/_generated/models/query_orders_item.py +2 -9
  309. honeycomb/_generated/models/query_orders_item_order.py +1 -0
  310. honeycomb/_generated/models/query_panel.py +2 -6
  311. honeycomb/_generated/models/query_panel_query_panel.py +10 -9
  312. honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
  313. honeycomb/_generated/models/query_result.py +2 -5
  314. honeycomb/_generated/models/query_result_details.py +5 -8
  315. honeycomb/_generated/models/query_result_details_data.py +5 -8
  316. honeycomb/_generated/models/query_result_details_links.py +2 -9
  317. honeycomb/_generated/models/query_result_links.py +2 -9
  318. honeycomb/_generated/models/query_results_data.py +2 -5
  319. honeycomb/_generated/models/query_results_data_data.py +2 -8
  320. honeycomb/_generated/models/query_results_series.py +2 -5
  321. honeycomb/_generated/models/recipient_properties.py +4 -12
  322. honeycomb/_generated/models/recipient_type.py +1 -0
  323. honeycomb/_generated/models/slack_recipient.py +4 -7
  324. honeycomb/_generated/models/slack_recipient_details.py +1 -7
  325. honeycomb/_generated/models/slack_recipient_type.py +1 -0
  326. honeycomb/_generated/models/slo.py +4 -8
  327. honeycomb/_generated/models/slo_create.py +4 -8
  328. honeycomb/_generated/models/slo_create_sli.py +1 -7
  329. honeycomb/_generated/models/slo_detailed_response.py +4 -8
  330. honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
  331. honeycomb/_generated/models/slo_history.py +2 -9
  332. honeycomb/_generated/models/slo_history_request.py +2 -8
  333. honeycomb/_generated/models/slo_history_response.py +2 -3
  334. honeycomb/_generated/models/slo_panel.py +2 -6
  335. honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
  336. honeycomb/_generated/models/slo_sli.py +1 -7
  337. honeycomb/_generated/models/tag.py +1 -7
  338. honeycomb/_generated/models/team_relationship.py +2 -3
  339. honeycomb/_generated/models/team_relationship_team.py +6 -5
  340. honeycomb/_generated/models/team_relationship_team_data.py +3 -8
  341. honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
  342. honeycomb/_generated/models/template_variable_definition.py +2 -9
  343. honeycomb/_generated/models/text_panel.py +2 -6
  344. honeycomb/_generated/models/text_panel_text_panel.py +1 -7
  345. honeycomb/_generated/models/trigger_response.py +27 -21
  346. honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
  347. honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
  348. honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
  349. honeycomb/_generated/models/update_board_view_request.py +2 -5
  350. honeycomb/_generated/models/update_environment_request.py +8 -6
  351. honeycomb/_generated/models/update_environment_request_data.py +10 -7
  352. honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
  353. honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
  354. honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
  355. honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
  356. honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
  357. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
  358. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
  359. honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
  360. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
  361. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
  362. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
  363. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
  364. honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
  365. honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
  366. honeycomb/_generated/models/user_relationship.py +2 -3
  367. honeycomb/_generated/models/user_relationship_data.py +2 -8
  368. honeycomb/_generated/models/user_relationship_data_type.py +1 -0
  369. honeycomb/_generated/models/validation_error.py +8 -8
  370. honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
  371. honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
  372. honeycomb/_generated/models/webhook_header.py +2 -9
  373. honeycomb/_generated/models/webhook_recipient.py +4 -7
  374. honeycomb/_generated/models/webhook_recipient_details.py +8 -8
  375. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
  376. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
  377. honeycomb/_generated/models/webhook_recipient_type.py +1 -0
  378. honeycomb/_generated/types.py +1 -1
  379. honeycomb/cli/__init__.py +85 -0
  380. honeycomb/cli/api_keys.py +205 -0
  381. honeycomb/cli/auth.py +70 -0
  382. honeycomb/cli/boards.py +203 -0
  383. honeycomb/cli/columns.py +256 -0
  384. honeycomb/cli/config.py +259 -0
  385. honeycomb/cli/datasets.py +186 -0
  386. honeycomb/cli/derived_columns.py +222 -0
  387. honeycomb/cli/environments.py +240 -0
  388. honeycomb/cli/formatters.py +242 -0
  389. honeycomb/cli/markers.py +151 -0
  390. honeycomb/cli/queries.py +380 -0
  391. honeycomb/cli/recipients.py +211 -0
  392. honeycomb/cli/slos.py +338 -0
  393. honeycomb/cli/triggers.py +271 -0
  394. honeycomb/client.py +13 -7
  395. honeycomb/models/__init__.py +18 -3
  396. honeycomb/models/api_keys.py +49 -5
  397. honeycomb/models/auth.py +71 -0
  398. honeycomb/models/board_builder.py +97 -25
  399. honeycomb/models/boards.py +95 -1
  400. honeycomb/models/datasets.py +42 -0
  401. honeycomb/models/queries.py +21 -0
  402. honeycomb/models/query_builder.py +119 -59
  403. honeycomb/models/recipient_builder.py +51 -4
  404. honeycomb/models/slo_builder.py +24 -19
  405. honeycomb/models/slos.py +50 -3
  406. honeycomb/models/tool_inputs.py +630 -0
  407. honeycomb/models/triggers.py +39 -9
  408. honeycomb/resources/__init__.py +2 -0
  409. honeycomb/resources/api_keys.py +66 -29
  410. honeycomb/resources/auth.py +97 -0
  411. honeycomb/resources/boards.py +272 -18
  412. honeycomb/resources/datasets.py +49 -11
  413. honeycomb/resources/environments.py +54 -31
  414. honeycomb/resources/slos.py +87 -61
  415. honeycomb/tools/__main__.py +40 -4
  416. honeycomb/tools/builders.py +235 -150
  417. honeycomb/tools/descriptions.py +175 -7
  418. honeycomb/tools/executor.py +212 -25
  419. honeycomb/tools/generator.py +61 -2264
  420. honeycomb/tools/resources/__init__.py +42 -0
  421. honeycomb/tools/resources/api_keys.py +249 -0
  422. honeycomb/tools/resources/auth.py +98 -0
  423. honeycomb/tools/resources/boards.py +313 -0
  424. honeycomb/tools/resources/burn_alerts.py +278 -0
  425. honeycomb/tools/resources/columns.py +257 -0
  426. honeycomb/tools/resources/datasets.py +215 -0
  427. honeycomb/tools/resources/derived_columns.py +311 -0
  428. honeycomb/tools/resources/environments.py +211 -0
  429. honeycomb/tools/resources/events.py +158 -0
  430. honeycomb/tools/resources/marker_settings.py +216 -0
  431. honeycomb/tools/resources/markers.py +197 -0
  432. honeycomb/tools/resources/queries.py +220 -0
  433. honeycomb/tools/resources/recipients.py +297 -0
  434. honeycomb/tools/resources/service_map.py +110 -0
  435. honeycomb/tools/resources/slos.py +276 -0
  436. honeycomb/tools/resources/triggers.py +328 -0
  437. honeycomb/tools/schemas.py +81 -0
  438. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
  439. honeycomb_api-0.5.3.dist-info/RECORD +497 -0
  440. honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
  441. honeycomb_api-0.1.0.dist-info/RECORD +0 -453
  442. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
  443. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/licenses/LICENSE +0 -0
@@ -2,9 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import builtins
5
6
  from typing import TYPE_CHECKING, Any
6
7
 
7
- from ..models.boards import Board, BoardCreate
8
+ from ..models.boards import Board, BoardCreate, BoardView, BoardViewCreate
9
+ from ..models.tool_inputs import PositionInput
8
10
  from .base import BaseResource
9
11
 
10
12
  if TYPE_CHECKING:
@@ -37,6 +39,13 @@ class BoardsResource(BaseResource):
37
39
  return f"{base}/{board_id}"
38
40
  return base
39
41
 
42
+ def _build_view_path(self, board_id: str, view_id: str | None = None) -> str:
43
+ """Build API path for board views."""
44
+ base = f"/1/boards/{board_id}/views"
45
+ if view_id:
46
+ return f"{base}/{view_id}"
47
+ return base
48
+
40
49
  # -------------------------------------------------------------------------
41
50
  # Async methods
42
51
  # -------------------------------------------------------------------------
@@ -96,17 +105,21 @@ class BoardsResource(BaseResource):
96
105
  await self._delete_async(self._build_path(board_id))
97
106
 
98
107
  async def create_from_bundle_async(self, bundle: BoardBundle) -> Board:
99
- """Create board from BoardBundle with automatic query creation.
108
+ """Create board from BoardBundle with automatic query and view creation.
100
109
 
101
110
  Orchestrates:
102
111
  1. Create queries + annotations from QueryBuilder instances
103
112
  2. Assemble all panel configurations
104
113
  3. Create board with all panels
114
+ 4. Create views for the board (if any)
105
115
 
106
116
  Panels are added to the board in the order they appear in the bundle:
107
117
  - Auto-layout: Honeycomb arranges panels in this order
108
118
  - Manual-layout: Respects explicit positions
109
119
 
120
+ If view creation fails, a warning is issued but the board creation succeeds.
121
+ Views can be created manually later using create_view_async().
122
+
110
123
  Args:
111
124
  bundle: BoardBundle from BoardBuilder.build()
112
125
 
@@ -123,6 +136,7 @@ class BoardsResource(BaseResource):
123
136
  ... .last_1_hour()
124
137
  ... .count()
125
138
  ... )
139
+ ... .add_view("Active Only", [{"column": "status", "operation": "=", "value": "active"}])
126
140
  ... .build()
127
141
  ... )
128
142
  """
@@ -194,13 +208,31 @@ class BoardsResource(BaseResource):
194
208
  preset_filters=bundle.preset_filters,
195
209
  )
196
210
 
197
- return await self.create_async(board_create)
211
+ board = await self.create_async(board_create)
212
+
213
+ # Create views after board creation
214
+ if bundle.views:
215
+ import warnings
216
+
217
+ for view_create in bundle.views:
218
+ try:
219
+ await self.create_view_async(board.id, view_create)
220
+ except Exception as e:
221
+ # Log but don't fail - board was created successfully
222
+ # User can retry view creation manually
223
+ warnings.warn(
224
+ f"Failed to create view '{view_create.name}' for board '{board.id}': {e}",
225
+ UserWarning,
226
+ stacklevel=2,
227
+ )
228
+
229
+ return board
198
230
 
199
231
  def _build_query_panel_dict(
200
232
  self,
201
233
  query_id: str,
202
234
  annotation_id: str,
203
- position: tuple[int, int, int, int] | None,
235
+ position: PositionInput | None,
204
236
  style: str,
205
237
  visualization: dict[str, Any] | None,
206
238
  ) -> dict[str, Any]:
@@ -220,45 +252,124 @@ class BoardsResource(BaseResource):
220
252
  }
221
253
  if position:
222
254
  panel["position"] = {
223
- "x_coordinate": position[0],
224
- "y_coordinate": position[1],
225
- "width": position[2],
226
- "height": position[3],
255
+ "x_coordinate": position.x_coordinate,
256
+ "y_coordinate": position.y_coordinate,
257
+ "width": position.width,
258
+ "height": position.height,
227
259
  }
228
260
  return panel
229
261
 
230
262
  def _build_slo_panel_dict(
231
263
  self,
232
264
  slo_id: str,
233
- position: tuple[int, int, int, int] | None,
265
+ position: PositionInput | None,
234
266
  ) -> dict[str, Any]:
235
267
  """Build SLO panel dictionary for API."""
236
268
  panel = {"type": "slo", "slo_panel": {"slo_id": slo_id}}
237
269
  if position:
238
270
  panel["position"] = {
239
- "x_coordinate": position[0],
240
- "y_coordinate": position[1],
241
- "width": position[2],
242
- "height": position[3],
271
+ "x_coordinate": position.x_coordinate,
272
+ "y_coordinate": position.y_coordinate,
273
+ "width": position.width,
274
+ "height": position.height,
243
275
  }
244
276
  return panel
245
277
 
246
278
  def _build_text_panel_dict(
247
279
  self,
248
280
  content: str,
249
- position: tuple[int, int, int, int] | None,
281
+ position: PositionInput | None,
250
282
  ) -> dict[str, Any]:
251
283
  """Build text panel dictionary for API."""
252
284
  panel = {"type": "text", "text_panel": {"content": content}}
253
285
  if position:
254
286
  panel["position"] = {
255
- "x_coordinate": position[0],
256
- "y_coordinate": position[1],
257
- "width": position[2],
258
- "height": position[3],
287
+ "x_coordinate": position.x_coordinate,
288
+ "y_coordinate": position.y_coordinate,
289
+ "width": position.width,
290
+ "height": position.height,
259
291
  }
260
292
  return panel
261
293
 
294
+ # -------------------------------------------------------------------------
295
+ # Board View Methods - Async
296
+ # -------------------------------------------------------------------------
297
+
298
+ async def list_views_async(self, board_id: str) -> list[BoardView]:
299
+ """List all views for a board (async).
300
+
301
+ Args:
302
+ board_id: Board ID.
303
+
304
+ Returns:
305
+ List of BoardView objects (max 50 per board).
306
+ """
307
+ data = await self._get_async(self._build_view_path(board_id))
308
+ return self._parse_model_list(BoardView, data)
309
+
310
+ async def get_view_async(self, board_id: str, view_id: str) -> BoardView:
311
+ """Get a specific board view (async).
312
+
313
+ Args:
314
+ board_id: Board ID.
315
+ view_id: View ID.
316
+
317
+ Returns:
318
+ BoardView object.
319
+ """
320
+ data = await self._get_async(self._build_view_path(board_id, view_id))
321
+ return self._parse_model(BoardView, data)
322
+
323
+ async def create_view_async(self, board_id: str, view: BoardViewCreate) -> BoardView:
324
+ """Create a new board view (async).
325
+
326
+ Args:
327
+ board_id: Board ID.
328
+ view: View configuration.
329
+
330
+ Returns:
331
+ Created BoardView object.
332
+
333
+ Note:
334
+ Each board is limited to 50 views maximum.
335
+ """
336
+ data = await self._post_async(
337
+ self._build_view_path(board_id),
338
+ json=view.model_dump_for_api(),
339
+ )
340
+ return self._parse_model(BoardView, data)
341
+
342
+ async def update_view_async(
343
+ self,
344
+ board_id: str,
345
+ view_id: str,
346
+ view: BoardViewCreate,
347
+ ) -> BoardView:
348
+ """Update an existing board view (async).
349
+
350
+ Args:
351
+ board_id: Board ID.
352
+ view_id: View ID.
353
+ view: Updated view configuration.
354
+
355
+ Returns:
356
+ Updated BoardView object.
357
+ """
358
+ data = await self._put_async(
359
+ self._build_view_path(board_id, view_id),
360
+ json=view.model_dump_for_api(),
361
+ )
362
+ return self._parse_model(BoardView, data)
363
+
364
+ async def delete_view_async(self, board_id: str, view_id: str) -> None:
365
+ """Delete a board view (async).
366
+
367
+ Args:
368
+ board_id: Board ID.
369
+ view_id: View ID.
370
+ """
371
+ await self._delete_async(self._build_view_path(board_id, view_id))
372
+
262
373
  # -------------------------------------------------------------------------
263
374
  # Sync methods
264
375
  # -------------------------------------------------------------------------
@@ -348,3 +459,146 @@ class BoardsResource(BaseResource):
348
459
  import asyncio
349
460
 
350
461
  return asyncio.run(self.create_from_bundle_async(bundle))
462
+
463
+ # -------------------------------------------------------------------------
464
+ # Board View Methods - Sync
465
+ # -------------------------------------------------------------------------
466
+
467
+ def list_views(self, board_id: str) -> builtins.list[BoardView]:
468
+ """List all views for a board.
469
+
470
+ Args:
471
+ board_id: Board ID.
472
+
473
+ Returns:
474
+ List of BoardView objects (max 50 per board).
475
+ """
476
+ if not self._client.is_sync:
477
+ raise RuntimeError("Use list_views_async() for async mode, or pass sync=True to client")
478
+ data = self._get_sync(self._build_view_path(board_id))
479
+ return self._parse_model_list(BoardView, data)
480
+
481
+ def get_view(self, board_id: str, view_id: str) -> BoardView:
482
+ """Get a specific board view.
483
+
484
+ Args:
485
+ board_id: Board ID.
486
+ view_id: View ID.
487
+
488
+ Returns:
489
+ BoardView object.
490
+ """
491
+ if not self._client.is_sync:
492
+ raise RuntimeError("Use get_view_async() for async mode, or pass sync=True to client")
493
+ data = self._get_sync(self._build_view_path(board_id, view_id))
494
+ return self._parse_model(BoardView, data)
495
+
496
+ def create_view(self, board_id: str, view: BoardViewCreate) -> BoardView:
497
+ """Create a new board view.
498
+
499
+ Args:
500
+ board_id: Board ID.
501
+ view: View configuration.
502
+
503
+ Returns:
504
+ Created BoardView object.
505
+
506
+ Note:
507
+ Each board is limited to 50 views maximum.
508
+ """
509
+ if not self._client.is_sync:
510
+ raise RuntimeError(
511
+ "Use create_view_async() for async mode, or pass sync=True to client"
512
+ )
513
+ data = self._post_sync(
514
+ self._build_view_path(board_id),
515
+ json=view.model_dump_for_api(),
516
+ )
517
+ return self._parse_model(BoardView, data)
518
+
519
+ def update_view(self, board_id: str, view_id: str, view: BoardViewCreate) -> BoardView:
520
+ """Update an existing board view.
521
+
522
+ Args:
523
+ board_id: Board ID.
524
+ view_id: View ID.
525
+ view: Updated view configuration.
526
+
527
+ Returns:
528
+ Updated BoardView object.
529
+ """
530
+ if not self._client.is_sync:
531
+ raise RuntimeError(
532
+ "Use update_view_async() for async mode, or pass sync=True to client"
533
+ )
534
+ data = self._put_sync(
535
+ self._build_view_path(board_id, view_id),
536
+ json=view.model_dump_for_api(),
537
+ )
538
+ return self._parse_model(BoardView, data)
539
+
540
+ def delete_view(self, board_id: str, view_id: str) -> None:
541
+ """Delete a board view.
542
+
543
+ Args:
544
+ board_id: Board ID.
545
+ view_id: View ID.
546
+ """
547
+ if not self._client.is_sync:
548
+ raise RuntimeError(
549
+ "Use delete_view_async() for async mode, or pass sync=True to client"
550
+ )
551
+ self._delete_sync(self._build_view_path(board_id, view_id))
552
+
553
+ # -------------------------------------------------------------------------
554
+ # Export/Import with Views
555
+ # -------------------------------------------------------------------------
556
+
557
+ async def export_with_views_async(self, board_id: str) -> dict[str, Any]:
558
+ """Export board with views included (async).
559
+
560
+ Returns a dictionary suitable for JSON serialization and import,
561
+ including all board data and associated views.
562
+
563
+ Args:
564
+ board_id: Board ID
565
+
566
+ Returns:
567
+ Dict with board data and views (IDs stripped for portability)
568
+
569
+ Example:
570
+ >>> data = await client.boards.export_with_views_async("board-123")
571
+ >>> with open("board.json", "w") as f:
572
+ ... json.dump(data, f, indent=2)
573
+ """
574
+ board = await self.get_async(board_id)
575
+ views = await self.list_views_async(board_id)
576
+
577
+ # Export board without IDs and timestamps for portability
578
+ data = board.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
579
+
580
+ # Add views (without IDs)
581
+ if views:
582
+ data["views"] = [v.model_dump(exclude={"id"}, mode="json") for v in views]
583
+
584
+ return data
585
+
586
+ def export_with_views(self, board_id: str) -> dict[str, Any]:
587
+ """Export board with views included (sync).
588
+
589
+ Returns a dictionary suitable for JSON serialization and import,
590
+ including all board data and associated views.
591
+
592
+ Args:
593
+ board_id: Board ID
594
+
595
+ Returns:
596
+ Dict with board data and views (IDs stripped for portability)
597
+ """
598
+ if not self._client.is_sync:
599
+ raise RuntimeError(
600
+ "Use export_with_views_async() for async mode, or pass sync=True to client"
601
+ )
602
+ import asyncio
603
+
604
+ return asyncio.run(self.export_with_views_async(board_id))
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from ..models.datasets import Dataset, DatasetCreate
7
+ from ..models.datasets import Dataset, DatasetCreate, DatasetUpdate
8
8
  from .base import BaseResource
9
9
 
10
10
  if TYPE_CHECKING:
@@ -40,6 +40,14 @@ class DatasetsResource(BaseResource):
40
40
  # Async methods
41
41
  # -------------------------------------------------------------------------
42
42
 
43
+ def _parse_dataset(self, data: dict) -> Dataset:
44
+ """Parse a dataset from API response, handling nested settings."""
45
+ return Dataset.from_api_response(data)
46
+
47
+ def _parse_dataset_list(self, data: list) -> list[Dataset]:
48
+ """Parse a list of datasets from API response."""
49
+ return [self._parse_dataset(item) for item in data]
50
+
43
51
  async def list_async(self) -> list[Dataset]:
44
52
  """List all datasets (async).
45
53
 
@@ -47,7 +55,7 @@ class DatasetsResource(BaseResource):
47
55
  List of Dataset objects.
48
56
  """
49
57
  data = await self._get_async(self._build_path())
50
- return self._parse_model_list(Dataset, data)
58
+ return self._parse_dataset_list(data)
51
59
 
52
60
  async def get_async(self, slug: str) -> Dataset:
53
61
  """Get a specific dataset (async).
@@ -59,7 +67,7 @@ class DatasetsResource(BaseResource):
59
67
  Dataset object.
60
68
  """
61
69
  data = await self._get_async(self._build_path(slug))
62
- return self._parse_model(Dataset, data)
70
+ return self._parse_dataset(data)
63
71
 
64
72
  async def create_async(self, dataset: DatasetCreate) -> Dataset:
65
73
  """Create a new dataset (async).
@@ -71,9 +79,9 @@ class DatasetsResource(BaseResource):
71
79
  Created Dataset object.
72
80
  """
73
81
  data = await self._post_async(self._build_path(), json=dataset.model_dump_for_api())
74
- return self._parse_model(Dataset, data)
82
+ return self._parse_dataset(data)
75
83
 
76
- async def update_async(self, slug: str, dataset: DatasetCreate) -> Dataset:
84
+ async def update_async(self, slug: str, dataset: DatasetCreate | DatasetUpdate) -> Dataset:
77
85
  """Update an existing dataset (async).
78
86
 
79
87
  Args:
@@ -84,7 +92,20 @@ class DatasetsResource(BaseResource):
84
92
  Updated Dataset object.
85
93
  """
86
94
  data = await self._put_async(self._build_path(slug), json=dataset.model_dump_for_api())
87
- return self._parse_model(Dataset, data)
95
+ return self._parse_dataset(data)
96
+
97
+ async def set_delete_protected_async(self, slug: str, protected: bool) -> Dataset:
98
+ """Set delete protection on a dataset (async).
99
+
100
+ Args:
101
+ slug: Dataset slug.
102
+ protected: True to enable delete protection, False to disable.
103
+
104
+ Returns:
105
+ Updated Dataset object.
106
+ """
107
+ update = DatasetUpdate(delete_protected=protected)
108
+ return await self.update_async(slug=slug, dataset=update)
88
109
 
89
110
  async def delete_async(self, slug: str) -> None:
90
111
  """Delete a dataset (async).
@@ -107,7 +128,7 @@ class DatasetsResource(BaseResource):
107
128
  if not self._client.is_sync:
108
129
  raise RuntimeError("Use list_async() for async mode, or pass sync=True to client")
109
130
  data = self._get_sync(self._build_path())
110
- return self._parse_model_list(Dataset, data)
131
+ return self._parse_dataset_list(data)
111
132
 
112
133
  def get(self, slug: str) -> Dataset:
113
134
  """Get a specific dataset.
@@ -121,7 +142,7 @@ class DatasetsResource(BaseResource):
121
142
  if not self._client.is_sync:
122
143
  raise RuntimeError("Use get_async() for async mode, or pass sync=True to client")
123
144
  data = self._get_sync(self._build_path(slug))
124
- return self._parse_model(Dataset, data)
145
+ return self._parse_dataset(data)
125
146
 
126
147
  def create(self, dataset: DatasetCreate) -> Dataset:
127
148
  """Create a new dataset.
@@ -135,9 +156,9 @@ class DatasetsResource(BaseResource):
135
156
  if not self._client.is_sync:
136
157
  raise RuntimeError("Use create_async() for async mode, or pass sync=True to client")
137
158
  data = self._post_sync(self._build_path(), json=dataset.model_dump_for_api())
138
- return self._parse_model(Dataset, data)
159
+ return self._parse_dataset(data)
139
160
 
140
- def update(self, slug: str, dataset: DatasetCreate) -> Dataset:
161
+ def update(self, slug: str, dataset: DatasetCreate | DatasetUpdate) -> Dataset:
141
162
  """Update an existing dataset.
142
163
 
143
164
  Args:
@@ -150,7 +171,24 @@ class DatasetsResource(BaseResource):
150
171
  if not self._client.is_sync:
151
172
  raise RuntimeError("Use update_async() for async mode, or pass sync=True to client")
152
173
  data = self._put_sync(self._build_path(slug), json=dataset.model_dump_for_api())
153
- return self._parse_model(Dataset, data)
174
+ return self._parse_dataset(data)
175
+
176
+ def set_delete_protected(self, slug: str, protected: bool) -> Dataset:
177
+ """Set delete protection on a dataset.
178
+
179
+ Args:
180
+ slug: Dataset slug.
181
+ protected: True to enable delete protection, False to disable.
182
+
183
+ Returns:
184
+ Updated Dataset object.
185
+ """
186
+ if not self._client.is_sync:
187
+ raise RuntimeError(
188
+ "Use set_delete_protected_async() for async mode, or pass sync=True to client"
189
+ )
190
+ update = DatasetUpdate(delete_protected=protected)
191
+ return self.update(slug=slug, dataset=update)
154
192
 
155
193
  def delete(self, slug: str) -> None:
156
194
  """Delete a dataset.