Repository navigation
sdk-sync: API 2.0.0+ffb34b7 → sdk-java (minor) - #91
marketdata-sdk-sync[bot] wants to merge 1 commit into
Conversation
tests: Build fails as expected (missing `DteFilter` and `ExpirationFilter.dte(DteFilter)`, not yet implemented). Confirmed per phase-1 requirements; stopping here.
Summary:
- Added unit wire tests in `OptionsResourceTest.java` for the three new `dte` forms the delta enumerates: comma-separated list (`DteFilter.values`), closed range (`DteFilter.range`), and comparison operator — one test per each of the four operators (`GT`/`GTE`/`LT`/`LTE`), mirroring `StrikeFilter.Operator`'s closed set.
- Added validation tests for the new `DteFilter` factories: non-negative and ≤36500-day bounds on `values`/`range`/`comparison`, and `range`'s min≤max check — all on the new type, not on the pre-existing `ExpirationFilter.dte(int)`.
- Left the existing single-value `dte(int)` wire/validation tests untouched as the regression case; the new forms are modeled as an additive `ExpirationFilter.dte(DteFilter)` overload so no existing caller breaks.
- Added three integration tests against the live chain endpoint, one per new form (values/range/comparison), asserting decoded `dte` shape rather than exact values.
- `gradle test --no-daemon --console=plain` fails at compile time on the missing `DteFilter` symbol, as required for phase 1.
implement: Clean build succeeds from scratch, 100% coverage, formatting clean. Everything is in order.
## Summary
Widened the chain endpoint's `dte` filter from a plain integer to the API's richer string syntax (comma list, closed range, comparison operator), via a new `DteFilter` sealed type and an additive `ExpirationFilter.dte(DteFilter)` overload — the existing `dte(int)` single-value overload is untouched, so no caller breaks.
- Documentation: `docs/options/chain.md` now lists and demonstrates all three new forms.
- Every new public member documented: `DteFilter` interface, its three factories, and its three records all carry Javadoc.
- Wire test per form: comma list, closed range, and all four comparison operators (`GT`/`GTE`/`LT`/`LTE`) each assert the exact request sent, from phase 1.
- Validation holds on every public path: bounds/operator checks live in the records' compact constructors, so both the static factories and direct `new DteFilter.X(...)` enforce them.
- Coverage: 100% with no new `@Generated` exclusions.
- Examples/docs that already showed `dte` usage (chain.md's existing example, `OptionsAdvancedExample.java`) still compile and were extended, not replaced, with a new-form example.
Left unchanged, and why: `README.md`, `docs/client.md`, `docs/options/{quotes,expirations,lookup,README}.md`, `OptionsChain.java`, `OptionsCsvResource.java`, `OptionsHtmlResource.java`, `MarketDataClient.java`, `JsonResponseParserTest.java`, `RequestValidationTest.java` — their matches are incidental (generic "chain"/"ExpirationFilter" mentions, unrelated `dte` response field, or method-chaining prose), none describe the request-side `dte` syntax. `ADR-008` also left unchanged: `DteFilter` applies the sealed-type convention the ADR already accepted, rather than setting a new one. `OptionsExample.java` left unchanged — its reference to "DTE...filters" already points to `OptionsAdvancedExample`, which now covers the new form.
Outside my limits, left as-is: nothing identified as now incorrect in `.github/ISSUE_TEMPLATE/bug.yml`, `build.gradle.kts`, or `.github/BUG_FINDING.md` — their matches predate and are unrelated to this parameter change.
review fix 1: Within limits, nothing touched outside the allowed paths.
## Summary
- Major — `DteFilter.Values` public construction path (`DteFilter.java:52`): added `isEmpty()` and per-element null checks to the record's canonical constructor, each throwing `IllegalArgumentException` before any unboxing happens, so `new DteFilter.Values(...)` enforces the same invariants as the `values(...)` factory regardless of entry point. Added two direct-constructor tests: `dteFilterValuesCanonicalConstructorRejectsEmptyList` and `...RejectsNullElement`, both calling `new DteFilter.Values(...)` directly rather than through the factory.
- Major — missing live test for the single-value form (`OptionsIntegrationTest.java:138`): added `chainDteSingleValueStillResolvesViaStringHandler`, which calls `ExpirationFilter.dte(30)` against the live chain endpoint and asserts every returned row decodes a non-null `dte`.
- Minor — weak assertion in `chainDteValuesReturnsExpirationPerValue`: kept the existing non-empty/non-null checks and added the market-independent consequence of the comma-list form: distinct expirations across the 3 requested values is asserted `<= 3`.
- Updated `DteFilter.Values`'s Javadoc to state the non-empty/no-null-element invariant now enforced in the constructor itself.
- Re-ran `gradle test` and `gradle clean test build` (`--no-daemon --console=plain`): both green, 100% JaCoCo line coverage held with no new `@Generated` exclusions.
- No other files needed changes beyond the ones already touched in the prior cycle; nothing outside the test/integration-test/main-source limits was modified.
changelog: Added `DteFilter` sealed type under `### Added` in `[Unreleased]`, describing v2.0.0's dte parameter widening and its three record forms and static factories.
🧾 Job log — sdk-syncsdk-auto-sync job log
Changes in the API surface1. testsCoder (23 turns, US$ 1.24):
Gates:
2. implementCoder (55 turns, US$ 2.44):
Gates:
3. review 1Reviewer (11 turns, US$ 1.56): 2 blocking finding(s)
4. review fix 1Findings sent back to the coder:
Minor findings sent along, as optional:
Coder (14 turns, US$ 0.71):
Gates:
5. review 2Reviewer (4 turns, US$ 0.64): approved
6. securitySecurity (2 turns, US$ 0.40): approved
7. assessAnalyst (5 turns, US$ 0.12) — public surface:
Computed by the pipeline: minor; changelog entry written 8. changelogCoder (5 turns, US$ 0.09):
Gates:
Totals
Agent runs
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #91 +/- ##
============================================
+ Coverage 98.27% 98.30% +0.02%
- Complexity 1043 1055 +12
============================================
Files 123 124 +1
Lines 2606 2651 +45
Branches 301 309 +8
============================================
+ Hits 2561 2606 +45
Partials 45 45
Continue to review full report in Codecov by Harness.
🚀 New features to boost your workflow:
|
✅ Ready — Code reviewVersion impact: minor. The change adds Rating patch 6/6 (exemplary) · proof 6/6 (comprehensive) · overall 6/6 Reviewed |
|
Closed to rerun the sdk-sync pipeline from scratch for API 2.0.0 (kind-of-change label, stage durations). |
Generated by sdk-auto-sync for API release 2.0.0 (commit
ffb34b7).Changes in the API surface
Snapshots
ae2b047c8f6f→c2a31e277345:What the agent did
tests: Build fails as expected (missing
DteFilterandExpirationFilter.dte(DteFilter), not yet implemented). Confirmed per phase-1 requirements; stopping here.Summary:
OptionsResourceTest.javafor the three newdteforms the delta enumerates: comma-separated list (DteFilter.values), closed range (DteFilter.range), and comparison operator — one test per each of the four operators (GT/GTE/LT/LTE), mirroringStrikeFilter.Operator's closed set.DteFilterfactories: non-negative and ≤36500-day bounds onvalues/range/comparison, andrange's min≤max check — all on the new type, not on the pre-existingExpirationFilter.dte(int).dte(int)wire/validation tests untouched as the regression case; the new forms are modeled as an additiveExpirationFilter.dte(DteFilter)overload so no existing caller breaks.dteshape rather than exact values.gradle test --no-daemon --console=plainfails at compile time on the missingDteFiltersymbol, as required for phase 1.implement: Clean build succeeds from scratch, 100% coverage, formatting clean. Everything is in order.
Summary
Widened the chain endpoint's
dtefilter from a plain integer to the API's richer string syntax (comma list, closed range, comparison operator), via a newDteFiltersealed type and an additiveExpirationFilter.dte(DteFilter)overload — the existingdte(int)single-value overload is untouched, so no caller breaks.docs/options/chain.mdnow lists and demonstrates all three new forms.DteFilterinterface, its three factories, and its three records all carry Javadoc.GT/GTE/LT/LTE) each assert the exact request sent, from phase 1.new DteFilter.X(...)enforce them.@Generatedexclusions.dteusage (chain.md's existing example,OptionsAdvancedExample.java) still compile and were extended, not replaced, with a new-form example.Left unchanged, and why:
README.md,docs/client.md,docs/options/{quotes,expirations,lookup,README}.md,OptionsChain.java,OptionsCsvResource.java,OptionsHtmlResource.java,MarketDataClient.java,JsonResponseParserTest.java,RequestValidationTest.java— their matches are incidental (generic "chain"/"ExpirationFilter" mentions, unrelateddteresponse field, or method-chaining prose), none describe the request-sidedtesyntax.ADR-008also left unchanged:DteFilterapplies the sealed-type convention the ADR already accepted, rather than setting a new one.OptionsExample.javaleft unchanged — its reference to "DTE...filters" already points toOptionsAdvancedExample, which now covers the new form.Outside my limits, left as-is: nothing identified as now incorrect in
.github/ISSUE_TEMPLATE/bug.yml,build.gradle.kts, or.github/BUG_FINDING.md— their matches predate and are unrelated to this parameter change.review fix 1: Within limits, nothing touched outside the allowed paths.
Summary
DteFilter.Valuespublic construction path (DteFilter.java:52): addedisEmpty()and per-element null checks to the record's canonical constructor, each throwingIllegalArgumentExceptionbefore any unboxing happens, sonew DteFilter.Values(...)enforces the same invariants as thevalues(...)factory regardless of entry point. Added two direct-constructor tests:dteFilterValuesCanonicalConstructorRejectsEmptyListand...RejectsNullElement, both callingnew DteFilter.Values(...)directly rather than through the factory.OptionsIntegrationTest.java:138): addedchainDteSingleValueStillResolvesViaStringHandler, which callsExpirationFilter.dte(30)against the live chain endpoint and asserts every returned row decodes a non-nulldte.chainDteValuesReturnsExpirationPerValue: kept the existing non-empty/non-null checks and added the market-independent consequence of the comma-list form: distinct expirations across the 3 requested values is asserted<= 3.DteFilter.Values's Javadoc to state the non-empty/no-null-element invariant now enforced in the constructor itself.gradle testandgradle clean test build(--no-daemon --console=plain): both green, 100% JaCoCo line coverage held with no new@Generatedexclusions.changelog: Added
DteFiltersealed type under### Addedin[Unreleased], describing v2.0.0's dte parameter widening and its three record forms and static factories.Files
CHANGELOG.mddocs/options/chain.mdexamples/consumer-test/src/main/java/com/marketdata/examples/resources/OptionsAdvancedExample.javasrc/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.javasrc/main/java/com/marketdata/sdk/OptionsResource.javasrc/main/java/com/marketdata/sdk/options/DteFilter.javasrc/main/java/com/marketdata/sdk/options/ExpirationFilter.javasrc/test/java/com/marketdata/sdk/OptionsResourceTest.javaVersion
Public-surface change computed by the pipeline: minor
DteFilterDteFilter.values(int, int[])DteFilter.range(int, int)DteFilter.comparison(StrikeFilter.Operator, int)DteFilter.ValuesDteFilter.RangeDteFilter.ComparisonExpirationFilter.dte(DteFilter)ExpirationFilter.DteExprLive-API suite
src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.javaFiles of this suite changed by this pull request. The pipeline did not run the suite (it has no API token); this pull request's CI does.
Job log
The full record of this job — every phase, test and build result, review findings and how they were resolved, and each fix round after the PR was opened — is in the job log comment.
4 coder run(s) · 3 review(s) · 119 turns · 15,242,680 tokens · US$ 7.20 · item
5c097984-5f7b-401b-abba-235a3f417767Agent runs