# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Ideas / Not Yet Planned
  - Migrate CI fully to GitHub Actions and retire CircleCI. GHA already builds docs and
    publishes releases; CircleCI only remains for lint/unit/functional, duplicating config
    across two systems.
  - Consider generating `CHANGELOG.txt` from per-PR fragments (e.g. `towncrier`) instead of
    hand-editing it, now that releases are tag-driven via `setuptools-scm`.
  - Bump `paramiko` past the `<4.0.0` ceiling (currently resolves to 3.5.1; latest is 5.0.0) and
    `types-paramiko` off `~3.3.0.0` to match. The ceiling was added to dodge a DSSKey removal in
    paramiko 4; needs checking what else changed across 4.x/5.x before lifting it.

## [Unreleased]

## [1.5.1] - 2026-08-05
### Fixed
  - Breaking regression from https://github.com/octopus-energy/tentaclio/pull/241 which caused
    pandas `DataFrame.to_csv()` to fail with `TypeError: write() argument must be str, not bytes`
    when supplied with a tentaclio `mode="w"` writer
    (https://github.com/octopus-energy/tentaclio/issues/248).
  - Some code comment spelling mistakes.

## [1.5.0] - 2026-07-30
### Changed
  - Bump the minimum supported Python from 3.9 (EOL) to 3.10; drop the `importlib_metadata`
    backport dependency in favour of the stdlib `importlib.metadata.packages_distributions`
    (available since 3.10). CircleCI executors bumped from `cimg/python:3.9` to `3.10`
    accordingly.
  - Upgrade Sphinx from the `~4.5.0` pin (and the five `sphinxcontrib-*` upper-bound pins added
    to keep it building) to `sphinx>=8.0`/`myst-parser>=4.0`. Added `myst_heading_anchors = 4`
    to `docs/conf.py` so in-page anchor links in `README.md` (e.g. `#credentials-file`) still
    resolve when included into the docs build.
  - Bump `moto` from `~4.0.0` to `~5.2.0`; `moto.mock_s3()` was replaced with `moto.mock_aws()`
    in `tests/conftest.py`.
  - Release to PyPI via a GitHub Actions workflow using PyPI Trusted Publishing (OIDC),
    instead of a CircleCI job using a long-lived API token. CircleCI still runs lint,
    unit, and functional tests.
  - Replace `twine` with `uv publish` for building/publishing/checking release artifacts.
  - Derive the package version from the git tag at build time via `setuptools-scm`,
    instead of a committed `version` field in `pyproject.toml`. Releases no longer
    require a version-bump commit before tagging; `scripts/verify_version.py` is
    removed since there's no longer a committed version to verify against tags.
    `tentaclio.__version__` is now exposed at runtime via `importlib.metadata`.
  - Add a GitHub Actions workflow that builds the Sphinx docs on every push/PR touching
    `docs/` or `src/`, so a broken build is caught in CI instead of only surfacing on
    Read the Docs' own webhook-triggered build. Docs are still hosted on Read the Docs;
    `.readthedocs.yaml` is unchanged.
  - Fix `make docs` (previously invoked `mkdocs serve`, but this project's docs are
    built with Sphinx and `mkdocs` was not even a dependency). It now runs
    `docs-build` and serves the built HTML via `python -m http.server`.
### Fixed
  - Ship the `py.typed` marker file so the `Typing :: Typed` classifier is accurate for
    consumers relying on PEP 561 type information.
  - Fix pre-existing `mypy tests` failures (52 errors across 14 files) that had been
    silently blocking `make test`/`make lint` from ever reaching `unit`.
  - Pin `sphinxcontrib-applehelp`/`devhelp`/`htmlhelp`/`qthelp`/`serializinghtml` to the
    last versions compatible with the pinned `sphinx~=4.5.0` (newer releases of these
    call `require_sphinx('5.0')` and fail the build outright). This was silently broken
    for anyone building docs locally or on Read the Docs with an unpinned resolver.
### Added
  - Add `Programming Language :: Python :: 3.13` and `Programming Language :: Python :: 3.14`
    classifiers.
  - Add more validation for tentaclio secrets YAML files, including checks that the top level of
    the YAML file contains key-value pairs, the `secrets:` block is not empty, the `secrets:` block
    and subsequent entries are correctly indented, and the `secrets:` block contains key-value
    pairs. If any of the validation steps fail, `TentaclioFileError`s with helpful error messages
    are raised.
  - Add `get_pl()` method to the SQLAlchemy client to fetch a Polars DataFrame.
  - Make `polars` an optional dependency accordingly. If `polars` is not available, raise a
    `ModuleNotFoundError`.

## [1.4.1] - 2026-01-12
### Fix
  - Update paramiko dependency to address security vulnerability.

## [1.4.0] - 2026-01-12
### Addition
  - Update repo to use uv for development environment management.

## [1.3.8] - 2025-09-15
### Addition
  - Set CircleCI checkout step method to full

## [1.3.7] - 2025-09-15
### Fix
  - Fix and improve shell detection in extras/init_tentaclio.sh.

## [1.3.6] - 2025-08-04
### Fix
  - Re-lock pipfile to fix release process.

## [1.3.5] - 2025-08-04
### Fix
  - Pin Paramiko dependency version to <4.0.0 to avoid DSSKey error (support dropped in newest version).

## [1.3.4] - 2025-07-21
### Added
  - Update CircleCI config to use latest convenience image for Python 3.9. and use an API token for publishing to PyPI.


## [1.3.3] - 2025-07-16
### Fix
  - Maintain optional input of private key path and private key password to SFTP client.

## [1.3.2] - 2025-07-12
### Added
  - Add support for use of private key path and private key password for SFTP using query parameters.
  - Not changed: If query parameters are provided in usage url, they overwrite query parameters in credentials url.
  - Limitations: Assume connections that use private key (SFTP) would not use query parameters. If needed, this can be
  handled in injection.py.

## [1.3.1] - 2024-01-04
### Changed
  - Error message when a Tentaclio secret cannot be passed to give more information to user.

## [1.3.0] - 2023-10-25
### Added
  - Add support for interpolating environment variables to tentaclio secrets file.

## [1.2.2] - 2023-10-18
### Added
  - Add support for connecting to SFTP via private key authentication. Replaces pysftp dependency with paramiko.

## [1.2.1] - 2023-04-20
### Fix
  - Issue where URL query parameters were not passed correctly to sqlalchemy for db connections.

## [1.2.0] - 2023-04-06
### Added
  - Add support for SQLAlchemy 2.0 by correctly handling `sqlalchemy.engine.url.URL`s, which are now immutable.
  Older versions of tentaclio should pin `sqlalchemy < 2.0` to avoid this issue.

## [1.1.0] - 2023-04-05
### Changed
  - Credential files error reporting to help users identify the credentials issues

## [1.0.9] - 2023-01-25
### Added
  - Add `tentaclio.streams.api.make_empty_safe` to modify the standard behavoir of creating
  empty files when no data is written into the stream.

## [1.0.8] - 2022-11-08
### Added
  - Make `tentaclio.fs.api.walk` visible outside of the module so it can be used from the root module

## [1.0.6] - 2022-07-04
### Added
  - Added snowflake plugin + schema

## [1.0.5] - 2022-05-23
### Changed
  - Allow specifying encoding for byte streams

## [1.0.4] - 2022-03-04
### Changed
  - Replace sqlalchemy's result.ResultProxy typehint with CursorResult
  - Enables sqlalchemy>=1.4

## [1.0.3] - 2022-01-18
### Changed
  - Pin databricks plugin to thrift version
  - Pin pandas<1.4 to avoid sqlalchemy dependency clash

## [1.0.2] - 2022-01-18
### Changed
  - Automatically import plugins
  - Enable installing plugins via setuptools extras

## [1.0.1] - 2022-01-18
### Changed
  - Re-release v1.0.0 after ensuring necessary tentaclio dependent services
    are pinned appropriately

## [1.0.0] - 2021-11-26
### Changed
  - Move athena, s3, gs, gdrive, databricks, postgres to seperate packages

## [0.0.15] - 2021-03-23
### Addition
  - Add Databricks db client

## [0.0.14] - 2021-03-17
### Fix
  - Temporarily pin sqlalchemy to <1.4 due to deprecated ResultProxy interface

## [0.0.13] - 2020-10-30
### Addition
  - Update to pandas 1.1.3 by E.on request

## [0.0.12] - 2020-09-24
### Fix
  - The token from google might have extra fields that cause the authentication process to fail

## [0.0.11] - 2020-09-23
### Fix
  - When we have access to a file in a shared drive but not to the drive itself it
  breaks the routine to "mount" the drives, as it can't access the root. Ignore those
  drives by the time being and warn the user.

## [0.0.10] - 2020-09-18
### Fix
  - Specify PyAthena version to prevent errors from current release

## [0.0.9] - 2020-08-27
### Addition
  - Allow filtering credentials by username in the url too. Until now we were relying on scheme,
  hostname, and path.

## [0.0.8] - 2020-08-27
### Fix
  - Add dataclasses dependency to support python 3.6.

## [0.0.7] - 2020-08-25
### Fix
  - Remove upper constraint on `boto3` Python dependency.

## [0.0.6] - 2020-08-25
### Fix
  - Windows based system don not have the HOME environment variable set by default.
  Fixed by using UserProfile instead.

## [0.0.5] - 2020-08-02
### Fix
 - Fix problems with base stream as it needed to make itself as fushable
 in order to play nicely with zip files
### Added
 - Experimental google drive support

## [0.0.4] - 2020-07-15
### Fix
 - Fix problems with base stream as it needed to make itself as seekable
 in order to play nicely with zip files
### Changed
 - Now the required dev version is python 3.7


## [0.0.3] - 2020-07-02
### Fix
 - Fix issue with the application name string for postgres

## [0.0.2] - 2020-07-02
### Added
 - TENCACLIO__PG_APPLICATION_NAME overrides the application name for postgres connection string

## [0.0.1] - 2020-06-15
### Added
 - support for google cloud storage (thanks to @benjamincerigo)
### Changed
 - Improved readme
 - Mark release as stable


## [0.0.1-alpha.10] - 2020-05-18
### Added
 - `extras/init_tentaclio.sh` for automatically create a secrets file and configure the user's
    environment.
### Fixed
 - `SQLAlchemyClient.query()` now takes an explicit `params` kwarg consistent with `conn.execute()`

## [0.0.1-alpha.9] - 2020-03-27
### Changed
 - Enforce versioning on `pandas` due to compatibility issues with the new I/O API (v1.0.2)

## [0.0.1-alpha.8] - 2020-03-19
### Added
 - `PostgresClient.get_df_unsafe()` using COPY for faster Postgres queries

## [0.0.1-alpha.7] - 2020-03-18
### Changed
 -  Do not check if the resource is a file before retrieval in the ftp client. The method might not
 be implemented and the server will complain regardless.

## [0.0.1-alpha.6] - 2020-03-18
### Added
 - Allow ftp scandir fallback to dir when mlst is not implemented on the server

## [0.0.1-alpha.5] - 2020-02-12
### Added
 - Support deleting resources (ftp and sftp).

## [0.0.1-alpha.4] - 2020-01-21
### Added
 - Support deleting resources (S3 and local file system ).
 - Support for copying any arbitrary pair of resources.
 - Support for copying S3 files using aws boto directly.
### Changed
 - Removed a duplication of the main api.

## [0.0.1-alpha.3] - 2019-07-24
### Added
 - Support for listing resources (S3, local file system, sftp, and ftp schemes).
 - More internal registries for more types of handlers.
### Changed
 - URL class no longer contains the stream handlers.

## [0.0.1-alpha.2] - 2019-07-24
### Added
 - Athena client.
