All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.2.0] - 2026-07-07
Changed
- Use Elixir's built-in
JSONmodule (Elixir 1.18+) for encoding/decoding instead ofJason, and drop thejasondependency.
Fixed
- Resumable uploads — send an explicit
Content-Lengthon both resumable requests so real GCS no longer rejects them with411 Length Required:0on the bodyless session-initiation POST, and the known file size on the session PUT (which also stops Mint from falling back totransfer-encoding: chunkedfor the stream body). Thefake-gcs-serveremulator does not enforce this, so the failure only appeared against the live API. Regression covered by aBypass-based test that asserts the exact headers sent.
[0.1.0] - 2026-06-25
Initial release.
Added
- Buckets —
create_bucket/3,get_bucket/2,list_buckets/2,delete_bucket/2,update_bucket/3 - Object metadata —
get_object/3,list_objects/2(withprefix/delimiterpaging),delete_object/3,update_object/4,copy_object/5,compose_object/4,rewrite_object/5(token-following),move_object/4 - Uploads —
put_object/4(simple),upload_file/4andupload_stream/4(resumable, constant memory),upload/4(auto-selects strategy), plus the low-levelstart_resumable_upload/3andupload_chunk/3primitives - Downloads —
download/3(buffered),download_to_file/4anddownload_stream/5(streamed, constant memory) GcpGcs.Error— structured error type withcode,message,details, and HTTPstatus; HTTP statuses mapped to canonical atomsGcpGcs.Auth— OAuth2 access tokens via Goth or the gcloud CLI, with ETS-backed caching; auth is skipped automatically in emulator modeGcpGcs.Telemetry—[:gcp_gcs, :request, _]and[:gcp_gcs, :auth, _]span eventsGcpGcs.Config— production/emulator endpoint resolution, including theSTORAGE_EMULATOR_HOSTenvironment variable, and Finch pool configuration- Input validation for bucket names, object names, project IDs, and source
object lists, returning
{:error, %GcpGcs.Error{code: :validation_error}} docker-compose.ymlfor a localfake-gcs-serveremulator and an integration test suite (run withmix test --include integration)