Skip to content

sdk-sync: API 2.0.0+ffb34b7 → sdk-java (minor) - #91

Closed
marketdata-sdk-sync[bot] wants to merge 1 commit into
mainfrom
sdk-sync/2.0.0-ffb34b7
Closed

marketdata-sdk-sync[bot] wants to merge 1 commit into
mainfrom
sdk-sync/2.0.0-ffb34b7

Conversation

@marketdata-sdk-sync

@marketdata-sdk-sync marketdata-sdk-sync Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Generated by sdk-auto-sync for API release 2.0.0 (commit ffb34b7).

Changes in the API surface

Snapshots ae2b047c8f6f → c2a31e277345:

~ GET /v1/options/chain/{underlying}/ ?dte: string  (was integer)

What the agent did

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.

Files

  • CHANGELOG.md
  • docs/options/chain.md
  • examples/consumer-test/src/main/java/com/marketdata/examples/resources/OptionsAdvancedExample.java
  • src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java
  • src/main/java/com/marketdata/sdk/OptionsResource.java
  • src/main/java/com/marketdata/sdk/options/DteFilter.java
  • src/main/java/com/marketdata/sdk/options/ExpirationFilter.java
  • src/test/java/com/marketdata/sdk/OptionsResourceTest.java

Version

Public-surface change computed by the pipeline: minor

  • added: DteFilter
  • added: DteFilter.values(int, int[])
  • added: DteFilter.range(int, int)
  • added: DteFilter.comparison(StrikeFilter.Operator, int)
  • added: DteFilter.Values
  • added: DteFilter.Range
  • added: DteFilter.Comparison
  • added: ExpirationFilter.dte(DteFilter)
  • added: ExpirationFilter.DteExpr

Live-API suite

  • src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java

Files 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-235a3f417767

Agent runs
  • coder · claude-haiku-4-5-20251001, claude-sonnet-5 · 1,872,731 tokens (132,154 in, 1,704,300 cached, 36,277 out) · 23 turns · US$ 1.24
  • coder · claude-sonnet-5 · 9,458,291 tokens (65,479 in, 9,362,022 cached, 30,790 out) · 55 turns · US$ 2.44
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 617,201 tokens (93,749 in, 510,576 cached, 12,876 out) · 11 turns · US$ 1.56
  • coder · claude-sonnet-5 · 2,903,719 tokens (16,221 in, 2,880,582 cached, 6,916 out) · 14 turns · US$ 0.71
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 119,033 tokens (52,304 in, 64,520 cached, 2,209 out) · 4 turns · US$ 0.64
  • security · claude-haiku-4-5-20251001, claude-sonnet-5 · 85,998 tokens (84,659 in, 0 cached, 1,339 out) · 2 turns · US$ 0.40
  • analyst · claude-haiku-4-5-20251001 · 106,258 tokens (36,482 in, 65,483 cached, 4,293 out) · 5 turns · US$ 0.12
  • changelog · claude-haiku-4-5-20251001 · 79,449 tokens (28,902 in, 46,268 cached, 4,279 out) · 5 turns · US$ 0.09

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.
@marketdata-sdk-sync marketdata-sdk-sync Bot added the sdk-sync: in progress sdk-sync is still working on this PR: CI, code review, fixes label Oct 8, 2026
@marketdata-sdk-sync

Copy link
Copy Markdown
Author

🧾 Job log — sdk-sync

sdk-auto-sync job log

API release 2.0.0 (commit ffb34b7)
SDK sdk-java
Branch sdk-sync/2.0.0-ffb34b7
API surface ae2b047c8f6f → c2a31e277345
Date 2026-10-08 13:18:45Z
Outcome done

Changes in the API surface

~ GET /v1/options/chain/{underlying}/ ?dte: string  (was integer)

1. tests

Coder (23 turns, US$ 1.24):

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.

Gates:

  • tests (expected to fail), attempt 1: failed — Execution failed for task ':compileTestJava' (registered by plugin class 'org.gradle.api.plugins.JavaBasePlugin').

2. implement

Coder (55 turns, US$ 2.44):

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.

