Skip to content

Commit 26a2550

Browse files
jfrench9claude
andauthored
Add event action types and integrate into event block models (#119)
## Summary Introduces `event_action_type` support across the event block model layer in the `robosystems_client`. This change adds new type definitions and integrates them into the create, update, and envelope models for event blocks. ## Key Accomplishments - **New type models**: Added three new `event_action_type_0` model classes for `CreateEventBlockRequest`, `UpdateEventBlockRequest`, and `EventBlockEnvelope`, providing structured type definitions for event actions. - **Model integration**: Updated existing `CreateEventBlockRequest`, `UpdateEventBlockRequest`, and `EventBlockEnvelope` models to incorporate the new `event_action_type` field, enabling event blocks to carry action type metadata. - **Module exports**: Updated `models/__init__.py` to export all new model classes, ensuring they are accessible throughout the client library. ## Changes Breakdown | Area | Change | |------|--------| | `CreateEventBlockRequest` | Added `event_action_type` field + new type model | | `UpdateEventBlockRequest` | Added `event_action_type` field + new type model | | `EventBlockEnvelope` | Added `event_action_type` field + new type model | | `models/__init__.py` | Registered new model exports | ## Breaking Changes - **Potentially breaking for consumers**: If any downstream code performs strict schema validation or exhaustive field checks on `CreateEventBlockRequest`, `UpdateEventBlockRequest`, or `EventBlockEnvelope`, the addition of the new `event_action_type` field may require updates. However, since the field is additive, most standard usage patterns should remain unaffected. ## Testing Notes - Verify that event block creation, update, and retrieval flows correctly serialize and deserialize the new `event_action_type` field. - Confirm that the new type models (`*_event_action_type_0`) properly handle expected values and edge cases (e.g., `None`/`Unset` states). - Validate backward compatibility — existing event blocks without an `event_action_type` should continue to work without errors. ## Infrastructure Considerations - This is a client-side model change; ensure that the corresponding API/backend already supports the `event_action_type` field before deploying consumers that depend on it. - Auto-generated client code (if applicable) should be kept in sync with the upstream API schema to avoid drift. --- 🤖 Generated with [Claude Code](https://claude.ai/code) **Branch Info:** - Source: `feature/add-event-action` - Target: `main` - Type: feature Co-Authored-By: Claude <noreply@anthropic.com>
2 parents 6407f9a + 0fe74bb commit 26a2550

7 files changed

Lines changed: 199 additions & 0 deletions

robosystems_client/models/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
from .create_connection_request import CreateConnectionRequest
5959
from .create_connection_request_provider import CreateConnectionRequestProvider
6060
from .create_event_block_request import CreateEventBlockRequest
61+
from .create_event_block_request_event_action_type_0 import (
62+
CreateEventBlockRequestEventActionType0,
63+
)
6164
from .create_event_block_request_event_category import (
6265
CreateEventBlockRequestEventCategory,
6366
)
@@ -161,6 +164,7 @@
161164
from .evaluate_rules_response import EvaluateRulesResponse
162165
from .evaluate_rules_response_summary import EvaluateRulesResponseSummary
163166
from .event_block_envelope import EventBlockEnvelope
167+
from .event_block_envelope_event_action_type_0 import EventBlockEnvelopeEventActionType0
164168
from .event_block_envelope_metadata import EventBlockEnvelopeMetadata
165169
from .event_handler_response import EventHandlerResponse
166170
from .event_handler_response_match_metadata_expression_type_0 import (
@@ -596,6 +600,9 @@
596600
from .update_api_key_request import UpdateAPIKeyRequest
597601
from .update_entity_request import UpdateEntityRequest
598602
from .update_event_block_request import UpdateEventBlockRequest
603+
from .update_event_block_request_event_action_type_0 import (
604+
UpdateEventBlockRequestEventActionType0,
605+
)
599606
from .update_event_block_request_metadata_patch import (
600607
UpdateEventBlockRequestMetadataPatch,
601608
)
@@ -694,6 +701,7 @@
694701
"CreateConnectionRequest",
695702
"CreateConnectionRequestProvider",
696703
"CreateEventBlockRequest",
704+
"CreateEventBlockRequestEventActionType0",
697705
"CreateEventBlockRequestEventCategory",
698706
"CreateEventBlockRequestEventClass",
699707
"CreateEventBlockRequestMetadata",
@@ -781,6 +789,7 @@
781789
"EvaluateRulesResponse",
782790
"EvaluateRulesResponseSummary",
783791
"EventBlockEnvelope",
792+
"EventBlockEnvelopeEventActionType0",
784793
"EventBlockEnvelopeMetadata",
785794
"EventHandlerResponse",
786795
"EventHandlerResponseMatchMetadataExpressionType0",
@@ -1080,6 +1089,7 @@
10801089
"UpdateAPIKeyRequest",
10811090
"UpdateEntityRequest",
10821091
"UpdateEventBlockRequest",
1092+
"UpdateEventBlockRequestEventActionType0",
10831093
"UpdateEventBlockRequestMetadataPatch",
10841094
"UpdateEventBlockRequestTransitionToType0",
10851095
"UpdateEventHandlerRequest",

robosystems_client/models/create_event_block_request.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
from attrs import field as _attrs_field
99
from dateutil.parser import isoparse
1010

11+
from ..models.create_event_block_request_event_action_type_0 import (
12+
CreateEventBlockRequestEventActionType0,
13+
)
1114
from ..models.create_event_block_request_event_category import (
1215
CreateEventBlockRequestEventCategory,
1316
)
@@ -43,6 +46,10 @@ class CreateEventBlockRequest:
4346
event_class (CreateEventBlockRequestEventClass | Unset): REA event class. 'economic' events change resources and
4447
drive GL postings; 'support' events are audit-trail / value-chain primitives (typically captured with
4548
apply_handlers=False). Default: CreateEventBlockRequestEventClass.ECONOMIC.
49+
event_action (CreateEventBlockRequestEventActionType0 | None | Unset): Canonical action verb refining
50+
`event_category`. Disambiguates concepts ERPs collapse: `transferAllRights` (ownership transfer, no physical
51+
movement) vs `transferCustody` (physical only, no rights transfer) — load-bearing for consignment, drop-
52+
shipping, marketplace settlement, escrow. Optional; null is valid for legacy events and during adapter rollout.
4653
agent_id (None | str | Unset): ID of the counterparty agent (customer, vendor, employee, lender) involved in the
4754
event. `null` for internal-only events.
4855
resource_type (CreateEventBlockRequestResourceTypeType0 | None | Unset): REA resource kind being exchanged. One
@@ -78,6 +85,7 @@ class CreateEventBlockRequest:
7885
event_class: CreateEventBlockRequestEventClass | Unset = (
7986
CreateEventBlockRequestEventClass.ECONOMIC
8087
)
88+
event_action: CreateEventBlockRequestEventActionType0 | None | Unset = UNSET
8189
agent_id: None | str | Unset = UNSET
8290
resource_type: CreateEventBlockRequestResourceTypeType0 | None | Unset = UNSET
8391
resource_element_id: None | str | Unset = UNSET
@@ -107,6 +115,14 @@ def to_dict(self) -> dict[str, Any]:
107115
if not isinstance(self.event_class, Unset):
108116
event_class = self.event_class.value
109117

118+
event_action: None | str | Unset
119+
if isinstance(self.event_action, Unset):
120+
event_action = UNSET
121+
elif isinstance(self.event_action, CreateEventBlockRequestEventActionType0):
122+
event_action = self.event_action.value
123+
else:
124+
event_action = self.event_action
125+
110126
agent_id: None | str | Unset
111127
if isinstance(self.agent_id, Unset):
112128
agent_id = UNSET
@@ -195,6 +211,8 @@ def to_dict(self) -> dict[str, Any]:
195211
)
196212
if event_class is not UNSET:
197213
field_dict["event_class"] = event_class
214+
if event_action is not UNSET:
215+
field_dict["event_action"] = event_action
198216
if agent_id is not UNSET:
199217
field_dict["agent_id"] = agent_id
200218
if resource_type is not UNSET:
@@ -248,6 +266,25 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
248266
else:
249267
event_class = CreateEventBlockRequestEventClass(_event_class)
250268

269+
def _parse_event_action(
270+
data: object,
271+
) -> CreateEventBlockRequestEventActionType0 | None | Unset:
272+
if data is None:
273+
return data
274+
if isinstance(data, Unset):
275+
return data
276+
try:
277+
if not isinstance(data, str):
278+
raise TypeError()
279+
event_action_type_0 = CreateEventBlockRequestEventActionType0(data)
280+
281+
return event_action_type_0
282+
except (TypeError, ValueError, AttributeError, KeyError):
283+
pass
284+
return cast(CreateEventBlockRequestEventActionType0 | None | Unset, data)
285+
286+
event_action = _parse_event_action(d.pop("event_action", UNSET))
287+
251288
def _parse_agent_id(data: object) -> None | str | Unset:
252289
if data is None:
253290
return data
@@ -381,6 +418,7 @@ def _parse_discharges_event_id(data: object) -> None | str | Unset:
381418
occurred_at=occurred_at,
382419
source=source,
383420
event_class=event_class,
421+
event_action=event_action,
384422
agent_id=agent_id,
385423
resource_type=resource_type,
386424
resource_element_id=resource_element_id,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from enum import Enum
2+
3+
4+
class CreateEventBlockRequestEventActionType0(str, Enum):
5+
ACCEPT = "accept"
6+
CITE = "cite"
7+
COMBINE = "combine"
8+
CONSUME = "consume"
9+
COPY = "copy"
10+
DELIVERSERVICE = "deliverService"
11+
DROPOFF = "dropoff"
12+
LOWER = "lower"
13+
MODIFY = "modify"
14+
MOVE = "move"
15+
PICKUP = "pickup"
16+
PRODUCE = "produce"
17+
RAISE = "raise"
18+
SEPARATE = "separate"
19+
TRANSFER = "transfer"
20+
TRANSFERALLRIGHTS = "transferAllRights"
21+
TRANSFERCUSTODY = "transferCustody"
22+
USE = "use"
23+
WORK = "work"
24+
25+
def __str__(self) -> str:
26+
return str(self.value)

robosystems_client/models/event_block_envelope.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
from attrs import field as _attrs_field
99
from dateutil.parser import isoparse
1010

11+
from ..models.event_block_envelope_event_action_type_0 import (
12+
EventBlockEnvelopeEventActionType0,
13+
)
1114
from ..types import UNSET, Unset
1215

1316
if TYPE_CHECKING:
@@ -55,6 +58,8 @@ class EventBlockEnvelope:
5558
amount (int | None | Unset): Economic value in **cents** of `currency`, signed (inflows positive, outflows
5659
negative). `null` for non-economic events.
5760
description (None | str | Unset): Free-text human-readable summary.
61+
event_action (EventBlockEnvelopeEventActionType0 | None | Unset): Canonical action verb refining
62+
`event_category`. Null when the source adapter or capture path didn't supply one.
5863
agent_id (None | str | Unset): Counterparty agent ID, when the event involves one.
5964
resource_type (None | str | Unset): REA resource kind being exchanged (`goods`, `services`, `money`, `right`,
6065
`obligation`, `information`, `labor`).
@@ -86,6 +91,7 @@ class EventBlockEnvelope:
8691
external_url: None | str | Unset = UNSET
8792
amount: int | None | Unset = UNSET
8893
description: None | str | Unset = UNSET
94+
event_action: EventBlockEnvelopeEventActionType0 | None | Unset = UNSET
8995
agent_id: None | str | Unset = UNSET
9096
resource_type: None | str | Unset = UNSET
9197
resource_element_id: None | str | Unset = UNSET
@@ -152,6 +158,14 @@ def to_dict(self) -> dict[str, Any]:
152158
else:
153159
description = self.description
154160

161+
event_action: None | str | Unset
162+
if isinstance(self.event_action, Unset):
163+
event_action = UNSET
164+
elif isinstance(self.event_action, EventBlockEnvelopeEventActionType0):
165+
event_action = self.event_action.value
166+
else:
167+
event_action = self.event_action
168+
155169
agent_id: None | str | Unset
156170
if isinstance(self.agent_id, Unset):
157171
agent_id = UNSET
@@ -222,6 +236,8 @@ def to_dict(self) -> dict[str, Any]:
222236
field_dict["amount"] = amount
223237
if description is not UNSET:
224238
field_dict["description"] = description
239+
if event_action is not UNSET:
240+
field_dict["event_action"] = event_action
225241
if agent_id is not UNSET:
226242
field_dict["agent_id"] = agent_id
227243
if resource_type is not UNSET:
@@ -321,6 +337,25 @@ def _parse_description(data: object) -> None | str | Unset:
321337

322338
description = _parse_description(d.pop("description", UNSET))
323339

340+
def _parse_event_action(
341+
data: object,
342+
) -> EventBlockEnvelopeEventActionType0 | None | Unset:
343+
if data is None:
344+
return data
345+
if isinstance(data, Unset):
346+
return data
347+
try:
348+
if not isinstance(data, str):
349+
raise TypeError()
350+
event_action_type_0 = EventBlockEnvelopeEventActionType0(data)
351+
352+
return event_action_type_0
353+
except (TypeError, ValueError, AttributeError, KeyError):
354+
pass
355+
return cast(EventBlockEnvelopeEventActionType0 | None | Unset, data)
356+
357+
event_action = _parse_event_action(d.pop("event_action", UNSET))
358+
324359
def _parse_agent_id(data: object) -> None | str | Unset:
325360
if data is None:
326361
return data
@@ -410,6 +445,7 @@ def _parse_discharges_event_id(data: object) -> None | str | Unset:
410445
external_url=external_url,
411446
amount=amount,
412447
description=description,
448+
event_action=event_action,
413449
agent_id=agent_id,
414450
resource_type=resource_type,
415451
resource_element_id=resource_element_id,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from enum import Enum
2+
3+
4+
class EventBlockEnvelopeEventActionType0(str, Enum):
5+
ACCEPT = "accept"
6+
CITE = "cite"
7+
COMBINE = "combine"
8+
CONSUME = "consume"
9+
COPY = "copy"
10+
DELIVERSERVICE = "deliverService"
11+
DROPOFF = "dropoff"
12+
LOWER = "lower"
13+
MODIFY = "modify"
14+
MOVE = "move"
15+
PICKUP = "pickup"
16+
PRODUCE = "produce"
17+
RAISE = "raise"
18+
SEPARATE = "separate"
19+
TRANSFER = "transfer"
20+
TRANSFERALLRIGHTS = "transferAllRights"
21+
TRANSFERCUSTODY = "transferCustody"
22+
USE = "use"
23+
WORK = "work"
24+
25+
def __str__(self) -> str:
26+
return str(self.value)

robosystems_client/models/update_event_block_request.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
from attrs import field as _attrs_field
99
from dateutil.parser import isoparse
1010

11+
from ..models.update_event_block_request_event_action_type_0 import (
12+
UpdateEventBlockRequestEventActionType0,
13+
)
1114
from ..models.update_event_block_request_transition_to_type_0 import (
1215
UpdateEventBlockRequestTransitionToType0,
1316
)
@@ -43,6 +46,9 @@ class UpdateEventBlockRequest:
4346
an event was captured against the wrong period.
4447
metadata_patch (UpdateEventBlockRequestMetadataPatch | Unset): Key-value pairs merged into existing metadata
4548
(additive patch, not replace).
49+
event_action (None | Unset | UpdateEventBlockRequestEventActionType0): Set or correct the canonical action verb.
50+
Unset = unchanged. Useful when an adapter improvement makes a previously-NULL verb fillable, or when
51+
reclassifying after the fact.
4652
obligated_by_event_id (None | str | Unset): Set/update the forward-materialization link.
4753
discharges_event_id (None | str | Unset): Set/update the settlement link.
4854
"""
@@ -53,6 +59,7 @@ class UpdateEventBlockRequest:
5359
description: None | str | Unset = UNSET
5460
effective_at: datetime.datetime | None | Unset = UNSET
5561
metadata_patch: UpdateEventBlockRequestMetadataPatch | Unset = UNSET
62+
event_action: None | Unset | UpdateEventBlockRequestEventActionType0 = UNSET
5663
obligated_by_event_id: None | str | Unset = UNSET
5764
discharges_event_id: None | str | Unset = UNSET
5865
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
@@ -92,6 +99,14 @@ def to_dict(self) -> dict[str, Any]:
9299
if not isinstance(self.metadata_patch, Unset):
93100
metadata_patch = self.metadata_patch.to_dict()
94101

102+
event_action: None | str | Unset
103+
if isinstance(self.event_action, Unset):
104+
event_action = UNSET
105+
elif isinstance(self.event_action, UpdateEventBlockRequestEventActionType0):
106+
event_action = self.event_action.value
107+
else:
108+
event_action = self.event_action
109+
95110
obligated_by_event_id: None | str | Unset
96111
if isinstance(self.obligated_by_event_id, Unset):
97112
obligated_by_event_id = UNSET
@@ -121,6 +136,8 @@ def to_dict(self) -> dict[str, Any]:
121136
field_dict["effective_at"] = effective_at
122137
if metadata_patch is not UNSET:
123138
field_dict["metadata_patch"] = metadata_patch
139+
if event_action is not UNSET:
140+
field_dict["event_action"] = event_action
124141
if obligated_by_event_id is not UNSET:
125142
field_dict["obligated_by_event_id"] = obligated_by_event_id
126143
if discharges_event_id is not UNSET:
@@ -198,6 +215,25 @@ def _parse_effective_at(data: object) -> datetime.datetime | None | Unset:
198215
else:
199216
metadata_patch = UpdateEventBlockRequestMetadataPatch.from_dict(_metadata_patch)
200217

218+
def _parse_event_action(
219+
data: object,
220+
) -> None | Unset | UpdateEventBlockRequestEventActionType0:
221+
if data is None:
222+
return data
223+
if isinstance(data, Unset):
224+
return data
225+
try:
226+
if not isinstance(data, str):
227+
raise TypeError()
228+
event_action_type_0 = UpdateEventBlockRequestEventActionType0(data)
229+
230+
return event_action_type_0
231+
except (TypeError, ValueError, AttributeError, KeyError):
232+
pass
233+
return cast(None | Unset | UpdateEventBlockRequestEventActionType0, data)
234+
235+
event_action = _parse_event_action(d.pop("event_action", UNSET))
236+
201237
def _parse_obligated_by_event_id(data: object) -> None | str | Unset:
202238
if data is None:
203239
return data
@@ -227,6 +263,7 @@ def _parse_discharges_event_id(data: object) -> None | str | Unset:
227263
description=description,
228264
effective_at=effective_at,
229265
metadata_patch=metadata_patch,
266+
event_action=event_action,
230267
obligated_by_event_id=obligated_by_event_id,
231268
discharges_event_id=discharges_event_id,
232269
)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from enum import Enum
2+
3+
4+
class UpdateEventBlockRequestEventActionType0(str, Enum):
5+
ACCEPT = "accept"
6+
CITE = "cite"
7+
COMBINE = "combine"
8+
CONSUME = "consume"
9+
COPY = "copy"
10+
DELIVERSERVICE = "deliverService"
11+
DROPOFF = "dropoff"
12+
LOWER = "lower"
13+
MODIFY = "modify"
14+
MOVE = "move"
15+
PICKUP = "pickup"
16+
PRODUCE = "produce"
17+
RAISE = "raise"
18+
SEPARATE = "separate"
19+
TRANSFER = "transfer"
20+
TRANSFERALLRIGHTS = "transferAllRights"
21+
TRANSFERCUSTODY = "transferCustody"
22+
USE = "use"
23+
WORK = "work"
24+
25+
def __str__(self) -> str:
26+
return str(self.value)

0 commit comments

Comments
 (0)