Release Notes
4.2.0 [2025-05-30]
Enhancements:
- Added more robust retry logic for dropped DICOM connections with automatic reconnection handling
Fixes:
- Fixed connection error handling to properly retry on invalid server responses
- Fixed gear execution at acquisition level without input files
Maintenance:
- Migrated from
poetrytouvfor dependency management - Upgraded base Docker image from
flywheel/python:main.66a70563toflywheel/python:3.12-alpine - Updated
pythonfrom3.10.4to3.12.7 - Migrated CI pipeline from
sse-qa-citoqa-ciproject - Updated
.pre-commit-config.yamlhooks: addedhadolint,linkcheck,markdownlint, andruff_format - Refactored
Dockerfileto usepip installwithrequirements.txtinstead ofpoetry - Removed default merge request template
Documentation:
- Updated Orthanc server download URL from Osimis to official Orthanc website
- Fixed Flywheel URL formatting in
README.md - Updated source URL in manifest from
flywheel-appstoscientific-solutions/gears - Improved formatting and line wrapping in
README.mdfor better readability - Fixed relative link path in
CONTRIBUTING.mdchangelog reference
4.1.1 [2024-04-10]
Fixes:
- Increased default timeout values from
30sto60sfor DICOM operations (acse_timeout,dimse_timeout,network_timeout) - Increased default
file_download_retry_timefrom10sto60sto reduce download failures - Fixed typo in log message
Enhancements:
- Added
Slim-Containersfeature flag to exclude analyses when fetching container data - Added
Exclude-Filesfeature flag for subject/session API calls to reduce payload size - Configured
CoreClientwith increased timeouts (read_timeout=60s,connect_timeout=15s) and retries (retry_total=10) - Added debug logging for session DICOM downloads
- Improved logging to include container type and ID when downloading DICOM files
4.1.0 [2024-03-26]
Enhancements:
- Added support for running at acquisition level without file input
- Added support for running at session level to send all DICOM files across acquisitions
- Added support for running at subject level to send all DICOM files across sessions
- Added configuration option to disable report upload
Fixes:
- Fixed issue where private DICOM tag group was incorrectly overridden by Flywheel group label
Maintenance:
- Migrated CI pipeline from
flywheel-io/tools/etc/qa-citoflywheel-io/scientific-solutions/etc/sse-qa-ci - Updated pre-commit hooks configuration
- Added
.dockerignorefile to optimize Docker build context - Refactored
dicom_send_session()todicom_send_container()for multi-level support - Updated manifest classification and suite metadata
4.0.2 [2022-09-07]
Fixes:
- Fixed variable name conflict where Flywheel group label was incorrectly overriding DICOM group tag
0x0021in send operations (fw_gear_dicom_send/main.py:149,fw_gear_dicom_send/main.py:235)
Maintenance:
- Added test assertions to verify DICOM group tag
0x0021is not overridden by Flywheel group label (GEAR-3019)
4.0.1 [2022-07-21]
Maintenance:
- Enhanced package metadata with repository URL, keywords, and PyPI classifiers
- Added README reference and expanded package description in
pyproject.toml
4.0.0 [2022-07-21]
Enhancements:
- Migrated from
dcmtkstorescutopynetdicomfor DICOM transmission with improved logging, error handling, and performance - Added configurable DICOM private tag parameters (
group,identifier,tag_value) - Enabled bulk association for improved transmission performance
Fixes:
- Fixed DICOM file filtering to properly validate files before transmission
- Improved error reporting with specific failure codes and detailed messages
- Fixed handling of temporary resource exhaustion with exponential backoff
Maintenance:
- Enabled
mypy,pylint, andpylint-testspre-commit hooks for type checking and linting - Increased test coverage from 30% to 90%
- Refactored codebase with full type annotations and improved code structure
- Removed
workersconfiguration option (bulk associations handle parallelism) - Removed
tls_use_pem,tls_ciphers, andtls_seedconfiguration options - Simplified
tls_enabledfrom three-state enum to boolean - Removed
tls_security_profileconfiguration option - Updated test certificates and keys for TLS testing
Documentation:
- Updated README to reflect migration from
storescutopynetdicom - Removed
api_keyinput documentation (now handled automatically with read-only key) - Removed TLS cipher list documentation (no longer configurable)
- Removed workflow section (implementation details)
- Updated TESTING.md with alternative
storescpinstructions for TLS testing
Breaking Changes:
- Changed DICOM transmission implementation from
dcmtkstorescutopynetdicomlibrary - Removed configuration options:
workers,tls_use_pem,tls_ciphers,tls_seed,tls_security_profile - Changed
tls_enabledfrom string enum (disabled/enabled/anonymous) to boolean - Report format changed from acquisition-centric to file-centric structure
3.0.3 [2022-05-04]
Fixes:
- Fixed non signed-url file uploads by correcting the
filesparameter format inreport_generator.py:242
3.0.2 [2022-04-27]
Enhancements:
- Added configurable
workersparameter to control the number of process pool workers for parallel DICOM transmission - Implemented parallel DICOM transmission using
ProcessPoolExecutorfor improved performance when sending multiple files
Fixes:
- Removed
--scan-directoriesflag fromstorescucommand to resolve transmission issues
Maintenance:
- Refactored DICOM transmission to use concurrent futures with proper error handling and result collection
3.0.1 [2022-04-12]
Fixes:
- Fixed missing f-string prefix in log messages for zipfile and tarfile extraction
- Fixed incorrect usage of
acq.idinstead ofacq._idwhen downloading and sending DICOM files - Fixed gear to handle cases where no input file is provided, ensuring it correctly downloads files from the session
Maintenance:
- Updated Dockerfile to use
poetry install --no-devfor final installation step - Renamed
api_keyinput toapi-keyin manifest for consistency with naming conventions
Documentation:
- Added comprehensive testing guide for validating against real PACS systems
- Documented firewall configuration and port setup for Orthanc server testing
- Added troubleshooting steps for network connectivity verification
Enhancements:
- Added
debugconfiguration option to enable debug logging - Added environment variables section to manifest for better container configuration visibility
3.0.0 [2022-04-08]
Enhancements:
- Added TLS support with configurable encryption modes (
enabled,disabled,anonymous) - Added TLS configuration options including security profiles, cipher selection, and certificate validation
- Added file download retry mechanism with configurable timeout for improved reliability
- Added comprehensive gear execution report with transmission status details
Fixes:
- Fixed file download error handling when no input file is provided
Maintenance:
- Migrated from
ubuntu:20.04toflywheel/pythonbase image - Updated
dcmtkfrom3.6.4-2.1build2to3.6.5-1 - Migrated from
flywheel-sdktofw-core-clientfor API interactions - Updated
pydicomfrom2.1to2.3withfw-fileintegration - Reorganized codebase into
fw_gear_dicom_sendpackage structure - Migrated dependency management to
poetrywithpyproject.toml - Added CI/CD pipeline configuration with
.gitlab-ci.yml - Added pre-commit hooks for code quality checks (
black,isort,pytest, etc.) - Updated Docker entrypoint to use
poetry run python - Improved DICOM validation using
fw-fileDICOMCollection - Enhanced error logging for
storescucommand failures
Documentation:
- Added
CONTRIBUTING.mdwith development workflow and release process - Reorganized testing documentation into
docs/TESTING.md - Added TLS configuration guide with Orthanc server setup instructions
- Added
changelog.mdfor tracking design decisions - Created merge request template with release notes checklist
- Expanded README with TLS configuration details and available cipher list
2.1.1 [2021-07-30]
Fixes:
- Fixed incorrect increment of
dicoms_sentcounter when DICOM transmission failed due to temporary errors
2.1.0 [2021-05-12]
Enhancements:
- Added automatic retry logic with exponential backoff for DICOM transmissions that fail due to temporary congestion
Fixes:
- Improved error handling for temporary DICOM transmission failures by detecting congestion errors and retrying up to 60 seconds
Maintenance:
- Added
backofflibrary dependency for retry functionality
2.0.3 [2021-05-12]
Fixes:
- Fixed incorrect indentation in error handling code that could cause syntax errors
Maintenance:
- Removed trailing whitespace from source files
2.0.2 [2021-05-12]
Fixes:
- Fixed indentation error in
run.pyexit statement when not all DICOM files are successfully transmitted
2.0.1 [2021-05-12]
Fixes:
- Fixed inconsistent exit behavior when DICOM transmission fails - now uses
os.sys.exit(1)in all error cases to ensure proper error code propagation
2.0.0 [2021-05-12]
Enhancements:
- Enhanced exit status handling to distinguish between partial and complete transmission failures, improving error reporting accuracy
Fixes:
- Fixed gear success reporting to accurately reflect when not all DICOM files were successfully transmitted
Documentation:
- Added clarification that gear only reports success when all DICOM files are successfully transmitted
- Added port forwarding setup note for local testing with DICOM servers
1.1.2 [2020-09-09]
Fixes:
- Fixed timestamp format in report filenames to use hyphens instead of colons for filesystem compatibility
- Added filename sanitization to handle special characters and ensure valid filenames across different operating systems
- Added special handling for
t2*naming patterns to replace asterisks withstarin filenames
Maintenance:
- Added
pathvalidatedependency for robust filename sanitization
1.1.1 [2020-09-08]
Fixes:
- Fixed session ID retrieval when a file input is provided by getting the parent session from the acquisition
- Refactored API key and Flywheel client handling to reduce redundant client instantiations
Maintenance:
- Refactored
run()function to acceptapi_keystring instead offlywheel.Clientobject - Updated
report_generatorfunctions to acceptapi_keyinstead offlywheel.Clientobject - Improved argument handling in
parse_config.pyby sanitizing printed output to exclude sensitive API keys
Documentation:
- Clarified that images are successfully sent when
storescureturns a "0" exit code
1.1.0 [2020-08-26]
Enhancements:
- Added CSV report generation that tracks export status for each DICOM file/archive, including acquisition ID, Flywheel path, filename, image counts, and completion status
- Report is automatically uploaded as an attachment to the session container after gear execution
- Report is printed to the log file in human-readable format for immediate visibility
- Add count to track DICOM images present versus successfully sent
Maintenance:
- Initialized logging via
gear_context.init_logging()in main execution flow - Added new
report_generatorutility module for CSV report handling - Updated
dicom_send.run()to passflywheel.Clientinstance and acquisition ID for report generation - Modified
tag_and_transmit.run()to return both present and sent DICOM counts
Documentation:
- Added gear outputs section describing the CSV report format and columns
- Added testing section with reference to
TESTING.md - Updated workflow documentation to reflect report generation
1.0.0 [2020-08-18]
Enhancements:
- Added support for tar archive (
.tgz) input in addition to zip archives and single DICOM files - Added validation to check for empty archives and exit with error if detected
- Added
TESTING.mdwith instructions for local testing using Orthanc DICOM server
Fixes:
- Fixed
portconfiguration default value type from string to integer in manifest
Maintenance:
- Upgraded base image from
ubuntu:16.04toubuntu:20.04 - Upgraded
pythonfrom2.7to3.8 - Upgraded
dcmtkto version3.6.4-2.1build2 - Migrated from bash script (
run) to Python-based implementation (run.py) - Refactored codebase into modular utility functions in
utils/directory - Added
flywheel-gear-toolkitfor improved gear context handling - Replaced
download_dicoms.pystandalone script with integrated download functionality inutils/dicom_send.py - Replaced
tagger.pystandalone script with tag and transmit functionality inutils/tag_and_transmit.py - Added
utils/parse_config.pyfor centralized configuration parsing
Documentation:
- Updated manifest description to clarify gear behavior and private tag usage
- Updated input description to explicitly mention support for zip, tar, and single DICOM files
- Updated
destinationconfiguration description to clarify "engine host" requirement - Updated README workflow section to clarify session-level DICOM download behavior
- Added gear category
converterin manifest
0.15.0 [2020-07-15]
Enhancements:
- Added
read-onlyflag toapi_keyinput for improved security - Expanded README with comprehensive gear description, inputs, configuration settings, and workflow documentation
Maintenance:
- Consolidated dependency installation in Dockerfile to use
requirements.txt - Reformatted all Python code to follow standardized formatting guidelines
- Updated manifest structure to use
gear-buildercustom configuration format - Changed source URL from
https://flywheel.iotohttps://github.com/flywheel-apps/dicom-send - Updated gear label from "DCMTK: DICOM Send - storescu" to "DCMTK: DICOM Send"
- Added
tests/__init__.pyfile to properly structure test package
0.14.1 [2019-01-28]
Fixes:
- Fixed crash when processing non-DICOM files in directory by catching
pydicom.errors.InvalidDicomErrorand skipping invalid files - Added warning message when no DICOM files were successfully tagged
0.14.0 [2018-12-03]
Enhancements:
- Added automatic site admin privilege detection and usage for DICOM downloads when authenticated user has root access
0.13.0 [2018-09-07]
Enhancements:
- Added validation to check if DICOM files have recognized
SOPClassUIDbefore attempting to send - Added counter to track number of successfully sent DICOM files
- Changed exit behavior to only fail if no DICOM files were successfully sent, allowing partial success when some files have unrecognized
SOPClassUID
Fixes:
- Fixed potential issue with file path handling by adding quotes around
$input_filevariable incpcommand
0.12.0 [2018-08-28]
Enhancements:
- Added DICOM file tagging to prevent re-reaping of sent files using private DICOM tags
Fixes:
- Fixed zip extraction handling to correctly identify directory structure and avoid path resolution errors
Maintenance:
- Added
pydicom>=1.1.0dependency for DICOM file manipulation
0.11.0 [2018-07-10]
Enhancements:
- Added support for sending all DICOMs from a session when no input file is provided
- Added
api_keyinput to enable authentication with Flywheel API - Made
fileinput optional to support session-level DICOM operations - Added batch processing to send multiple DICOM files sequentially
Maintenance:
- Installed
python2.7andpython-pipsystem packages - Added
flywheel-sdkPython package - Added
download_dicoms.pyscript for retrieving DICOMs from Flywheel sessions
0.10.0 [2018-06-27]
Enhancements:
- Added configurable
calling_aeparameter to allow customization of the Calling AE title (defaults toflywheel)
Fixes:
- Removed handling for PAR/REC files, which are not valid DICOM format
- Fixed configuration parsing logic to properly handle both
config.jsonandmanifest.jsonfallback scenarios - Added verbose output flag (
-v) tostorescucommand for better debugging - Added proper quoting to shell variables to prevent word splitting issues
- Fixed file copy command to preserve file attributes using
cp -a
Maintenance:
- Refactored configuration parsing into reusable
parse_configfunction - Improved code organization and comments in run script
- Removed default values from configuration fields that should be user-specified (
destination,called_ae) - Updated gear label to include DCMTK suite branding
- Updated author from individual to organization (
Flywheel) - Added
flywheel.suitemetadata field for gear categorization
Documentation:
- Added README with Docker Hub badges and gear description
- Improved configuration field descriptions with clearer usage notes
- Fixed typo in
called_aedescription ("recieving" → "receiving") - Enhanced
destinationfield description to note server reachability requirement
0.9.0 [2018-03-29]
Enhancements:
- Added input type validation to restrict file input to
dicomfiles only
Maintenance:
- Removed trailing whitespace from shell script comments
0.6.3 [2018-02-21]
Maintenance:
- Added
unzipsystem package to Docker image
0.6.2 [2018-02-07]
Fixes:
- Added execute permissions to the
runscript in the Docker container to ensure proper execution
0.6.1 [2018-02-07]
Enhancements:
- Added DICOM file sending capability using
dcmtkstorescuto transmit DICOM data to remote DICOM servers - Added support for multiple input formats including zip archives, gzipped files, and raw DICOM files
- Added configurable destination server, Called AE title, and port number through gear configuration
- Added automatic extraction and handling of compressed DICOM archives
Documentation:
- Added initial README
- Added gear manifest with configuration options for destination server, Called AE title, and port settings