Skip to content

Commit d95d9c4

Browse files
committed
To include request body and typed request body
1 parent d86b8cf commit d95d9c4

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

src/tools/endpoint_index.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ class EndpointSchema(BaseModel):
134134
description_markdown: str = Field(default="", description="Description in markdown format")
135135
tags: List[str] = Field(default_factory=list, description="Tags for categorization")
136136
parameters: List[EndpointParameter] = Field(default_factory=list, description="Endpoint parameters")
137-
requestBody: Optional[Dict[str, Any]] = Field(default=None, description="Request body specification")
137+
requestBody: Optional[Dict[str, Any]] = Field(default=None, description="OpenAPI-style request body specification (from swagger path)")
138+
example_request_body: Optional[Dict[str, Any]] = Field(default=None, description="Concrete example request body (from OBP resource-docs)")
139+
typed_request_body: Optional[Dict[str, Any]] = Field(default=None, description="JSON Schema for request body (from OBP resource-docs)")
138140
responses: Dict[str, EndpointResponse] = Field(default_factory=dict, description="Response specifications by status code")
139141
success_response_body: Optional[Dict[str, Any]] = Field(default=None, description="Example success response body")
140142
error_response_bodies: List[str] = Field(default_factory=list, description="Possible error response messages")
@@ -189,6 +191,8 @@ def from_raw(cls, data: Dict[str, Any]) -> "EndpointSchema":
189191
tags=data.get("tags", []),
190192
parameters=parameters,
191193
requestBody=data.get("requestBody"),
194+
example_request_body=data.get("example_request_body"),
195+
typed_request_body=data.get("typed_request_body"),
192196
responses=responses,
193197
success_response_body=data.get("success_response_body"),
194198
error_response_bodies=data.get("error_response_bodies", []),
@@ -420,7 +424,11 @@ def build_index_from_resource_docs(self, resource_docs_data: Dict[str, Any]) ->
420424
# Extract roles from resource docs format
421425
roles = doc.get("roles", [])
422426

423-
# Store full schema separately (keyed by endpoint_id)
427+
# Store full schema separately (keyed by endpoint_id).
428+
# OBP resource-docs use `example_request_body` / `typed_request_body`
429+
# (a concrete example object + a JSON Schema). The OpenAPI-style
430+
# `requestBody` field stays None on this path since resource-docs
431+
# don't carry that exact shape — clients should prefer the example.
424432
self._schemas[endpoint_id] = {
425433
"path": path,
426434
"method": method,
@@ -431,6 +439,8 @@ def build_index_from_resource_docs(self, resource_docs_data: Dict[str, Any]) ->
431439
"tags": tags,
432440
"parameters": [], # Resource docs don't provide parameters in the same way
433441
"requestBody": None,
442+
"example_request_body": doc.get("example_request_body"),
443+
"typed_request_body": doc.get("typed_request_body"),
434444
"responses": {},
435445
"success_response_body": doc.get("success_response_body"),
436446
"error_response_bodies": doc.get("error_response_bodies", []),

tests/test_endpoint_index.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,35 @@ def test_schema_from_raw(self):
232232
assert len(schema.responses) == 2
233233
assert schema.responses["200"].description == "Success"
234234

235+
def test_schema_carries_request_body_example_from_resource_docs(self):
236+
"""Resource-docs request-body examples should be exposed, not dropped."""
237+
raw_data = {
238+
"path": "/obp/v6.0.0/banks",
239+
"method": "POST",
240+
"operation_id": "OBPv6.0.0-createBank",
241+
"summary": "Create Bank",
242+
"tags": ["Bank"],
243+
"example_request_body": {
244+
"bank_id": "gh.29.uk",
245+
"bank_code": "CGHZ",
246+
"full_name": "Bank of Example",
247+
},
248+
"typed_request_body": {
249+
"type": "object",
250+
"properties": {
251+
"bank_id": {"type": "string"},
252+
"bank_code": {"type": "string"},
253+
},
254+
},
255+
}
256+
schema = EndpointSchema.from_raw(raw_data)
257+
assert schema.example_request_body is not None
258+
assert schema.example_request_body["bank_id"] == "gh.29.uk"
259+
assert schema.typed_request_body is not None
260+
assert schema.typed_request_body["properties"]["bank_id"]["type"] == "string"
261+
# OpenAPI-style requestBody stays None on the resource-docs path.
262+
assert schema.requestBody is None
263+
235264
def test_schema_serialization(self):
236265
"""Test that schema serializes to JSON correctly."""
237266
schema = EndpointSchema(

0 commit comments

Comments
 (0)