Changelog

Version 26.03.4

Released on March 4, 2026

Improvements

  • Added a :py:property:`otter.storage.synchronous.StorageHandle.relative`` property:

This property returns the path of the handle relative to the release root, which is useful inside tasks that need to work with local files even when running with a release_uri. (@d391724) - Resolve absolute paths to local with force_local: When force_local is set, absolute paths that contain the release root will be resolved to local paths by replacing the remote release root with the local work path. This allows tasks to work with local files even when running with a release_uri. (@26bbf87)

Version 26.03.3

Released on March 3, 2026

Bugfixes

  • Fix Google’s copy_within for large files: The copy_within method was failing

large files because multiple calls to rewrite must be made until the copy is complete (@8097b98)

Version 26.03.2

Released on March 3, 2026

This release moves into the new version schema, which will contain the year and month of the Open Targets release in the context of which the Otter changes happen

Bugfixes

  • Fix copy_within for Google Cloud Storage: The copy_within method for Google

Cloud Storage now properly handles copying files between different regions and files larger than 5TB by using the rewrite method instead of copy. See https://docs.cloud.google.com/storage/docs/json_api/v1/objects/copy for details (@38b43db)

Version 26.0.1

Released on February 19, 2026

Improvements

  • Improved manifest handling: Add tasks to the manifest when they are built, add failure_reason field, and improve step finish info (@715cbe3, @f867f8e, @7e51c95)

  • Improved errors: Error messages are now more descriptive and actionable (@584846e)

  • Step run always returns now: Instead of exiting with a code 1 on error, otter.step.coordinator.Coordinator.run() always finishes and will return a otter.step.model.Step object with the final state of the step, so applications can handle errors as they see fit instead (@1368108)

Bugfixes

  • Coordinator now stops immediately on error: Previously a failing task would not halt the run; now the coordinator kills all workers on any error (@1639da3, @acfd557, @3177c8f)

  • Tasks that are done waiting for subtasks are now properly marked as complete in the manifest (@95ab8d3, @c95e1e2)

Version 26.0.0

Released on February 18, 2026

Improvements

  • Asynchronous task execution: Otter now supports both synchronous and asynchronous tasks, with improved run logic and better coordination by using pull-style workers and a more robust process pool management system (@086911a, @b5d7dea, @2c8f37e, @f0e697e)

  • Improved storage handling: File operations are now handled through “StorageHandle” and “AsyncStorageHandle” classes which provide a consistent interface for local and cloud storage. (@aa6da20, @7e84c40, @dc2e4d2, @0c37f92, @6e62d59)

  • New copy_many task for batch operations: A new builtin task enables efficient copying of multiple files at once. This task is better suited for copying a large amount (100+) of relatively small (tens of MB) files. It avoids spawning a new process and a new client for each file. It supports passing a list of sources, a path to a file with a list of sources, or a glob (when copying from backends that can handle those, like cloud services) (@db0a2b9, @917e91f, @21a707e)

Bugfixes

  • Do not fail validation when file size cannot be determined (@8a3164f)

  • Fix find_latest task functionality (@b5d774d)

  • Fix Google Cloud Storage glob pattern handling (@5de3d9d)

  • Fix scratchpad and add comprehensive tests (@1b26ee2)

  • Ensure mtime changes are properly tracked (@991bb9e, @71ee4d8)

  • Fix help not showing defaults (@4c8e07f)

Internal Changes

  • Switch to IOBase for improved I/O handling (@8b344f3)

  • Refactor builtin tasks for improved maintainability (@eb9701b)

  • Refactor manifest handling (@58a4a9e)

  • Make async and improve run logic (@086911a)

  • Improved storage handling (@bf5e167, @4dfd507)

  • Remove gsheets special case and clean logs (@522e899)

  • Logger rename for clarity (@3fa8456)

  • Update dependencies and fix linting and tests (@3792e29)

  • Ensure process pool is larger than one (@f4a9be2)

  • Update dependencies (@50456a5)

  • Simplify download method (@87318af)

  • Switch to ty type system with type checking improvements (@3d29142, @4262c9c)

  • Update documentation (@843d36e)