Gates:

  • tests, attempt 1: passed
  • build, attempt 1: passed

3. review 1

Reviewer (11 turns, US$ 1.56): 2 blocking finding(s)

The change models the widened dte parameter as a new sealed DteFilter (list / closed range / comparison) reached through a new ExpirationFilter.dte(DteFilter) overload, with exact-wire unit tests for all four operators and both other forms, docs and example updates; the public surface change is purely additive (new type, new overload, new permitted sealed subtype), so version impact is minor, not major. Two gaps remain: the new type's validation can be bypassed through its public record constructor, and the single-value dte form of the changed parameter has no live-API test.

  • [major] src/main/java/com/marketdata/sdk/options/DteFilter.java:52 — Values' canonical constructor is public and only validates the individual days, so new DteFilter.Values(List.of()) is a public path that makes dteFilterWireValue emit ?dte= (an empty value the API rejects); a list containing a null element also fails with NullPointerException from unboxing rather than the IllegalArgumentException the factory path uses. Add an isEmpty() guard (and a null-element check) to the compact constructor, with tests for both.
  • [major] src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java:138 — The changed parameter's description enumerates four forms, and only the three new ones get a live-API test: the single-value form (ExpirationFilter.dte(30), now parsed by the server's string handler) has none here. Add one chain integration test using ExpirationFilter.dte(N) that asserts the decoded rows carry a non-null dte.
  • [minor] src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java:152 — chainDteValuesReturnsExpirationPerValue asserts only non-empty rows and non-null dte, which is true of any chain query and so does not distinguish the comma-separated form. Assert the market-independent consequence of the form instead — at most three distinct expirations for three requested values (map(OptionQuote::expiration).distinct().count() ≤ 3).

4. review fix 1

Findings sent back to the coder:

  • [major] src/main/java/com/marketdata/sdk/options/DteFilter.java:52 — Values' canonical constructor is public and only validates the individual days, so new DteFilter.Values(List.of()) is a public path that makes dteFilterWireValue emit ?dte= (an empty value the API rejects); a list containing a null element also fails with NullPointerException from unboxing rather than the IllegalArgumentException the factory path uses. Add an isEmpty() guard (and a null-element check) to the compact constructor, with tests for both.
  • [major] src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java:138 — The changed parameter's description enumerates four forms, and only the three new ones get a live-API test: the single-value form (ExpirationFilter.dte(30), now parsed by the server's string handler) has none here. Add one chain integration test using ExpirationFilter.dte(N) that asserts the decoded rows carry a non-null dte.

Minor findings sent along, as optional:

  • [minor] src/integrationTest/java/com/marketdata/sdk/OptionsIntegrationTest.java:152 — chainDteValuesReturnsExpirationPerValue asserts only non-empty rows and non-null dte, which is true of any chain query and so does not distinguish the comma-separated form. Assert the market-independent consequence of the form instead — at most three distinct expirations for three requested values (map(OptionQuote::expiration).distinct().count() ≤ 3).

Coder (14 turns, US$ 0.71):

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.

Gates:

  • tests, attempt 1: passed
  • build, attempt 1: passed

5. review 2

Reviewer (4 turns, US$ 0.64): approved

Both majors from look 1 are fixed: DteFilter.Values' canonical constructor now rejects an empty list and null elements with IllegalArgumentException (matching the factory path), each with its own wire-independent unit test, and the single-value dte form has a live-API test. The optional minor is also addressed — the comma-separated integration test now asserts the form's market-independent consequence (≤3 distinct expirations). Nothing in the touched files was weakened or newly broken.

  • no findings

6. security

Security (2 turns, US$ 0.40): approved

The change adds a sealed DteFilter type and a new ExpirationFilter.dte(DteFilter) overload to express the widened dte query parameter (list/range/comparison). All values reaching the query string are either validated integers (bounded 0–36500) or fixed operator-symbol strings from the existing StrikeFilter.Operator, with no raw/unescaped user input concatenated into the URL. No secrets, logging, dependency, TLS, or deserialization changes are present; I found no security issue in this diff.

  • no findings

7. assess

Analyst (5 turns, US$ 0.12) — public surface:

The change adds support for the API's v2.0.0 richer dte parameter syntax (comma-separated values, ranges, and comparison operators) via a new sealed type DteFilter with three variants and an overloaded ExpirationFilter.dte(DteFilter) method, while preserving the existing dte(int) API unchanged. All additions are non-breaking.

  • added: DteFilter
  • added: DteFilter.values(int, int[])
  • added: DteFilter.range(int, int)
  • added: DteFilter.comparison(StrikeFilter.Operator, int)
  • added: DteFilter.Values
  • added: DteFilter.Range
  • added: DteFilter.Comparison
  • added: ExpirationFilter.dte(DteFilter)
  • added: ExpirationFilter.DteExpr

Computed by the pipeline: minor; changelog entry written

8. changelog

Coder (5 turns, US$ 0.09):

Added DteFilter sealed type under ### Added in [Unreleased], describing v2.0.0's dte parameter widening and its three record forms and static factories.

Gates:

  • build, attempt 1: passed

Totals

  • Bump: minor
  • Coder runs: 4
  • Review runs: 3
  • Gates run: 6 (1 failed)
  • Files changed by the agent: 8
  • Turns: 119
  • Tokens: 15,242,680
  • Estimated cost: US$ 7.20

Agent runs

  • coder · claude-haiku-4-5-20251001, claude-sonnet-5 · 1,872,731 tokens (132,154 in, 1,704,300 cached, 36,277 out) · 23 turns · US$ 1.24
  • coder · claude-sonnet-5 · 9,458,291 tokens (65,479 in, 9,362,022 cached, 30,790 out) · 55 turns · US$ 2.44
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 617,201 tokens (93,749 in, 510,576 cached, 12,876 out) · 11 turns · US$ 1.56
  • coder · claude-sonnet-5 · 2,903,719 tokens (16,221 in, 2,880,582 cached, 6,916 out) · 14 turns · US$ 0.71
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 119,033 tokens (52,304 in, 64,520 cached, 2,209 out) · 4 turns · US$ 0.64
  • security · claude-haiku-4-5-20251001, claude-sonnet-5 · 85,998 tokens (84,659 in, 0 cached, 1,339 out) · 2 turns · US$ 0.40
  • analyst · claude-haiku-4-5-20251001 · 106,258 tokens (36,482 in, 65,483 cached, 4,293 out) · 5 turns · US$ 0.12
  • changelog · claude-haiku-4-5-20251001 · 79,449 tokens (28,902 in, 46,268 cached, 4,279 out) · 5 turns · US$ 0.09

@codecov

codecov Bot commented Oct 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.30%. Comparing base (bf30c72) to head (fdde442).

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              
Files with missing lines Coverage Δ
.../main/java/com/marketdata/sdk/OptionsResource.java 98.58% <100.00%> (+0.05%) ⬆️
...ain/java/com/marketdata/sdk/options/DteFilter.java 100.00% <100.00%> (ø)
...a/com/marketdata/sdk/options/ExpirationFilter.java 95.83% <100.00%> (+0.83%) ⬆️

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update bf30c72...fdde442. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@marketdata-code-review

Copy link
Copy Markdown

✅ Ready — Code review

Version impact: minor. The change adds DteFilter, its three variants and factories, and an ExpirationFilter.dte(DteFilter) overload while leaving dte(int) unchanged, so the public-surface additions preserve source and binary compatibility.

Rating patch 6/6 (exemplary) · proof 6/6 (comprehensive) · overall 6/6


Reviewed fdde442 · revision 1 · codex (gpt-5.6-sol) · claude unavailable · rules: default, sdk

@marketdata-sdk-sync marketdata-sdk-sync Bot removed the sdk-sync: in progress sdk-sync is still working on this PR: CI, code review, fixes label Oct 8, 2026
@MarketDataDev03

Copy link
Copy Markdown
Collaborator

Closed to rerun the sdk-sync pipeline from scratch for API 2.0.0 (kind-of-change label, stage durations).

@MarketDataDev03
MarketDataDev03 deleted the sdk-sync/2.0.0-ffb34b7 branch October 13, 2026 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant