Skip to content

Individual account approval resources (ruby)#25

Open
lucasmiranda-stark wants to merge 1 commit into
masterfrom
feature/account-approval
Open

Individual account approval resources (ruby)#25
lucasmiranda-stark wants to merge 1 commit into
masterfrom
feature/account-approval

Conversation

@lucasmiranda-stark

Copy link
Copy Markdown

Context

The account-approval feature — IndividualAccountRequest and IndividualAccountAttachment (each with a read-only .Log) — for the ruby infra SDK, generated from contracts individual-account-request.md (v3) and individual-account-attachment.md (v3). Run-type: generate. Run artifacts: runs/20260528-182857-account-approval/ruby/.

What changed

  • Add IndividualAccountRequest (create/get/query/page/update + read-only .Log) with a structured Address sub-resource (nested object, never flattened).
  • Add IndividualAccountAttachment (create/get/query/page/cancel + read-only .Log); the constructor encodes content+contentType into a data:<contentType>;base64,… URL client-side; contentType is input-only; cancel → status deleted (idempotent).
  • CHANGELOG entry + per-resource README usage sections.
  • Tooling: Gemfile.lock BUNDLED WITH bumped 2.1.4 → 2.5.3 (bundler 2.1.4 crashes on ruby 3.3.0; required for the suite to run).

Test plan

  • all account-approval tests passing locally against the infra sandbox (Phase 6 — see runs/20260528-182857-account-approval/ruby/test-run-success.md)
  • Sandbox smoke check (manual after merge)

Risk & Rollback

  • Risk: new resources, additive only — no changes to existing public types.
  • Rollback: revert this PR; no data migration.

Contract review (Phase 7)

Contract Review

Checklist

IndividualAccountRequest (contracts/individual-account-request.md)

Mandatory point Status Implementation Test
[M1] create accepts a list, returns same shape with server-assigned id/status/accountType/created/updated covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:64-77 'create and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:12-24
[M2] address is an object with required sub-fields (street/number/neighborhood/city/state/zipCode), serialized nested (never flattened) covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:224-256 'address is constructed as a structured object' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:100-118
[M3] get(id) returns a single IndividualAccountRequest by id covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:91-93 'create and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:22-23
[M4] query returns iterable accepting limit/after/before/status/tags/ids covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:110-123 'query' + 'query params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:28-45
[M5] page returns [items, cursor] accepting same params as query plus cursor covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:143-157 'page' + 'page params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:48-72
[M6] update(id, ...) PATCHes — accepts name/taxId/address/income/status/tags, replaces (not deep-merges) address covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:177-189 'create and update' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:77-97
[M7] status enum exactly approved/created/denied/processing/updated; test asserts every fetched status is a member covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:28 (docstring enum) 'status enum is a member of the sandbox-emitted set' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:121-127
[M8] IndividualAccountRequest::Log read-only under resource.log; provides get/query/page; log.request is the parent type covered sdk-infra/ruby/lib/individual_account_request/log.rb:21-124 'query logs' + 'query and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest_log.rb:9-40
[M9] Log.query and Log.page accept limit/after/before/types/accountRequestIds covered sdk-infra/ruby/lib/individual_account_request/log.rb:61-105 'query params' + 'page params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest_log.rb:43-63
[M10] DateTime fields (created/updated) parsed to native datetime type covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:48-49 'datetime fields parse to native type' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:133-139
[M11] accountType/flags/id/status/created/updated are output-only — not sent in POST body covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:69-76 (explicit strip) 'output-only fields passed to constructor are ignored by the API' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:144-167
[M12] Error cases: name empty raises InputErrors (code-agnostic) covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:64-77 'create with empty name raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:172-178
[M12] Error cases: taxId invalid raises InputErrors covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:64-77 'create with invalid taxId raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:180-186
[M12] Error cases: address missing required sub-fields raises InputErrors covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:64-77 'create with incomplete address raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:188-198
[M12] Error cases: income < 0 raises InputErrors (income=0 is accepted — no error test) covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:64-77 'create with negative income raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:200-206
[M12] Error cases: status invalid transition raises InputErrors covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:177-189 'update with invalid status raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:208-215
[M12] Error cases: get("0") unknown id raises InputErrors covered sdk-infra/ruby/lib/individual_account_request/individual_account_request.rb:91-93 'get with unknown id raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountrequest.rb:217-221

