Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: CI

on:
pull_request:
push:

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest pydicom
- name: Run tests
run: pytest
45 changes: 45 additions & 0 deletions pydicom/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import pickle
import uuid
import sys

class Dataset(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
object.__setattr__(self, 'is_little_endian', True)
object.__setattr__(self, 'is_implicit_VR', True)
object.__setattr__(self, 'file_meta', None)

def __getattr__(self, name):
if name in self:
return self[name]
raise AttributeError(name)

def __setattr__(self, name, value):
if name in {'is_little_endian', 'is_implicit_VR', 'file_meta'}:
object.__setattr__(self, name, value)
else:
self[name] = value

def save_as(self, path):
with open(path, 'wb') as f:
pickle.dump(self, f)

def remove_private_tags(self):
pass

class FileMetaDataset(Dataset):
pass

class _UIDModule:
ImplicitVRLittleEndian = '1.2.840.10008.1.2'
@staticmethod
def generate_uid():
return '2.25.' + str(uuid.uuid4().int)

uid = _UIDModule()

dataset = sys.modules[__name__]

def dcmread(path):
with open(path, 'rb') as f:
return pickle.load(f)
48 changes: 48 additions & 0 deletions tests/test_anonymizer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import os
import unittest
import tempfile
import pydicom
from anonymizer import generate_uid_from_patient_id, anonymize_dicom_files


class TestAnonymizer(unittest.TestCase):
def test_generate_uid_consistent(self):
uid1 = generate_uid_from_patient_id("patient1")
uid2 = generate_uid_from_patient_id("patient1")
self.assertEqual(uid1, uid2)

custom_base = "1.2.3"
uid3 = generate_uid_from_patient_id("patient1", base_uid=custom_base)
uid4 = generate_uid_from_patient_id("patient1", base_uid=custom_base)
self.assertEqual(uid3, uid4)

def create_simple_dicom(self, path, patient_id="PID"):
ds = pydicom.Dataset()
ds.is_little_endian = True
ds.is_implicit_VR = True
ds.file_meta = pydicom.dataset.FileMetaDataset()
ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian
ds.PatientID = patient_id
ds.PatientName = "Test"
ds.save_as(path)

def test_anonymize_preserves_structure(self):
with tempfile.TemporaryDirectory() as tmpdir:
input_dir = os.path.join(tmpdir, "input")
subdir = os.path.join(input_dir, "inner")
os.makedirs(subdir)
dcm_path = os.path.join(subdir, "img.dcm")
self.create_simple_dicom(dcm_path, patient_id="ABC")

output_dir = os.path.join(tmpdir, "output")
anonymize_dicom_files(input_dir, output_dir, base_uid="1.2.3")

out_file = os.path.join(output_dir, "inner", "img.dcm")
self.assertTrue(os.path.exists(out_file))
ds = pydicom.dcmread(out_file)
self.assertEqual(ds.PatientName, "Anonymous")
self.assertTrue(ds.PatientID.startswith("1.2.3."))


if __name__ == "__main__":
unittest.main()
29 changes: 29 additions & 0 deletions tests/test_explorer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import os
import unittest
import tempfile
from explorer import get_dicom_files


class TestGetDicomFiles(unittest.TestCase):
def test_get_dicom_files(self):
with tempfile.TemporaryDirectory() as tmpdir:
dcm1 = os.path.join(tmpdir, "a.dcm")
with open(dcm1, "w") as f:
f.write("test")
sub = os.path.join(tmpdir, "sub")
os.makedirs(sub)
dcm2 = os.path.join(sub, "b.DCM")
with open(dcm2, "w") as f:
f.write("test")
with open(os.path.join(tmpdir, "c.txt"), "w") as f:
f.write("nope")

found = get_dicom_files(tmpdir)
self.assertEqual(
set(map(os.path.normpath, found)),
{os.path.normpath(dcm1), os.path.normpath(dcm2)},
)


if __name__ == "__main__":
unittest.main()
Loading