Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
dd2bca3
feat(client): add `HttpRequest#url()` method
stainless-app[bot] Jan 6, 2026
4f0db30
feat(client): allow configuring dispatcher executor service
stainless-app[bot] Jan 9, 2026
d790509
chore(internal): support uploading Maven repo artifacts to stainless …
stainless-app[bot] Jan 13, 2026
d441da9
chore(internal): clean up maven repo artifact script and add html doc…
stainless-app[bot] Jan 16, 2026
b2ac60a
chore: test on Jackson 2.14.0 to avoid encountering FasterXML/jackson…
stainless-app[bot] Jan 17, 2026
24c2d4b
chore(internal): improve maven repo docs
stainless-app[bot] Jan 17, 2026
3ee28c5
fix(client): disallow coercion from float to int
stainless-app[bot] Jan 17, 2026
8cfab13
chore(internal): update `actions/checkout` version
stainless-app[bot] Jan 17, 2026
2ddb812
fix(client): fully respect max retries
stainless-app[bot] Jan 17, 2026
67eb04e
chore(ci): upgrade `actions/setup-java`
stainless-app[bot] Jan 17, 2026
0259720
chore(internal): update maven repo doc to include authentication
stainless-app[bot] Jan 22, 2026
f6d45cd
feat(client): send `X-Stainless-Kotlin-Version` header
stainless-app[bot] Jan 22, 2026
a636226
docs: add comment for arbitrary value fields
stainless-app[bot] Jan 23, 2026
d3c3b9c
chore(internal): correct cache invalidation for `SKIP_MOCK_TESTS`
stainless-app[bot] Jan 23, 2026
573fcaf
fix(client): preserve time zone in lenient date-time parsing
stainless-app[bot] Jan 23, 2026
a32a19d
chore(ci): upgrade `actions/github-script`
stainless-app[bot] Jan 24, 2026
6657dbb
release: 0.1.0
stainless-app[bot] Jan 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |
Expand All @@ -40,14 +40,17 @@ jobs:
build:
timeout-minutes: 15
name: build
permissions:
contents: read
id-token: write
runs-on: ${{ github.repository == 'stainless-sdks/blooio-java' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |
Expand All @@ -61,16 +64,31 @@ jobs:
- name: Build SDK
run: ./scripts/build

- name: Get GitHub OIDC Token
if: github.repository == 'stainless-sdks/blooio-java'
id: github-oidc
uses: actions/github-script@v8
with:
script: core.setOutput('github_token', await core.getIDToken());

- name: Build and upload Maven artifacts
if: github.repository == 'stainless-sdks/blooio-java'
env:
URL: https://pkg.stainless.com/s
AUTH: ${{ steps.github-oidc.outputs.github_token }}
SHA: ${{ github.sha }}
PROJECT: blooio-java
run: ./scripts/upload-artifacts
test:
timeout-minutes: 15
name: test
runs-on: ${{ github.repository == 'stainless-sdks/blooio-java' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-sonatype.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-doctor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
if: github.repository == 'Blooio/blooio-java-sdk' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Check release environment
run: |
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.0.4"
".": "0.1.0"
}
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
# Changelog

## 0.1.0 (2026-01-24)

Full Changelog: [v0.0.4...v0.1.0](https://github.com/Blooio/blooio-java-sdk/compare/v0.0.4...v0.1.0)

### Features

* **client:** add `HttpRequest#url()` method ([dd2bca3](https://github.com/Blooio/blooio-java-sdk/commit/dd2bca38596e4ef7626ef23d1a73ce7678a4375e))
* **client:** allow configuring dispatcher executor service ([4f0db30](https://github.com/Blooio/blooio-java-sdk/commit/4f0db3097b9b0c1876887115146216c0b3a50c30))
* **client:** send `X-Stainless-Kotlin-Version` header ([f6d45cd](https://github.com/Blooio/blooio-java-sdk/commit/f6d45cddc950b7443fb661d4804c4986ef89c187))


### Bug Fixes

* **client:** disallow coercion from float to int ([3ee28c5](https://github.com/Blooio/blooio-java-sdk/commit/3ee28c5e8bd033c3d96134fb13903941de2e8735))
* **client:** fully respect max retries ([2ddb812](https://github.com/Blooio/blooio-java-sdk/commit/2ddb8126d441b260c80b9ef3b87a24f9ce20b5be))
* **client:** preserve time zone in lenient date-time parsing ([573fcaf](https://github.com/Blooio/blooio-java-sdk/commit/573fcaf71930c387314fb18231334b542df8a47f))
* **client:** send retry count header for max retries 0 ([2ddb812](https://github.com/Blooio/blooio-java-sdk/commit/2ddb8126d441b260c80b9ef3b87a24f9ce20b5be))
* date time deserialization leniency ([b2ac60a](https://github.com/Blooio/blooio-java-sdk/commit/b2ac60a271022b4f389feee2e73467927b2c7a51))


### Chores

* **ci:** upgrade `actions/github-script` ([a32a19d](https://github.com/Blooio/blooio-java-sdk/commit/a32a19dcfbeff710c7c6c0b4daaa8ed98107294a))
* **ci:** upgrade `actions/setup-java` ([67eb04e](https://github.com/Blooio/blooio-java-sdk/commit/67eb04e66d48b47097af4e8d66f093688ff1f8ef))
* **internal:** clean up maven repo artifact script and add html documentation to repo root ([d441da9](https://github.com/Blooio/blooio-java-sdk/commit/d441da9aa8607881a63e2ed14b9037fcccf1600d))
* **internal:** correct cache invalidation for `SKIP_MOCK_TESTS` ([d3c3b9c](https://github.com/Blooio/blooio-java-sdk/commit/d3c3b9c5e26275edbc5897780f4338d88e65eb7d))
* **internal:** depend on packages directly in example ([2ddb812](https://github.com/Blooio/blooio-java-sdk/commit/2ddb8126d441b260c80b9ef3b87a24f9ce20b5be))
* **internal:** improve maven repo docs ([24c2d4b](https://github.com/Blooio/blooio-java-sdk/commit/24c2d4b5b8e3295a5218d2f999fd796fef269b88))
* **internal:** support uploading Maven repo artifacts to stainless package server ([d790509](https://github.com/Blooio/blooio-java-sdk/commit/d7905093b659e696e05478ee514fbbad370cc9d0))
* **internal:** update `actions/checkout` version ([8cfab13](https://github.com/Blooio/blooio-java-sdk/commit/8cfab13629687564f829968a161b50843d8ddc73))
* **internal:** update maven repo doc to include authentication ([0259720](https://github.com/Blooio/blooio-java-sdk/commit/025972007906b16f60bb8dc09ff3433c752f4be0))
* test on Jackson 2.14.0 to avoid encountering FasterXML/jackson-databind[#3240](https://github.com/Blooio/blooio-java-sdk/issues/3240) in tests ([b2ac60a](https://github.com/Blooio/blooio-java-sdk/commit/b2ac60a271022b4f389feee2e73467927b2c7a51))


### Documentation

* add comment for arbitrary value fields ([a636226](https://github.com/Blooio/blooio-java-sdk/commit/a636226690a94e032e7b7d6e8fcf9d2f373bcfc3))

## 0.0.4 (2025-12-03)

Full Changelog: [v0.0.3...v0.0.4](https://github.com/Blooio/blooio-java-sdk/compare/v0.0.3...v0.0.4)
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright 2025 Blooio
Copyright 2026 Blooio

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

<!-- x-release-please-start-version -->

[![Maven Central](https://img.shields.io/maven-central/v/com.blooio.api/blooio-java)](https://central.sonatype.com/artifact/com.blooio.api/blooio-java/0.0.4)
[![javadoc](https://javadoc.io/badge2/com.blooio.api/blooio-java/0.0.4/javadoc.svg)](https://javadoc.io/doc/com.blooio.api/blooio-java/0.0.4)
[![Maven Central](https://img.shields.io/maven-central/v/com.blooio.api/blooio-java)](https://central.sonatype.com/artifact/com.blooio.api/blooio-java/0.1.0)
[![javadoc](https://javadoc.io/badge2/com.blooio.api/blooio-java/0.1.0/javadoc.svg)](https://javadoc.io/doc/com.blooio.api/blooio-java/0.1.0)

<!-- x-release-please-end -->

Expand All @@ -13,7 +13,7 @@ It is generated with [Stainless](https://www.stainless.com/).

<!-- x-release-please-start-version -->

Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.blooio.api/blooio-java/0.0.4).
Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.blooio.api/blooio-java/0.1.0).

<!-- x-release-please-end -->

Expand All @@ -24,7 +24,7 @@ Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.blooio.api/blo
### Gradle

```kotlin
implementation("com.blooio.api:blooio-java:0.0.4")
implementation("com.blooio.api:blooio-java:0.1.0")
```

### Maven
Expand All @@ -33,7 +33,7 @@ implementation("com.blooio.api:blooio-java:0.0.4")
<dependency>
<groupId>com.blooio.api</groupId>
<artifactId>blooio-java</artifactId>
<version>0.0.4</version>
<version>0.1.0</version>
</dependency>
```

Expand Down Expand Up @@ -258,6 +258,8 @@ If the SDK threw an exception, but you're _certain_ the version is compatible, t
> [!CAUTION]
> We make no guarantee that the SDK works correctly when the Jackson version check is disabled.

Also note that there are bugs in older Jackson versions that can affect the SDK. We don't work around all Jackson bugs ([example](https://github.com/FasterXML/jackson-databind/issues/3240)) and expect users to upgrade Jackson for those instead.

## Network options

### Retries
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import java.net.Proxy
import java.time.Clock
import java.time.Duration
import java.util.Optional
import java.util.concurrent.ExecutorService
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager
Expand Down Expand Up @@ -44,11 +45,31 @@ class BlooioOkHttpClient private constructor() {
class Builder internal constructor() {

private var clientOptions: ClientOptions.Builder = ClientOptions.builder()
private var dispatcherExecutorService: ExecutorService? = null
private var proxy: Proxy? = null
private var sslSocketFactory: SSLSocketFactory? = null
private var trustManager: X509TrustManager? = null
private var hostnameVerifier: HostnameVerifier? = null

/**
* The executor service to use for running HTTP requests.
*
* Defaults to OkHttp's
* [default executor service](https://github.com/square/okhttp/blob/ace792f443b2ffb17974f5c0d1cecdf589309f26/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Dispatcher.kt#L98-L104).
*
* This class takes ownership of the executor service and shuts it down when closed.
*/
fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply {
this.dispatcherExecutorService = dispatcherExecutorService
}

/**
* Alias for calling [Builder.dispatcherExecutorService] with
* `dispatcherExecutorService.orElse(null)`.
*/
fun dispatcherExecutorService(dispatcherExecutorService: Optional<ExecutorService>) =
dispatcherExecutorService(dispatcherExecutorService.getOrNull())

fun proxy(proxy: Proxy?) = apply { this.proxy = proxy }

/** Alias for calling [Builder.proxy] with `proxy.orElse(null)`. */
Expand Down Expand Up @@ -297,6 +318,7 @@ class BlooioOkHttpClient private constructor() {
OkHttpClient.builder()
.timeout(clientOptions.timeout())
.proxy(proxy)
.dispatcherExecutorService(dispatcherExecutorService)
.sslSocketFactory(sslSocketFactory)
.trustManager(trustManager)
.hostnameVerifier(hostnameVerifier)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import java.net.Proxy
import java.time.Clock
import java.time.Duration
import java.util.Optional
import java.util.concurrent.ExecutorService
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager
Expand Down Expand Up @@ -44,11 +45,31 @@ class BlooioOkHttpClientAsync private constructor() {
class Builder internal constructor() {

private var clientOptions: ClientOptions.Builder = ClientOptions.builder()
private var dispatcherExecutorService: ExecutorService? = null
private var proxy: Proxy? = null
private var sslSocketFactory: SSLSocketFactory? = null
private var trustManager: X509TrustManager? = null
private var hostnameVerifier: HostnameVerifier? = null

/**
* The executor service to use for running HTTP requests.
*
* Defaults to OkHttp's
* [default executor service](https://github.com/square/okhttp/blob/ace792f443b2ffb17974f5c0d1cecdf589309f26/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Dispatcher.kt#L98-L104).
*
* This class takes ownership of the executor service and shuts it down when closed.
*/
fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply {
this.dispatcherExecutorService = dispatcherExecutorService
}

/**
* Alias for calling [Builder.dispatcherExecutorService] with
* `dispatcherExecutorService.orElse(null)`.
*/
fun dispatcherExecutorService(dispatcherExecutorService: Optional<ExecutorService>) =
dispatcherExecutorService(dispatcherExecutorService.getOrNull())

fun proxy(proxy: Proxy?) = apply { this.proxy = proxy }

/** Alias for calling [Builder.proxy] with `proxy.orElse(null)`. */
Expand Down Expand Up @@ -297,6 +318,7 @@ class BlooioOkHttpClientAsync private constructor() {
OkHttpClient.builder()
.timeout(clientOptions.timeout())
.proxy(proxy)
.dispatcherExecutorService(dispatcherExecutorService)
.sslSocketFactory(sslSocketFactory)
.trustManager(trustManager)
.hostnameVerifier(hostnameVerifier)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@ import java.net.Proxy
import java.time.Duration
import java.util.concurrent.CancellationException
import java.util.concurrent.CompletableFuture
import java.util.concurrent.ExecutorService
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Dispatcher
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType
import okhttp3.MediaType.Companion.toMediaType
Expand Down Expand Up @@ -198,6 +200,7 @@ private constructor(@JvmSynthetic internal val okHttpClient: okhttp3.OkHttpClien

private var timeout: Timeout = Timeout.default()
private var proxy: Proxy? = null
private var dispatcherExecutorService: ExecutorService? = null
private var sslSocketFactory: SSLSocketFactory? = null
private var trustManager: X509TrustManager? = null
private var hostnameVerifier: HostnameVerifier? = null
Expand All @@ -208,6 +211,10 @@ private constructor(@JvmSynthetic internal val okHttpClient: okhttp3.OkHttpClien

fun proxy(proxy: Proxy?) = apply { this.proxy = proxy }

fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply {
this.dispatcherExecutorService = dispatcherExecutorService
}

fun sslSocketFactory(sslSocketFactory: SSLSocketFactory?) = apply {
this.sslSocketFactory = sslSocketFactory
}
Expand All @@ -223,12 +230,16 @@ private constructor(@JvmSynthetic internal val okHttpClient: okhttp3.OkHttpClien
fun build(): OkHttpClient =
OkHttpClient(
okhttp3.OkHttpClient.Builder()
// `RetryingHttpClient` handles retries if the user enabled them.
.retryOnConnectionFailure(false)
.connectTimeout(timeout.connect())
.readTimeout(timeout.read())
.writeTimeout(timeout.write())
.callTimeout(timeout.request())
.proxy(proxy)
.apply {
dispatcherExecutorService?.let { dispatcher(Dispatcher(it)) }

val sslSocketFactory = sslSocketFactory
val trustManager = trustManager
if (sslSocketFactory != null && trustManager != null) {
Expand Down
18 changes: 10 additions & 8 deletions blooio-java-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@ plugins {

configurations.all {
resolutionStrategy {
// Compile and test against a lower Jackson version to ensure we're compatible with it.
// We publish with a higher version (see below) to ensure users depend on a secure version by default.
force("com.fasterxml.jackson.core:jackson-core:2.13.4")
force("com.fasterxml.jackson.core:jackson-databind:2.13.4")
force("com.fasterxml.jackson.core:jackson-annotations:2.13.4")
force("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.4")
force("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.4")
force("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.4")
// Compile and test against a lower Jackson version to ensure we're compatible with it. Note that
// we generally support 2.13.4, but test against 2.14.0 because 2.13.4 has some annoying (but
// niche) bugs (users should upgrade if they encounter them). We publish with a higher version
// (see below) to ensure users depend on a secure version by default.
force("com.fasterxml.jackson.core:jackson-core:2.14.0")
force("com.fasterxml.jackson.core:jackson-databind:2.14.0")
force("com.fasterxml.jackson.core:jackson-annotations:2.14.0")
force("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.14.0")
force("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.0")
force("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.0")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ private constructor(
headers.put("X-Stainless-Package-Version", getPackageVersion())
headers.put("X-Stainless-Runtime", "JRE")
headers.put("X-Stainless-Runtime-Version", getJavaVersion())
headers.put("X-Stainless-Kotlin-Version", KotlinVersion.CURRENT.toString())
apiKey.let {
if (!it.isEmpty()) {
headers.put("Authorization", "Bearer $it")
Expand Down
Loading
Loading