Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.3.0] - 2026-04-21

### Added
- New Escalation Paths endpoints (create, read, update, delete, list) with typed rule models (alert urgency, working hour, JSON path, field, service, deferral window)
- New API Keys endpoints (create, read, update, delete, list, rotate)
- New SLA endpoints (create, read, update, delete, list)
- New On-Call endpoints (list on-call users)
- New On-Call Pay Reports endpoints (create, read, update, delete, list)
- New Meeting Recordings endpoints (read, list)
- New Catalog Checklist Templates endpoints (create, read, update, delete, list)
- New Catalog Entity Checklists endpoints (read, list)
- New Catalog Properties endpoints (create, read, update, delete, list) — replaces Catalog Fields
- Catalog property endpoints for causes, environments, functionalities, incident types, services, and teams
- New incident actions: `detach_from_parent_incident`, `unmark_as_duplicate_incident`
- New workflow task type: `PageJsmopsOnCallRespondersTaskParams` — page JSM Ops on-call responders
- New workflow task type: `CreateJsmopsAlertTaskParams` — create JSM Ops alerts
- New role permission types: catalogs, communication, edge connectors, incident communication, paging, SLAs, sub-statuses
- Alert trigger params: alert condition urgency support
- Status page: CNAME records and section ordering support
- Page Rootly on-call responders: functionality target support
- GitHub issue task params: issue type and labels support
- Zoom meeting: global dial-in numbers support

### Changed
- Regenerated client from latest OpenAPI specification
- **BREAKING**: Catalog Fields renamed to Catalog Properties across all endpoints and models
- **BREAKING**: Minimum Python version bumped to 3.10

### Removed
- Catalog Fields endpoints and models (replaced by Catalog Properties)
- Some escalation policy path rule type models (consolidated in upstream spec)

