diff --git a/MIGRATING.md b/MIGRATING.md index e676ed40e4..3db1b1efc2 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -11,7 +11,7 @@ what wrong behaviour you get if you ignore one. This file is that half. --- -# Unreleased +# v0.14.0 Breaking in Go and in the shape every SDK decodes from `GET /uploads/{id}/versions.json`. diff --git a/README.md b/README.md index c2c5af289b..8a48d33c61 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Official [Basecamp](https://basecamp.com) [API](https://github.com/basecamp/bc3- OpenAPI 3.1 spec included. -**Upgrading?** Read [MIGRATING.md](MIGRATING.md) *before* you bump the version. v0.13.0 breaks all six SDKs, and 61 of those breaks survive a clean build — 55 give no signal at all, and 6 compile and then fail at runtime on one particular shape of response, which is not the same shape in every SDK: Go's four need the field *absent*, Ruby's and Kotlin's need it *present*. +**Upgrading?** Read [MIGRATING.md](MIGRATING.md) *before* you bump the version. v0.14.0 breaks all six SDKs: `ListUploadVersions` now returns version events instead of uploads — the four typed SDKs catch that at compile time, Ruby and Python just start seeing different keys — and every 507 now reports the new `limit_exceeded` code instead of a retryable `api_error`, which silently reroutes any error handling that branches on the old code. Coming from v0.12.0 or earlier? v0.13.0's section still applies, and 61 of its breaks survive a clean build. ## Languages diff --git a/conformance/runner/typescript/package-lock.json b/conformance/runner/typescript/package-lock.json index 4aa9721593..6c906713c9 100644 --- a/conformance/runner/typescript/package-lock.json +++ b/conformance/runner/typescript/package-lock.json @@ -20,7 +20,7 @@ }, "../../../typescript": { "name": "@37signals/basecamp", - "version": "0.13.0", + "version": "0.14.0", "license": "MIT", "dependencies": { "openapi-fetch": "^0.17.0" diff --git a/go/README.md b/go/README.md index e4c0bd9877..78a17bafbb 100644 --- a/go/README.md +++ b/go/README.md @@ -6,7 +6,7 @@ Official Go SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#go) before you bump the version — Go carries sixteen breaks your compiler will not catch — twelve that give no signal at all, and four that compile and then panic only when the server omits a field. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version. The compiler catches the type changes — `ListVersions` elements became `UploadVersion`, and `UpdateUploadRequest.Description` became `*string` — but not the reroute: every 507 now reports `limit_exceeded` instead of a retryable `api_error`, so a `case` falling through to a default arm sends storage, project and webhook limits wherever that default goes. Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Features diff --git a/go/pkg/basecamp/version.go b/go/pkg/basecamp/version.go index a7b58aa7cc..dcd6346fb9 100644 --- a/go/pkg/basecamp/version.go +++ b/go/pkg/basecamp/version.go @@ -1,7 +1,7 @@ package basecamp // Version is the current version of the Basecamp Go SDK. -const Version = "0.13.0" +const Version = "0.14.0" // APIVersion is the Basecamp API version this SDK targets. const APIVersion = "2026-08-05" diff --git a/kotlin/README.md b/kotlin/README.md index e17a69bc12..41e23fd2c2 100644 --- a/kotlin/README.md +++ b/kotlin/README.md @@ -6,7 +6,7 @@ Official Kotlin SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#kotlin) before you bump the version — Kotlin carries seven breaks your compiler will not catch — six that give no signal at all, and one that throws only when the field is present and carries a JSON number or boolean where the model declares a string. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version. The compiler catches the `listVersions` retype and any exhaustive `when` over `BasecampException` (it gains `LimitExceeded`); what it will not catch is a `when` with an `else` arm, where storage, project and webhook limit failures — previously the retryable `BasecampException.Api` — now land silently. Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Features diff --git a/kotlin/sdk/build.gradle.kts b/kotlin/sdk/build.gradle.kts index 4517e14938..cf7833c5c5 100644 --- a/kotlin/sdk/build.gradle.kts +++ b/kotlin/sdk/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "com.basecamp" -version = "0.13.0" +version = "0.14.0" kotlin { jvm { diff --git a/kotlin/sdk/src/commonMain/kotlin/com/basecamp/sdk/BasecampConfig.kt b/kotlin/sdk/src/commonMain/kotlin/com/basecamp/sdk/BasecampConfig.kt index d3f147da31..bb9c48c59c 100644 --- a/kotlin/sdk/src/commonMain/kotlin/com/basecamp/sdk/BasecampConfig.kt +++ b/kotlin/sdk/src/commonMain/kotlin/com/basecamp/sdk/BasecampConfig.kt @@ -41,7 +41,7 @@ data class BasecampConfig( } companion object { - const val VERSION = "0.13.0" + const val VERSION = "0.14.0" const val API_VERSION = "2026-08-05" const val DEFAULT_BASE_URL = "https://3.basecampapi.com" const val DEFAULT_USER_AGENT = "basecamp-sdk-kotlin/$VERSION (api:$API_VERSION)" diff --git a/package.json b/package.json index 011601f363..2560ec46d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@37signals/basecamp", - "version": "0.13.0", + "version": "0.14.0", "private": true, "description": "TypeScript SDK for the Basecamp API", "engines": { diff --git a/python/README.md b/python/README.md index e6f319b769..6ea18120f0 100644 --- a/python/README.md +++ b/python/README.md @@ -6,7 +6,7 @@ Official Python SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#python) before you bump the version — Python carries eight breaks with no signal at all, and no compile step to catch anything else. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version. `uploads.list_versions` entries now carry the version event's keys with the file nested under `"upload"`, and every 507 reports the new `ErrorCode.LIMIT_EXCEEDED` instead of the retryable `ErrorCode.API` — the interpreter surfaces neither change; only a `match` ending in `typing.assert_never` fails, and only under a static type checker (this package's own CI runs mypy). Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Features diff --git a/python/pyproject.toml b/python/pyproject.toml index de6f2debe3..a0008bb402 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "basecamp-sdk" -version = "0.13.0" +version = "0.14.0" description = "Official Python SDK for the Basecamp API" readme = "README.md" requires-python = ">=3.11" diff --git a/python/src/basecamp/_version.py b/python/src/basecamp/_version.py index d32515d710..2ba1ad803c 100644 --- a/python/src/basecamp/_version.py +++ b/python/src/basecamp/_version.py @@ -1,2 +1,2 @@ -VERSION = "0.13.0" +VERSION = "0.14.0" API_VERSION = "2026-08-05" diff --git a/python/uv.lock b/python/uv.lock index d5ff32dcb9..262e2b4278 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -17,7 +17,7 @@ wheels = [ [[package]] name = "basecamp-sdk" -version = "0.13.0" +version = "0.14.0" source = { editable = "." } dependencies = [ { name = "httpx" }, diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 282a0d1730..f95595d4a9 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - basecamp-sdk (0.13.0) + basecamp-sdk (0.14.0) faraday (~> 2.0) zeitwerk (~> 2.6) @@ -153,7 +153,7 @@ CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b - basecamp-sdk (0.13.0) + basecamp-sdk (0.14.0) bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7 bundler (4.0.14) sha256=d09a0a965cf772266a7e49e83610be7c2f4e49e61134c42a56804bb383cc24b8 concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 diff --git a/ruby/README.md b/ruby/README.md index 2984c6041e..b3d382220b 100644 --- a/ruby/README.md +++ b/ruby/README.md @@ -2,7 +2,7 @@ Official Ruby SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#ruby) before you bump the version — Ruby carries eleven breaks nothing catches at load time — ten with no signal at all, and one that raises only on a record where the field is populated. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version — nothing catches either break at load time. `uploads.list_versions` entries now carry the version event's keys, with the file nested under `"upload"` — code reading `version["filename"]` was getting nil and now has a real place to look — and every 507 reports `limit_exceeded` instead of a retryable `api_error`, so a `when` falling through to an else arm reroutes storage, project and webhook limits silently. Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Requirements diff --git a/ruby/lib/basecamp/version.rb b/ruby/lib/basecamp/version.rb index a670016225..92860f2ae7 100644 --- a/ruby/lib/basecamp/version.rb +++ b/ruby/lib/basecamp/version.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true module Basecamp - VERSION = "0.13.0" + VERSION = "0.14.0" API_VERSION = "2026-08-05" end diff --git a/swift/README.md b/swift/README.md index caea10972e..65c13d6947 100644 --- a/swift/README.md +++ b/swift/README.md @@ -6,7 +6,7 @@ Official Swift SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#swift) before you bump the version — Swift carries ten breaks your compiler will not catch, all of which give no signal at all. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version. The compiler catches the `listVersions` retype and any `switch` over `BasecampError` without a `default` (it gains `case limitExceeded`); what it will not catch is a `switch` **with** a `default`, where storage, project and webhook limit failures — previously the retryable `case api` — now land silently. Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Features diff --git a/swift/Sources/Basecamp/BasecampConfig.swift b/swift/Sources/Basecamp/BasecampConfig.swift index 132684c22a..f2b202183a 100644 --- a/swift/Sources/Basecamp/BasecampConfig.swift +++ b/swift/Sources/Basecamp/BasecampConfig.swift @@ -24,7 +24,7 @@ public struct BasecampConfig: Sendable { public let timeoutInterval: TimeInterval /// SDK version string. - public static let version = "0.13.0" + public static let version = "0.14.0" /// Basecamp API version this SDK targets. public static let apiVersion = "2026-08-05" diff --git a/typescript/README.md b/typescript/README.md index 1cd8d29771..c7e2cfce66 100644 --- a/typescript/README.md +++ b/typescript/README.md @@ -6,7 +6,7 @@ Official TypeScript SDK for the [Basecamp API](https://github.com/basecamp/bc3-api). -**Upgrading to v0.13.0?** Read [MIGRATING.md](../MIGRATING.md#typescript) before you bump the version — TypeScript carries nine breaks your compiler will not catch, all of which give no signal at all. +**Upgrading to v0.14.0?** Read [MIGRATING.md](../MIGRATING.md) before you bump the version. The compiler catches the `uploads.listVersions` retype and any exhaustive handling of the widened `ErrorCode` union; what it will not catch is a non-exhaustive branch on `"api_error"`, which storage, project and webhook limit failures no longer reach — they now report `"limit_exceeded"`. Coming from v0.12.0 or earlier, read v0.13.0's section too. ## Features diff --git a/typescript/package-lock.json b/typescript/package-lock.json index 25be736534..5c5a660252 100644 --- a/typescript/package-lock.json +++ b/typescript/package-lock.json @@ -1,12 +1,12 @@ { "name": "@37signals/basecamp", - "version": "0.13.0", + "version": "0.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@37signals/basecamp", - "version": "0.13.0", + "version": "0.14.0", "license": "MIT", "dependencies": { "openapi-fetch": "^0.17.0" diff --git a/typescript/package.json b/typescript/package.json index bb8f7c1861..3084fb1b25 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@37signals/basecamp", - "version": "0.13.0", + "version": "0.14.0", "description": "TypeScript SDK for the Basecamp API", "type": "module", "main": "dist/index.js", diff --git a/typescript/src/client.ts b/typescript/src/client.ts index 0098c41768..79758d7f50 100644 --- a/typescript/src/client.ts +++ b/typescript/src/client.ts @@ -266,7 +266,7 @@ export interface BasecampClientOptions { maxPages?: number; } -export const VERSION = "0.13.0"; +export const VERSION = "0.14.0"; export const API_VERSION = "2026-08-05"; const DEFAULT_USER_AGENT = `basecamp-sdk-ts/${VERSION} (api:${API_VERSION})`;