From 4b526bcf5f8270b3327ef453df007559c76b320c Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 8 Mar 2026 12:49:37 +0100 Subject: [PATCH 1/2] Enforce ruff/isort rules (I) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 13931d945..56ef74fbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -140,6 +140,7 @@ extend-select = [ "PIE", "PYI", "FLY", + "I", "UP", ] ignore = [ From 65638a429b3b8d762423a43c8412fe58feb10015 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 8 Mar 2026 12:50:46 +0100 Subject: [PATCH 2/2] Apply ruff/isort rule I001 Import block is un-sorted or un-formatted --- pynetdicom/__init__.py | 10 ++-- pynetdicom/_config.py | 2 +- pynetdicom/_handlers.py | 43 ++++++++------- pynetdicom/_version.py | 2 +- pynetdicom/acse.py | 8 +-- pynetdicom/ae.py | 32 +++++------ pynetdicom/apps/common.py | 2 +- pynetdicom/apps/echoscp/echoscp.py | 4 +- pynetdicom/apps/echoscu/echoscu.py | 6 +-- pynetdicom/apps/findscu/findscu.py | 10 ++-- pynetdicom/apps/getscu/getscu.py | 6 +-- pynetdicom/apps/movescu/movescu.py | 8 +-- pynetdicom/apps/qrscp/db.py | 11 ++-- pynetdicom/apps/qrscp/handlers.py | 3 +- pynetdicom/apps/qrscp/qrscp.py | 33 ++++++------ pynetdicom/apps/storescp/storescp.py | 6 +-- pynetdicom/apps/storescu/storescu.py | 8 +-- pynetdicom/association.py | 80 ++++++++++++++-------------- pynetdicom/dimse.py | 38 +++++++------ pynetdicom/dimse_messages.py | 18 +++---- pynetdicom/dimse_primitives.py | 8 +-- pynetdicom/dsutils.py | 6 +-- pynetdicom/dul.py | 14 ++--- pynetdicom/events.py | 12 ++--- pynetdicom/fsm.py | 16 +++--- pynetdicom/pdu.py | 18 +++---- pynetdicom/pdu_items.py | 16 +++--- pynetdicom/pdu_primitives.py | 15 +++--- pynetdicom/presentation.py | 4 +- pynetdicom/service_class.py | 38 ++++++------- pynetdicom/service_class_n.py | 6 +-- pynetdicom/sop_class.py | 2 +- pynetdicom/status.py | 6 +-- pynetdicom/transport.py | 12 ++--- pynetdicom/utils.py | 6 +-- 35 files changed, 253 insertions(+), 256 deletions(-) diff --git a/pynetdicom/__init__.py b/pynetdicom/__init__.py index 3462c9257..c8b046ebd 100644 --- a/pynetdicom/__init__.py +++ b/pynetdicom/__init__.py @@ -42,15 +42,13 @@ # Convenience imports # ruff: noqa: E402,F401 from pynetdicom import events as evt -from pynetdicom.ae import ApplicationEntity as AE -from pynetdicom.association import Association from pynetdicom._globals import ( ALL_TRANSFER_SYNTAXES, DEFAULT_TRANSFER_SYNTAXES, ) +from pynetdicom.ae import ApplicationEntity as AE +from pynetdicom.association import Association from pynetdicom.presentation import ( - build_context, - build_role, AllStoragePresentationContexts, ApplicationEventLoggingPresentationContexts, BasicWorklistManagementPresentationContexts, @@ -70,11 +68,13 @@ QueryRetrievePresentationContexts, RelevantPatientInformationPresentationContexts, RTMachineVerificationPresentationContexts, - StoragePresentationContexts, StorageCommitmentPresentationContexts, + StoragePresentationContexts, SubstanceAdministrationPresentationContexts, UnifiedProcedurePresentationContexts, VerificationPresentationContexts, + build_context, + build_role, ) from pynetdicom.sop_class import register_uid diff --git a/pynetdicom/_config.py b/pynetdicom/_config.py index 0bda84882..de44cfc1b 100644 --- a/pynetdicom/_config.py +++ b/pynetdicom/_config.py @@ -1,7 +1,7 @@ """pynetdicom configuration options""" -from typing import Any from collections.abc import Callable +from typing import Any from pynetdicom._validators import validate_ae, validate_ui diff --git a/pynetdicom/_handlers.py b/pynetdicom/_handlers.py index 2e32cd095..976af5fc4 100644 --- a/pynetdicom/_handlers.py +++ b/pynetdicom/_handlers.py @@ -1,54 +1,57 @@ """Standard logging event handlers.""" import logging -from struct import unpack, calcsize -from typing import TYPE_CHECKING, cast, Any -from collections.abc import Sequence, Iterator +from collections.abc import Iterator, Sequence +from struct import calcsize, unpack +from typing import TYPE_CHECKING, Any, cast from pydicom.dataset import Dataset from pydicom.uid import UID from pynetdicom.dimse_messages import ( - C_STORE_RQ, - C_STORE_RSP, + C_CANCEL_RQ, + C_ECHO_RQ, + C_ECHO_RSP, C_FIND_RQ, C_FIND_RSP, C_GET_RQ, C_GET_RSP, C_MOVE_RQ, C_MOVE_RSP, - C_ECHO_RQ, - C_ECHO_RSP, - C_CANCEL_RQ, - N_EVENT_REPORT_RQ, - N_EVENT_REPORT_RSP, - N_GET_RQ, - N_GET_RSP, - N_SET_RQ, - N_SET_RSP, + C_STORE_RQ, + C_STORE_RSP, N_ACTION_RQ, N_ACTION_RSP, N_CREATE_RQ, N_CREATE_RSP, N_DELETE_RQ, N_DELETE_RSP, + N_EVENT_REPORT_RQ, + N_EVENT_REPORT_RSP, + N_GET_RQ, + N_GET_RSP, + N_SET_RQ, + N_SET_RSP, ) from pynetdicom.pdu import ( - A_ASSOCIATE_RQ, + A_ABORT_RQ, A_ASSOCIATE_AC, A_ASSOCIATE_RJ, - A_RELEASE_RQ, + A_ASSOCIATE_RQ, A_RELEASE_RP, - A_ABORT_RQ, + A_RELEASE_RQ, P_DATA_TF, ) from pynetdicom.sop_class import uid_to_service_class -from pynetdicom.utils import pretty_bytes, decode_bytes +from pynetdicom.utils import decode_bytes, pretty_bytes if TYPE_CHECKING: # pragma: no cover from pynetdicom.events import Event - from pynetdicom.pdu_items import UserInformationItem, UserIdentitySubItemRQ - from pynetdicom.pdu_items import SOPClassCommonExtendedNegotiation + from pynetdicom.pdu_items import ( + SOPClassCommonExtendedNegotiation, + UserIdentitySubItemRQ, + UserInformationItem, + ) LOGGER = logging.getLogger(__name__) diff --git a/pynetdicom/_version.py b/pynetdicom/_version.py index 31dedc2eb..be0638655 100644 --- a/pynetdicom/_version.py +++ b/pynetdicom/_version.py @@ -1,7 +1,7 @@ """Version information for pynetdicom based on PEP396 and 440""" -from importlib.metadata import version import re +from importlib.metadata import version # pynetdicom version __version__: str = version("pynetdicom") diff --git a/pynetdicom/acse.py b/pynetdicom/acse.py index 1f791bf28..3b87b5acf 100644 --- a/pynetdicom/acse.py +++ b/pynetdicom/acse.py @@ -5,21 +5,21 @@ from pydicom.uid import UID -from pynetdicom import evt, _config +from pynetdicom import _config, evt from pynetdicom._globals import APPLICATION_CONTEXT_NAME from pynetdicom.pdu_primitives import ( - A_ASSOCIATE, - A_RELEASE, A_ABORT, + A_ASSOCIATE, A_P_ABORT, + A_RELEASE, AsynchronousOperationsWindowNegotiation, SOPClassCommonExtendedNegotiation, SOPClassExtendedNegotiation, UserIdentityNegotiation, ) from pynetdicom.presentation import ( - negotiate_as_requestor, negotiate_as_acceptor, + negotiate_as_requestor, negotiate_unrestricted, ) diff --git a/pynetdicom/ae.py b/pynetdicom/ae.py index 74fe07578..625517c80 100644 --- a/pynetdicom/ae.py +++ b/pynetdicom/ae.py @@ -2,39 +2,39 @@ The main user class, represents a DICOM Application Entity """ -from copy import deepcopy -from datetime import datetime import logging import socket -from ssl import SSLContext import threading +import warnings +from collections.abc import Sequence +from copy import deepcopy +from datetime import datetime +from ssl import SSLContext from typing import ( - cast, - TypeVar, Any, + TypeVar, + cast, ) -from collections.abc import Sequence -import warnings from pydicom.uid import UID from pynetdicom import _config +from pynetdicom._globals import ( + DEFAULT_MAX_LENGTH, + DEFAULT_TRANSFER_SYNTAXES, + MODE_REQUESTOR, +) from pynetdicom.association import Association from pynetdicom.events import EventHandlerType -from pynetdicom.presentation import PresentationContext from pynetdicom.pdu_primitives import _UI +from pynetdicom.presentation import PresentationContext from pynetdicom.transport import ( - AssociationSocket, + AddressInformation, AssociationServer, + AssociationSocket, ThreadedAssociationServer, - AddressInformation, -) -from pynetdicom.utils import make_target, set_ae, decode_bytes, set_uid -from pynetdicom._globals import ( - MODE_REQUESTOR, - DEFAULT_MAX_LENGTH, - DEFAULT_TRANSFER_SYNTAXES, ) +from pynetdicom.utils import decode_bytes, make_target, set_ae, set_uid LOGGER = logging.getLogger(__name__) diff --git a/pynetdicom/apps/common.py b/pynetdicom/apps/common.py index 4ebae4f85..d09fbc2a0 100644 --- a/pynetdicom/apps/common.py +++ b/pynetdicom/apps/common.py @@ -6,7 +6,7 @@ from struct import pack from pydicom import dcmread -from pydicom.datadict import tag_for_keyword, repeater_has_keyword, get_entry +from pydicom.datadict import get_entry, repeater_has_keyword, tag_for_keyword from pydicom.dataset import Dataset from pydicom.tag import Tag from pydicom.uid import DeflatedExplicitVRLittleEndian diff --git a/pynetdicom/apps/echoscp/echoscp.py b/pynetdicom/apps/echoscp/echoscp.py index aebd57354..33098096b 100755 --- a/pynetdicom/apps/echoscp/echoscp.py +++ b/pynetdicom/apps/echoscp/echoscp.py @@ -5,14 +5,14 @@ import sys from pydicom.uid import ( + ExplicitVRBigEndian, ExplicitVRLittleEndian, ImplicitVRLittleEndian, - ExplicitVRBigEndian, ) from pynetdicom import AE, evt -from pynetdicom.apps.common import setup_logging from pynetdicom._globals import ALL_TRANSFER_SYNTAXES, DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import setup_logging from pynetdicom.sop_class import Verification __version__ = "0.7.0" diff --git a/pynetdicom/apps/echoscu/echoscu.py b/pynetdicom/apps/echoscu/echoscu.py index 1bce9ba6c..624c13651 100755 --- a/pynetdicom/apps/echoscu/echoscu.py +++ b/pynetdicom/apps/echoscu/echoscu.py @@ -9,15 +9,15 @@ import sys from pydicom.uid import ( + DeflatedExplicitVRLittleEndian, + ExplicitVRBigEndian, ExplicitVRLittleEndian, ImplicitVRLittleEndian, - ExplicitVRBigEndian, - DeflatedExplicitVRLittleEndian, ) from pynetdicom import AE -from pynetdicom.apps.common import setup_logging from pynetdicom._globals import DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import setup_logging from pynetdicom.sop_class import Verification __version__ = "0.7.0" diff --git a/pynetdicom/apps/findscu/findscu.py b/pynetdicom/apps/findscu/findscu.py index 47df32e45..c3fab29fc 100755 --- a/pynetdicom/apps/findscu/findscu.py +++ b/pynetdicom/apps/findscu/findscu.py @@ -13,22 +13,22 @@ from pynetdicom import ( AE, - BasicWorklistManagementPresentationContexts, - QueryRetrievePresentationContexts, PYNETDICOM_IMPLEMENTATION_UID, PYNETDICOM_IMPLEMENTATION_VERSION, PYNETDICOM_UID_PREFIX, + BasicWorklistManagementPresentationContexts, + QueryRetrievePresentationContexts, UnifiedProcedurePresentationContexts, ) -from pynetdicom.apps.common import create_dataset, setup_logging from pynetdicom._globals import DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import create_dataset, setup_logging from pynetdicom.pdu_primitives import SOPClassExtendedNegotiation from pynetdicom.sop_class import ( ModalityWorklistInformationFind, - UnifiedProcedureStepPull, PatientRootQueryRetrieveInformationModelFind, - StudyRootQueryRetrieveInformationModelFind, PatientStudyOnlyQueryRetrieveInformationModelFind, + StudyRootQueryRetrieveInformationModelFind, + UnifiedProcedureStepPull, ) __version__ = "0.2.0" diff --git a/pynetdicom/apps/getscu/getscu.py b/pynetdicom/apps/getscu/getscu.py index 9ea3c3c98..8bf59d7c0 100755 --- a/pynetdicom/apps/getscu/getscu.py +++ b/pynetdicom/apps/getscu/getscu.py @@ -9,17 +9,17 @@ from pynetdicom import ( AE, + StoragePresentationContexts, build_role, evt, - StoragePresentationContexts, ) -from pynetdicom.apps.common import setup_logging, create_dataset, handle_store from pynetdicom._globals import DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import create_dataset, handle_store, setup_logging from pynetdicom.pdu_primitives import SOPClassExtendedNegotiation from pynetdicom.sop_class import ( PatientRootQueryRetrieveInformationModelGet, - StudyRootQueryRetrieveInformationModelGet, PatientStudyOnlyQueryRetrieveInformationModelGet, + StudyRootQueryRetrieveInformationModelGet, ) __version__ = "0.4.0" diff --git a/pynetdicom/apps/movescu/movescu.py b/pynetdicom/apps/movescu/movescu.py index c0396b48e..7043d9be9 100755 --- a/pynetdicom/apps/movescu/movescu.py +++ b/pynetdicom/apps/movescu/movescu.py @@ -9,17 +9,17 @@ from pynetdicom import ( AE, - evt, - QueryRetrievePresentationContexts, AllStoragePresentationContexts, + QueryRetrievePresentationContexts, + evt, ) -from pynetdicom.apps.common import setup_logging, create_dataset, handle_store from pynetdicom._globals import ALL_TRANSFER_SYNTAXES, DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import create_dataset, handle_store, setup_logging from pynetdicom.pdu_primitives import SOPClassExtendedNegotiation from pynetdicom.sop_class import ( PatientRootQueryRetrieveInformationModelMove, - StudyRootQueryRetrieveInformationModelMove, PatientStudyOnlyQueryRetrieveInformationModelMove, + StudyRootQueryRetrieveInformationModelMove, ) __version__ = "0.4.0" diff --git a/pynetdicom/apps/qrscp/db.py b/pynetdicom/apps/qrscp/db.py index 72d71a5a0..a95c12904 100644 --- a/pynetdicom/apps/qrscp/db.py +++ b/pynetdicom/apps/qrscp/db.py @@ -17,26 +17,25 @@ * Required keys shall not be in a C-GET or C-MOVE request's Identifier """ -from collections import OrderedDict import sys +from collections import OrderedDict try: - from sqlalchemy import create_engine, Column, ForeignKey, Integer, String + from sqlalchemy import Column, ForeignKey, Integer, String, create_engine except ImportError: sys.exit("qrscp requires the sqlalchemy package") -from sqlalchemy.orm import declarative_base - from pydicom.dataset import Dataset +from sqlalchemy.orm import declarative_base from pynetdicom import build_context from pynetdicom.sop_class import ( PatientRootQueryRetrieveInformationModelFind, - PatientRootQueryRetrieveInformationModelMove, PatientRootQueryRetrieveInformationModelGet, + PatientRootQueryRetrieveInformationModelMove, StudyRootQueryRetrieveInformationModelFind, - StudyRootQueryRetrieveInformationModelMove, StudyRootQueryRetrieveInformationModelGet, + StudyRootQueryRetrieveInformationModelMove, ) diff --git a/pynetdicom/apps/qrscp/handlers.py b/pynetdicom/apps/qrscp/handlers.py index 5874a411a..3a89f4cb3 100644 --- a/pynetdicom/apps/qrscp/handlers.py +++ b/pynetdicom/apps/qrscp/handlers.py @@ -3,11 +3,10 @@ import os from pydicom import dcmread - from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from pynetdicom.apps.qrscp.db import add_instance, search, InvalidIdentifier, Instance +from pynetdicom.apps.qrscp.db import Instance, InvalidIdentifier, add_instance, search def handle_echo(event, cli_config, logger): diff --git a/pynetdicom/apps/qrscp/qrscp.py b/pynetdicom/apps/qrscp/qrscp.py index 847e4e1cc..c0d029aa8 100755 --- a/pynetdicom/apps/qrscp/qrscp.py +++ b/pynetdicom/apps/qrscp/qrscp.py @@ -2,9 +2,9 @@ """A Verification, Storage and Query/Retrieve SCP application.""" import argparse -from configparser import ConfigParser import os import sys +from configparser import ConfigParser import pydicom.config from sqlalchemy import create_engine @@ -12,35 +12,34 @@ from pynetdicom import ( AE, - _config, - evt, - _handlers, - AllStoragePresentationContexts, ALL_TRANSFER_SYNTAXES, + AllStoragePresentationContexts, UnifiedProcedurePresentationContexts, + _config, + _handlers, + evt, ) from pynetdicom.apps.common import setup_logging +from pynetdicom.apps.qrscp import db +from pynetdicom.apps.qrscp.handlers import ( + handle_echo, + handle_find, + handle_get, + handle_move, + handle_store, +) from pynetdicom.sop_class import ( - Verification, ModalityWorklistInformationFind, PatientRootQueryRetrieveInformationModelFind, - PatientRootQueryRetrieveInformationModelMove, PatientRootQueryRetrieveInformationModelGet, + PatientRootQueryRetrieveInformationModelMove, StudyRootQueryRetrieveInformationModelFind, - StudyRootQueryRetrieveInformationModelMove, StudyRootQueryRetrieveInformationModelGet, + StudyRootQueryRetrieveInformationModelMove, + Verification, ) from pynetdicom.utils import set_ae -from pynetdicom.apps.qrscp.handlers import ( - handle_echo, - handle_find, - handle_get, - handle_move, - handle_store, -) -from pynetdicom.apps.qrscp import db - # Use `None` for empty values pydicom.config.use_none_as_empty_text_VR_value = True # Don't log identifiers diff --git a/pynetdicom/apps/storescp/storescp.py b/pynetdicom/apps/storescp/storescp.py index 3224f48f2..ce31ca181 100755 --- a/pynetdicom/apps/storescp/storescp.py +++ b/pynetdicom/apps/storescp/storescp.py @@ -8,19 +8,19 @@ import sys from pydicom.uid import ( + ExplicitVRBigEndian, ExplicitVRLittleEndian, ImplicitVRLittleEndian, - ExplicitVRBigEndian, ) from pynetdicom import ( AE, - evt, AllStoragePresentationContexts, VerificationPresentationContexts, + evt, ) -from pynetdicom.apps.common import setup_logging, handle_store from pynetdicom._globals import ALL_TRANSFER_SYNTAXES, DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import handle_store, setup_logging __version__ = "0.6.0" diff --git a/pynetdicom/apps/storescu/storescu.py b/pynetdicom/apps/storescu/storescu.py index ff912bb7b..f20759f1c 100755 --- a/pynetdicom/apps/storescu/storescu.py +++ b/pynetdicom/apps/storescu/storescu.py @@ -6,21 +6,21 @@ import argparse import os -from pathlib import Path import sys +from pathlib import Path from pydicom import dcmread from pydicom.errors import InvalidDicomError from pydicom.uid import ( + DeflatedExplicitVRLittleEndian, + ExplicitVRBigEndian, ExplicitVRLittleEndian, ImplicitVRLittleEndian, - ExplicitVRBigEndian, - DeflatedExplicitVRLittleEndian, ) from pynetdicom import AE, StoragePresentationContexts -from pynetdicom.apps.common import setup_logging, get_files from pynetdicom._globals import DEFAULT_MAX_LENGTH +from pynetdicom.apps.common import get_files, setup_logging __version__ = "0.3.0" diff --git a/pynetdicom/association.py b/pynetdicom/association.py index 415fa2a51..5bd35c16d 100644 --- a/pynetdicom/association.py +++ b/pynetdicom/association.py @@ -1,87 +1,87 @@ """Defines the Association class which handles associating with peers.""" -from io import BytesIO import logging import os -from pathlib import Path import threading import time +import warnings +from collections.abc import Callable, Iterator +from io import BytesIO +from pathlib import Path from typing import ( - Any, TYPE_CHECKING, + Any, cast, ) -from collections.abc import Callable, Iterator -import warnings from pydicom import dcmread from pydicom.dataset import Dataset from pydicom.tag import BaseTag -from pydicom.uid import UID, ImplicitVRLittleEndian, ExplicitVRBigEndian +from pydicom.uid import UID, ExplicitVRBigEndian, ImplicitVRLittleEndian -from pynetdicom.acse import ACSE from pynetdicom import _config, evt +from pynetdicom._globals import ( + DEFAULT_MAX_LENGTH, + MODE_ACCEPTOR, + MODE_REQUESTOR, + STATUS_CANCEL, + STATUS_FAILURE, + STATUS_PENDING, + STATUS_SUCCESS, + STATUS_WARNING, +) +from pynetdicom._handlers import ( + standard_dimse_recv_handler, + standard_dimse_sent_handler, + standard_pdu_recv_handler, + standard_pdu_sent_handler, +) +from pynetdicom.acse import ACSE from pynetdicom.dimse import DIMSEServiceProvider from pynetdicom.dimse_primitives import ( + C_CANCEL, C_ECHO, + C_FIND, + C_GET, C_MOVE, C_STORE, - C_GET, - C_FIND, - C_CANCEL, + N_ACTION, + N_CREATE, + N_DELETE, N_EVENT_REPORT, N_GET, N_SET, - N_CREATE, - N_ACTION, - N_DELETE, DimseServiceType, ) from pynetdicom.dsutils import decode, encode, pretty_dataset, split_dataset from pynetdicom.dul import DULServiceProvider -from pynetdicom._globals import ( - MODE_REQUESTOR, - MODE_ACCEPTOR, - DEFAULT_MAX_LENGTH, - STATUS_WARNING, - STATUS_SUCCESS, - STATUS_CANCEL, - STATUS_PENDING, - STATUS_FAILURE, -) -from pynetdicom._handlers import ( - standard_dimse_recv_handler, - standard_dimse_sent_handler, - standard_pdu_recv_handler, - standard_pdu_sent_handler, -) from pynetdicom.pdu_primitives import ( - UserIdentityNegotiation, - MaximumLengthNotification, + _UI, + A_ASSOCIATE, + AsynchronousOperationsWindowNegotiation, ImplementationClassUIDNotification, ImplementationVersionNameNotification, - AsynchronousOperationsWindowNegotiation, - SOPClassExtendedNegotiation, - SOPClassCommonExtendedNegotiation, + MaximumLengthNotification, SCP_SCU_RoleSelectionNegotiation, - A_ASSOCIATE, - _UI, + SOPClassCommonExtendedNegotiation, + SOPClassExtendedNegotiation, + UserIdentityNegotiation, _UITypes, ) from pynetdicom.presentation import PresentationContext from pynetdicom.sop_class import ( # type: ignore RepositoryQuery, - uid_to_service_class, + UnifiedProcedureStepEvent, UnifiedProcedureStepPull, UnifiedProcedureStepPush, - UnifiedProcedureStepEvent, UnifiedProcedureStepQuery, UnifiedProcedureStepWatch, Verification, + uid_to_service_class, ) -from pynetdicom.status import code_to_category, STORAGE_SERVICE_CLASS_STATUS +from pynetdicom.status import STORAGE_SERVICE_CLASS_STATUS, code_to_category from pynetdicom.transport import AddressInformation -from pynetdicom.utils import make_target, set_timer_resolution, set_ae, decode_bytes +from pynetdicom.utils import decode_bytes, make_target, set_ae, set_timer_resolution if TYPE_CHECKING: # pragma: no cover from pynetdicom.ae import ApplicationEntity diff --git a/pynetdicom/dimse.py b/pynetdicom/dimse.py index c8d9f7c1c..6ae1533a8 100644 --- a/pynetdicom/dimse.py +++ b/pynetdicom/dimse.py @@ -2,54 +2,52 @@ Implementation of the DIMSE service provider. """ -from io import BytesIO import logging import queue import threading +from io import BytesIO from typing import TYPE_CHECKING, cast from pynetdicom import evt - from pynetdicom.dimse_messages import ( - C_STORE_RQ, - C_STORE_RSP, + C_CANCEL_RQ, + C_ECHO_RQ, + C_ECHO_RSP, C_FIND_RQ, C_FIND_RSP, C_GET_RQ, C_GET_RSP, C_MOVE_RQ, C_MOVE_RSP, - C_ECHO_RQ, - C_ECHO_RSP, - C_CANCEL_RQ, - N_EVENT_REPORT_RQ, - N_GET_RQ, - N_SET_RQ, + C_STORE_RQ, + C_STORE_RSP, N_ACTION_RQ, + N_ACTION_RSP, N_CREATE_RQ, + N_CREATE_RSP, N_DELETE_RQ, + N_DELETE_RSP, + N_EVENT_REPORT_RQ, N_EVENT_REPORT_RSP, + N_GET_RQ, N_GET_RSP, + N_SET_RQ, N_SET_RSP, - N_ACTION_RSP, - N_CREATE_RSP, - N_DELETE_RSP, DIMSEMessage, ) - from pynetdicom.dimse_primitives import ( - C_STORE, + C_CANCEL, + C_ECHO, C_FIND, C_GET, C_MOVE, - C_ECHO, - C_CANCEL, - N_EVENT_REPORT, - N_GET, - N_SET, + C_STORE, N_ACTION, N_CREATE, N_DELETE, + N_EVENT_REPORT, + N_GET, + N_SET, DimsePrimitiveType, DimseServiceType, ) diff --git a/pynetdicom/dimse_messages.py b/pynetdicom/dimse_messages.py index 5d5b161ba..c5544be74 100644 --- a/pynetdicom/dimse_messages.py +++ b/pynetdicom/dimse_messages.py @@ -1,12 +1,12 @@ """Define the DIMSE Message classes.""" -from io import BytesIO import logging +from collections.abc import Iterator +from io import BytesIO from math import ceil from pathlib import Path from tempfile import NamedTemporaryFile from typing import TYPE_CHECKING, cast -from collections.abc import Iterator from pydicom.dataset import Dataset from pydicom.filewriter import write_file_meta_info @@ -15,21 +15,21 @@ from pynetdicom import _config from pynetdicom.dimse_primitives import ( - C_STORE, + C_CANCEL, + C_ECHO, C_FIND, C_GET, C_MOVE, - C_ECHO, - C_CANCEL, - N_EVENT_REPORT, - N_GET, - N_SET, + C_STORE, N_ACTION, N_CREATE, N_DELETE, + N_EVENT_REPORT, + N_GET, + N_SET, DimsePrimitiveType, ) -from pynetdicom.dsutils import encode, decode, create_file_meta +from pynetdicom.dsutils import create_file_meta, decode, encode from pynetdicom.pdu_primitives import P_DATA if TYPE_CHECKING: # pragma: no cover diff --git a/pynetdicom/dimse_primitives.py b/pynetdicom/dimse_primitives.py index 77ed79cc0..e89021ed7 100644 --- a/pynetdicom/dimse_primitives.py +++ b/pynetdicom/dimse_primitives.py @@ -6,18 +6,18 @@ in order for the DIMSE messages/primitives to be created correctly. """ +import logging +import warnings from collections.abc import Sequence from io import BytesIO -import logging from pathlib import Path from typing import TYPE_CHECKING, TypeAlias -import warnings -from pydicom.tag import Tag, BaseTag +from pydicom.tag import BaseTag, Tag from pydicom.uid import UID from pynetdicom._globals import OptionalUIDType -from pynetdicom.utils import set_ae, decode_bytes, set_uid +from pynetdicom.utils import decode_bytes, set_ae, set_uid if TYPE_CHECKING: # pragma: no cover from io import BufferedWriter diff --git a/pynetdicom/dsutils.py b/pynetdicom/dsutils.py index 965fa421c..fa2d72a05 100644 --- a/pynetdicom/dsutils.py +++ b/pynetdicom/dsutils.py @@ -1,13 +1,13 @@ """DICOM dataset utility functions.""" -from io import BytesIO import logging -from pathlib import Path import zlib +from io import BytesIO +from pathlib import Path from pydicom import Dataset -from pydicom.dataset import FileMetaDataset from pydicom.dataelem import DataElement +from pydicom.dataset import FileMetaDataset from pydicom.filebase import DicomBytesIO from pydicom.filereader import read_dataset, read_preamble from pydicom.filewriter import write_dataset, write_file_meta_info diff --git a/pynetdicom/dul.py b/pynetdicom/dul.py index a5f03b0db..b7699ea2f 100644 --- a/pynetdicom/dul.py +++ b/pynetdicom/dul.py @@ -5,27 +5,27 @@ import logging import queue import struct -from threading import Thread import time +from threading import Thread from typing import TYPE_CHECKING, cast from pynetdicom import evt from pynetdicom.fsm import StateMachine from pynetdicom.pdu import ( - A_ASSOCIATE_RQ, + A_ABORT_RQ, A_ASSOCIATE_AC, A_ASSOCIATE_RJ, - P_DATA_TF, - A_RELEASE_RQ, + A_ASSOCIATE_RQ, A_RELEASE_RP, - A_ABORT_RQ, + A_RELEASE_RQ, + P_DATA_TF, _PDUType, ) from pynetdicom.pdu_primitives import ( - A_ASSOCIATE, - A_RELEASE, A_ABORT, + A_ASSOCIATE, A_P_ABORT, + A_RELEASE, P_DATA, _PDUPrimitiveType, ) diff --git a/pynetdicom/events.py b/pynetdicom/events.py index e8d8c83ee..a7d54e5d9 100644 --- a/pynetdicom/events.py +++ b/pynetdicom/events.py @@ -2,22 +2,22 @@ the state machine events. """ -from datetime import datetime -from io import BytesIO import inspect import logging -from pathlib import Path import sys -from typing import Any, NamedTuple, TYPE_CHECKING, cast, TypeAlias from collections.abc import Callable, Iterator +from datetime import datetime +from io import BytesIO +from pathlib import Path +from typing import TYPE_CHECKING, Any, NamedTuple, TypeAlias, cast from pydicom.dataset import Dataset, FileMetaDataset -from pynetdicom.dimse_primitives import C_STORE from pydicom.filereader import dcmread from pydicom.tag import BaseTag from pydicom.uid import UID -from pynetdicom.dsutils import decode, create_file_meta, encode_file_meta +from pynetdicom.dimse_primitives import C_STORE +from pynetdicom.dsutils import create_file_meta, decode, encode_file_meta if TYPE_CHECKING: # pragma: no cover from pynetdicom.association import Association diff --git a/pynetdicom/fsm.py b/pynetdicom/fsm.py index 5a182a9fa..695d9ae11 100644 --- a/pynetdicom/fsm.py +++ b/pynetdicom/fsm.py @@ -8,21 +8,21 @@ from pynetdicom import evt from pynetdicom.pdu import ( - A_ASSOCIATE_RQ, - A_ASSOCIATE_RJ, + A_ABORT_RQ, A_ASSOCIATE_AC, - P_DATA_TF, - A_RELEASE_RQ, + A_ASSOCIATE_RJ, + A_ASSOCIATE_RQ, A_RELEASE_RP, - A_ABORT_RQ, + A_RELEASE_RQ, + P_DATA_TF, ) -from pynetdicom.pdu_primitives import A_P_ABORT, A_ABORT -from pynetdicom.transport import T_CONNECT, AssociationSocket, AddressInformation +from pynetdicom.pdu_primitives import A_ABORT, A_P_ABORT +from pynetdicom.transport import T_CONNECT, AddressInformation, AssociationSocket if TYPE_CHECKING: # pragma: no cover from pynetdicom.dul import DULServiceProvider + from pynetdicom.pdu_primitives import A_ASSOCIATE, A_RELEASE, P_DATA from pynetdicom.transport import AssociationSocket - from pynetdicom.pdu_primitives import A_ASSOCIATE, P_DATA, A_RELEASE LOGGER = logging.getLogger(__name__) diff --git a/pynetdicom/pdu.py b/pynetdicom/pdu.py index cf66c6ab2..ac4ee0adc 100644 --- a/pynetdicom/pdu.py +++ b/pynetdicom/pdu.py @@ -20,31 +20,31 @@ """ import logging +from collections.abc import Callable, Iterator from struct import Struct -from typing import Any, TYPE_CHECKING, cast, TypeAlias -from collections.abc import Iterator, Callable +from typing import TYPE_CHECKING, Any, TypeAlias, cast from pydicom.uid import UID from pynetdicom.pdu_items import ( + PDU_ITEM_TYPES, ApplicationContextItem, - PresentationContextItemRQ, + PDUItem, PresentationContextItemAC, - UserInformationItem, + PresentationContextItemRQ, PresentationDataValueItem, - PDU_ITEM_TYPES, + UserInformationItem, _PDUItemType, - PDUItem, ) from pynetdicom.utils import decode_bytes, set_ae if TYPE_CHECKING: # pragma: no cover from pynetdicom.pdu_primitives import ( - A_ASSOCIATE, - P_DATA, - A_RELEASE, A_ABORT, + A_ASSOCIATE, A_P_ABORT, + A_RELEASE, + P_DATA, ) diff --git a/pynetdicom/pdu_items.py b/pynetdicom/pdu_items.py index d23ddece6..cfefd8bbb 100644 --- a/pynetdicom/pdu_items.py +++ b/pynetdicom/pdu_items.py @@ -41,26 +41,26 @@ """ import logging +from collections.abc import Callable, Iterator from struct import Struct -from typing import Any, TYPE_CHECKING, cast, TypeAlias -from collections.abc import Iterator, Callable +from typing import TYPE_CHECKING, Any, TypeAlias, cast from pydicom.uid import UID from pynetdicom._globals import OptionalUIDType from pynetdicom.presentation import PresentationContext -from pynetdicom.utils import validate_uid, decode_bytes, set_ae, set_uid +from pynetdicom.utils import decode_bytes, set_ae, set_uid, validate_uid if TYPE_CHECKING: # pragma: no cover from pynetdicom.pdu_primitives import ( - MaximumLengthNotification, - ImplementationVersionNameNotification, + AsynchronousOperationsWindowNegotiation, ImplementationClassUIDNotification, - SOPClassExtendedNegotiation, - SOPClassCommonExtendedNegotiation, + ImplementationVersionNameNotification, + MaximumLengthNotification, SCP_SCU_RoleSelectionNegotiation, + SOPClassCommonExtendedNegotiation, + SOPClassExtendedNegotiation, UserIdentityNegotiation, - AsynchronousOperationsWindowNegotiation, _UserInformationPrimitiveType, ) diff --git a/pynetdicom/pdu_primitives.py b/pynetdicom/pdu_primitives.py index 8fa642b42..fac847dec 100644 --- a/pynetdicom/pdu_primitives.py +++ b/pynetdicom/pdu_primitives.py @@ -3,25 +3,24 @@ """ import logging -from typing import cast, TypeAlias, TYPE_CHECKING +from typing import TYPE_CHECKING, TypeAlias, cast from pydicom.uid import UID -from pynetdicom._globals import OptionalUIDType +from pynetdicom._globals import DEFAULT_MAX_LENGTH, OptionalUIDType from pynetdicom.pdu_items import ( - MaximumLengthSubItem, + AsynchronousOperationsWindowSubItem, ImplementationClassUIDSubItem, ImplementationVersionNameSubItem, - AsynchronousOperationsWindowSubItem, + MaximumLengthSubItem, SCP_SCU_RoleSelectionSubItem, - SOPClassExtendedNegotiationSubItem, SOPClassCommonExtendedNegotiationSubItem, - UserIdentitySubItemRQ, + SOPClassExtendedNegotiationSubItem, UserIdentitySubItemAC, + UserIdentitySubItemRQ, ) from pynetdicom.presentation import PresentationContext -from pynetdicom.utils import validate_uid, decode_bytes, set_ae, set_uid -from pynetdicom._globals import DEFAULT_MAX_LENGTH +from pynetdicom.utils import decode_bytes, set_ae, set_uid, validate_uid if TYPE_CHECKING: # pragma: no cover from pynetdicom.transport import AddressInformation diff --git a/pynetdicom/presentation.py b/pynetdicom/presentation.py index 2bb889af7..16ad663a3 100644 --- a/pynetdicom/presentation.py +++ b/pynetdicom/presentation.py @@ -5,8 +5,8 @@ from pydicom.uid import UID -from pynetdicom._globals import DEFAULT_TRANSFER_SYNTAXES from pynetdicom import sop_class as SOP_CLASS_MODULE +from pynetdicom._globals import DEFAULT_TRANSFER_SYNTAXES from pynetdicom.sop_class import ( _APPLICATION_EVENT_CLASSES, _BASIC_WORKLIST_CLASSES, @@ -31,7 +31,7 @@ _UNIFIED_PROCEDURE_STEP_CLASSES, _VERIFICATION_CLASSES, ) -from pynetdicom.utils import validate_uid, set_uid +from pynetdicom.utils import set_uid, validate_uid if TYPE_CHECKING: # pragma: no cover from pynetdicom.pdu_primitives import SCP_SCU_RoleSelectionNegotiation diff --git a/pynetdicom/service_class.py b/pynetdicom/service_class.py index 1df54a067..5e6d1258c 100644 --- a/pynetdicom/service_class.py +++ b/pynetdicom/service_class.py @@ -1,57 +1,57 @@ """Implements the supported Service Classes.""" -from io import BytesIO import logging import os import sys import traceback +from collections.abc import Iterator, Sequence +from io import BytesIO from types import TracebackType from typing import ( TYPE_CHECKING, - cast, Any, TypeVar, + cast, ) -from collections.abc import Iterator, Sequence from pydicom.dataset import Dataset from pydicom.tag import Tag -from pynetdicom import evt, _config -from pynetdicom.dsutils import decode, encode, pretty_dataset +from pynetdicom import _config, evt +from pynetdicom._globals import ( + STATUS_CANCEL, + STATUS_FAILURE, + STATUS_PENDING, + STATUS_SUCCESS, + STATUS_WARNING, +) from pynetdicom.dimse_primitives import ( - C_STORE, C_ECHO, - C_MOVE, - C_GET, C_FIND, + C_GET, + C_MOVE, + C_STORE, N_ACTION, N_CREATE, N_DELETE, N_EVENT_REPORT, N_GET, N_SET, - DimseServiceType, DIMSEPrimitive, + DimseServiceType, ) -from pynetdicom._globals import ( - STATUS_FAILURE, - STATUS_SUCCESS, - STATUS_WARNING, - STATUS_PENDING, - STATUS_CANCEL, -) +from pynetdicom.dsutils import decode, encode, pretty_dataset from pynetdicom.status import ( - StatusDictType, GENERAL_STATUS, + NON_PATIENT_SERVICE_CLASS_STATUS, QR_FIND_SERVICE_CLASS_STATUS, QR_GET_SERVICE_CLASS_STATUS, QR_MOVE_SERVICE_CLASS_STATUS, - NON_PATIENT_SERVICE_CLASS_STATUS, RELEVANT_PATIENT_SERVICE_CLASS_STATUS, - SUBSTANCE_ADMINISTRATION_SERVICE_CLASS_STATUS, STORAGE_SERVICE_CLASS_STATUS, + SUBSTANCE_ADMINISTRATION_SERVICE_CLASS_STATUS, VERIFICATION_SERVICE_CLASS_STATUS, + StatusDictType, ) if TYPE_CHECKING: # pragma: no cover diff --git a/pynetdicom/service_class_n.py b/pynetdicom/service_class_n.py index fccb11453..d996b1770 100644 --- a/pynetdicom/service_class_n.py +++ b/pynetdicom/service_class_n.py @@ -4,24 +4,24 @@ from typing import TYPE_CHECKING from pynetdicom.dimse_primitives import ( + C_FIND, N_ACTION, N_CREATE, N_DELETE, N_EVENT_REPORT, N_GET, N_SET, - C_FIND, ) from pynetdicom.service_class import ServiceClass from pynetdicom.status import ( - GENERAL_STATUS, APPLICATION_EVENT_LOGGING_SERVICE_CLASS_STATUS, + GENERAL_STATUS, MEDIA_CREATION_MANAGEMENT_SERVICE_CLASS_STATUS, PRINT_JOB_MANAGEMENT_SERVICE_CLASS_STATUS, PROCEDURE_STEP_STATUS, + RT_MACHINE_VERIFICATION_SERVICE_CLASS_STATUS, STORAGE_COMMITMENT_SERVICE_CLASS_STATUS, STORAGE_MANAGEMENT_SERVICE_CLASS_STATUS, - RT_MACHINE_VERIFICATION_SERVICE_CLASS_STATUS, UNIFIED_PROCEDURE_STEP_SERVICE_CLASS_STATUS, ) diff --git a/pynetdicom/sop_class.py b/pynetdicom/sop_class.py index e4a50c526..65eac78ce 100644 --- a/pynetdicom/sop_class.py +++ b/pynetdicom/sop_class.py @@ -1,9 +1,9 @@ """Generates the supported SOP Classes and well-known SOP Instances.""" import inspect -from keyword import iskeyword import logging import sys +from keyword import iskeyword from typing import cast from pydicom.uid import UID diff --git a/pynetdicom/status.py b/pynetdicom/status.py index b0831ec3f..a99fad440 100644 --- a/pynetdicom/status.py +++ b/pynetdicom/status.py @@ -5,12 +5,12 @@ from pydicom.dataset import Dataset from pynetdicom._globals import ( - STATUS_SUCCESS, - STATUS_FAILURE, - STATUS_WARNING, STATUS_CANCEL, + STATUS_FAILURE, STATUS_PENDING, + STATUS_SUCCESS, STATUS_UNKNOWN, + STATUS_WARNING, ) __all__ = [ diff --git a/pynetdicom/transport.py b/pynetdicom/transport.py index b17a23e44..35377f73e 100644 --- a/pynetdicom/transport.py +++ b/pynetdicom/transport.py @@ -1,13 +1,13 @@ """Implementation of the Transport Service.""" -from copy import deepcopy -from datetime import datetime import gc import logging import queue import select import socket -from socketserver import TCPServer, ThreadingMixIn, BaseRequestHandler +from copy import deepcopy +from datetime import datetime +from socketserver import BaseRequestHandler, TCPServer, ThreadingMixIn try: import ssl @@ -18,11 +18,11 @@ # and must use "ssl.SSLContext" in type hints _HAS_SSL = False import threading -from typing import TYPE_CHECKING, Any, cast -from collections.abc import Callable import warnings +from collections.abc import Callable +from typing import TYPE_CHECKING, Any, cast -from pynetdicom import evt, _config +from pynetdicom import _config, evt from pynetdicom._globals import MODE_ACCEPTOR from pynetdicom._handlers import ( standard_dimse_recv_handler, diff --git a/pynetdicom/utils.py b/pynetdicom/utils.py index 1d4beaa4b..2cfd9f99a 100644 --- a/pynetdicom/utils.py +++ b/pynetdicom/utils.py @@ -1,12 +1,12 @@ """Various utility functions.""" +import logging +import sys +from collections.abc import Callable, Iterator, Sequence from contextlib import contextmanager from contextvars import copy_context from io import BytesIO -import logging -import sys from typing import cast -from collections.abc import Iterator, Callable, Sequence try: import ctypes