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
@@ -1,6 +1,7 @@
1
1
  """Pydantic models for Honeycomb API resources."""
2
2
 
3
- from .api_keys import ApiKey, ApiKeyCreate, ApiKeyType
3
+ from .api_keys import ApiKey, ApiKeyCreate, ApiKeyType, ApiKeyUpdate
4
+ from .auth import AuthInfo, AuthInfoV2
4
5
  from .board_builder import (
5
6
  BoardBuilder,
6
7
  BoardBundle,
@@ -10,10 +11,16 @@ from .board_builder import (
10
11
  SLOBuilderPanel,
11
12
  TextPanel,
12
13
  )
13
- from .boards import Board, BoardCreate
14
+ from .boards import (
15
+ Board,
16
+ BoardCreate,
17
+ BoardView,
18
+ BoardViewCreate,
19
+ BoardViewFilter,
20
+ )
14
21
  from .burn_alerts import BurnAlert, BurnAlertCreate, BurnAlertRecipient, BurnAlertType
15
22
  from .columns import Column, ColumnCreate, ColumnType
16
- from .datasets import Dataset, DatasetCreate
23
+ from .datasets import Dataset, DatasetCreate, DatasetUpdate
17
24
  from .derived_columns import DerivedColumn, DerivedColumnBuilder, DerivedColumnCreate
18
25
  from .environments import Environment, EnvironmentColor, EnvironmentCreate, EnvironmentUpdate
19
26
  from .events import BatchEvent, BatchEventResult
@@ -88,11 +95,15 @@ __all__ = [
88
95
  # Datasets
89
96
  "Dataset",
90
97
  "DatasetCreate",
98
+ "DatasetUpdate",
91
99
  # Boards
92
100
  "Board",
93
101
  "BoardBuilder",
94
102
  "BoardBundle",
95
103
  "BoardCreate",
104
+ "BoardView",
105
+ "BoardViewCreate",
106
+ "BoardViewFilter",
96
107
  "ExistingQueryPanel",
97
108
  "ExistingSLOPanel",
98
109
  "QueryBuilderPanel",
@@ -141,6 +152,10 @@ __all__ = [
141
152
  "ApiKey",
142
153
  "ApiKeyCreate",
143
154
  "ApiKeyType",
155
+ "ApiKeyUpdate",
156
+ # Auth
157
+ "AuthInfo",
158
+ "AuthInfoV2",
144
159
  # Environments (v2)
145
160
  "Environment",
146
161
  "EnvironmentCreate",
@@ -23,17 +23,34 @@ class ApiKeyCreate(BaseModel):
23
23
  key_type: ApiKeyType = Field(description="Type of API key")
24
24
  environment_id: str = Field(description="Environment ID this key belongs to")
25
25
  disabled: bool = Field(default=False, description="Whether key is disabled")
26
+ permissions: dict[str, bool] | None = Field(
27
+ default=None,
28
+ description=(
29
+ "Permissions for configuration keys (REQUIRED for configuration type). "
30
+ "Available permissions: 'create_datasets', 'send_events', 'manage_markers', "
31
+ "'manage_triggers', 'manage_boards', 'run_queries', 'manage_columns', "
32
+ "'manage_slos', 'manage_recipients', 'manage_privateBoards', "
33
+ "'read_service_maps', 'visible_team_members'. "
34
+ "Ignored for ingest keys."
35
+ ),
36
+ )
26
37
 
27
38
  def to_jsonapi(self) -> dict[str, Any]:
28
39
  """Convert to JSON:API format for API request."""
40
+ attributes: dict[str, Any] = {
41
+ "name": self.name,
42
+ "key_type": self.key_type.value,
43
+ "disabled": self.disabled,
44
+ }
45
+
46
+ # Add permissions for configuration keys
47
+ if self.permissions is not None:
48
+ attributes["permissions"] = self.permissions
49
+
29
50
  return {
30
51
  "data": {
31
52
  "type": "api-keys",
32
- "attributes": {
33
- "name": self.name,
34
- "key_type": self.key_type.value,
35
- "disabled": self.disabled,
36
- },
53
+ "attributes": attributes,
37
54
  "relationships": {
38
55
  "environment": {"data": {"type": "environments", "id": self.environment_id}}
39
56
  },
@@ -41,6 +58,29 @@ class ApiKeyCreate(BaseModel):
41
58
  }
42
59
 
43
60
 
61
+ class ApiKeyUpdate(BaseModel):
62
+ """Model for updating an API key."""
63
+
64
+ name: str | None = Field(default=None, description="New name for the API key")
65
+ disabled: bool | None = Field(default=None, description="Enable/disable the key")
66
+
67
+ def to_jsonapi(self, key_id: str) -> dict[str, Any]:
68
+ """Convert to JSON:API format for API request."""
69
+ attributes: dict[str, Any] = {}
70
+ if self.name is not None:
71
+ attributes["name"] = self.name
72
+ if self.disabled is not None:
73
+ attributes["disabled"] = self.disabled
74
+
75
+ return {
76
+ "data": {
77
+ "id": key_id,
78
+ "type": "api-keys",
79
+ "attributes": attributes,
80
+ }
81
+ }
82
+
83
+
44
84
  class ApiKey(BaseModel):
45
85
  """A Honeycomb API key (response model)."""
46
86
 
@@ -49,6 +89,9 @@ class ApiKey(BaseModel):
49
89
  key_type: ApiKeyType = Field(description="Type of API key")
50
90
  environment_id: str | None = Field(default=None, description="Environment ID")
51
91
  disabled: bool = Field(default=False, description="Whether key is disabled")
92
+ permissions: dict[str, bool] | None = Field(
93
+ default=None, description="Permissions for configuration keys"
94
+ )
52
95
  secret: str | None = Field(
53
96
  default=None, description="Key secret (only available during creation)"
54
97
  )
@@ -75,6 +118,7 @@ class ApiKey(BaseModel):
75
118
  key_type=attributes.get("key_type", "ingest"),
76
119
  environment_id=env_id,
77
120
  disabled=attributes.get("disabled", False),
121
+ permissions=attributes.get("permissions"),
78
122
  secret=attributes.get("secret"),
79
123
  created_at=attributes.get("created_at"),
80
124
  updated_at=attributes.get("updated_at"),
@@ -0,0 +1,71 @@
1
+ """Auth endpoint models for API key metadata."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class AuthInfo(BaseModel):
10
+ """v1 auth endpoint response - API key metadata."""
11
+
12
+ id: str = Field(description="Unique identifier of the API key")
13
+ type: str = Field(description="Key type: 'configuration' or 'ingest'")
14
+ team_name: str = Field(description="Name of the team")
15
+ team_slug: str = Field(description="URL-safe team identifier")
16
+ environment_name: str = Field(description="Name of the environment")
17
+ environment_slug: str = Field(description="URL-safe environment identifier")
18
+ api_key_access: dict[str, Any] = Field(description="Key capabilities/permissions")
19
+ time_to_live: str | None = Field(default=None, description="Expiration time (RFC3339)")
20
+
21
+ model_config = {"extra": "allow"}
22
+
23
+
24
+ class AuthInfoV2(BaseModel):
25
+ """v2 auth endpoint response - Management key metadata."""
26
+
27
+ id: str = Field(description="Unique identifier of the management key")
28
+ name: str = Field(description="Human-readable name")
29
+ key_type: str = Field(description="Key type: 'management'")
30
+ disabled: bool = Field(default=False, description="Whether the key is disabled")
31
+ scopes: list[str] = Field(default_factory=list, description="Authorized scopes")
32
+ team_id: str = Field(description="Team ID this key belongs to")
33
+ team_name: str | None = Field(default=None, description="Team name")
34
+ team_slug: str | None = Field(default=None, description="Team slug")
35
+ created_at: datetime | None = Field(default=None, description="Creation timestamp")
36
+ updated_at: datetime | None = Field(default=None, description="Last update timestamp")
37
+
38
+ model_config = {"extra": "allow"}
39
+
40
+ @classmethod
41
+ def from_jsonapi(cls, data: dict[str, Any]) -> "AuthInfoV2":
42
+ """Parse from JSON:API format."""
43
+ obj = data.get("data", data)
44
+ attrs = obj.get("attributes", {})
45
+ rels = obj.get("relationships", {})
46
+ included = data.get("included", [])
47
+
48
+ # Extract team info from relationships and included
49
+ team_id = rels.get("team", {}).get("data", {}).get("id", "")
50
+ team_name = None
51
+ team_slug = None
52
+ for inc in included:
53
+ if inc.get("type") == "teams" and inc.get("id") == team_id:
54
+ team_attrs = inc.get("attributes", {})
55
+ team_name = team_attrs.get("name")
56
+ team_slug = team_attrs.get("slug")
57
+ break
58
+
59
+ timestamps = attrs.get("timestamps", {})
60
+ return cls(
61
+ id=obj.get("id", ""),
62
+ name=attrs.get("name", ""),
63
+ key_type=attrs.get("key_type", "management"),
64
+ disabled=attrs.get("disabled", False),
65
+ scopes=attrs.get("scopes", []),
66
+ team_id=team_id,
67
+ team_name=team_name,
68
+ team_slug=team_slug,
69
+ created_at=timestamps.get("created_at"),
70
+ updated_at=timestamps.get("updated_at"),
71
+ )
@@ -5,7 +5,9 @@ from __future__ import annotations
5
5
  from dataclasses import dataclass
6
6
  from typing import TYPE_CHECKING, Any, Literal
7
7
 
8
+ from honeycomb.models.boards import BoardViewCreate, BoardViewFilter
8
9
  from honeycomb.models.tags_mixin import TagsMixin
10
+ from honeycomb.models.tool_inputs import PositionInput
9
11
 
10
12
  if TYPE_CHECKING:
11
13
  from honeycomb.models.query_builder import QueryBuilder
@@ -23,14 +25,14 @@ class QueryBuilderPanel:
23
25
 
24
26
  Attributes:
25
27
  builder: QueryBuilder instance with .name() set
26
- position: Optional (x, y, width, height) for manual layout
28
+ position: Optional PositionInput for manual layout
27
29
  style: Display style (graph, table, combo)
28
30
  visualization: Optional visualization settings dict
29
31
  dataset_override: Optional dataset override
30
32
  """
31
33
 
32
34
  builder: QueryBuilder
33
- position: tuple[int, int, int, int] | None
35
+ position: PositionInput | None
34
36
  style: Literal["graph", "table", "combo"]
35
37
  visualization: dict[str, Any] | None
36
38
  dataset_override: str | None
@@ -43,7 +45,7 @@ class ExistingQueryPanel:
43
45
  Attributes:
44
46
  query_id: ID of saved query
45
47
  annotation_id: Annotation ID of query
46
- position: Optional (x, y, width, height) for manual layout
48
+ position: Optional PositionInput for manual layout
47
49
  style: Display style (graph, table, combo)
48
50
  visualization: Optional visualization settings dict
49
51
  dataset: Optional dataset name
@@ -51,7 +53,7 @@ class ExistingQueryPanel:
51
53
 
52
54
  query_id: str
53
55
  annotation_id: str
54
- position: tuple[int, int, int, int] | None
56
+ position: PositionInput | None
55
57
  style: Literal["graph", "table", "combo"]
56
58
  visualization: dict[str, Any] | None
57
59
  dataset: str | None
@@ -63,11 +65,11 @@ class SLOBuilderPanel:
63
65
 
64
66
  Attributes:
65
67
  builder: SLOBuilder instance
66
- position: Optional (x, y, width, height) for manual layout
68
+ position: Optional PositionInput for manual layout
67
69
  """
68
70
 
69
71
  builder: SLOBuilder
70
- position: tuple[int, int, int, int] | None
72
+ position: PositionInput | None
71
73
 
72
74
 
73
75
  @dataclass
@@ -76,11 +78,11 @@ class ExistingSLOPanel:
76
78
 
77
79
  Attributes:
78
80
  slo_id: ID of the SLO
79
- position: Optional (x, y, width, height) for manual layout
81
+ position: Optional PositionInput for manual layout
80
82
  """
81
83
 
82
84
  slo_id: str
83
- position: tuple[int, int, int, int] | None
85
+ position: PositionInput | None
84
86
 
85
87
 
86
88
  @dataclass
@@ -89,11 +91,11 @@ class TextPanel:
89
91
 
90
92
  Attributes:
91
93
  content: Markdown text content
92
- position: Optional (x, y, width, height) for manual layout
94
+ position: Optional PositionInput for manual layout
93
95
  """
94
96
 
95
97
  content: str
96
- position: tuple[int, int, int, int] | None
98
+ position: PositionInput | None
97
99
 
98
100
 
99
101
  @dataclass
@@ -112,6 +114,7 @@ class BoardBundle:
112
114
  existing_query_panels: Panels from existing query IDs
113
115
  slo_panels: SLO panels
114
116
  text_panels: Text panels
117
+ views: Board views to create
115
118
  """
116
119
 
117
120
  board_name: str
@@ -125,6 +128,8 @@ class BoardBundle:
125
128
  slo_builder_panels: list[SLOBuilderPanel]
126
129
  existing_slo_panels: list[ExistingSLOPanel]
127
130
  text_panels: list[TextPanel]
131
+ # Views
132
+ views: list[BoardViewCreate]
128
133
 
129
134
 
130
135
  class BoardBuilder(TagsMixin):
@@ -146,15 +151,17 @@ class BoardBuilder(TagsMixin):
146
151
  .build()
147
152
  )
148
153
 
149
- Example - Manual layout with tuple positioning:
154
+ Example - Manual layout with PositionInput:
155
+ from honeycomb.models.tool_inputs import PositionInput
156
+
150
157
  board = await client.boards.create_from_bundle_async(
151
158
  BoardBuilder("Custom Layout")
152
159
  .manual_layout()
153
160
  .query(
154
161
  QueryBuilder("Requests").dataset("api-logs").last_1_hour().count(),
155
- position=(0, 0, 8, 6)
162
+ position=PositionInput(x_coordinate=0, y_coordinate=0, width=8, height=6)
156
163
  )
157
- .slo("slo-id-1", position=(8, 0, 4, 6))
164
+ .slo("slo-id-1", position=PositionInput(x_coordinate=8, y_coordinate=0, width=4, height=6))
158
165
  .build()
159
166
  )
160
167
  """
@@ -171,6 +178,8 @@ class BoardBuilder(TagsMixin):
171
178
  self._slo_builder_panels: list[SLOBuilderPanel] = []
172
179
  self._existing_slo_panels: list[ExistingSLOPanel] = []
173
180
  self._text_panels: list[TextPanel] = []
181
+ # Views
182
+ self._views: list[BoardViewCreate] = []
174
183
 
175
184
  def description(self, desc: str) -> BoardBuilder:
176
185
  """Set board description (max 1024 chars).
@@ -230,7 +239,7 @@ class BoardBuilder(TagsMixin):
230
239
  query: QueryBuilder | str,
231
240
  annotation_id: str | None = None,
232
241
  *,
233
- position: tuple[int, int, int, int] | None = None,
242
+ position: PositionInput | None = None,
234
243
  style: Literal["graph", "table", "combo"] = "graph",
235
244
  visualization: dict[str, Any] | None = None,
236
245
  dataset: str | None = None,
@@ -240,12 +249,14 @@ class BoardBuilder(TagsMixin):
240
249
  Args:
241
250
  query: QueryBuilder with .name() OR existing query_id string
242
251
  annotation_id: Required only if query is string
243
- position: (x, y, width, height) for manual layout
252
+ position: PositionInput for manual layout
244
253
  style: graph | table | combo
245
254
  visualization: {"hide_markers": True, "utc_xaxis": True, ...}
246
255
  dataset: Override QueryBuilder's dataset
247
256
 
248
257
  Example - Inline QueryBuilder:
258
+ from honeycomb.models.tool_inputs import PositionInput
259
+
249
260
  .query(
250
261
  QueryBuilder("Request Count")
251
262
  .dataset("api-logs")
@@ -253,7 +264,7 @@ class BoardBuilder(TagsMixin):
253
264
  .count()
254
265
  .group_by("service")
255
266
  .description("Requests by service over 24h"),
256
- position=(0, 0, 9, 6),
267
+ position=PositionInput(x_coordinate=0, y_coordinate=0, width=9, height=6),
257
268
  style="graph",
258
269
  visualization={"hide_markers": True, "utc_xaxis": True}
259
270
  )
@@ -296,25 +307,27 @@ class BoardBuilder(TagsMixin):
296
307
  self,
297
308
  slo: SLOBuilder | str,
298
309
  *,
299
- position: tuple[int, int, int, int] | None = None,
310
+ position: PositionInput | None = None,
300
311
  ) -> BoardBuilder:
301
312
  """Add an SLO panel.
302
313
 
303
314
  Args:
304
315
  slo: SLOBuilder instance OR existing SLO ID string
305
- position: (x, y, width, height) for manual layout
316
+ position: PositionInput for manual layout
306
317
 
307
318
  Example - Inline SLOBuilder:
319
+ from honeycomb.models.tool_inputs import PositionInput
320
+
308
321
  .slo(
309
322
  SLOBuilder("API Availability")
310
323
  .dataset("api-logs")
311
- .target_nines(3)
324
+ .target_percentage(99.9)
312
325
  .sli(alias="success_rate"),
313
- position=(9, 0, 3, 6)
326
+ position=PositionInput(x_coordinate=9, y_coordinate=0, width=3, height=6)
314
327
  )
315
328
 
316
329
  Example - Existing SLO:
317
- .slo("slo-id-123", position=(8, 0, 4, 6))
330
+ .slo("slo-id-123", position=PositionInput(x_coordinate=8, y_coordinate=0, width=4, height=6))
318
331
  """
319
332
  from honeycomb.models.slo_builder import SLOBuilder
320
333
 
@@ -328,22 +341,80 @@ class BoardBuilder(TagsMixin):
328
341
  self,
329
342
  content: str,
330
343
  *,
331
- position: tuple[int, int, int, int] | None = None,
344
+ position: PositionInput | None = None,
332
345
  ) -> BoardBuilder:
333
346
  """Add a text panel (supports markdown, max 10000 chars).
334
347
 
335
348
  Args:
336
349
  content: Markdown text content
337
- position: (x, y, width, height) for manual layout
350
+ position: PositionInput for manual layout
338
351
 
339
352
  Example:
340
- .text("## Service Status\\n\\nAll systems operational", position=(0, 6, 12, 2))
353
+ from honeycomb.models.tool_inputs import PositionInput
354
+
355
+ .text(
356
+ "## Service Status\\n\\nAll systems operational",
357
+ position=PositionInput(x_coordinate=0, y_coordinate=6, width=12, height=2)
358
+ )
341
359
  """
342
360
  if len(content) > 10000:
343
361
  raise ValueError(f"Text content must be <= 10000 characters, got {len(content)}")
344
362
  self._text_panels.append(TextPanel(content=content, position=position))
345
363
  return self
346
364
 
365
+ # -------------------------------------------------------------------------
366
+ # Board Views
367
+ # -------------------------------------------------------------------------
368
+
369
+ def add_view(
370
+ self,
371
+ name: str,
372
+ filters: list[BoardViewFilter] | list[dict[str, Any]] | None = None,
373
+ ) -> BoardBuilder:
374
+ """Add a view to the board.
375
+
376
+ Views are filtered perspectives on board data. Each board can have up to 50 views.
377
+
378
+ Args:
379
+ name: View name
380
+ filters: List of BoardViewFilter objects or dicts with column/operation/value
381
+
382
+ Example with dict filters:
383
+ .add_view("Active Services", [
384
+ {"column": "status", "operation": "=", "value": "active"},
385
+ {"column": "environment", "operation": "in", "value": ["prod", "staging"]}
386
+ ])
387
+
388
+ Example with BoardViewFilter objects:
389
+ from honeycomb.models.boards import BoardViewFilter
390
+ from honeycomb.models.query_builder import FilterOp
391
+
392
+ .add_view("Error View", [
393
+ BoardViewFilter(
394
+ column="status_code",
395
+ operation=FilterOp.GREATER_THAN_OR_EQUAL,
396
+ value=400
397
+ )
398
+ ])
399
+
400
+ Example with no filters (all data):
401
+ .add_view("All Data")
402
+ """
403
+ if filters is None:
404
+ filters = []
405
+
406
+ # Convert dict filters to BoardViewFilter objects
407
+ filter_objs: list[BoardViewFilter] = []
408
+ for f in filters:
409
+ if isinstance(f, BoardViewFilter):
410
+ filter_objs.append(f)
411
+ else:
412
+ # Convert dict to BoardViewFilter
413
+ filter_objs.append(BoardViewFilter.model_validate(f))
414
+
415
+ self._views.append(BoardViewCreate(name=name, filters=filter_objs))
416
+ return self
417
+
347
418
  # -------------------------------------------------------------------------
348
419
  # Build
349
420
  # -------------------------------------------------------------------------
@@ -370,7 +441,7 @@ class BoardBuilder(TagsMixin):
370
441
  if panel.position is None:
371
442
  raise ValueError(
372
443
  f"Manual layout requires position for all panels. "
373
- f"Panel {i} missing position. Use position=(x, y, width, height)"
444
+ f"Panel {i} missing position. Use position=PositionInput(x_coordinate=..., y_coordinate=..., width=..., height=...)"
374
445
  )
375
446
 
376
447
  return BoardBundle(
@@ -384,4 +455,5 @@ class BoardBuilder(TagsMixin):
384
455
  slo_builder_panels=self._slo_builder_panels,
385
456
  existing_slo_panels=self._existing_slo_panels,
386
457
  text_panels=self._text_panels,
458
+ views=self._views,
387
459
  )
@@ -4,7 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Any, Literal
6
6
 
7
- from pydantic import BaseModel, Field
7
+ from pydantic import BaseModel, ConfigDict, Field
8
+
9
+ from .query_builder import FilterOp
8
10
 
9
11
 
10
12
  class BoardCreate(BaseModel):
@@ -84,3 +86,95 @@ class Board(BaseModel):
84
86
  tags: list[dict] | None = Field(default=None, description="Board tags")
85
87
 
86
88
  model_config = {"extra": "allow"}
89
+
90
+
91
+ # =============================================================================
92
+ # Board Views
93
+ # =============================================================================
94
+
95
+
96
+ class BoardViewFilter(BaseModel):
97
+ """Filter for board views.
98
+
99
+ Uses the same FilterOp enum as QueryBuilder for consistency.
100
+
101
+ Attributes:
102
+ column: Column name to filter on
103
+ operation: Filter operation to apply
104
+ value: Filter value (optional for exists/does-not-exist operations)
105
+
106
+ Example:
107
+ >>> BoardViewFilter(column="status", operation=FilterOp.EQUALS, value="active")
108
+ >>> BoardViewFilter(column="error", operation=FilterOp.EXISTS)
109
+ """
110
+
111
+ model_config = ConfigDict(extra="forbid")
112
+
113
+ column: str = Field(description="Column name to filter on")
114
+ operation: FilterOp = Field(description="Filter operation")
115
+ value: Any | None = Field(
116
+ default=None,
117
+ description="Filter value (optional for exists/does-not-exist)",
118
+ )
119
+
120
+ def model_dump_for_api(self) -> dict[str, Any]:
121
+ """Serialize for API request."""
122
+ data: dict[str, Any] = {
123
+ "column": self.column,
124
+ "operation": self.operation.value,
125
+ }
126
+ if self.value is not None:
127
+ data["value"] = self.value
128
+ return data
129
+
130
+
131
+ class BoardViewCreate(BaseModel):
132
+ """Model for creating or updating a board view.
133
+
134
+ Attributes:
135
+ name: View name
136
+ filters: List of filters to apply to this view
137
+
138
+ Example:
139
+ >>> BoardViewCreate(
140
+ ... name="Active Services",
141
+ ... filters=[
142
+ ... BoardViewFilter(column="status", operation=FilterOp.EQUALS, value="active")
143
+ ... ]
144
+ ... )
145
+ """
146
+
147
+ name: str = Field(description="View name")
148
+ filters: list[BoardViewFilter] = Field(
149
+ default_factory=list,
150
+ description="List of filters",
151
+ )
152
+
153
+ def model_dump_for_api(self) -> dict[str, Any]:
154
+ """Serialize for API request."""
155
+ return {
156
+ "name": self.name,
157
+ "filters": [f.model_dump_for_api() for f in self.filters],
158
+ }
159
+
160
+
161
+ class BoardView(BaseModel):
162
+ """A board view (response model).
163
+
164
+ Board views are filtered perspectives on a board, with each board
165
+ supporting up to 50 views maximum.
166
+
167
+ Attributes:
168
+ id: Unique identifier
169
+ name: View name
170
+ filters: List of filters applied to this view
171
+ """
172
+
173
+ id: str = Field(description="Unique identifier")
174
+ name: str = Field(description="View name")
175
+ filters: list[BoardViewFilter] = Field(
176
+ default_factory=list,
177
+ description="Filters",
178
+ )
179
+
180
+ model_config = {"extra": "allow"}
@@ -35,6 +35,40 @@ class DatasetCreate(BaseModel):
35
35
  return data
36
36
 
37
37
 
38
+ class DatasetUpdate(BaseModel):
39
+ """Model for updating an existing dataset."""
40
+
41
+ name: str | None = Field(default=None, description="Human-readable name for the dataset")
42
+ description: str | None = Field(default=None, description="Longer description")
43
+ expand_json_depth: int | None = Field(
44
+ default=None,
45
+ ge=0,
46
+ le=10,
47
+ description="Depth to expand JSON fields (0-10)",
48
+ )
49
+ delete_protected: bool | None = Field(
50
+ default=None, description="If true, the dataset cannot be deleted"
51
+ )
52
+
53
+ def model_dump_for_api(self) -> dict[str, Any]:
54
+ """Serialize for API request."""
55
+ data: dict[str, Any] = {}
56
+
57
+ if self.name is not None:
58
+ data["name"] = self.name
59
+
60
+ if self.description is not None:
61
+ data["description"] = self.description
62
+
63
+ if self.expand_json_depth is not None:
64
+ data["expand_json_depth"] = self.expand_json_depth
65
+
66
+ if self.delete_protected is not None:
67
+ data["settings"] = {"delete_protected": self.delete_protected}
68
+
69
+ return data
70
+
71
+
38
72
  class Dataset(BaseModel):
39
73
  """A Honeycomb dataset (response model)."""
40
74
 
@@ -42,6 +76,7 @@ class Dataset(BaseModel):
42
76
  slug: str = Field(description="URL-safe identifier")
43
77
  description: str | None = Field(default=None, description="Longer description")
44
78
  expand_json_depth: int = Field(default=0, description="JSON expansion depth")
79
+ delete_protected: bool = Field(default=False, description="If true, dataset cannot be deleted")
45
80
  created_at: datetime | None = Field(default=None, description="Creation timestamp")
46
81
  last_written_at: datetime | None = Field(
47
82
  default=None, description="Last event written timestamp"
@@ -49,3 +84,10 @@ class Dataset(BaseModel):
49
84
  regular_columns_count: int | None = Field(default=None, description="Number of regular columns")
50
85
 
51
86
  model_config = {"extra": "allow"}
87
+
88
+ @classmethod
89
+ def from_api_response(cls, data: dict[str, Any]) -> Dataset:
90
+ """Parse from API response format, extracting settings."""
91
+ settings = data.pop("settings", {}) if isinstance(data.get("settings"), dict) else {}
92
+ delete_protected = settings.get("delete_protected", False)
93
+ return cls(delete_protected=delete_protected, **data)