IndividualAccountAttachment (contracts/individual-account-attachment.md)

Mandatory point Status Implementation Test
[M1] create accepts a list, returns same shape with server-assigned id/status/created covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:60-62 'create and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:14-27
[M2] constructor encodes content + contentType into data:;base64, URL client-side covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:42-45 'constructor encodes content and contentType into a data URL' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:97-111
[M3] contentType is input-only — not serialized as its own wire field; nil on deserialized response covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:44 (@content_type = nil after encoding) 'contentType is not present on the deserialized response object' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:115-125
[M4] get(id) returns a single IndividualAccountAttachment by id covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:76-78 'create and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:26-27
[M5] query returns iterable accepting limit/after/before/status/tags/ids covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:95-108 'query' + 'query params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:31-48
[M6] page returns [items, cursor] accepting same params as query plus cursor covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:128-142 'page' + 'page params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:51-75
[M7] cancel(id) maps to DELETE, returns status="deleted", is idempotent (second cancel succeeds) covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:156-158 'create and cancel is idempotent' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:79-94
[M8] resource exposed under IndividualAccountAttachment (not accountRequestAttachment) covered sdk-infra/ruby/lib/starkinfra.rb:18-19 test_individualaccountattachment.rb:7 (describe block uses StarkInfra::IndividualAccountAttachment)
[M9] IndividualAccountAttachment::Log read-only under resource.log; provides get/query/page; log.attachment is parent type covered sdk-infra/ruby/lib/individual_account_attachment/log.rb:21-124 'query logs' + 'query and get' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment_log.rb:9-40
[M10] Log.query and Log.page accept limit/after/before/types/attachmentIds (NOT accountRequestIds) covered sdk-infra/ruby/lib/individual_account_attachment/log.rb:61-105 'query params' + 'page params' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment_log.rb:44-64
[M11] type enum exactly drivers-license-front/drivers-license-back/identity-front/identity-back; selfie rejected covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:18-19 (docstring enum) 'type enum is a member of the documented set' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:128-134 + 'create with invalid type raises InputErrors' @ line 154-168
[M12] DateTime field (created) parsed to native datetime type covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:38 'created parses to native datetime type' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:140-148
[M13] Error cases: type not in enum raises InputErrors covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:60-62 'create with invalid type raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:154-168
[M13] Error cases: content empty raises InputErrors covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:60-62 'create with empty content raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:170-184
[M13] Error cases: contentType missing when content provided raises InputErrors (code is client-serialization-dependent) covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:42-45 'create with missing contentType raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:186-201
[M13] Error cases: accountRequestId not found raises InputErrors covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:60-62 'create with unknown accountRequestId raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:203-214
[M13] Error cases: get("0") unknown id raises InputErrors covered sdk-infra/ruby/lib/individual_account_attachment/individual_account_attachment.rb:76-78 'get with unknown id raises InputErrors' @ sdk-infra/ruby/test/starkinfra/test_individualaccountattachment.rb:216-220
[M14] Previous AccountRequestAttachment removed (route /account-request-attachment, SDK identifier accountRequestAttachment) not applicable n/a n/a — run-type is generate (greenfield); no legacy AccountRequestAttachment ever existed in this SDK. No grep match for AccountRequestAttachment/account_request_attachment in sdk-infra/ruby/ (confirmed).

Summary

  • Total mandatory points: 33 (request M1–M12 expanded to 16 rows; attachment M1–M14 expanded to 17 rows)
  • covered: 32
  • not covered: 0
  • partial: 0
  • not applicable: 1 (attachment M14 — generate run-type, no legacy)
  • VERDICT: PASS (not-covered == 0 and partial == 0)

If FAIL — routing recommendation

N/A — VERDICT is PASS.

Metadata

  • Contracts: contracts/individual-account-request.md (v3), contracts/individual-account-attachment.md (v3)
  • Run artifacts: runs/20260528-182857-account-approval/ruby/
  • Branch: feature/account-approval
  • Base SHA: 927db714d613403c146c1468a3244b3f657b374e

@lucasmiranda-stark lucasmiranda-stark requested a review from a team May 29, 2026 23:42
@lucasmiranda-stark lucasmiranda-stark force-pushed the feature/account-approval branch from 798923d to b25d71b Compare May 30, 2026 00:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant