You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CLAUDE.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,7 +27,7 @@ These decisions are not up for debate without amending the corresponding ADR:
27
27
-**Java only.** Single artifact, no Kotlin sources. Published JAR must not bring `kotlin-stdlib` as a transitive dep. JSpecify is compile-time only and doesn't count. (ADR-001)
28
28
-**Kotlin consumers are first-class via interop, not via a Kotlin artifact.** A separate `marketdata-sdk-java-kotlin` extensions JAR (Option E) is deferred. (ADR-001)
29
29
-**JDK 17 minimum.** Build with `javac --release 17`; no multi-release JAR. CI test matrix is `{17, 21, 25}` for forward-compat. (ADR-002)
30
-
-**Gradle, Kotlin DSL.**`build.gradle.kts`, `settings.gradle.kts`, version catalog at `gradle/libs.versions.toml`. Standard plugins: `java-library`, `maven-publish`, Vanniktech Maven Publish (or Gradle Nexus Publish), Spotless, JaCoCo. Integration tests live in a separate `integrationTest` source set, env-var-gated. (ADR-003)
30
+
-**Gradle 8.14, Kotlin DSL.**`build.gradle.kts`, `settings.gradle.kts`, version catalog at `gradle/libs.versions.toml`. Wrapper pinned to **Gradle 8.14** (the minimum that supports JDK 25 as a toolchain target — 8.12 had this version cap and 9.0+ would also work but adds breaking changes we don't need yet). The daemon itself runs on JDK 17 via `JAVA_HOME`; toolchain forks compile/test JDKs as needed. Standard plugins: `java-library`, `maven-publish`, Vanniktech Maven Publish (or Gradle Nexus Publish), Spotless, JaCoCo. Integration tests live in a separate `integrationTest` source set, env-var-gated. (ADR-003)
31
31
-**`java.net.http.HttpClient` exclusively.** No third-party HTTP client (OkHttp, Apache) as a runtime dep — ever. HTTP/2 on (default). One shared `HttpClient` per `MarketDataClient`. Timeouts: 99s request, 2s connect. (ADR-004)
32
32
-**Jackson (`jackson-databind`) for JSON.** Records-based response models (Jackson record support, 2.12+). The API's parallel-arrays wire format (e.g. `{"s":"ok","symbol":["AAPL","MSFT"],"price":[150.0,400.0]}`) is decoded via custom `JsonDeserializer` classes, *not* default reflection. Jackson is **not shaded** in v1; shading is held in reserve. (ADR-005)
33
33
-**Sync + async parity per endpoint.** Every public endpoint exposes both `quote(...)` and `quoteAsync(...)`; async returns `CompletableFuture<T>`. **Internal logic is async-first.** Sync methods are thin wrappers that call `.join()` and unwrap `CompletionException` to surface the underlying cause directly. Both surfaces share validation, retry, rate-limit, and concurrency-pool logic — no parallel implementations. Tests must cover both variants for every endpoint. (ADR-006)
@@ -86,7 +86,6 @@ The Java SDK must also satisfy the canonical, cross-language [SDK Requirements](
86
86
- §9 retry/backoff policy and `/status/` cache workflow.
87
87
- §12 acquire/release of the concurrency semaphore around dispatched requests.
88
88
- §13 100% coverage threshold via JaCoCo `violationRules`; deferred until there is functional code worth the threshold.
89
-
- §13 integration-test CI job: wired into both `pull-request.yml` and `main.yml` as a separate `integration-tests` job that depends on `verify`. Pulls `MARKETDATA_TOKEN` from repo secrets, exports `MARKETDATA_RUN_INTEGRATION_TESTS=true`, runs `./gradlew integrationTest`. A shell-level guard skips gracefully with `::warning::` + `exit 0` when the secret isn't available (e.g. fork PRs). The IT class `MarketsStatusIT` parameterizes scenarios over `CallMode.{SYNC,ASYNC}` — `CallMode` is extracted to its own file in `src/test/java/com/marketdata/sdk/markets/CallMode.java` so the integrationTest source set can reuse it via `compileClasspath += sourceSets.test.get().output`.
90
89
91
90
When picking up new work, check this list before reaching for the SDK requirements doc — most foundational rules are already encoded in code; missing pieces are deferred deliberately, not by accident.
0 commit comments