# Changelog All notable changes to this project will be documented in this file. ## [Unreleased] ### Changed - Built access level labels from their bits instead of a fixed table of combinations, so a level the server adds later is labelled too. A project level (bit 16 and up) is named after the project as the server reports it to its members, e.g. `Brain/MINDS 2.0 Open`, and otherwise `Project Open`. A restrict network other than CBS is `Restrict Open`; `0x0200`, formerly `5Kikan Open`, is now `Restrict2 Open`. - `chacl` takes keys built the same way: `cbs_or_pw_open`, `project0_open` and so on. `5kikan_open` is no longer accepted. Its help lists them, an invalid level lists the projects the user belongs to with their keys, and `public` and `storage`, which the server refuses, are refused before any request. - `ls` asks the server for the user's projects once per run when logged in. - Removed `FolderAccessLevel.ACCESS_LEVELS` and `FolderAccessLevelItem`. `FolderSimple.access_level_label()` labels a level with the project names given to it. ### Fixed - Reported an access level that has no meaning as `Unknown (0x…)` instead of `Storage`. Storage is the absence of every bit, so it matched any level. A level made of known bits is no longer labelled by the first table entry it contained either: `0x10104` was `CBS or PW Open`. This changes the `access_level` value in `ls` output, including JSON. - Reported a locked folder that was fetched without its password as `FolderLockedException`, a subclass of `UnauthorizedException`, instead of a pydantic `ValidationError`. The server answers with a short record that has no sub-folders or path. A password-protected DOI folder fails this way before its password is sent, so it can now be opened again. ## [1.3.20] - 2026-11-04 ### Changed - Raised the minimum versions of `pydantic`, `pydantic-settings`, `python-dotenv`, `PyJWT` and `validators` to their current releases. ### Security - Required `PyJWT` 2.15.1 or later; releases before 2.14.0 have a known vulnerability. ## [1.3.19] - 2026-09-04 ### Fixed - Reported failed transfers instead of ending in success, so a run that lost files exits non-zero. - Left an existing local file intact when a download fails part way through. - Opened password-protected DOI folders, which previously failed outright. - Kept a session working across concurrent runs and long server queues. - Other minor fixes to `ls` output and remote URL handling. ### Changed - Moved packaging to PEP 621 metadata with flit as the build backend. - Updated dependencies. - **Breaking for embedders:** `CacheInterface` now requires `lock()` and `reload()`. ## [1.3.18] - 2026-07-02 ### Added - Added a comprehensive unit test suite in `tests/test_commands.py` checking registration, parsing, and execution flow of all 16 commands. ### Refactored - Abstracted configuration storage (introducing `ConfigInterface`, `InMemoryConfig`, and updating `ConfigFile`) to enable dependency injection. - Modularized transfer operations (upload and download) to decouple them from the service layer. - Decoupled commands from direct file system configurations and migrated all subcommands to use abstract config classes. ### Changed - Upgraded dependencies including `pydantic-settings` to `2.14.2` and `pyright` to `1.1.411`. ### Fixed - Fixed duplicate `__all__` definitions in package initialization file `mdrsclient/__init__.py` that caused `__version__` export to be overwritten. ## [1.3.17] - 2026-07-02 ### Refactored - Decoupled core logic from CLI interface and introduced `MdrsClient` service layer to improve library portability. - Migrated all CLI commands to utilize `MdrsClient` for execution. ### Added - Abstract authentication state using `CacheInterface` and `InMemoryCache`. ## [1.3.16] - 2026-06-12 ### Fixed - Retrieve the full `Folder` object from `FoldersApi` instead of using the `FolderSimple` returned by `find_sub_folder` when resolving DOI subfolders. This fixes a type checker error under the upgraded pyright and avoids a potential AttributeError at runtime due to `FolderSimple` lacking the `path` attribute. ### Changed - Upgraded dependencies and bumped version to 1.3.16 in pyproject.toml. ## [1.3.15] - 2026-05-01 ### Fixed - Apply NFC normalization to filenames and folder names sent to the server. ## [1.3.14] - 2026-04-17 ### Changed - Simplified `config list` command (removed `-l`/`--long` option, always display URL). - Renamed `--quick` option to `--quiet` for `ls` subcommand. ### Added - Added subcommand aliases for config commands (e.g. `ls` alias for list, `rm` alias for delete). - Added `version` command. ## [1.3.13] - 2025-07-02 ### Fixed - Fixed pagination logic for the `file.list` API. ## [1.3.12] - 2025-05-20 ### Fixed - Fixed bug where file downloading was skipped incorrectly when `-s`/`--skip-if-file-exists` option was present. ## [1.3.11] - 2025-01-21 ### Fixed - Follow-up fixes for User API specification changes. ## [1.3.10] - 2024-12-23 ### Added - Delete broken files and show a summary when a file download fails. ### Changed - Updated dependency libraries. ## [1.3.9] - 2024-10-23 ### Fixed - Fixed compatibility with Python 3.10. ## [1.3.8] - 2024-09-18 ### Added - Implemented `-s`/`--skip-if-file-exists` option for `download` command. ### Fixed - Added exception handling for unexpected responses from the server. ## [1.3.7] - 2024-07-22 ### Added - Implemented `--exclude` argument for download subcommand. ## [1.3.6] - 2024-07-08 ### Added - Support cancelling recursive downloads if downloading some files fails. ## [1.3.5] - 2024-07-08 ### Added - Added authorization token validation checks for file download operations. ### Removed - Removed unnecessary debug code. ## [1.3.4] - 2024-07-04 ### Added - Added some aliases for config sub command. ### Fixed - Fixed bug when uploading large files. ## [1.3.3] - 2024-02-13 ### Added - Implemented `-s`/`--skip-if-file-exists` option for `upload` command. ## [1.3.2] - 2024-02-09 ### Added - Added `-u` and `-p` options to login command. ## [1.3.1] - 2023-12-20 ### Fixed - Fixed bug to resolve local files for recursive file upload. ## [1.3.0] - 2023-12-18 ### Changed - Removed debug comments. ## [1.2.0] - 2023-10-04 ### Changed - Follow-up recent specification changes about folder access level. ## [1.1.1] - 2023-07-26 ### Changed - Set destination folder name using name attribute of folder copy API.