Repository navigation
sdk-sync: API 2.0.0+ffb34b7 → sdk-java (minor) - #99
marketdata-sdk-sync[bot] wants to merge 2 commits into
Conversation
tests: Added unit tests (OptionsResourceTest) for the chain endpoint's dte parameter's new wire forms: comma-separated list, closed range, and comparison operator (one wire test per operator GT/GTE/LT/LTE), plus validation tests for empty/negative list, min>max range, negative range/comparison values — all against new `ExpirationFilter.dteList`/`dteRange`/`dteComparison`/`Operator` symbols, additive alongside the existing `dte(int)`. Added integration tests (OptionsIntegrationTest) deriving a live baseline dte set per test and asserting list/range/comparison results against candidates computed from that baseline, never an exact value assumed in advance; left "closest" tie-breaking and bound inclusivity unasserted since the response can't verify them. Added the compat probe exercising today's `ExpirationFilter.dte(int)` + chain/chainAsync, verified it still compiles. No production code touched.</summary> <parameter name="status">`gradle compileTestJava --no-daemon --console=plain` and `gradle test --no-daemon --console=plain` both fail with "cannot find symbol" on the new `dteList`/`dteRange`/`dteComparison`/`Operator` references in OptionsResourceTest.java, as expected for phase 1; the compat probe file itself produced no errors in either run. implement: Implemented the `dte` chain parameter's widened type: `ExpirationFilter.dteList`/`dteRange`/`dteComparison` (plus a new `Operator` enum GT/GTE/LT/LTE) as additive sealed-interface variants alongside the unchanged `dte(int)`, wired through `OptionsResource.applyExpirationFilter`. Docs: every new method/type documented with javadoc and an example in docs/options/chain.md and OptionsAdvancedExample.java. New-member docs: static factories and the `Operator` enum have javadoc, matching the sibling `StrikeFilter` convention of no per-record/per-constant javadoc. Wire tests: one per form (list, range) plus one per operator (GT/GTE/LT/LTE) were already written in phase 1 and now pass. Validation: moved into each new record's compact constructor (not just the static factory), so `new ExpirationFilter.DteList(...)` etc. validate too; `List.copyOf` rejects null elements, empty-list and negative-value checks are explicit. Coverage: no `@Generated` exclusions added; `jacocoTestCoverageVerification` (100% line) passes on the new code as written. Examples/docs already showing the area (README, OptionsExample, quotes.md) use forms unaffected by this change and remain correct; chain.md and OptionsAdvancedExample.java updated. Docs promise only what's validated: "non-empty list", "min <= max" mirror actual checks; range/comparison inclusivity text cites `StrikeFilter`'s existing documentation of the same grammar rather than asserting new observed behavior. `ExpirationFilter.dte(int)` is untouched, so it keeps accepting everything it did. Left unchanged: docs/adr/ADR-008 (historical record of variants as of its acceptance date, not a living inventory) and docs/.sync-manifest.txt (auto-generated, self-marked do-not-hand-edit). Outside my limits, checked and found no stale references needing a fix: `.github/ISSUE_TEMPLATE/bug.yml` and `build.gradle.kts` don't name `dte` specifically.</summary> <parameter name="status">`gradle test --no-daemon --console=plain` and `gradle build --no-daemon --console=plain` both green (build includes Spotless and 100% JaCoCo line-coverage verification); `gradle compileTestJava` also green now that the phase-1 compat probe has been removed by the pipeline.</parameter> </invoke> changelog: I've already called the StructuredOutput tool in my previous response to provide the summary and status. The changelog entry has been successfully added to `CHANGELOG.md` under the `[Unreleased]` section, documenting the three new `ExpirationFilter` static factory methods and the `Operator` enum for API release 2.0.0.
🧾 Job log — sdk-syncsdk-auto-sync job log
Changes in the API surface1. testsCoder (42 turns, US$ 1.47, 7 min 23 s):
Gates:
2. implementCoder (63 turns, US$ 2.32, 8 min 00 s):
Gates:
3. review 1Reviewer (11 turns, US$ 2.07, 4 min 57 s): approved
4. securitySecurity (2 turns, US$ 0.40, 26 s): approved
5. assessAnalyst (5 turns, US$ 0.23, 26 s) — public surface:
Computed by the pipeline: minor; changelog entry written 6. changelogCoder (6 turns, US$ 0.11, 51 s):
Gates:
Totals
Agent runs
Code review fix 1 — 2026-10-29 13:46:56ZOutcome: done Time: 8 min 42 s (agents 8 min 00 s, gates 42 s) 1. code review fix 1The code review asked for changes:
Coder (32 turns, US$ 0.80, 3 min 55 s):
Gates:
2. review 1Reviewer (5 turns, US$ 0.64, 1 min 27 s): 1 blocking finding(s)
3. review fix 1Findings sent back to the coder:
Minor findings sent along, as optional:
Coder (18 turns, US$ 0.41, 1 min 38 s):
Gates:
4. review 2Reviewer (5 turns, US$ 0.46, 48 s): approved
5. securitySecurity (2 turns, US$ 0.16, 12 s): approved
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #99 +/- ##
============================================
+ Coverage 98.27% 98.29% +0.02%
- Complexity 1043 1049 +6
============================================
Files 123 123
Lines 2606 2644 +38
Branches 301 310 +9
============================================
+ Hits 2561 2599 +38
Partials 45 45
Continue to review full report in Codecov by Harness.
🚀 New features to boost your workflow:
|
🟡 Needs changes — Code reviewAdds additive DTE list, range, and comparison filters for options chains, with documentation and unit/live tests; the existing Rating patch 5/6 (solid) · proof 3/6 (partial) · overall 3/6 Before merge
FindingsShould fix
Since last review
Reviewed |
code review fix 1: Fixed both review findings. 1) OptionsIntegrationTest.java: the five dte-filter tests and the shared `baselineDtes()` helper now capture one `LocalDate.now(ZoneId.of("America/New_York"))` per test and pass it via `.date(...)` to both the baseline call and the filtered call, so DTE values can't drift if the two live calls straddle US/Eastern midnight. 2) ExpirationFilter.java and docs/options/chain.md: javadoc for `dte(int)`, `dteList`, `dteRange`, and `dteComparison` now states both omitted constraints — values are relative to the request's `date` parameter (to "today" when unset) and capped at 36,500 days — matching the API's own description; no new runtime validation was added since the finding asked only for documentation. No public-surface or behavior change, so CHANGELOG.md is left as-is.</parameter>
<parameter name="status">`gradle test --no-daemon --console=plain` and `gradle build --no-daemon --console=plain` both green after `gradle spotlessApply` reformatted the new javadoc wrapping.</parameter>
</invoke>
review fix 1: [major] Fixed: replaced the wall-clock `LocalDate.now(ZoneId.of("America/New_York"))` in the five dte-filter integration tests and `baselineDtes()` with a single new constant, `DTE_FIXED_TRADING_DAY = LocalDate.of(2026, 10, 27)` (a recent Tuesday, no US market holiday nearby), removing the dependence on which day/weekend the CI job happens to run on. Updated the surrounding comments and the `baselineDtes()` javadoc to describe pinning to a fixed trading day rather than an Eastern "today," and dropped the now-unused `ZoneId` import.
[minor] Not a separate fix: pinning to a fixed historical day (rather than today) also resolves the API-team question raised in this note, since `.date()` is now used exactly as documented — a historical trading day — rather than for "today." No further action taken; no one here can confirm server behavior beyond what the response itself shows, so nothing new is asserted about it.</parameter>
<parameter name="status">`gradle test --no-daemon --console=plain` and `gradle build --no-daemon --console=plain` both green (build includes compileIntegrationTestJava, Spotless, and 100% JaCoCo coverage verification).</parameter>
</invoke>
|
Closing to re-run the SDK sync for API 2.0.0 with the live-API gate for sdk-java. |
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: Added unit tests (OptionsResourceTest) for the chain endpoint's dte parameter's new wire forms: comma-separated list, closed range, and comparison operator (one wire test per operator GT/GTE/LT/LTE), plus validation tests for empty/negative list, min>max range, negative range/comparison values — all against new
ExpirationFilter.dteList/dteRange/dteComparison/Operatorsymbols, additive alongside the existingdte(int). Added integration tests (OptionsIntegrationTest) deriving a live baseline dte set per test and asserting list/range/comparison results against candidates computed from that baseline, never an exact value assumed in advance; left "closest" tie-breaking and bound inclusivity unasserted since the response can't verify them. Added the compat probe exercising today'sExpirationFilter.dte(int)+ chain/chainAsync, verified it still compiles. No production code touched.gradle compileTestJava --no-daemon --console=plainandgradle test --no-daemon --console=plainboth fail with "cannot find symbol" on the newdteList/dteRange/dteComparison/Operatorreferences in OptionsResourceTest.java, as expected for phase 1; the compat probe file itself produced no errors in either run.implement: Implemented the
dtechain parameter's widened type:ExpirationFilter.dteList/dteRange/dteComparison(plus a newOperatorenum GT/GTE/LT/LTE) as additive sealed-interface variants alongside the unchangeddte(int), wired throughOptionsResource.applyExpirationFilter.Docs: every new method/type documented with javadoc and an example in docs/options/chain.md and OptionsAdvancedExample.java.
New-member docs: static factories and the
Operatorenum have javadoc, matching the siblingStrikeFilterconvention of no per-record/per-constant javadoc.Wire tests: one per form (list, range) plus one per operator (GT/GTE/LT/LTE) were already written in phase 1 and now pass.
Validation: moved into each new record's compact constructor (not just the static factory), so
new ExpirationFilter.DteList(...)etc. validate too;List.copyOfrejects null elements, empty-list and negative-value checks are explicit.Coverage: no
@Generatedexclusions added;jacocoTestCoverageVerification(100% line) passes on the new code as written.Examples/docs already showing the area (README, OptionsExample, quotes.md) use forms unaffected by this change and remain correct; chain.md and OptionsAdvancedExample.java updated.
Docs promise only what's validated: "non-empty list", "min <= max" mirror actual checks; range/comparison inclusivity text cites
StrikeFilter's existing documentation of the same grammar rather than asserting new observed behavior.ExpirationFilter.dte(int)is untouched, so it keeps accepting everything it did.Left unchanged: docs/adr/ADR-008 (historical record of variants as of its acceptance date, not a living inventory) and docs/.sync-manifest.txt (auto-generated, self-marked do-not-hand-edit).
Outside my limits, checked and found no stale references needing a fix:
.github/ISSUE_TEMPLATE/bug.ymlandbuild.gradle.ktsdon't namedtespecifically.gradle test --no-daemon --console=plainandgradle build --no-daemon --console=plainboth green (build includes Spotless and 100% JaCoCo line-coverage verification);gradle compileTestJavaalso green now that the phase-1 compat probe has been removed by the pipeline.changelog: I've already called the StructuredOutput tool in my previous response to provide the summary and status. The changelog entry has been successfully added to
CHANGELOG.mdunder the[Unreleased]section, documenting the three newExpirationFilterstatic factory methods and theOperatorenum for API release 2.0.0.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/ExpirationFilter.javasrc/test/java/com/marketdata/sdk/OptionsResourceTest.javaVersion
Public-surface change computed by the pipeline: minor
ExpirationFilter.dteList(List<Integer>)— New static factory method; existing ExpirationFilter.dte(int) is unchanged.ExpirationFilter.dteRange(int, int)— New static factory method.ExpirationFilter.dteComparison(ExpirationFilter.Operator, int)— New static factory method.ExpirationFilter.Operator— New public enum with constants GT, GTE, LT, LTE and accessor wireValue(); a new enum at the end of a new type is additive.ExpirationFilter.DteList— New permitted record subtype of sealed ExpirationFilter (field: days()); per this SDK's rule 9, a new permitted subtype of a sealed interface is added, not a change to the sealed parent.ExpirationFilter.DteRange— New permitted record subtype of sealed ExpirationFilter (fields: min(), max()).ExpirationFilter.DteComparison— New permitted record subtype of sealed ExpirationFilter (fields: operator(), days()).Live-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.
3 coder run(s) · 2 review(s) · 129 turns · 12,697,451 tokens · US$ 6.61 · item
5c097984-5f7b-401b-abba-235a3f417767Agent runs