### Fixed
- Applied nullable enum fix to 1,348 model files via `tools/fix_nullable_enums.py`
- Escalation path endpoints now fully generated — added `tools/fix_openapi_escalation_paths.py` to patch inline `oneOf` variants into named `$ref` schemas ([upstream bug](https://github.com/openapi-generators/openapi-python-client/issues/1428))

## [1.2.1] - 2025-03-02

### Fixed
Expand Down
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "rootly"
version = "1.2.1"
version = "1.3.0"
description = "A client library for accessing Rootly API v1"
authors = []
readme = "README.md"
Expand All @@ -10,8 +10,8 @@ packages = [
include = ["CHANGELOG.md", "rootly_sdk/py.typed"]

[tool.poetry.dependencies]
python = "^3.9"
httpx = ">=0.23.0,<0.29.0"
python = "^3.10"
httpx = ">=0.20.0,<0.29.0"
attrs = ">=22.2.0"
python-dateutil = "^2.8.0"

Expand Down
36 changes: 20 additions & 16 deletions rootly_sdk/api/alert_events/create_alert_event.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from http import HTTPStatus
from typing import Any
from urllib.parse import quote

import httpx

Expand All @@ -8,22 +9,25 @@
from ...models.alert_event_response import AlertEventResponse
from ...models.errors_list import ErrorsList
from ...models.new_alert_event import NewAlertEvent
from ...types import Response
from ...types import UNSET, Response, Unset


def _get_kwargs(
alert_id: str,
*,
body: NewAlertEvent,
body: NewAlertEvent | Unset = UNSET,
) -> dict[str, Any]:
headers: dict[str, Any] = {}

_kwargs: dict[str, Any] = {
"method": "post",
"url": f"/v1/alerts/{alert_id}/events",
"url": "/v1/alerts/{alert_id}/events".format(
alert_id=quote(str(alert_id), safe=""),
),
}

_kwargs["json"] = body.to_dict()
if not isinstance(body, Unset):
_kwargs["json"] = body.to_dict()

headers["Content-Type"] = "application/vnd.api+json"

Expand Down Expand Up @@ -65,22 +69,22 @@ def sync_detailed(
alert_id: str,
*,
client: AuthenticatedClient,
body: NewAlertEvent,
body: NewAlertEvent | Unset = UNSET,
) -> Response[AlertEventResponse | ErrorsList]:
"""Create alert event

Creates a new alert event

Args:
alert_id (str):
body (NewAlertEvent):
body (NewAlertEvent | Unset):

Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[AlertEventResponse, ErrorsList]]
Response[AlertEventResponse | ErrorsList]
"""

kwargs = _get_kwargs(
Expand All @@ -99,22 +103,22 @@ def sync(
alert_id: str,
*,
client: AuthenticatedClient,
body: NewAlertEvent,
body: NewAlertEvent | Unset = UNSET,
) -> AlertEventResponse | ErrorsList | None:
"""Create alert event

Creates a new alert event

Args:
alert_id (str):
body (NewAlertEvent):
body (NewAlertEvent | Unset):

Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[AlertEventResponse, ErrorsList]
AlertEventResponse | ErrorsList
"""

return sync_detailed(
Expand All @@ -128,22 +132,22 @@ async def asyncio_detailed(
alert_id: str,
*,
client: AuthenticatedClient,
body: NewAlertEvent,
body: NewAlertEvent | Unset = UNSET,
) -> Response[AlertEventResponse | ErrorsList]:
"""Create alert event

Creates a new alert event

Args:
alert_id (str):
body (NewAlertEvent):
body (NewAlertEvent | Unset):

Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[AlertEventResponse, ErrorsList]]
Response[AlertEventResponse | ErrorsList]
"""

kwargs = _get_kwargs(
Expand All @@ -160,22 +164,22 @@ async def asyncio(
alert_id: str,
*,
client: AuthenticatedClient,
body: NewAlertEvent,
body: NewAlertEvent | Unset = UNSET,
) -> AlertEventResponse | ErrorsList | None:
"""Create alert event

Creates a new alert event

Args:
alert_id (str):
body (NewAlertEvent):
body (NewAlertEvent | Unset):

Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[AlertEventResponse, ErrorsList]
AlertEventResponse | ErrorsList
"""

return (
Expand Down
14 changes: 9 additions & 5 deletions rootly_sdk/api/alert_events/delete_alert_event.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from http import HTTPStatus
from typing import Any, cast
from urllib.parse import quote

import httpx

Expand All @@ -12,9 +13,12 @@
def _get_kwargs(
id: str,
) -> dict[str, Any]:

_kwargs: dict[str, Any] = {
"method": "delete",
"url": f"/v1/alert_events/{id}",
"url": "/v1/alert_events/{id}".format(
id=quote(str(id), safe=""),
),
}

return _kwargs
Expand Down Expand Up @@ -63,7 +67,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[Any, ErrorsList]]
Response[Any | ErrorsList]
"""

kwargs = _get_kwargs(
Expand Down Expand Up @@ -95,7 +99,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[Any, ErrorsList]
Any | ErrorsList
"""

return sync_detailed(
Expand All @@ -122,7 +126,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[Any, ErrorsList]]
Response[Any | ErrorsList]
"""

kwargs = _get_kwargs(
Expand Down Expand Up @@ -152,7 +156,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[Any, ErrorsList]
Any | ErrorsList
"""

return (
Expand Down
14 changes: 9 additions & 5 deletions rootly_sdk/api/alert_events/get_alert_event.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from http import HTTPStatus
from typing import Any
from urllib.parse import quote

import httpx

Expand All @@ -13,9 +14,12 @@
def _get_kwargs(
id: str,
) -> dict[str, Any]:

_kwargs: dict[str, Any] = {
"method": "get",
"url": f"/v1/alert_events/{id}",
"url": "/v1/alert_events/{id}".format(
id=quote(str(id), safe=""),
),
}

return _kwargs
Expand Down Expand Up @@ -68,7 +72,7 @@ def sync_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[AlertEventResponse, ErrorsList]]
Response[AlertEventResponse | ErrorsList]
"""

kwargs = _get_kwargs(
Expand Down Expand Up @@ -99,7 +103,7 @@ def sync(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[AlertEventResponse, ErrorsList]
AlertEventResponse | ErrorsList
"""

return sync_detailed(
Expand All @@ -125,7 +129,7 @@ async def asyncio_detailed(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Response[Union[AlertEventResponse, ErrorsList]]
Response[AlertEventResponse | ErrorsList]
"""

kwargs = _get_kwargs(
Expand Down Expand Up @@ -154,7 +158,7 @@ async def asyncio(
httpx.TimeoutException: If the request takes longer than Client.timeout.

Returns:
Union[AlertEventResponse, ErrorsList]
AlertEventResponse | ErrorsList
"""

return (
Expand Down
Loading