- Raise the floor for pydantic to 2.14.3, and for black, flake8, isort and pyright to their current releases.
6.5 KiB
6.5 KiB
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 otherwiseProject<n> Open. A restrict network other than CBS isRestrict<n> Open;0x0200, formerly5Kikan Open, is nowRestrict2 Open. chacltakes keys built the same way:cbs_or_pw_open,project0_openand so on.5kikan_openis no longer accepted. Its help lists them, an invalid level lists the projects the user belongs to with their keys, andpublicandstorage, which the server refuses, are refused before any request.lsasks the server for the user's projects once per run when logged in.- Raised the minimum version of
pydanticto 2.14.3, and of the development toolsblack,flake8,isortandpyrightto their current releases. - Removed
FolderAccessLevel.ACCESS_LEVELSandFolderAccessLevelItem.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 ofStorage. 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:0x10104wasCBS or PW Open. This changes theaccess_levelvalue inlsoutput, including JSON. - Reported a locked folder that was fetched without its password as
FolderLockedException, a subclass ofUnauthorizedException, instead of a pydanticValidationError. 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,PyJWTandvalidatorsto their current releases.
Security
- Required
PyJWT2.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
lsoutput and remote URL handling.
Changed
- Moved packaging to PEP 621 metadata with flit as the build backend.
- Updated dependencies.
- Breaking for embedders:
CacheInterfacenow requireslock()andreload().
[1.3.18] - 2026-07-02
Added
- Added a comprehensive unit test suite in
tests/test_commands.pychecking registration, parsing, and execution flow of all 16 commands.
Refactored
- Abstracted configuration storage (introducing
ConfigInterface,InMemoryConfig, and updatingConfigFile) 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-settingsto2.14.2andpyrightto1.1.411.
Fixed
- Fixed duplicate
__all__definitions in package initialization filemdrsclient/__init__.pythat caused__version__export to be overwritten.
[1.3.17] - 2026-07-02
Refactored
- Decoupled core logic from CLI interface and introduced
MdrsClientservice layer to improve library portability. - Migrated all CLI commands to utilize
MdrsClientfor execution.
Added
- Abstract authentication state using
CacheInterfaceandInMemoryCache.
[1.3.16] - 2026-06-12
Fixed
- Retrieve the full
Folderobject fromFoldersApiinstead of using theFolderSimplereturned byfind_sub_folderwhen resolving DOI subfolders. This fixes a type checker error under the upgraded pyright and avoids a potential AttributeError at runtime due toFolderSimplelacking thepathattribute.
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 listcommand (removed-l/--longoption, always display URL). - Renamed
--quickoption to--quietforlssubcommand.
Added
- Added subcommand aliases for config commands (e.g.
lsalias for list,rmalias for delete). - Added
versioncommand.
[1.3.13] - 2025-07-02
Fixed
- Fixed pagination logic for the
file.listAPI.
[1.3.12] - 2025-05-20
Fixed
- Fixed bug where file downloading was skipped incorrectly when
-s/--skip-if-file-existsoption 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-existsoption fordownloadcommand.
Fixed
- Added exception handling for unexpected responses from the server.
[1.3.7] - 2024-07-22
Added
- Implemented
--excludeargument 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-existsoption foruploadcommand.
[1.3.2] - 2024-02-09
Added
- Added
-uand-poptions 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.