Release Notes
1.10.0 [2026-03-11]
Enhancements:
- Added support for
project.*Jinja2 template variables in de-identification profiles, allowing project-level metadata (e.g.,project.info.site_id) to be used as substitution values.
Fixes:
- Fixed
mapping_csvinput type declaration fromsource codetotabular datainmanifest.json. - Disabled DICOM reading and writing validation warnings via
fw_file.dicomget_config()to reduce noise during gear execution.
Maintenance:
- Added
ruamel.yaml>=0.18dependency. - Updated
PYTHON_VERSIONfrom3.12.12to3.12.13. - Added
CLAUDE.mdwith codebase guidance for Claude Code. - Integrated
claude-codeCI pipeline for automated release notes generation. - Removed unused
.envfile containingCOVER=30.
Documentation:
- Updated
README.mdenvironment setup instructions to referenceuvinstead ofpoetry.
1.9.1 [2025-12-09]
Fixes:
- Fixed session filtering when
session_level_profileisTrueand subject exists in CSV but not all sessions are mapped, ensuring unmapped sessions are correctly skipped during export
Maintenance:
- Updated
flywheel-sdkfrom~=20.3to>=20.4.0 - Updated
pythonfrom3.12.11to3.12.12
1.9.0 [2025-08-07]
Enhancements:
- Added capability for session-level deid templating when
session_level_profileisTrue - Added
session_level_profileconfig option to enable session-level deid profiles instead of subject-level - Renamed csv input from
subject_csvtomapping_csvfor clarity - Added
match_by_idconfig option for backwards compatibility with workflows that depend on matching destination session or acquisition containers byinfo.export.origin_id - Adjusted Flywheel metadata lookup to skip subject/session if expected metadata is missing (aligned with CSV lookup behavior)
Fixes:
- Added
delete_reasonconfig option for validated instance compatibility whenoverwrite_filesis"Cleanup"or"Cleanup_force" - Fixed regex to allow multiple jinja variables on the same line
Documentation:
- Updated
README.mdto reflectmapping_csvinput rename and session-level customization workflow - Added documentation for
session_level_profile,delete_reason, andmatch_by_idconfig options - Added example table showing session-level mapping CSV format with
session.labelcolumn
1.8.6 [2025-07-17]
Maintenance:
- Updated
pythonfrom3.12.10to3.12.11 - Migrated from
poetrytouvfor dependency management
Documentation:
- Added compatibility note for Flywheel instances on version 19.5.x or earlier
1.8.5 [2025-05-31]
Fixes:
- Updated
deidandmigration-toolkitto fix bug in logic of pixel scrubbing rules evaluation
1.8.4 [2025-05-23]
Enhancements:
- Added non-root user
flywheelto run the gear container, improving security posture
Fixes:
- Fixed file upload method to use
fw_client.upload_file_to_containerinstead of passing file objects directly to uploader - Fixed template file handling to ensure writable copy is made to work directory before processing
- Fixed working directory to be gear's work dir during export to enable migration-toolkit pixel actions writing
Maintenance:
- Updated
flywheel-sdkfrom16.19.2to^20.3 - Updated
pytest-covfrom^3.0to^6.1 - Updated
pytest-mockfrom^3.8to^3.14 - Updated
joblibfrom^1.0to^1.5 - Updated
ipykernelfrom^6.29.4to^6.29 - Simplified
Uploaderclass by delegating file upload method selection to SDK - Increased minimum test coverage requirement from
40to44 - Improved type hints in
container_export.py,file_exporter.py, andretry_utils.py - Refactored
upload_file_with_retryto accept file path instead ofFileSpecobject - Removed obsolete signed URL upload implementation from
Uploaderclass - Added comprehensive unit tests for
file_exporter.py,run.py, anduploader.py
Documentation:
- Fixed line length formatting in README encryption/decryption sections to comply with formatting standards
1.8.2 [2025-05-09]
Enhancements:
- Added Docker build caching support via
DOCKER_BUILD_CACHEvariable - Added classification validation via
VALIDATE_CLASSIFICATIONconfiguration - Implemented multi-stage Docker build for optimized image layers
Fixes:
- Fixed label sanitization for numeric strings and strings containing commas
- Fixed duplicate file upload prevention logic in session export
- Improved error messages for file upload conflicts to be more descriptive
Maintenance:
- Increased test coverage requirement from
35%to40% - Refactored
Dockerfileto use multi-stage builds withbase,build, anddevstages - Updated
flywheel-migrationfrom^13.10.1to^13.10.2 - Replaced
pipwithuv pipfor faster dependency installation - Added
requirements-dev.txtto.dockerignoreallowlist - Renamed function
quote_numeric_string()tosanitize_label()for clarity - Added empty
tests/__init__.pyfile for proper test package structure - Applied code formatting fixes to comply with
rufflinter rules - Reordered pre-commit hooks:
ruff_formatnow runs beforeruff - Added
noqacomments to suppressPLR0913(too many arguments) andPLR0912(too many branches) warnings where appropriate - Simplified conditional logic in multiple functions for better readability
1.8.1 [2025-05-01]
Enhancements:
- Included the original filename and parent container information in the error log when a filename conflict occurs during export
Maintenance:
- Updated
migration-toolkitto13.10.1 - Updated
pythonfrom3.12.9to3.12.10
Documentation:
- Added information in the README about the
filenameprofile
1.8.0 [2025-04-11]
Enhancements:
- Added support for updating Flywheel metadata fields using subject_csv data via new
flywheelconfiguration block in deid profiles - Files skipped due to no matching profile are now logged in warning messages and included in output CSV entries
Fixes:
- Fixed handling of files without matching templates to properly record skipped status instead of silently ignoring them
Maintenance:
- Updated
flywheel-migrationto^13.10withpixelextras - Updated
pythonfrom3.12.7to3.12.9
Documentation:
- Added example configuration showing how to update
subject.labeland other Flywheel metadata fields usingflywheelblock in deid profiles
1.7.0 [2025-01-16]
Enhancements:
- Added capability to pull values from Flywheel subject metadata for subject-specific deid profile templates using
subject.*Jinja variables
Fixes:
- Fixed typo in log message output
Maintenance:
- Split parser functions from
run.pyinto dedicatedfw_gear_deid_export/parser.pymodule - Added
fw_gear_deid_export/var_utils.pymodule for handling Jinja variable utilities - Refactored
container_export.export_container()function signature to acceptjinja_var_dfandkey_dictparameters directly - Refactored Jinja variable validation and dataframe creation logic
- Added
opensslsystem package to Dockerfile - Migrated from
flywheel.GearContexttoflywheel_gear_toolkit.GearToolkitContext - Updated
flywheel-migrationdependency to13.9.1 - Added comprehensive test coverage for parser functions in
tests/test_parser.py - Added comprehensive test coverage for variable utilities in
tests/test_var_utils.py - Updated existing tests to reflect refactored deid template validation logic
Documentation:
- Added section on subject metadata as option for subject-level customization
- Updated examples to demonstrate using
subject.infometadata with deid profiles - Fixed markdown formatting for gear level section
- Reorganized subject-level customization sections with proper heading hierarchy
1.6.1 [2024-10-21]
Maintenance:
- Migrated CI configuration from
flywheel-io/scientific-solutions/etc/sse-qa-citoflywheel-io/tools/etc/qa-ci - Updated
pythonfrom3.11to3.12 - Updated base Docker image from
python:3.11-slim-bullseyetoflywheel/python:3.12-alpine - Replaced system package installation (
apt-get) with Alpine package manager (apk) - Updated
flywheel-sdkfrom16.16.2to16.19.2 - Updated
flywheel-migrationdependency to^13.9.0 - Added
flywheel-gear-toolkitdependency^0.6.18 - Refactored retry logic into dedicated utility module
- Added smart retry handlers for file uploads and container creation operations
- Added comprehensive test coverage for retry utilities and uploader
- Updated pre-commit hooks configuration and linting rules
- Updated Docker environment variables for
python3.12and virtual environment - Reformatted README markdown syntax for consistency
- Reformatted Jupyter notebook whitespace
Fixes:
- Fixed gear failure when
subject.date_of_birthis empty string orNone
1.6.0 [2024-08-28]
Enhancements:
- Upgraded
pythonfrom3.8to3.11 - Updated
flywheel-migrationdependency to supportencryptanddecryptactions for DICOM and non-DICOM files - Added support for DICOM pixel data masking based on pre-defined coordinates
- Added
public_key,private_key, andsecret_keyconfiguration options for encryption/decryption workflows - Changed
overwrite_filesconfiguration from boolean to enum with options:Skip,Cleanup,Cleanup_force, andReplace - Added
date_of_birthto subject metadata allow list - Enhanced README with comprehensive encryption/decryption usage instructions, workflow documentation, and tutorials
- Updated container matching to use
labelinstead ofinfo.export.origin_id
Fixes:
- Files that fail de-identification are now skipped and reported in the export CSV with job state marked as failed
- Fixed subject label truncation when length exceeds 64 characters
- Fixed
file.info.headerremoval behavior - now removed by default unlessinclude-info-header: trueis set - Fixed
timestampfield formatting to use correct datetime format%Y-%m-%d %H:%M:%S.%f - Fixed error handling for smart-copied files with improved deletion strategies
Maintenance:
- Migrated from
poetryexport topyproject_exportin pre-commit hooks - Updated pre-commit hooks from
blackandisorttoruffandruff_format - Added
gearcheckhook to pre-commit configuration - Updated
flywheel-sdkto16.16.2 - Removed pinned version for
gitpackage in Dockerfile - Switched from
ruamel.yaml.LoadertoYAML(typ="safe", pure=True)for safer YAML parsing - Updated Flywheel classification metadata in manifest
- Renamed
identityaction tokeepthroughout profiles and documentation
Documentation:
- Added comprehensive encryption/decryption workflow examples
- Added blank export profile example with
file.info.headerpreservation - Expanded README with detailed input/config descriptions, usage instructions, and development setup
- Added tutorial notebook reference for batch subject-level processing
- Improved documentation formatting and organization with table of contents
1.5.1 [2023-04-12]
Fixes:
- Fixed file metadata update to conditionally include
typeparameter only when present, preventing errors when updating file modality without type information
1.5.0 [2023-03-20]
Maintenance:
- Migrated CI/CD configuration to use SSE QA CI templates from
flywheel-apps/utils/ci-templates - Updated
.pre-commit-config.yamlto reference SSE QA CI hooks - Migrated from
poetrytorequirements.txtfor Docker dependency management - Upgraded base Docker image from
python:3.8-slim-busterto pinnedpython@sha256:a076...(python3.8.16) - Added
.dockerignorefile to optimize Docker build context by excluding unnecessary files - Updated Docker entrypoint from
poetry run pythonto directpythonexecution - Pinned
gitpackage version to1:2.30.2-1+deb11u2in Dockerfile - Updated repository URLs from
flywheel-io/flywheel-apps/deid-exporttoflywheel-io/scientific-solutions/gears/deid-export - Added
setuptools>=65.5.0andMarkupSafe<2.1dependencies - Removed
requirements.txtfrom.gitignoreto allow version control - Added environment variables to manifest:
PATH,GPG_KEY,PYTHON_VERSION,PYTHON_PIP_VERSION,PYTHON_SETUPTOOLS_VERSION,PYTHON_GET_PIP_URL,PYTHON_GET_PIP_SHA256,PWD - Set
PYTEST_COV_FAIL_UNDERto 35% and enabledPUBLISH_POETRYin CI variables - Removed extra blank lines throughout codebase for consistency
Documentation:
- Added whitespace formatting improvements to README for better readability
1.3.0 [2022-01-18]
Enhancements:
- Added support to export file's
zip_member_countand file tags - Added
.pre-commit-config.yamlwith hooks for code formatting (isort,black), manifest validation, andpytest
Fixes:
- Updated
flywheel-migrationreference to make de-identified UID DICOM compliant
Maintenance:
- Migrated CI/CD configuration to use shared CI templates from
flywheel-io/flywheel-apps/utils/ci-templates - Added
--no-cache-dirflag topip installinDockerfileto reduce image size - Copied
README.mdto Docker image and runpoetry install --no-devtwice to ensure proper installation - Updated test
Dockerfileto include.pre-commit-config.yaml,.env, and.gitdirectory - Installed
pre-commitin test container - Added
.envfile withCOVER=30configuration - Removed
.envfrom.gitignoreto track environment configuration
1.2.3 [2021-07-29]
Enhancements:
- Added
mlsetmetadata field for subject containers with valuesTraining,Test, andValidation
Fixes:
- Fixed
cohortfield capitalization to useControlandStudyinstead of lowercase variants - Removed constraint on
speciesfield to allow any string value
Maintenance:
- Added test coverage for metadata validation with correct capitalization
1.2.2 [2021-06-09]
Fixes:
- Fixed error when processing sessions without a
statecolumn in the export dataframe - Fixed handling of empty session exports by returning the dataframe instead of
None - Fixed parsing of CSV lookup data by using
to_dict('records')[0]instead of deprecatedsqueeze("rows")
Maintenance:
- Updated README URL reference in
manifest.jsonfrommastertomainbranch - Removed support for
deid-logconfiguration in deid profiles with warning message - Reordered YAML fields in
deid-dicom.ymlexample to placeregexandnamebefore action fields
1.2.1 [2021-03-30]
Enhancements:
- Added
blank-export.ymltemplate that preserves all original filenames and metadata
Fixes:
- Fixed error when updating file type for files without modality when
typeisNone
Maintenance:
- Updated
flywheel-migrationdependency tozip_file_profilebranch
1.2.0 [2021-03-18]
Enhancements:
- Updated
flywheel-sdkfrom^14.5.0to^15.3
Fixes:
- Fixed typo in log message from "two errors" to "errors" in
run.py:131 - Fixed file type not being set when modality is not present, working around FLYW-6472
- Improved upload retry logic to properly close failed responses before retrying
- Fixed incorrect handling of file metadata updates by extracting
typeandmodalitybefore processing other metadata
Maintenance:
- Updated
flywheel-migrationdependency to commitb67680b2 - Removed unused
_upload_sessioninstance variable fromUploaderclass - Refactored
signed_url_uploadto accept optionalupload_sessionparameter instead of using instance variable - Removed verbose logging statement from
export_containerfunction - Migrated from
get_safe_filenametosanitize_filenamefunction - Added test coverage for
pluralizeandget_upload_ticket_suggested_headersfunctions - Added
upload_sessionparameter to upload methods for improved testability
1.1.0 [2021-03-15]
Enhancements:
- Added
--debugflag tocontainer_export.pyscript for enabling debug logging when running standalone - Added
uploader.pymodule implementing signed URL uploads with automatic retry logic for improved reliability
Fixes:
- Fixed YAML loading security issue by replacing
yaml.load()withyaml.safe_load()incontainer_export.py - Fixed parent container lookups by implementing caching for
projectandsubjectcontainers and LRU caching forsessionandacquisitioncontainers to improve performance - Updated
deid_template.pyto uselogger.debug()instead oflogger.warning()for informational messages about unused CSV columns - Added validation for
PatientIdentityRemovedfield in example de-identification profile
Maintenance:
- Updated project repository references from
fw-gear-deid-exporttodeid-exportinmanifest.json - Migrated from
yamltoruamel.yamllibrary for improved YAML handling - Applied
blackcode formatter across all Python files for consistent code style - Reorganized imports across all modules to follow standard Python conventions (stdlib, third-party, local)
- Added comprehensive test coverage for
uploader.pymodule including retry logic and signed URL support - Updated example de-identification profile validation in tests
Documentation:
- Updated README with corrected YAML formatting for
zipprofile configuration showing proper field ordering and validation options
1.0.0 [2020-12-23]
Enhancements:
- Added profile-based de-identification and export functionality for Flywheel containers
- Added support for de-identifying DICOM, JPG, PNG, TIFF, XML, JSON, CSV, TSV, and text files
- Added support for
flywheel-migrationde-identification profiles - Added subject-specific configuration support via CSV mapping file
- Added Flywheel metadata de-identification with container-level transformations
- Added automated container hierarchy creation in destination project
- Added file overwrite protection with configurable override option
- Added export status tracking with CSV output reporting
- Added Jupyter notebook tutorial for batch processing at subject level
Documentation:
- Added comprehensive README with usage instructions and workflow examples
- Added YAML profile examples for DICOM, non-DICOM, table/text, and MHD files
- Added LICENSE file (MIT)