Release SDK updates - #12
Conversation
Stainless-Generated-From: ab3e58c4baead53d7e9649f14807c0f0cec6e162
Stainless-Generated-From: f5b4eaa887d14336ee8da2f5bc83fa3fbe418b06
…e) (#1) Mechanical cleanup after the org rename autorenderhq -> autorender. Updates GitHub org/repo references (URLs, workflow repo guards, uses:, package metadata, docs). Intentionally left unchanged: SDK mount paths (autorenderhq-<lang>), Linear workspace URL, Sentry org slug. No logic changed (string references only). Co-authored-by: Geetha Karthick <geetha.karthick@seaant.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 52 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (47)
📝 WalkthroughWalkthroughThe Java client adds synchronous and asynchronous pagination for file listings, configurable stream-handler executors, and a typed upload-tag union. File services, generated models, tests, documentation, workflows, publishing metadata, and mock specification data were updated. ChangesPagination and repository alignment
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Sequence Diagram(s)sequenceDiagram
participant Caller
participant FileServiceAsync
participant FileListPageAsync
participant AutoPagerAsync
participant StreamHandlerExecutor
Caller->>FileServiceAsync: list()
FileServiceAsync-->>Caller: CompletableFuture<FileListPageAsync>
Caller->>FileListPageAsync: autoPager()
FileListPageAsync->>AutoPagerAsync: create pager
AutoPagerAsync->>StreamHandlerExecutor: schedule page traversal
StreamHandlerExecutor-->>AutoPagerAsync: deliver page items
AutoPagerAsync->>FileListPageAsync: request next page
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
⚔️ Resolve merge conflicts 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Stainless-Generated-From: 8ccecc24f89b45f829399f8e1dcd6db127a8a8aa
7a3a2b2 to
2101447
Compare
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (2)
autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt (1)
37-39: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winKeep parameterized file-list coverage.
The no-argument tests cannot detect dropped filters, sort options, or pagination values. Add a request assertion with non-default
FileListParams. Verify that a subsequent page preserves every filter and changes only the page number.
autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt#L37-L39: add a parameterizedlistrequest test.autorender-java-core/src/test/kotlin/io/autorender/services/async/FileServiceAsyncTest.kt#L38-L41: add the equivalent asynchronous request test.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt` around lines 37 - 39, The blocking test at autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt#L37-L39 and asynchronous test at autorender-java-core/src/test/kotlin/io/autorender/services/async/FileServiceAsyncTest.kt#L38-L41 should add parameterized list-request coverage using non-default FileListParams. Verify the initial request preserves every filter, sort option, and pagination value, then verify a subsequent page preserves all parameters except the page number.autorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateFromUrlParamsTest.kt (1)
19-19: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAdd coverage for the scalar tag variant.
The changed test covers only the list variant at Line [19], Line [34], and Line [46]. The upload-tag union also supports a scalar string variant. Add a separate body case for the scalar-string builder and assert the corresponding scalar
Tagsvariant.Also applies to: 34-34, 46-46
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@autorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateFromUrlParamsTest.kt` at line 19, Add a separate test body case in the upload parameter test alongside the existing tagsOfStrings cases, using the scalar-string tag builder and asserting that serialization produces the corresponding scalar Tags variant. Cover each affected request-body test path while preserving the existing list-tag assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt`:
- Line 187: Update Builder.from and the streamHandlerExecutor handling in
ClientOptions so copied options do not share shutdown ownership with the source
options. Create an independent executor for copied options, or implement
reference-counted ownership that keeps the executor alive until the final
ClientOptions.close() call.
- Around line 50-57: Update AutoPagerAsync so the nextPage().thenCompose {
it.handle() } traversal and whenComplete completion callback are both dispatched
through ClientOptions.streamHandlerExecutor, ensuring handler.onNext and
handler.onComplete execute on the configured executor rather than HTTP or
completion threads. Preserve the existing paging and completion behavior while
using executor-backed asynchronous continuations for all stream-event work.
In
`@autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt`:
- Line 39: Configure Stainless pagination with the has_next_page property so
generated wrappers use FileListPageResponse.Meta.hasNext instead of inferring
continuation from item counts. Regenerate both affected files:
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt:39-39
and
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageAsync.kt:42-42;
do not hand-edit either generated wrapper.
In `@README.md`:
- Line 14: Update the Javadocs URL in the README to reference the current 0.1.2
release, or generate that version from the project’s release metadata instead of
hardcoding 0.0.1.
- Line 343: Update all three README examples where page-consuming lambdas call
page.autoPager().subscribe(...) to use CompletableFuture.thenAccept instead of
thenRun, preserving the existing callback bodies.
In `@scripts/mock`:
- Line 14: The embedded EMBEDDED_SPEC payload in scripts/mock is stale or
unsynchronized; regenerate it directly from the repository’s current
openapi.json and replace the existing payload, preserving the fallback behavior
when STAINLESS_OPENAPI_SPEC_URL is unset.
---
Nitpick comments:
In
`@autorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateFromUrlParamsTest.kt`:
- Line 19: Add a separate test body case in the upload parameter test alongside
the existing tagsOfStrings cases, using the scalar-string tag builder and
asserting that serialization produces the corresponding scalar Tags variant.
Cover each affected request-body test path while preserving the existing
list-tag assertions.
In
`@autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt`:
- Around line 37-39: The blocking test at
autorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.kt#L37-L39
and asynchronous test at
autorender-java-core/src/test/kotlin/io/autorender/services/async/FileServiceAsyncTest.kt#L38-L41
should add parameterized list-request coverage using non-default FileListParams.
Verify the initial request preserves every filter, sort option, and pagination
value, then verify a subsequent page preserves all parameters except the page
number.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 6d2074ee-a713-44b9-8847-b67b9e2b06fa
📒 Files selected for processing (47)
.github/workflows/publish-sonatype.yml.github/workflows/release-doctor.yml.github/workflows/release-please.yml.github/workflows/stlc-promote.yml.github/workflows/stlc-sync-from-production.ymlCHANGELOG.mdCONTRIBUTING.mdREADME.mdautorender-java-client-okhttp/src/main/kotlin/io/autorender/client/okhttp/AutorenderOkHttpClient.ktautorender-java-client-okhttp/src/main/kotlin/io/autorender/client/okhttp/AutorenderOkHttpClientAsync.ktautorender-java-core/src/main/kotlin/io/autorender/core/AutoPager.ktautorender-java-core/src/main/kotlin/io/autorender/core/AutoPagerAsync.ktautorender-java-core/src/main/kotlin/io/autorender/core/Check.ktautorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.ktautorender-java-core/src/main/kotlin/io/autorender/core/Page.ktautorender-java-core/src/main/kotlin/io/autorender/core/PageAsync.ktautorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.ktautorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageAsync.ktautorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageResponse.ktautorender-java-core/src/main/kotlin/io/autorender/models/files/FileListResponse.ktautorender-java-core/src/main/kotlin/io/autorender/models/uploads/UploadCreateFromUrlParams.ktautorender-java-core/src/main/kotlin/io/autorender/services/async/FileServiceAsync.ktautorender-java-core/src/main/kotlin/io/autorender/services/async/FileServiceAsyncImpl.ktautorender-java-core/src/main/kotlin/io/autorender/services/blocking/FileService.ktautorender-java-core/src/main/kotlin/io/autorender/services/blocking/FileServiceImpl.ktautorender-java-core/src/test/kotlin/io/autorender/core/AutoPagerAsyncTest.ktautorender-java-core/src/test/kotlin/io/autorender/core/AutoPagerTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/files/FileListPageResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/files/FileListResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/files/FileRenameResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/files/FileRetrieveResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/folders/FolderCreateResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/folders/FolderListResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/folders/FolderRenameResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/multipartuploads/MultipartUploadCompleteResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/multipartuploads/MultipartUploadStartResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateFromUrlParamsTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateFromUrlResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/models/uploads/UploadCreateResponseTest.ktautorender-java-core/src/test/kotlin/io/autorender/services/ServiceParamsTest.ktautorender-java-core/src/test/kotlin/io/autorender/services/async/FileServiceAsyncTest.ktautorender-java-core/src/test/kotlin/io/autorender/services/async/UploadServiceAsyncTest.ktautorender-java-core/src/test/kotlin/io/autorender/services/blocking/FileServiceTest.ktautorender-java-core/src/test/kotlin/io/autorender/services/blocking/UploadServiceTest.ktautorender-java-proguard-test/src/test/kotlin/io/autorender/proguard/ProGuardCompatibilityTest.ktbuildSrc/src/main/kotlin/autorender.publish.gradle.ktsscripts/mock
💤 Files with no reviewable changes (3)
- .github/workflows/stlc-promote.yml
- autorender-java-core/src/test/kotlin/io/autorender/services/ServiceParamsTest.kt
- .github/workflows/stlc-sync-from-production.yml
| httpClient = clientOptions.originalHttpClient | ||
| checkJacksonVersionCompatibility = clientOptions.checkJacksonVersionCompatibility | ||
| jsonMapper = clientOptions.jsonMapper | ||
| streamHandlerExecutor = clientOptions.streamHandlerExecutor |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
ast-grep outline autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt --items all
rg -n -C 5 'from\(clientOptions: ClientOptions\)|streamHandlerExecutor|fun close\(|toBuilder' \
autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt
rg -n -C 5 'ClientOptions.*builder|toBuilder\(|streamHandlerExecutor|close\(' \
autorender-java-core/src/test/kotlinRepository: autorender/autorender-java
Length of output: 45084
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Read the relevant ClientOptions implementation sections and track copied executor references.
sed -n '24,145p' autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt
sed -n '182,190p' autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt
sed -n '458,543p' autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt
# Locate AsyncStreamResponse/Client subclasses that call close() and subscribe() on streamHandlerExecutor.
rg -n -C 4 'streamHandlerExecutor|executor|close\(\)|Cannot subscribe after|execute\(' autorender-java-core/src/main/kotlin -g '*.kt'
# Behavioral probe: simulate Builder.from copying an ExecutorService and ClientOptions.close calling shutdown,
# then a later asynchronous subscribe/task attempting execution the way AsyncStreamResponse does.
python3 - <<'PY'
import threading, time
from concurrent.futures import Future
print("No runtime source is executed; this probe only documents ExecutorService shutdown semantics from Java ExecutorService.shutdown().")
print("Relevant observed code shape:")
print("- build default: streamHandlerExecutor wraps Executors.newCachedThreadPool and ClientOptions close calls ExecutorService.shutdown().")
print("- Builder.from copies clientOptions.streamHandlerExecutor value without creating a new executor.")
print("- AsyncStreamResponse close may call shutdown() on the same streamHandlerExecutor in other code paths if that executor is shared.")
print("Observed code also uses a PhantomReachableExecutorService wrapper whose shutdown likely delegates to the wrapped executable.")
PYRepository: autorender/autorender-java
Length of output: 50385
Do not share streamHandlerExecutor ownership between copied ClientOptions.
Builder.from copies the same default ExecutorService, and ClientOptions.close() shuts it down. When toBuilder().build() replaces a reachable original client, copying also closes the original executor. Use an independent executor for copied options, or use shared reference-counted ownership that only shuts down after the last owner closes.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@autorender-java-core/src/main/kotlin/io/autorender/core/ClientOptions.kt` at
line 187, Update Builder.from and the streamHandlerExecutor handling in
ClientOptions so copied options do not share shutdown ownership with the source
options. Create an independent executor for copied options, or implement
reference-counted ownership that keeps the executor alive until the final
ClientOptions.close() call.
|
|
||
| override fun items(): List<FileListResponse> = files() | ||
|
|
||
| override fun hasNextPage(): Boolean = items().isNotEmpty() |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win
Both page wrappers ignore meta.hasNext. The response model exposes FileListPageResponse.Meta.hasNext, but both generated wrappers infer continuation from the item count. The shared root cause is the Stainless pagination configuration, which does not declare a has_next_page property. Each full traversal therefore costs one extra request when the last page is full.
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt#L39-L39: makehasNextPage()readmeta.hasNextby declaringhas_next_pagein the Stainless pagination configuration and regenerating.autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageAsync.kt#L42-L42: the same regeneration fixes the asynchronous wrapper; do not hand-edit this generated file.
📍 Affects 2 files
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt#L39-L39(this comment)autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageAsync.kt#L42-L42
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt`
at line 39, Configure Stainless pagination with the has_next_page property so
generated wrappers use FileListPageResponse.Meta.hasNext instead of inferring
continuation from item counts. Regenerate both affected files:
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPage.kt:39-39
and
autorender-java-core/src/main/kotlin/io/autorender/models/files/FileListPageAsync.kt:42-42;
do not hand-edit either generated wrapper.
26e21db chore: rename autorenderhq -> autorender references (GitHub org rename) (#1)
a27e207 chore: sync openapi.json from northstar-server
d33ab7c reseal java custom-code
0f1ece4 Build SDK
2a609b9 fix: restore staging workflows in back-sync to prevent pipeline deletion
Summary by CodeRabbit