dicom-dre 1.0.0.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dicom-dre might be problematic. Click here for more details.
- dicom_dre-1.0.0.dev1/.devcontainer/devcontainer-lock.json +24 -0
- dicom_dre-1.0.0.dev1/.devcontainer/devcontainer.json +48 -0
- dicom_dre-1.0.0.dev1/.devcontainer/post-create.sh +34 -0
- dicom_dre-1.0.0.dev1/.github/copilot-instructions.md +232 -0
- dicom_dre-1.0.0.dev1/.github/instructions/dicom-io.instructions.md +25 -0
- dicom_dre-1.0.0.dev1/.github/instructions/tests.instructions.md +314 -0
- dicom_dre-1.0.0.dev1/.github/workflows/deploy.yml +182 -0
- dicom_dre-1.0.0.dev1/.gitignore +41 -0
- dicom_dre-1.0.0.dev1/.vscode/extensions.json +10 -0
- dicom_dre-1.0.0.dev1/.vscode/settings.json +45 -0
- dicom_dre-1.0.0.dev1/CHANGELOG.md +11 -0
- dicom_dre-1.0.0.dev1/LICENSE +202 -0
- dicom_dre-1.0.0.dev1/NOTICE +57 -0
- dicom_dre-1.0.0.dev1/PKG-INFO +186 -0
- dicom_dre-1.0.0.dev1/README.md +161 -0
- dicom_dre-1.0.0.dev1/TODO +14 -0
- dicom_dre-1.0.0.dev1/docs/Makefile +16 -0
- dicom_dre-1.0.0.dev1/docs/_static/.gitkeep +0 -0
- dicom_dre-1.0.0.dev1/docs/api.md +10 -0
- dicom_dre-1.0.0.dev1/docs/conf.py +89 -0
- dicom_dre-1.0.0.dev1/docs/index.md +19 -0
- dicom_dre-1.0.0.dev1/docs/make.bat +35 -0
- dicom_dre-1.0.0.dev1/hatch_build.py +53 -0
- dicom_dre-1.0.0.dev1/justfile +83 -0
- dicom_dre-1.0.0.dev1/pyproject.toml +228 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/__init__.py +66 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/_jpeg_dct_accel.c +1573 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/_jpeg_dct_accel_build.py +581 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/_version.py +24 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/actions.py +278 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/batch.py +409 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/catalog.py +871 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/cli.py +435 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/default_catalog.py +2002 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/jpeg_dct_scrubber.py +915 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/pipeline.py +164 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/pixel_blanker.py +324 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profile.py +370 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/__init__.py +14 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/builder.py +130 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/default.py +514 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/lds.py +56 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/lds_no_dob.py +55 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/profiles/pixels_only.py +419 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/py.typed +0 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/pydicom_config.py +20 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/resources/__init__.py +1 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/resources/allow_lists/__init__.py +1 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/resources/allow_lists/default.csv +32343 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/result.py +107 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/scrub_region.py +42 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/text_redactor.py +836 -0
- dicom_dre-1.0.0.dev1/src/dicom_dre/uid_utils.py +35 -0
- dicom_dre-1.0.0.dev1/staged.diff +203 -0
- dicom_dre-1.0.0.dev1/tests/conftest.py +14 -0
- dicom_dre-1.0.0.dev1/tests/unit/__init__.py +1 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/cr/agfa/dxd40_1000c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/ge_medical_systems/discovery_ls.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/ge_medical_systems/qx_i.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/ge_medical_systems_ct/discovery_qx_i.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/ge_medical_systems_mimvista/discovery_st.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/mimvista_corp/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/neurologica/ceretom.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/neusoft/unknown.json +80 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/philips/gemini.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/ct/siemens_mimvista/emotion_duo.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/dx/agfa/dx_g.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/carestream/classic_cr.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/fischer_imaging_corporation/senoscan_trueview.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/fujifilm_corporation/clearview_csm.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/fujifilm_corporation/fdr_1000aws.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/fujifilm_corporation/fdr_2000aws.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_healthcare/senographe_pristina.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/ads_1_0.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/senograph_2000d_ads_17_2_3.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/senographe_essential_ads_43_10_1.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/senographe_essential_ads_56_21_3.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/senographe_essential_dbt_reconstruction_box_01_10_3.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ge_medical_systems/senographe_essential_dbt_reconstruction_box_01_10_4.json +99 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/hologic_inc/lorad_selenia.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/hologic_inc/selenia_dimensions.json +119 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/ims_s_r_l/giotto_image_3dl.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/kodak/classic_cr.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/kodak/elite_cr.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/lorad/hologic_selenia.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/lorad/lorad_selenia.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/lorad_a_hologic_company/dsm.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/mptronic_software/senographe_essential_ads_43_10_1.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/philips_digital_mammography_sweden_ab/l30.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/siemens/mammomat_inspiration.json +101 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/siemens/mammomat_novation_dr.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/siemens/mammomat_revelation.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mg/tmsc_fujitsu_ltd/mgu_1000d.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/ge_medical_systems/discovery_mr750.json +80 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/ge_medical_systems/signa_architect.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/ge_medical_systems/signa_hdxt.json +148 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/ge_medical_systems/signa_pet_mr.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/ge_medical_systems/signa_premier.json +84 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/hitachi_medical_corporation/oasis.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/merge_healthcare/cadstream_5_2_7_563.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/philips_medical_systems/ingenia.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/philips_medical_systems/intera.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/siemens/avanto.json +59 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/toshiba/titan.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/mr/toshiba_mec/mrt200pp3.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/nm/adac/atlantis.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/nm/segami/mirage.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/ge_medical_systems/qx_i.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/ge_medical_systems/signa_pet_mr.json +272 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/ge_medical_systems_pet/discovery_qx_i.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/gems/advance.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/gems/unknown.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/hmsa_mim_software/927.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/philips_medical_systems/gemini_tf_base_c.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/philips_medical_systems/guardian_body_c.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/philips_medical_systems_mimvista/allegro_body_c.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/pt/siemens/1094.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/b_k_medical/1202.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/invenia.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/invenia_abus_2_0.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiq7.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqbook.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqe.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqe9.json +111 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqi.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqp5.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqp6.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqs7.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqs8.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_healthcare/logiqworkse9.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_medical_systems/logiq9.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_vingmed_ultrasound/echopac_pc.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_vingmed_ultrasound/vivid7.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/ge_vingmed_ultrasound/vivid_e9.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/philips_medical_systems/lumify.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/siemens/s2000.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/allow/us/siemens_medical_systems_ultrasound_division/antares.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/cannon/dr_2050c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/canon/dr_2010c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/canon/dr_2050c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/canon/dr_c125.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/eastman_kodak_company/ls_75.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/efilm_medical/unknown.json +36 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/fujitsu/fi_6140z.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/g_e_medical_systems/prodigy.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/ge_healthcare_it_radiology/centricity_radiology_ra_600.json +308 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/general_electric/centricity_ra_600.json +61 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/hologic/discovery_a_s_n80111.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/hologic/discovery_a_s_n_85108.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/infinitt/infinitt_pacs.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/lexmark/unknown.json +84 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/lifeimagenomination/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/lifeimagenotify/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/lifeimagereport/unknown.json +20 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/lumisys/unknown.json +242 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/medweb/none.json +56 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/meridian_technique_limited/orthoview_isd.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/nai_tech_products_inc/the_dicom_box.json +41 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/neurostar_solutions_inc/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/north_american_imaging_inc/the_dicom_box.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacs/dr_c125.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsgear/pacsscan.json +84 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsgear/print2pacs.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsgear/unknown.json +426 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsgear_inc/the_dicom_box.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsgear_rii2/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacslogic/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/pacsmatt/unknown.json +68 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/panasonic/kv_s2026c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/philips/easydiagnost_super80_cp.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/philips_medical_systems/unknown.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/siemens_health_services/unknown.json +167 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/sorna_corporation/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/vidar/diagnosticpro_advantage.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/vidar/unknown.json +157 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/vidar/vidar_digitizer.json +149 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/cr/viztek/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/brightspeed.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/brightspeed_qx_i.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/brightspeed_s.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_600.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_610.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_690.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_710.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_ct.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_ct590_rt.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_ct750_hd.json +58 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_iq.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_mi.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_rx.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_st.json +55 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_ste.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/discovery_xr.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/hispeed_qx_i.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed16.json +72 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_plus.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_pro_16.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_pro_32.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_qx_i.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_rt.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_rt16.json +39 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_ultra.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_vct.json +129 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/lightspeed_xtra.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/optima_560.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/optima_ct520_series.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/optima_ct540.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/optima_ct580.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/optima_ct660.json +58 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/revolution_ct.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/revolution_evo.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/revolution_gsi.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/ge_medical_systems/revolution_hd.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/medrad_inc/certegra.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/philips/brilliance_64.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/philips/gemini_tf_big_bore.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/philips/precedence_16p.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/siemens/sensation_64.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ct/toshiba/aquilion.json +163 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/bioptics_inc/pathvision.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/efilm_medical/unknown.json +68 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/faxitron_x_ray_llc/dx_50.json +66 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/ge_healthcare/lunar_prodigy.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/ge_healthcare/lunar_prodigy_advance.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/hologic/discovery_a_s_n87685.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/hologic/discovery_c_s_n81330.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/hologic/discovery_c_s_n84951.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/hologic/discovery_sl_s_n82250.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/hologic/horizon_w_s_n_200112.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/lexmark/unknown.json +124 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/lifeimagenomination/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/lifeimagenotify/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/lifeimagereport/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/pacsgear/unknown.json +1726 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/pacslogic/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/pacsmatt/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/dx/philips_medical_systems/unknown.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ko/ge_healthcare_it_radiology/centricity_radiology_ra_1000.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/bioptics_inc/biovision.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/bioptics_inc/corevision.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/bioptics_inc/pixarray100.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/cadx/cad1.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/cadx/mmhwdcad.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/cadx/ohmac2cad.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/canon/2050c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/canon/dr_2010c.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/confirma_inc/cadstream_4_1_3_985.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/connect_imaging/unknown.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/di/document_scanner.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/eastman_kodak_company/carestream_digitized_priors_input_station_1_1_5_38679_vidar.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/faxitron_bioptics_llc/biovision.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/faxitron_x_ray_corporation/dx_50.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/faxitron_x_ray_llc/dx_50.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/ge_healthcare/lunar_prodigy_advance.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/ge_healthcare_it_digital_hardcopy/centricity_digital_hardcopy.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/ge_healthcare_it_radiology/centricity_radiology_ra_600.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/hologic/discovery_a_s_n83038.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/hologic_inc/securview.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/hologic_inc/trident.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/icad_inc/7_2_h.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/icad_inc/icad_powerlook_amp_8_0_1.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/icad_inc/unknown.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/kubtec/xpert.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/kubtec/xpert_20.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/lexmark/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/matakina_technology/unknown.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/matakina_technology/volpara_server.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/primordial/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/r2_technology_inc/cenova.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/r2_technology_inc/digitalnow_enhanced.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/r2_technology_inc/digitalnow_tm.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/ramsoft_inc/castle_powerreader.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/siemens_healthcare/syngo_via_va30a.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/three_palm_software/workstationone.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/vidar/cad_pro_advantage.json +27 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/vidar/cadpro.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/vidar/diagnosticpro_advantage.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/vidar/vidar_digitizer.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/visage_imaging/senograph_ds_ads_43_10_1.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/visage_imaging/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mg/volpara_limited/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/agfa/clinapps.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/aze/unknown.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/bammergroup_stanford/rapid_2_0.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/barco/voxar_3d.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/cannon/dr_2050c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/canon/2050c.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/circlecvi/unknown.json +40 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/confirma_inc/cadstream_4_1_2_613.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/dcad/unknown.json +36 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/desacc_inc/health_data_explorer.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/fujitsu/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/ge/signa_1_5t.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/ge_healthcare_it_radiology/centricity_radiology_ra_600.json +61 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/ge_medical_systems/signa_hdxt.json +59 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/icad/unknown.json +36 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/image_information_systems/unknown.json +20 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/imagenow/unknown.json +20 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/lexmark/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/lifeimagenomination/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/lifeimagenotify/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/lifeimagereport/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/lumisys/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/medweb/none.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/merge_healthcare/cadstream_5_2_7_563.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/merge_healthcare/cadstream_5_2_9_711.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/merge_healthcare_inc/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/neurostar_solutions_inc/unknown.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsgear/pacsscan.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsgear/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsgear_riipscan/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsmatt/unknown.json +55 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsscan/dr_2080c.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/pacsscan_4_0/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/panasonic/kv_s2028c.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/philips/unknown.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/philips_medical_systems/unknown.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/primordial/unknown.json +34 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/radiology_research/hfh.json +41 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/siemens_healthcare/syngo_via_va20a.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/siemens_healthcare/syngo_via_vb10a.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/sorna_corporation/unknown.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/statrad_llc/push2pacs.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/toshiba_mec/mrt200pp3.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/toshiba_mec/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/urlj/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/vassol/unknown.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/vidar/unknown.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/vital_images_inc/vitrea_2.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/mr/viztek/unknown.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/nm/adac/unknown.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/nm/ge_medical_systems/discovery_st.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/nm/segami/mirage.json +59 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ot/ge_medical_systems/qx_i.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/ot/philips_medical_systems/alluraxper.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pct/ge_medical_systems/discovery_ste.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pt/ge_medical_systems/discovery_690.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pt/ge_medical_systems/discovery_st.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pt/ge_medical_systems/discovery_ste.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pt/ge_medical_systems/qx_i.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/pt/philips_medical_systems/allegro_body_c.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sc/sante_dicom/unknown.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/philips_medical_systems/ie33.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/biograph128.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/sensation_16.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/sensation_64.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/somatom_definition.json +19 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/somatom_definition_as.json +32 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/somatom_definition_edge.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/somatom_definition_flash.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/siemens/somatom_force.json +18 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/sr/sonosite_inc/turbo.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/acuson/cypress.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/acuson/sequoia.json +80 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/aloka_co_ltd/ssd_5500.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/atl/hdi_5000.json +79 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/g_e_medical_systems/logiq_700.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiq_s6.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqe.json +61 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqe9.json +523 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqi.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqp5.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqp6.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqp9.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqs7.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/logiqs8.json +252 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/venue_40.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare/viewpoint.json +85 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare_it_radiology/centricity_radiology_ra_600.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_healthcare_viewpoint/viewpoint.json +49 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_medical_systems/logiq5.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_medical_systems/logiq9.json +177 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_medical_systems/logiqworks.json +65 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/ge_vingmed_ultrasound/vivid7.json +43 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/gems_ultrasound/vivid_i.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/gems_ultrasound/vivid_s5.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/gems_ultrasound/vivid_s6.json +39 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/medison/accuvix.json +20 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/medison/accuvix_xg.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/philips_medical_systems/affiniti_50g.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/philips_medical_systems/epiq_5g.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/philips_medical_systems/epiq_7g.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/philips_medical_systems/hd15.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/philips_medical_systems/iu22.json +43 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/samsung_medison_co_ltd/rs80a.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/samsung_medison_co_ltd/sonoace_r7.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens/acuson_p500.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens/acuson_sc2000.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens/acuson_x300.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens/acuson_x700.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens/s2000.json +55 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens_medical_systems_ultrasound_division/antares.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/siemens_ultrasound/g50_s.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/sonosite_inc/micromaxx.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/sonosite_inc/nano.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/sonosite_inc/x_porte.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/supersonic_imagine_sa/aixplorer.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/toshiba_mec/ssa_580a.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/toshiba_mec_us/tus_a500.json +67 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/u_systems/somoviewer.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/unknown/unknown.json +38 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/zonare/z_one.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/us/zonare/zs3.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/xa/philips/allura_clarity.json +22 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/filter/xa/philips_medical_systems/alluraxper.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/cr/canon_inc/axiom_multix_m.json +61 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/cr/canon_inc/cxdi.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/cr/konica/0402.json +49 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/cr/medicatechusa/krystalrad_660vsi.json +303 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/cr/shimadzu/cxdi_control_software_ne.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ct/siemens/s1000.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/dx/canon_inc/cxdi.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/dx/cuattro_llc/clouddr_medical.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/dx/medicatechusa/krystalrad_660_vxi.json +257 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/dx/medlink_imaging/altodr.json +27 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/nm/ge_medical_systems_nuclear/unknown.json +50 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ot/ge_medical_systems/discovery_690.json +28 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ot/ge_medical_systems/discovery_mi.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ot/ge_medical_systems/discovery_st.json +52 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ot/ge_medical_systems/discovery_ste.json +72 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/ot/ge_medical_systems/signa_pet_mr.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/pt/ge_medical_systems/discovery_600.json +28 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/pt/ge_medical_systems/discovery_mi.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/pt/ge_medical_systems/signa_pet_mr.json +29 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/pt/philips_medical_systems/guardian_body_c.json +92 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/acuson/cypress.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/acuson/sequoia.json +89 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/aloka_co_ltd/ssd_5500.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/aloka_co_ltd/ssd_alpha10.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/aloka_co_ltd/ssd_alpha5.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/aloka_co_ltd/ssd_alpha6.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/aloka_co_ltd/ssd_alpha7.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/b_k_medical/1202.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/b_k_medical/2202.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/bk_medical/2300.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/g_e_medical_systems/logiq_700.json +42 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiq7.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiq_s6.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqe.json +64 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqe9.json +304 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqi.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqp5.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqp6.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqp9.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqs7.json +63 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/logiqs8.json +204 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/vivide.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/voluson_p.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare/voluson_s.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare_austria_gmbh_co_og/v830.json +131 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_healthcare_austria_gmbh_co_og/voluson_e8.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_medical_systems/logiq5.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_medical_systems/logiq9.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_medical_systems_kretztechnik_gmbh_co_ohg/v830.json +104 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_ultrasound/vivid_3.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_vingmed_ultrasound/vivid7.json +47 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_vingmed_ultrasound/vivid_e9.json +67 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/ge_vingmed_ultrasound/vivid_e95.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/gems_ultrasound/logiq_400.json +21 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/gems_ultrasound/vivid_i.json +45 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/gems_ultrasound/vivid_q.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/gems_ultrasound/vivid_s5.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/gems_ultrasound/vivid_s6.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/hitachi_aloka_medical_ltd/noblus.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/hitachi_aloka_medical_ltd/prosound_f75.json +64 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/medison/accuvix.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/medison/accuvix_v10.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/medison/accuvix_v20.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/medison/accuvix_xg.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/medison/sonoace_x8.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/affiniti_50g.json +26 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/affiniti_70g.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/clearvue_550.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/cx30.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/cx50.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/epiq_5w.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/epiq_7g.json +67 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/hd15.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/ie33.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/iu22.json +88 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/philips_medical_systems/sparq.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/samsung_medison_co_ltd/h60.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/samsung_medison_co_ltd/rs80a.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/samsung_medison_co_ltd/sonoace_r7.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/acuson_freestyle.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/acuson_p500.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/acuson_sc2000.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/acuson_x300.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/acuson_x700.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/s1000.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/s2000.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens/s3000.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_medical_systems_ultrasound_division/antares.json +67 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_ultrasound/elegra.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_ultrasound/g40.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_ultrasound/g50_s.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_ultrasound/g60_s.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/siemens_ultrasound/x150.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/sonosite/sonosite_titan.json +23 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/sonosite_inc/micromaxx.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/sonosite_inc/nano.json +44 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/sonosite_inc/turbo.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/sonosite_inc/x_porte.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/supersonic_imagine_sa/aixplorer.json +291 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec/aplioxg.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec/viamo.json +24 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec/xarioxg.json +45 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/ssh_880cv.json +25 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/tus_a300.json +27 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/tus_a400.json +27 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/tus_a500.json +28 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/tus_ai700.json +28 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/toshiba_mec_us/tus_x200.json +27 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/zonare/z_one.json +45 -0
- dicom_dre-1.0.0.dev1/tests/unit/catalog_fixtures/scrub/us/zonare/zs3.json +46 -0
- dicom_dre-1.0.0.dev1/tests/unit/conftest.py +115 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_batch.py +425 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_catalog.py +577 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_catalog_regression_fixtures.py +113 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_cli.py +311 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_default_catalog.py +570 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_jpeg_dct_scrubber.py +307 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_pipeline_preservation.py +200 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_pipeline_redaction.py +141 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_pixel_blanker.py +674 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_profile.py +531 -0
- dicom_dre-1.0.0.dev1/tests/unit/test_text_redactor.py +827 -0
- dicom_dre-1.0.0.dev1/uv.lock +1294 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"features": {
|
|
3
|
+
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
|
|
4
|
+
"version": "1.0.6",
|
|
5
|
+
"resolved": "ghcr.io/devcontainers-extra/features/apt-packages@sha256:55c54412112da81b9381e470cdbbe55278564950d1ff536ce925b1e8e096babd",
|
|
6
|
+
"integrity": "sha256:55c54412112da81b9381e470cdbbe55278564950d1ff536ce925b1e8e096babd"
|
|
7
|
+
},
|
|
8
|
+
"ghcr.io/devcontainers/features/common-utils:2": {
|
|
9
|
+
"version": "2.5.9",
|
|
10
|
+
"resolved": "ghcr.io/devcontainers/features/common-utils@sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a",
|
|
11
|
+
"integrity": "sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a"
|
|
12
|
+
},
|
|
13
|
+
"ghcr.io/devcontainers/features/github-cli:1": {
|
|
14
|
+
"version": "1.1.0",
|
|
15
|
+
"resolved": "ghcr.io/devcontainers/features/github-cli@sha256:d22f50b70ed75339b4eed1ba9ecde3a1791f90e88d37936517e3bace0bbad671",
|
|
16
|
+
"integrity": "sha256:d22f50b70ed75339b4eed1ba9ecde3a1791f90e88d37936517e3bace0bbad671"
|
|
17
|
+
},
|
|
18
|
+
"ghcr.io/jsburckhardt/devcontainer-features/uv:1": {
|
|
19
|
+
"version": "1.0.0",
|
|
20
|
+
"resolved": "ghcr.io/jsburckhardt/devcontainer-features/uv@sha256:542a0bc2203205b3c696de650ba862f280b20af3543493cc232edd9ac35791f7",
|
|
21
|
+
"integrity": "sha256:542a0bc2203205b3c696de650ba862f280b20af3543493cc232edd9ac35791f7"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
|
2
|
+
// https://containers.dev/
|
|
3
|
+
{
|
|
4
|
+
"name": "dicom-dre",
|
|
5
|
+
"image": "python:3.12-slim-trixie",
|
|
6
|
+
"remoteUser": "${localEnv:USER}${localEnv:USERNAME}",
|
|
7
|
+
"containerEnv": {
|
|
8
|
+
"UV_COMPILE_BYTECODE": "1",
|
|
9
|
+
"UV_LINK_MODE": "copy",
|
|
10
|
+
"UV_PYTHON_DOWNLOADS": "never",
|
|
11
|
+
"UV_TOOL_BIN_DIR": "/usr/local/bin"
|
|
12
|
+
},
|
|
13
|
+
"customizations": {
|
|
14
|
+
"vscode": {
|
|
15
|
+
"settings": {
|
|
16
|
+
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
|
|
17
|
+
"extensions.verifySignature": false, // https://github.com/microsoft/vscode-remote-release/issues/9628
|
|
18
|
+
"remote.autoForwardPorts": false,
|
|
19
|
+
"extensions.ignoreRecommendations": true
|
|
20
|
+
},
|
|
21
|
+
"extensions": [
|
|
22
|
+
"bierner.markdown-mermaid",
|
|
23
|
+
"charliermarsh.ruff",
|
|
24
|
+
"GitHub.copilot",
|
|
25
|
+
"GitHub.vscode-pull-request-github",
|
|
26
|
+
"ms-python.python",
|
|
27
|
+
"meta.pyrefly",
|
|
28
|
+
"redhat.vscode-yaml"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"features": {
|
|
33
|
+
"ghcr.io/devcontainers/features/common-utils:2": {
|
|
34
|
+
"username": "${localEnv:USER}${localEnv:USERNAME}",
|
|
35
|
+
"userUid": "1000",
|
|
36
|
+
"userGid": "1000",
|
|
37
|
+
"upgradePackages": "false",
|
|
38
|
+
"configureZshAsDefaultShell": "false"
|
|
39
|
+
},
|
|
40
|
+
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
|
|
41
|
+
"packages": "build-essential,ca-certificates,cmake,curl,dcmtk,file,git,just,ninja-build,patchelf,pkg-config,swig,unzip,wget,zip"
|
|
42
|
+
},
|
|
43
|
+
"ghcr.io/jsburckhardt/devcontainer-features/uv:1": {},
|
|
44
|
+
"ghcr.io/devcontainers/features/github-cli:1": {}
|
|
45
|
+
},
|
|
46
|
+
"postCreateCommand": "bash ./.devcontainer/post-create.sh",
|
|
47
|
+
"waitFor": "postCreateCommand"
|
|
48
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
WORKSPACE_DIR="$(pwd)"
|
|
5
|
+
|
|
6
|
+
BLUE='\033[0;34m'
|
|
7
|
+
NC='\033[0m'
|
|
8
|
+
|
|
9
|
+
# Git doesn't like the UID changes from bind-mounting the source into the container.
|
|
10
|
+
if ! git config --global --get-all safe.directory | grep -qx "${WORKSPACE_DIR}"; then
|
|
11
|
+
git config --global --add safe.directory "${WORKSPACE_DIR}"
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
# Convenience aliases.
|
|
15
|
+
if ! grep -q "#dicom-dre#" "${HOME}/.bashrc" 2>/dev/null; then
|
|
16
|
+
{
|
|
17
|
+
echo '#dicom-dre#'
|
|
18
|
+
echo 'alias ll="ls -alF"'
|
|
19
|
+
echo 'alias la="ls -A"'
|
|
20
|
+
echo 'alias l="ls -CF"'
|
|
21
|
+
} >> "${HOME}/.bashrc"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Sync dependencies and build the CFFI JPEG-DCT extension (and python-gdcm from source).
|
|
25
|
+
echo -e "${BLUE}Running uv sync...${NC}"
|
|
26
|
+
uv sync
|
|
27
|
+
|
|
28
|
+
# Compile the CFFI JPEG-DCT acceleration extension into src/dicom_dre/.
|
|
29
|
+
# Without this the engine silently falls back to the ~300x-slower pure-Python
|
|
30
|
+
# entropy codec. Building from src/ so the module 'dicom_dre._jpeg_dct_accel'
|
|
31
|
+
# lands at src/dicom_dre/_jpeg_dct_accel.*.so.
|
|
32
|
+
echo -e "${BLUE}Compiling JPEG-DCT acceleration extension...${NC}"
|
|
33
|
+
(cd src && uv run python -m dicom_dre._jpeg_dct_accel_build)
|
|
34
|
+
rm -f src/dicom_dre/_jpeg_dct_accel.c src/dicom_dre/_jpeg_dct_accel.o
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
COPILOT INSTRUCTIONS
|
|
2
|
+
|
|
3
|
+
This document defines how the AI pair programmer should reason, communicate, and write code.
|
|
4
|
+
It sets style rules, workflow expectations, and interaction guidelines to ensure consistent,
|
|
5
|
+
high-quality, and safe contributions.
|
|
6
|
+
|
|
7
|
+
CORE DIRECTIVE
|
|
8
|
+
You are an expert AI pair programmer.
|
|
9
|
+
Your primary goal is to make precise, high-quality, and safe code modifications.
|
|
10
|
+
Follow every rule in this document meticulously.
|
|
11
|
+
|
|
12
|
+
INTERACTION & REASONING GUIDELINES
|
|
13
|
+
|
|
14
|
+
- Concise communication:
|
|
15
|
+
Use one clear sentence before each tool call to explain what you are doing.
|
|
16
|
+
|
|
17
|
+
- Continuity:
|
|
18
|
+
If the user says "resume" or "continue", pick up exactly where your last step ended.
|
|
19
|
+
|
|
20
|
+
- Thorough thinking:
|
|
21
|
+
Think rigorously and document reasoning internally.
|
|
22
|
+
Share only concise results externally.
|
|
23
|
+
|
|
24
|
+
- Communication style:
|
|
25
|
+
Use factual, descriptive language in the style of internal engineering specifications.
|
|
26
|
+
Never use marketing terms (efficient, compelling, comprehensively, effectively, successfully).
|
|
27
|
+
Never use promotional adjectives (comprehensive, robust, powerful, optimized, seamless, flexible, scalable, intuitive, advanced, cutting-edge).
|
|
28
|
+
Never use enthusiastic phrases (Perfect! Excellent! Great! Awesome! I have successfully...).
|
|
29
|
+
Avoid evaluative or subjective judgments.
|
|
30
|
+
Prefer verbs and concrete nouns over adjectives.
|
|
31
|
+
Omit unverifiable or unquantifiable claims.
|
|
32
|
+
Provide factual summaries that describe actions and results without celebration.
|
|
33
|
+
When uncertain if a word is promotional, omit it.
|
|
34
|
+
Do not use emphatic markers (CRITICAL, IMPORTANT, WARNING) in code comments or documentation unless explicitly requested by the user.
|
|
35
|
+
|
|
36
|
+
- File creation:
|
|
37
|
+
Do not create summary documentation unless explicitly requested.
|
|
38
|
+
Do not create test files without asking first.
|
|
39
|
+
Only create files directly required to fulfill the user's request.
|
|
40
|
+
|
|
41
|
+
- Error checking:
|
|
42
|
+
After making any code changes, automatically check for linter errors using get_errors.
|
|
43
|
+
Fix all errors before reporting completion.
|
|
44
|
+
Never wait for the user to point out linter errors.
|
|
45
|
+
|
|
46
|
+
CODING STANDARDS
|
|
47
|
+
General Rule:
|
|
48
|
+
|
|
49
|
+
- Implement the smallest possible change that satisfies the request.
|
|
50
|
+
- Follow the Google Python coding standards except when they conflict with this document.
|
|
51
|
+
- Do not create trailing whitespace, and immediately remove trailing whitespace when found.
|
|
52
|
+
- Avoid spaces in empty lines.
|
|
53
|
+
- Avoid the use of emojis in log messages or documentation.
|
|
54
|
+
|
|
55
|
+
Naming Conventions:
|
|
56
|
+
|
|
57
|
+
- Modules: lowercase_with_underscores
|
|
58
|
+
- Classes: CapWords
|
|
59
|
+
- Functions & variables: lowercase_with_underscores
|
|
60
|
+
- Constants: UPPERCASE_WITH_UNDERSCORES
|
|
61
|
+
- Private members: prefix with \_
|
|
62
|
+
|
|
63
|
+
Strings:
|
|
64
|
+
|
|
65
|
+
- Prefer double quotes ("...")
|
|
66
|
+
- Use triple quotes ("""...""") for docstrings
|
|
67
|
+
|
|
68
|
+
Error Handling:
|
|
69
|
+
|
|
70
|
+
- CRITICAL: Never use assert statements for runtime validation
|
|
71
|
+
- Assert statements are removed in optimized byte code compilation
|
|
72
|
+
- Use explicit ValueError, TypeError, or other appropriate exceptions instead
|
|
73
|
+
- Provide clear, descriptive error messages
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
# Wrong
|
|
77
|
+
assert value is not None
|
|
78
|
+
assert len(items) > 0
|
|
79
|
+
|
|
80
|
+
# Correct
|
|
81
|
+
if value is None:
|
|
82
|
+
raise ValueError("value must not be None")
|
|
83
|
+
if len(items) == 0:
|
|
84
|
+
raise ValueError("items list cannot be empty")
|
|
85
|
+
|
|
86
|
+
IMPORTS
|
|
87
|
+
|
|
88
|
+
Rules:
|
|
89
|
+
|
|
90
|
+
- All imports must be at the top of the file
|
|
91
|
+
- Only use inline imports when necessary for performance or to avoid circular import issues
|
|
92
|
+
- One import per line
|
|
93
|
+
- Order: standard library -> third-party -> local
|
|
94
|
+
- Always use absolute imports, inside **init**.py is ok
|
|
95
|
+
- Avoid importing Prefect functions and modules in a file that does not contain @task and @flow functions.
|
|
96
|
+
|
|
97
|
+
PACKAGE RESOURCES
|
|
98
|
+
|
|
99
|
+
- Use importlib.resources, never Path(__file__).parent
|
|
100
|
+
- Pattern: import importlib.resources as pkg_resources, then Path(str(pkg_resources.files(resource_module)))
|
|
101
|
+
|
|
102
|
+
DOCSTRINGS & COMMENTS
|
|
103
|
+
|
|
104
|
+
- Follow PEP 257
|
|
105
|
+
- First line: short summary sentence
|
|
106
|
+
- Document all public classes, methods, and functions
|
|
107
|
+
- Never write obvious comments that simply restate what the code does
|
|
108
|
+
|
|
109
|
+
Example:
|
|
110
|
+
def add(x: int, y: int) -> int:
|
|
111
|
+
"""Return the sum of x and y."""
|
|
112
|
+
return x + y
|
|
113
|
+
|
|
114
|
+
TYPE ANNOTATIONS
|
|
115
|
+
|
|
116
|
+
- Use PEP 484 type hints
|
|
117
|
+
- Forward-declare types with TYPE_CHECKING if needed
|
|
118
|
+
- Use quoted annotations ("State") when types are not available at runtime
|
|
119
|
+
|
|
120
|
+
DATACLASSES
|
|
121
|
+
|
|
122
|
+
- Fields with default values MUST come after fields without defaults
|
|
123
|
+
- Order fields: required fields first, then optional/default fields
|
|
124
|
+
- Use field(default=...) or field(default_factory=...) for fields with defaults
|
|
125
|
+
- Never mix required and default fields in arbitrary order
|
|
126
|
+
|
|
127
|
+
Example:
|
|
128
|
+
@dataclass
|
|
129
|
+
class MyClass:
|
|
130
|
+
# Required fields first
|
|
131
|
+
name: str
|
|
132
|
+
age: int
|
|
133
|
+
# Default fields last
|
|
134
|
+
status: str = "active"
|
|
135
|
+
tags: List[str] = field(default_factory=list)
|
|
136
|
+
|
|
137
|
+
TESTING
|
|
138
|
+
|
|
139
|
+
- Run tests using `uv run pytest` (NEVER `python -m pytest`)
|
|
140
|
+
- Place tests in tests/ using pytest
|
|
141
|
+
- Mock external services in unit tests especially if they use network calls
|
|
142
|
+
- Prefer small, isolated tests over broad coverage in a single test
|
|
143
|
+
- Avoid disabling, skipping, or commenting out failing unit tests. If a unit test fails, fix the root cause of the exception.
|
|
144
|
+
- Avoid removing assertions, adding empty try/catch blocks, or making tests trivial in order to make tests pass.
|
|
145
|
+
- Avoid introducing conditional logic that skips test cases under certain conditions, for example a missing dependency.
|
|
146
|
+
- Always ensure the unit test continues to properly validate the intended functionality.
|
|
147
|
+
|
|
148
|
+
DOCUMENTATION
|
|
149
|
+
|
|
150
|
+
- When making changes to workflows, always update the corresponding documentation in the docs/ folder
|
|
151
|
+
- Keep workflow documentation synchronized with code changes
|
|
152
|
+
- Update relevant .md files in docs/workflows/ when modifying flow implementations
|
|
153
|
+
- When adding CLI documentation, verify all commands and options against actual --help output
|
|
154
|
+
- When adding new documentation files, add them to the `nav` section in mkdocs.yml
|
|
155
|
+
|
|
156
|
+
CLI REGISTRATION
|
|
157
|
+
|
|
158
|
+
- When creating new CLI commands, always register them in src/dicom_dre/cli.py
|
|
159
|
+
- Add the new command or command group to the `cli` group following the pattern of existing subcommands
|
|
160
|
+
- Group related subcommands under a click group (as done for the redactor subgroup)
|
|
161
|
+
|
|
162
|
+
PYTHON PACKAGE MANAGEMENT
|
|
163
|
+
|
|
164
|
+
- Always use `uv` instead of `pip` for all package management operations
|
|
165
|
+
- Installation: `uv pip install <package>`
|
|
166
|
+
- Editable install: `uv pip install -e .`
|
|
167
|
+
- Multiple packages: `uv pip install package1 package2`
|
|
168
|
+
- Upgrading packages: `uv add package_name>=package_version --upgrade-package package_name`
|
|
169
|
+
- Never use bare `pip` commands
|
|
170
|
+
- `uv` is faster and more reliable than pip for this project
|
|
171
|
+
|
|
172
|
+
SAFETY & ERROR HANDLING
|
|
173
|
+
|
|
174
|
+
- Never suggest destructive commands without confirmation
|
|
175
|
+
- Validate API usage against latest documentation
|
|
176
|
+
- Do not expose secrets, credentials, or tokens in code
|
|
177
|
+
|
|
178
|
+
PHI PROTECTION
|
|
179
|
+
|
|
180
|
+
This project processes medical imaging data. Protected Health Information (PHI) must never
|
|
181
|
+
be transmitted to external services, including MCP servers configured in .vscode/mcp.json.
|
|
182
|
+
|
|
183
|
+
- Never include PHI in tool queries sent to external MCP servers
|
|
184
|
+
- PHI includes: patient names, MRNs, accession numbers, dates of birth, addresses,
|
|
185
|
+
phone numbers, Social Security numbers, and any other HIPAA-defined identifiers
|
|
186
|
+
- When formulating search queries for external documentation servers, use generic
|
|
187
|
+
placeholders (e.g., "accession number" instead of an actual value)
|
|
188
|
+
- If the user pastes PHI in the chat, do not echo it in tool queries
|
|
189
|
+
- Safe test values: The accession numbers "TEST" and "TESTING" exist on the server
|
|
190
|
+
and contain no PHI. These are safe to use in examples and testing.
|
|
191
|
+
|
|
192
|
+
GIT
|
|
193
|
+
|
|
194
|
+
- Avoid suggesting git commands that modify history (rebase, reset, amend) without explicit user confirmation.
|
|
195
|
+
|
|
196
|
+
COMMIT MESSAGES
|
|
197
|
+
|
|
198
|
+
Use Conventional Commits format for all commit messages. This format is parsed by
|
|
199
|
+
python-semantic-release to determine version bumps automatically.
|
|
200
|
+
|
|
201
|
+
Format: <type>[optional scope]: <description>
|
|
202
|
+
|
|
203
|
+
Types that trigger releases:
|
|
204
|
+
- feat: A new feature (triggers MINOR version bump, e.g., 1.0.0 -> 1.1.0)
|
|
205
|
+
- fix: A bug fix (triggers PATCH version bump, e.g., 1.0.0 -> 1.0.1)
|
|
206
|
+
- perf: A performance improvement (triggers PATCH version bump)
|
|
207
|
+
|
|
208
|
+
Types that do NOT trigger releases:
|
|
209
|
+
- chore: Maintenance tasks, dependency updates
|
|
210
|
+
- docs: Documentation changes
|
|
211
|
+
- refactor: Code refactoring without behavior change
|
|
212
|
+
- style: Formatting, whitespace changes
|
|
213
|
+
- test: Adding or updating tests
|
|
214
|
+
- ci: CI/CD configuration changes
|
|
215
|
+
- build: Build system changes
|
|
216
|
+
|
|
217
|
+
Breaking changes (trigger MAJOR version bump, e.g., 1.0.0 -> 2.0.0):
|
|
218
|
+
- Add ! after type: feat!: remove deprecated API
|
|
219
|
+
- Or add BREAKING CHANGE: footer in commit body
|
|
220
|
+
|
|
221
|
+
Examples:
|
|
222
|
+
- feat: add new DICOM anonymization option
|
|
223
|
+
- fix(pipeline): handle missing patient ID gracefully
|
|
224
|
+
- docs: update workflow documentation
|
|
225
|
+
- feat!: change CLI argument format
|
|
226
|
+
- fix: resolve memory leak in image processing
|
|
227
|
+
|
|
228
|
+
BREAKING CHANGE: The --format flag now requires explicit value
|
|
229
|
+
|
|
230
|
+
FINALLY
|
|
231
|
+
|
|
232
|
+
Provide short, concise summaries without the use of emoji when completing a large task.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Reading and writing DICOM with pydicom
|
|
3
|
+
applyTo: "src/dicom_dre/**/*.py"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DICOM I/O Conventions
|
|
7
|
+
|
|
8
|
+
## Process-wide pydicom config
|
|
9
|
+
|
|
10
|
+
Any module that reads or writes DICOM with pydicom (`dcmread`, `dcmwrite`,
|
|
11
|
+
`save_as`, `Dataset` I/O) depends on the global settings in
|
|
12
|
+
`dicom_dre.pydicom_config`, which make reads tolerant of malformed
|
|
13
|
+
production data.
|
|
14
|
+
|
|
15
|
+
- The settings are process-global: one import applies them everywhere, so the
|
|
16
|
+
import only has to run before the first read or write in the process.
|
|
17
|
+
- Add the side-effect import to any new DICOM reader/writer whose module (or its
|
|
18
|
+
import chain) does not already reach it:
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
import dicom_dre.pydicom_config # noqa: F401 applies process-wide pydicom config
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Modules that import the pipeline (`dicom_dre.pipeline`) or an anonymizer entry
|
|
25
|
+
module already inherit it transitively and do not need the direct import.
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Writing tests in tests/unit/
|
|
3
|
+
applyTo: "tests/**/*.py"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Writing Tests in dicom-dre
|
|
7
|
+
|
|
8
|
+
Instructions for creating and maintaining tests in the `tests/` directory.
|
|
9
|
+
|
|
10
|
+
## Test Structure
|
|
11
|
+
|
|
12
|
+
All tests live in `tests/unit/` and mirror the `src/dicom_dre/` module structure:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
tests/
|
|
16
|
+
├── conftest.py # Root config: GDCM/ARM64 segfault guard (pytest_configure)
|
|
17
|
+
└── unit/
|
|
18
|
+
├── conftest.py # Shared fixtures: synthetic GE SIGNA Premier MR dataset
|
|
19
|
+
├── test_catalog.py
|
|
20
|
+
├── test_cli.py
|
|
21
|
+
├── test_default_catalog.py
|
|
22
|
+
├── test_jpeg_dct_anonymizer.py
|
|
23
|
+
├── test_pipeline_preservation.py
|
|
24
|
+
├── test_pixel_blanker.py
|
|
25
|
+
├── test_profile.py
|
|
26
|
+
└── test_text_redactor.py
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Placing New Tests
|
|
30
|
+
|
|
31
|
+
All new tests go in `tests/unit/`. They must use only mocks, `tmp_path`, pure Python
|
|
32
|
+
logic, or `pydicom` test data — no network calls, no cloud services, no external
|
|
33
|
+
processes. For example, a test for `src/dicom_dre/catalog.py` belongs at
|
|
34
|
+
`tests/unit/test_catalog.py`.
|
|
35
|
+
|
|
36
|
+
## Test Framework
|
|
37
|
+
|
|
38
|
+
Use pytest for all tests. Configuration is in `pyproject.toml`:
|
|
39
|
+
|
|
40
|
+
- Test timeout: 90 seconds (configurable per test with `@pytest.mark.timeout`)
|
|
41
|
+
- Coverage requirement: 20% minimum
|
|
42
|
+
|
|
43
|
+
## GDCM / ARM64 Import Note
|
|
44
|
+
|
|
45
|
+
`python-gdcm` (SWIG bindings) can segfault on ARM64 if loaded during pytest's
|
|
46
|
+
assertion-rewriting phase. The root `conftest.py` imports `pydicom` in
|
|
47
|
+
`pytest_configure` to trigger GDCM loading before collection begins. To stay
|
|
48
|
+
safe, import `pydicom` inside test functions or fixtures rather than at module
|
|
49
|
+
level in test files.
|
|
50
|
+
|
|
51
|
+
## File Naming Conventions
|
|
52
|
+
|
|
53
|
+
- Test files: `test_*.py`
|
|
54
|
+
- Benchmark files: `bench_*.py`
|
|
55
|
+
- Test functions: `test_*`
|
|
56
|
+
- Benchmark functions: `bench_*`
|
|
57
|
+
|
|
58
|
+
## Test Class Organization
|
|
59
|
+
|
|
60
|
+
Group related tests in classes with descriptive names:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
"""Tests for the device catalog lookup."""
|
|
64
|
+
|
|
65
|
+
import pytest
|
|
66
|
+
|
|
67
|
+
from dicom_dre.catalog import DeviceCatalog
|
|
68
|
+
from dicom_dre.catalog import CatalogDecision
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class TestDeviceCatalogLookup:
|
|
72
|
+
"""Test device catalog manufacturer/model matching."""
|
|
73
|
+
|
|
74
|
+
def test_known_device_returns_decision(self):
|
|
75
|
+
"""A known manufacturer/model pair returns a catalog decision."""
|
|
76
|
+
catalog = DeviceCatalog.from_default()
|
|
77
|
+
decision = catalog.lookup("GE MEDICAL SYSTEMS", "SIGNA Premier")
|
|
78
|
+
assert decision is not None, "Known device should return a decision"
|
|
79
|
+
|
|
80
|
+
def test_unknown_device_returns_none(self):
|
|
81
|
+
"""An unrecognised manufacturer/model pair returns None."""
|
|
82
|
+
catalog = DeviceCatalog.from_default()
|
|
83
|
+
decision = catalog.lookup("UNKNOWN_MFR", "UNKNOWN_MODEL")
|
|
84
|
+
assert decision is None, "Unknown device should return None"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Docstrings
|
|
88
|
+
|
|
89
|
+
- Module docstring: Describe what is being tested
|
|
90
|
+
- Class docstring: Describe the test suite purpose
|
|
91
|
+
- Test function docstring: Describe the expected behavior being validated
|
|
92
|
+
- Use present tense and be specific about what is being tested
|
|
93
|
+
- Avoid vague descriptions like "Test validation" or wordy phrases like "This test validates..."
|
|
94
|
+
|
|
95
|
+
## Temporary Files and Directories
|
|
96
|
+
|
|
97
|
+
**CRITICAL**: Always use pytest's `tmp_path` fixture. Never use hardcoded paths like `/tmp/test.dcm` or `Path.home()`.
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
def test_operation(tmp_path):
|
|
101
|
+
"""Test with temporary files."""
|
|
102
|
+
input_file = tmp_path / "test.dcm"
|
|
103
|
+
output_dir = tmp_path / "output"
|
|
104
|
+
output_dir.mkdir()
|
|
105
|
+
# tmp_path is automatically cleaned up after the test
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
For custom fixtures, use `tempfile.mkdtemp()`:
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
@pytest.fixture
|
|
112
|
+
def temp_dir():
|
|
113
|
+
"""Create a temporary directory for test files."""
|
|
114
|
+
temp_path = Path(tempfile.mkdtemp())
|
|
115
|
+
yield temp_path
|
|
116
|
+
shutil.rmtree(temp_path, ignore_errors=True)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Mocking External Services
|
|
120
|
+
|
|
121
|
+
Mock any calls that cross a process boundary (file I/O to real paths, network calls).
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
from unittest.mock import Mock, patch
|
|
125
|
+
|
|
126
|
+
def test_with_mock():
|
|
127
|
+
"""Test with mocked external service."""
|
|
128
|
+
mock_client = Mock()
|
|
129
|
+
mock_client.download.return_value = b"test data"
|
|
130
|
+
|
|
131
|
+
with patch("module.get_client", return_value=mock_client):
|
|
132
|
+
result = function_that_uses_client()
|
|
133
|
+
assert result is not None, "Result should not be None"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Environment Variables in Tests
|
|
137
|
+
|
|
138
|
+
Use `monkeypatch.setenv()` and `monkeypatch.delenv()` to set and clear environment
|
|
139
|
+
variables. Never use `os.environ` directly in tests or fixtures, as it leaks state
|
|
140
|
+
across tests.
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
def test_requires_env_var(monkeypatch):
|
|
144
|
+
"""Test behavior when environment variable is set."""
|
|
145
|
+
monkeypatch.setenv("SECRET_KEY", "test-secret-key")
|
|
146
|
+
result = load_config()
|
|
147
|
+
assert result.secret_key == "test-secret-key", "Config should read SECRET_KEY"
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def test_missing_env_var(monkeypatch):
|
|
151
|
+
"""Test behavior when environment variable is absent."""
|
|
152
|
+
monkeypatch.delenv("DATABASE_URL", raising=False)
|
|
153
|
+
with pytest.raises(ValueError, match="DATABASE_URL"):
|
|
154
|
+
load_config()
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Session-Scoped Temporary Directories
|
|
158
|
+
|
|
159
|
+
For session-scoped fixtures that need a temporary directory, use `tmp_path_factory`:
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
@pytest.fixture(scope="session")
|
|
163
|
+
def shared_output_dir(tmp_path_factory):
|
|
164
|
+
"""Shared output directory for session-scoped tests."""
|
|
165
|
+
return tmp_path_factory.mktemp("output")
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Testing with Real Data
|
|
169
|
+
|
|
170
|
+
### Using pydicom Test Data
|
|
171
|
+
|
|
172
|
+
Use pydicom test data for DICOM file tests:
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
from pathlib import Path
|
|
176
|
+
from pydicom.data import get_testdata_file
|
|
177
|
+
|
|
178
|
+
def test_dicom_processing(tmp_path):
|
|
179
|
+
"""Test DICOM file processing."""
|
|
180
|
+
input_file_str = get_testdata_file("CT_small.dcm")
|
|
181
|
+
if not isinstance(input_file_str, str):
|
|
182
|
+
raise ValueError("get_testdata_file did not return a string path")
|
|
183
|
+
|
|
184
|
+
source_file = Path(input_file_str)
|
|
185
|
+
test_file = tmp_path / "test.dcm"
|
|
186
|
+
shutil.copy2(source_file, test_file)
|
|
187
|
+
|
|
188
|
+
result = process_dicom(test_file)
|
|
189
|
+
assert result is not None
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Important**: Do not skip tests if pydicom is not available. All project dependencies (including pydicom) are listed in `pyproject.toml` and must be present. If a test cannot import pydicom, the test should **fail**, not skip. This ensures the development environment is correctly set up.
|
|
193
|
+
|
|
194
|
+
### Assertions
|
|
195
|
+
|
|
196
|
+
**EVERY assertion MUST include a message.** Never write bare `assert` statements without explanatory text. Include expected and actual values in assertion messages to make test failures immediately understandable.
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
# Correct - always include messages
|
|
200
|
+
assert result.success is True, "Operation should succeed"
|
|
201
|
+
assert len(items) == 3, f"Expected 3 items, got {len(items)}"
|
|
202
|
+
assert status.used_percent == 50.0, f"Expected 50.0%, got {status.used_percent}"
|
|
203
|
+
|
|
204
|
+
# Wrong - bare assertions without messages
|
|
205
|
+
assert result.success is True # NO - missing message
|
|
206
|
+
assert len(items) == 3 # NO - missing message
|
|
207
|
+
|
|
208
|
+
# Testing exceptions - use match parameter or check exc_info
|
|
209
|
+
def test_invalid_input_raises_error():
|
|
210
|
+
"""Invalid input raises ValueError."""
|
|
211
|
+
with pytest.raises(ValueError, match="cannot be None"):
|
|
212
|
+
validate_input(None)
|
|
213
|
+
|
|
214
|
+
# Or with exc_info for more complex checks
|
|
215
|
+
with pytest.raises(ValueError) as exc_info:
|
|
216
|
+
validate_input(None)
|
|
217
|
+
assert "cannot be None" in str(exc_info.value), f"Expected 'cannot be None' in error, got {exc_info.value}"
|
|
218
|
+
|
|
219
|
+
# Testing optional values - use explicit None checks
|
|
220
|
+
assert result.output_file is None, "No output file should be created"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Test Isolation
|
|
224
|
+
|
|
225
|
+
Each test must be independent. Never share state between tests.
|
|
226
|
+
|
|
227
|
+
```python
|
|
228
|
+
def test_operation(tmp_path):
|
|
229
|
+
"""Test operation with fresh data."""
|
|
230
|
+
input_file = tmp_path / "input.txt"
|
|
231
|
+
input_file.write_text("test data")
|
|
232
|
+
result = process_file(input_file)
|
|
233
|
+
assert result.success
|
|
234
|
+
|
|
235
|
+
# Use fixtures for setup/teardown
|
|
236
|
+
@pytest.fixture
|
|
237
|
+
def test_database():
|
|
238
|
+
"""Set up test database."""
|
|
239
|
+
db = create_test_db()
|
|
240
|
+
yield db
|
|
241
|
+
db.cleanup()
|
|
242
|
+
|
|
243
|
+
def test_with_database(test_database):
|
|
244
|
+
"""Test with isolated database."""
|
|
245
|
+
test_database.insert(record)
|
|
246
|
+
assert test_database.count() == 1
|
|
247
|
+
|
|
248
|
+
### Maintain Test Integrity
|
|
249
|
+
|
|
250
|
+
If a test fails, fix the root cause in the code or the test. Do not remove assertions, add empty try/catch blocks to hide errors, or add conditional logic to skip test cases. Never skip or disable failing tests. Tests must fail (not skip) when dependencies are missing.
|
|
251
|
+
|
|
252
|
+
### Parametrized Tests
|
|
253
|
+
|
|
254
|
+
Test multiple inputs efficiently:
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
@pytest.mark.parametrize("method,expected", [
|
|
258
|
+
("equals", True),
|
|
259
|
+
("contains", True),
|
|
260
|
+
("startsWith", True),
|
|
261
|
+
("invalid_method", False),
|
|
262
|
+
])
|
|
263
|
+
def test_method_validation(method, expected):
|
|
264
|
+
"""Test method name validation."""
|
|
265
|
+
result = is_valid_method(method)
|
|
266
|
+
assert result == expected
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Testing Time-Dependent Code
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
from unittest.mock import patch
|
|
273
|
+
from datetime import datetime
|
|
274
|
+
|
|
275
|
+
def test_timestamp_logic():
|
|
276
|
+
"""Test time-dependent logic with fixed time."""
|
|
277
|
+
fixed_time = datetime(2024, 1, 1, 12, 0, 0)
|
|
278
|
+
with patch("module.datetime") as mock_datetime:
|
|
279
|
+
mock_datetime.now.return_value = fixed_time
|
|
280
|
+
result = function_using_current_time()
|
|
281
|
+
assert result.timestamp == fixed_time
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Running Tests
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
# Run the full test suite
|
|
288
|
+
just test
|
|
289
|
+
|
|
290
|
+
# Run tests with coverage report
|
|
291
|
+
just cov
|
|
292
|
+
|
|
293
|
+
# Run a single test file
|
|
294
|
+
just test-one tests/unit/test_pipeline_preservation.py
|
|
295
|
+
|
|
296
|
+
# Verify the pure-Python fallback (without compiled C extension)
|
|
297
|
+
just test-fallback
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## PHI Protection
|
|
301
|
+
|
|
302
|
+
Never use real PHI in tests. Use the synthetic `signa_premier_file` fixture from
|
|
303
|
+
`tests/unit/conftest.py` or pydicom's built-in test files. Never commit test files
|
|
304
|
+
containing real patient data.
|
|
305
|
+
|
|
306
|
+
## Common Anti-patterns
|
|
307
|
+
|
|
308
|
+
Never use hardcoded paths like `Path("/tmp/test.dcm")`. Always use `tmp_path` for
|
|
309
|
+
temporary files. Never skip failing tests or remove assertions to make tests pass.
|
|
310
|
+
Tests must fail (not skip) when dependencies are missing. Do not share state between
|
|
311
|
+
tests using global variables. Do not comment out failing assertions or catch
|
|
312
|
+
exceptions to hide failures. Keep all dependencies in `pyproject.toml`. **Never
|
|
313
|
+
write bare assertions without messages** — every `assert` statement must include an
|
|
314
|
+
explanatory message with expected and actual values.
|