Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion MIGRATING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion conformance/runner/typescript/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion go/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion go/pkg/basecamp/version.go
Original file line number Diff line number Diff line change
@@ -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"
2 changes: 1 addition & 1 deletion kotlin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion kotlin/sdk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {
}

group = "com.basecamp"
version = "0.13.0"
version = "0.14.0"

kotlin {
jvm {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
2 changes: 1 addition & 1 deletion python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion python/src/basecamp/_version.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
VERSION = "0.13.0"
VERSION = "0.14.0"
API_VERSION = "2026-08-05"
2 changes: 1 addition & 1 deletion python/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions ruby/Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
basecamp-sdk (0.13.0)
basecamp-sdk (0.14.0)
faraday (~> 2.0)
zeitwerk (~> 2.6)

Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion ruby/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion ruby/lib/basecamp/version.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# frozen_string_literal: true

module Basecamp
VERSION = "0.13.0"
VERSION = "0.14.0"
API_VERSION = "2026-08-05"
end
2 changes: 1 addition & 1 deletion swift/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion swift/Sources/Basecamp/BasecampConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion typescript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions typescript/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion typescript/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion typescript/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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})`;

Expand Down