feat: full v1+v2 resource surface across all 7 SDKs (0.2.0)#1
Merged
Conversation
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Adds resource clients on V1Client/V2Client (Accounts, Transactions, Status, plus v2 SyncSessions, TransactionOrders, Batches, PaymentMethods), 20 typed exception classes covering every error_code, models as records with snake_case wire markers, and Transport.RequestRawAsync for CSV/JSON export. dotnet build clean (TreatWarningsAsErrors), 70/70 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Replaces all ErrNotImplemented stubs with real services on V1Client/V2Client (accounts, transactions, status, plus v2 sync_sessions, transaction_orders, batches, payment_methods). Adds 21 typed errors mapped from error_code, json-tagged structs for every model, raw-bytes path for CSV/JSON export. gofmt/vet clean, go test -race ./... green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. First real resource layer for Java — 0.1.x shipped only the builder + transport plumbing. Adds 7 resource clients on V1Client/V2Client (Accounts, Transactions, Status, plus v2 SyncSessions, TransactionOrders, Batches, PaymentMethods), 22 model records with snake_case wire ↔ camelCase Java via @JsonProperty, 25 typed exceptions per error_code, Transport.requestRaw for CSV/JSON export. ./gradlew clean build test green with -Werror -Xlint:all, 88 JUnit tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Lands the Transport.php slim refactor (extracts BackoffStrategy, CacheKey, JsonCodec, RateLimitTracker, RequestBuilder, RequestSummarizer, RetryPolicy, TransportConfig, Uuid into src/Internal/) and wires every resource client on V1\Client / V2\Client (Accounts, Transactions, Status, plus v2 SyncSessions, TransactionOrders, Batches, PaymentMethods). Adds 37 readonly model classes with typed properties and 20 new typed exceptions per error_code. composer test/phpstan(L8)/cs-check clean, 84 phpunit tests / 302 assertions pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Replaces v2/_stubs.py with real per-resource modules (transactions, sync_sessions, transaction_orders, batches, payment_methods, status). Adds 20+ typed exception classes per error_code, frozen @DataClass models for every response shape, cursor + offset iter_* generators, and request_raw transport path for CSV/JSON export. ruff/mypy clean, 103 pytest passes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Replaces lib/tesote_sdk/v2/stubs.rb with seven dedicated resource modules. Adds typed Struct models with keyword_init + tolerant from_hash/from_array, all spec error codes mapped to typed errors, cursor + offset enumerators, and request_unversioned + request_raw transport hooks for /status,/whoami at root and CSV/JSON export. rubocop clean (34 files, 0 offenses), 129 rspec examples pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
35 endpoints (6 v1 + 29 v2) wired against the Rails-controller-derived spec. Adds resource clients on V1Client/V2Client (Accounts, Transactions, Status, plus v2 SyncSessions, TransactionOrders, Batches, PaymentMethods), typed model interfaces for every response shape, 19 new typed error classes per error_code, cursor + offset listAll* async iterators, and raw-text transport bodies for CSV/JSON export. typecheck/biome lint/build clean, 106/106 vitest tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- spec/parity.yaml: add csharp entry (pascal case, Async suffix, .cs extension) - bin/check_parity.py: support optional async_suffix per language so the parity grep matches WhoamiAsync/UpdateAsync/DeleteAsync etc. - csharp: move ListForAccount from V1.AccountsClient.ListTransactionsAsync to V1.TransactionsClient.ListForAccountAsync; rename V2.TransactionsClient.ListAsync -> ListForAccountAsync (matches the cross-language manifest spelling). Tests updated. dotnet build -c Release clean (0 warnings, TreatWarningsAsErrors), 70/70 tests pass, python3 bin/check_parity.py reports OK for all six checked languages. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (37)
📝 WalkthroughWalkthroughImplements full v1/v2 client surfaces, typed models, and granular error mapping across Go, C#, Java, PHP, Python, and Ruby. Adds raw-response transports, idempotency handling, pagination helpers, and tests. Removes stubbed clients, updates versions to 0.2.0, and refines error-code fallbacks and content-type behavior. Changes
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
CLAUDE.md mandates a PHP 8.1 floor. The agents that scaffolded the v2 model classes used class-level `final readonly class X` syntax, which PHP 8.1 cannot parse — CI on PHP 8.1 was failing with linter errors on all 37 model files. Move `readonly` from the class declaration onto each promoted constructor parameter (`public readonly string $foo,`). Same immutability guarantee, syntax-compatible with 8.1+. composer cs-check / phpstan (level 8) / phpunit all clean (84 tests / 302 assertions). `php -l` against every modified file confirms no syntax errors. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CodeRabbit failed to parse the config with "String must contain at most 250 character(s) at tone_instructions". The previous string was 317 chars. Drop the per-linter list (each language already has its own linter run in CI; doesn't need to be enumerated here). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
treasury(the YAML was stale and missed batches, sync_sessions, transactions/{search,bulk,export}, accounts/{id}/sync). Single-source spec at/tmp/tesote_v1_v2_spec.mdwas used by all seven implementation agents.What's new in each SDK
Resource clients on
V1Client/V2Client(per-language idiomatic naming):Plus, in every language:
@dataclass(frozen=True), Ruby Structs, Java records, PHP readonly classes, Go structs, C# records) for every response shape — Account, Transaction, SyncTransaction, SyncResult, SyncSession, TransactionOrder, PaymentMethod, BatchSummary, etc. Snake_case on the wire, idiomatic case in the public model.error_codefromTesoteApi::ErrorCodes— adds ~20 classes per language (NotFound family, InvalidCursor/Count/Limit/Query, MissingDateRange, SyncInProgress, SyncRateLimitExceeded, BankUnderMaintenance, BankSubmission, BankConnectionNotFound, Validation, BatchValidation, InvalidOrderState, InternalError).requestRaw/request_raw/RequestRawAsyncpath for CSV/JSON export. Cursor + offset pagination iterators.Per-language test results
./gradlew clean build testclean (-Werror -Xlint:all)go test -race ./...dotnet build -c Releaseclean (0 warnings, TreatWarningsAsErrors)python3 bin/check_parity.py: all checked languages pass.Notable side-effects
src/Internal/helpers (BackoffStrategy,CacheKey,JsonCodec,RateLimitTracker,RequestBuilder,RequestSummarizer,RetryPolicy,TransportConfig,Uuid). DeletesNotImplemented.php.jackson-databindremains the only runtime dep (date fields stay ISO-8601 strings, no jsr310).ErrNotImplementedreturns remain.v2/_stubs.py,v2/stubs.rb) deleted.async_suffix: Async; renamedV1.AccountsClient.ListTransactionsAsync→V1.TransactionsClient.ListForAccountAsync,V2.TransactionsClient.ListAsync→ListForAccountAsyncto match the manifest.bin/check_parity.py: gains an optionalasync_suffixper-language config field.spec/parity.yaml: enrolls C#.YAML drift in
treasuryThe
engines/tesote_api/docs/openapi{,_v2}.yamlfiles in treasury are missing endpoints that the controllers expose with API-key auth: batches (×5), sync_sessions (×2), transactions/search, transactions/bulk, transactions/export, accounts/{id}/sync. The SDKs in this PR ship against the controller surface; a follow-up PR intreasuryshould bring the YAMLs in line. The matching docs site update lives in a separate PR intesote.com.Test plan
ts.yml,python.yml,ruby.yml,java.yml,php.yml,go.yml,csharp.yml).parity-check.ymlgreen.paymentMethods.list,transactionOrders.createagainst a sandbox account).🤖 Generated with Claude Code
Summary by CodeRabbit