imednet package
- class imednet.AsyncImednetSDK[source]
Bases:
_BaseSDK,SDKConvenienceMixinAsync variant of
ImednetSDKusing the async HTTP client.Always use this class with
async withor callawait sdk.aclose()explicitly when done. Using the synchronous context manager (with) or synchronousclose()on this class will raise aTypeError.- __init__(api_key=None, security_key=None, base_url=None, timeout=30.0, retries=3, backoff_factor=1.0, retry_policy=None, async_client=None)[source]
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
timeout (float) –
retries (int) –
backoff_factor (float) –
retry_policy (RetryPolicy | None) –
async_client (AsyncClient | None) –
- Return type:
None
-
codings:
AsyncCodingsEndpoint
-
forms:
AsyncFormsEndpoint
-
intervals:
AsyncIntervalsEndpoint
-
jobs:
AsyncJobsEndpoint
-
queries:
AsyncQueriesEndpoint
-
record_revisions:
AsyncRecordRevisionsEndpoint
-
records:
AsyncRecordsEndpoint
- property retry_policy: RetryPolicy
-
sites:
AsyncSitesEndpoint
-
studies:
AsyncStudiesEndpoint
-
subjects:
AsyncSubjectsEndpoint
-
users:
AsyncUsersEndpoint
-
variables:
AsyncVariablesEndpoint
-
visits:
AsyncVisitsEndpoint
-
workflows:
WorkflowsNamespaceProtocol
- class imednet.BaseClient[source]
Bases:
objectCommon initialization logic for HTTP clients.
- __init__(api_key=None, security_key=None, base_url=None, timeout=30.0, retries=3, backoff_factor=1.0, tracer=None, auth=None)[source]
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
timeout (float | Timeout) –
retries (int) –
backoff_factor (float) –
tracer (opentelemetry.trace.Tracer | None) –
auth (AuthStrategy | None) –
- Return type:
None
- class imednet.Config[source]
Bases:
objectConfig(api_key: ‘str’, security_key: ‘str’, base_url: ‘Optional[str]’ = None)
- __init__(api_key, security_key, base_url=None)
- Parameters:
api_key (str) –
security_key (str) –
base_url (str | None) –
- Return type:
None
-
api_key:
str
-
base_url:
Optional[str] = None
-
security_key:
str
- class imednet.DefaultRetryPolicy[source]
Bases:
objectRetry policy with idempotency-aware retry logic.
Network errors (
httpx.RequestError) and server errors (HTTP 500-599) are only retried for idempotent HTTP methods:GET,PUT,DELETE,HEAD, andOPTIONS.Rate-limit responses (HTTP 429) are retried for all methods because the server rejected the request before processing the payload, so there is no risk of duplicate side-effects.
Requests with an unknown or missing method are treated as non-idempotent (fail-safe default): they are not retried on network errors or 5xx responses.
Overriding this behaviour
If you need retries on a
POSTendpoint that is internally deduplicated (e.g. the server uses an idempotency key), subclassRetryPolicyand pass an instance to the client:from imednet.core.retry import RetryPolicy, RetryState, IDEMPOTENT_METHODS import httpx class IdempotentPostPolicy(RetryPolicy): def should_retry(self, state: RetryState) -> bool: method = (state.method or "").upper() if state.exception: return isinstance(state.exception, httpx.RequestError) response = state.result if isinstance(response, httpx.Response): return ( response.status_code == 429 or 500 <= response.status_code < 600 ) return False sdk = ImednetSDK(..., retry_policy=IdempotentPostPolicy())
- should_retry(state)[source]
- Return type:
bool- Parameters:
state (RetryState) –
- exception imednet.FilterConflictError[source]
Bases:
OrchestratorErrorRaised when both whitelist and blacklist are non-empty simultaneously.
The whitelist and blacklist filters are mutually exclusive operations. Providing both simultaneously creates ambiguous behavior and is rejected at validation time before any study resolution occurs.
Example:
# This raises FilterConflictError — a study key cannot be in both: orchestrator.execute_pipeline( my_func, whitelist={"STUDY-A", "STUDY-B"}, blacklist={"STUDY-C"}, )
- imednet.ImednetClient
alias of
ImednetSDK
- class imednet.ImednetSDK[source]
Bases:
_BaseSDK,SDKConvenienceMixinPublic entry-point for library users.
Provides access to all iMednet API endpoints and maintains configuration.
- __init__(api_key=None, security_key=None, base_url=None, timeout=30.0, retries=3, backoff_factor=1.0, retry_policy=None, client=None)[source]
Initialize the SDK with credentials and configuration.
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
timeout (float) –
retries (int) –
backoff_factor (float) –
retry_policy (RetryPolicy | None) –
client (Client | None) –
- Return type:
None
-
codings:
CodingsEndpoint
-
forms:
FormsEndpoint
-
intervals:
IntervalsEndpoint
-
jobs:
JobsEndpoint
-
queries:
QueriesEndpoint
-
record_revisions:
RecordRevisionsEndpoint
-
records:
RecordsEndpoint
- property retry_policy: RetryPolicy
-
sites:
SitesEndpoint
-
studies:
StudiesEndpoint
-
subjects:
SubjectsEndpoint
-
users:
UsersEndpoint
-
variables:
VariablesEndpoint
-
visits:
VisitsEndpoint
-
workflows:
WorkflowsNamespaceProtocol
- class imednet.MultiStudyOrchestrator[source]
Bases:
objectOrchestrates pipeline execution across multiple active clinical trial boundaries.
The SDK instance passed at construction is treated as an immutable read-only resource — no worker thread may mutate its transport, authentication state, or connection pool during parallel execution.
- Parameters:
sdk (
Any) – A fully initializedImednetSDKinstance. The orchestrator stores a reference (not a copy) and treats it as immutable.max_workers (
int) – Maximum number of concurrent worker threads. Defaults to 4. Set to 1 to force sequential execution (useful for debugging).
Example:
with ImednetSDK(api_key=..., security_key=...) as sdk: orchestrator = MultiStudyOrchestrator(sdk, max_workers=8) results = orchestrator.execute_pipeline(my_pipeline_func)
- execute_pipeline(pipeline_func, whitelist=None, blacklist=None, *args, **kwargs)[source]
Execute a pipeline function concurrently across resolved study contexts.
- Return type:
dict[str,OrchestratorResult]- Parameters:
pipeline_func (StudyWorkerCallable[Any]) –
whitelist (set[str] | None) –
blacklist (set[str] | None) –
args (Any) –
kwargs (Any) –
- property max_workers: int
Maximum number of concurrent worker threads.
- resolve_active_studies(whitelist=None, blacklist=None)[source]
Query the iMednet registry and apply filtering rules.
Calls
self._sdk.studies.list()to fetch the live study inventory, then applies the whitelist OR blacklist (mutually exclusive).- Parameters:
whitelist (
Optional[set[str]]) – If provided, only studies whosestudyKeyis in this set are included. Mutually exclusive withblacklist.blacklist (
Optional[set[str]]) – If provided, studies whosestudyKeyis in this set are excluded. Mutually exclusive withwhitelist.
- Return type:
list[str]- Returns:
Ordered list of study key strings targeting this execution run.
- Raises:
FilterConflictError – When both
whitelistandblacklistare non-empty simultaneously.
- property sdk: Any
The shared read-only SDK instance.
- exception imednet.OrchestratorError[source]
Bases:
ImednetErrorBase exception for all orchestration-layer failures.
Raised when the
MultiStudyOrchestratorencounters a structural or configuration error that prevents pipeline execution from starting.Individual per-study runtime failures are NOT raised as exceptions — they are captured in the
OrchestratorResultresult matrix withstatus="FAILED".
- class imednet.OrchestratorResult[source]
Bases:
TypedDictNormalized result entry returned per study by
execute_pipeline.-
data:
Optional[Any]
-
duration_seconds:
float
-
error:
Optional[str]
-
status:
str
-
data:
- exception imednet.PluginLoadError[source]
Bases:
ImednetErrorRaised when a plugin fails to load or does not satisfy the
PluginProtocol.
- class imednet.PluginProtocol[source]
Bases:
ProtocolProtocol that every iMednet plugin factory must satisfy.
A conforming factory is a callable that accepts an SDK instance and returns an object implementing
WorkflowsNamespaceProtocol.Example:
from imednet.plugins import PluginProtocol from imednet.sdk import ImednetSDK class MyWorkflows: def __init__(self, sdk: ImednetSDK) -> None: self.data_extraction = ... self.query_management = ... self.record_mapper = ... self.record_update = ... self.subject_data = ... def create_workflows(sdk: ImednetSDK) -> MyWorkflows: return MyWorkflows(sdk) # Verify conformance at import time (optional, for development use): assert isinstance(create_workflows, PluginProtocol)
- __init__(*args, **kwargs)
- class imednet.RetryPolicy[source]
Bases:
ProtocolInterface to determine whether a request should be retried.
- __init__(*args, **kwargs)
- should_retry(state)[source]
Return
Trueto retry the request for the given state.- Return type:
bool- Parameters:
state (RetryState) –
- class imednet.RetryState[source]
Bases:
objectState information passed to
RetryPolicy.- __init__(attempt_number, exception=None, result=None, method=None)
- Parameters:
attempt_number (int) –
exception (BaseException | None) –
result (Any | None) –
method (str | None) –
- Return type:
None
-
attempt_number:
int
-
exception:
Optional[BaseException] = None
-
method:
Optional[str] = None
-
result:
Optional[Any] = None
- class imednet.StudyWorkerCallable[source]
Bases:
Protocol[T_Output]Defines the explicit signature required for injected pipeline tasks.
Pipeline callables injected into
MultiStudyOrchestrator.execute_pipelinemust conform to this protocol.- __init__(*args, **kwargs)
- class imednet.WorkflowsNamespaceProtocol[source]
Bases:
ProtocolMinimal interface that a workflows namespace object must expose.
Each attribute should be a workflow class instance wired to the SDK.
- __init__(*args, **kwargs)
-
data_extraction:
Any
-
query_management:
Any
-
record_mapper:
Any
-
record_update:
Any
-
subject_data:
Any
- imednet.load_config(api_key=None, security_key=None, base_url=None)[source]
Return configuration using arguments or environment variables.
- Return type:
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
Subpackages
- imednet.auth package
- imednet.cli package
- Subpackages
- imednet.cli.export package
- imednet.cli.intervals package
- imednet.cli.jobs package
- imednet.cli.queries package
- imednet.cli.record_revisions package
- imednet.cli.records package
- imednet.cli.sites package
- imednet.cli.studies package
- imednet.cli.subjects package
- imednet.cli.utils package
- imednet.cli.variables package
- Submodules
- imednet.cli.decorators module
- Subpackages
- imednet.core package
ApiErrorAsyncClientAsyncPaginatorAuthenticationErrorAuthorizationErrorBadRequestErrorBaseClientClientConflictErrorContextDefaultRetryPolicyForbiddenErrorHTTPClientBaseImednetErrorNotFoundErrorPaginationErrorPaginatorRateLimitErrorRequestErrorRetryPolicyRetryStateServerErrorUnauthorizedErrorValidationError- Subpackages
- imednet.core.endpoint package
AsyncListGetEndpointEdcAsyncListGetEndpointEdcGenericListGetEndpointEdcSyncListGetEndpointGenericEndpointGenericListGetEndpointSupportsCreateSupportsGetSupportsListSyncListGetEndpoint- Subpackages
- Submodules
- imednet.core.endpoint.abc module
- imednet.core.endpoint.base module
- imednet.core.endpoint.edc_mixin module
- imednet.core.endpoint.protocols module
- imednet.core.endpoint.strategies module
- imednet.core.endpoint.structs module
- imednet.core.http package
- imednet.core.endpoint package
- Submodules
- imednet.core.async_client module
- imednet.core.base_client module
- imednet.core.client module
- imednet.core.context module
- imednet.core.factory module
- imednet.core.http_client_base module
- imednet.core.paginator module
- imednet.core.parsing module
- imednet.core.protocols module
- imednet.core.retry module
- imednet.endpoints package
AsyncCodingsEndpointAsyncFormsEndpointAsyncIntervalsEndpointAsyncJobsEndpointAsyncQueriesEndpointAsyncRecordRevisionsEndpointAsyncRecordsEndpointAsyncSitesEndpointAsyncStudiesEndpointAsyncSubjectsEndpointAsyncUsersEndpointAsyncVariablesEndpointAsyncVisitsEndpointCodingsEndpointFormsEndpointIntervalsEndpointJobsEndpointQueriesEndpointRecordRevisionsEndpointRecordsEndpointSitesEndpointStudiesEndpointSubjectsEndpointUsersEndpointVariablesEndpointVisitsEndpoint- Submodules
- imednet.endpoints.codings module
- imednet.endpoints.forms module
- imednet.endpoints.intervals module
- imednet.endpoints.jobs module
- imednet.endpoints.queries module
- imednet.endpoints.record_revisions module
- imednet.endpoints.records module
- imednet.endpoints.registry module
- imednet.endpoints.sites module
- imednet.endpoints.studies module
- imednet.endpoints.subjects module
- imednet.endpoints.users module
- imednet.endpoints.variables module
- imednet.endpoints.visits module
- imednet.errors package
ApiErrorAuthenticationErrorAuthorizationErrorBadRequestErrorClientErrorConfigurationErrorConflictErrorExportBatchErrorExportConfigurationErrorExportErrorFilterConflictErrorForbiddenErrorImednetErrorNotFoundErrorOrchestratorErrorPaginationErrorPathTraversalValidationErrorPluginLoadErrorRateLimitErrorRequestErrorServerErrorUnauthorizedErrorUnknownVariableTypeErrorValidationErrorget_error_class()- Submodules
- imednet.errors.api module
- imednet.errors.base module
- imednet.errors.client module
- imednet.errors.export module
- imednet.errors.network module
- imednet.errors.orchestration module
- imednet.errors.plugin module
- imednet.errors.registry module
- imednet.errors.validation module
- imednet.form_designer package
FormBuilderFormDesignerClientLayout- Submodules
- imednet.form_designer.builder module
- imednet.form_designer.client module
- imednet.form_designer.models module
BaseFieldPropsBaseFieldProps.bl_future_dateBaseFieldProps.bl_future_date_idBaseFieldProps.bl_inherit_dateBaseFieldProps.bl_inherit_date_idBaseFieldProps.bl_relatedBaseFieldProps.bl_reqBaseFieldProps.bl_req_idBaseFieldProps.blinded_rolesBaseFieldProps.catalogBaseFieldProps.commentsBaseFieldProps.fld_idBaseFieldProps.is_blindedBaseFieldProps.labelBaseFieldProps.model_configBaseFieldProps.mvBaseFieldProps.new_fld_idBaseFieldProps.nodeleteBaseFieldProps.page_noBaseFieldProps.question_idBaseFieldProps.question_nameBaseFieldProps.sas_labelBaseFieldProps.sdv_reqBaseFieldProps.sequence
CheckboxFieldPropsChoiceColDateTimeFieldPropsDateTimeFieldProps.allow_no_dayDateTimeFieldProps.allow_no_monthDateTimeFieldProps.allow_no_yearDateTimeFieldProps.date_ctrlDateTimeFieldProps.model_configDateTimeFieldProps.record_comp_dateDateTimeFieldProps.record_key_dateDateTimeFieldProps.time_ctrlDateTimeFieldProps.typeDateTimeFieldProps.use_seconds
DropdownFieldPropsEntityExtQuestionPropsFileUploadPropsLabelPropsLayoutMemoFieldPropsNumberFieldPropsPagePrecisionDateFieldPropsPrecisionDateFieldProps.allow_no_dayPrecisionDateFieldProps.allow_no_monthPrecisionDateFieldProps.allow_no_timePrecisionDateFieldProps.allow_no_yearPrecisionDateFieldProps.display_text_dayPrecisionDateFieldProps.display_text_monthPrecisionDateFieldProps.display_text_timePrecisionDateFieldProps.display_text_yearPrecisionDateFieldProps.impute_dayPrecisionDateFieldProps.impute_monthPrecisionDateFieldProps.impute_timePrecisionDateFieldProps.impute_yearPrecisionDateFieldProps.model_configPrecisionDateFieldProps.precision_secsPrecisionDateFieldProps.precision_timePrecisionDateFieldProps.record_comp_datePrecisionDateFieldProps.record_key_datePrecisionDateFieldProps.type
ProtocolDeviationFormPayloadRadioFieldPropsRowSeparatorPropsTablePropsTextFieldProps
- imednet.form_designer.presets module
- imednet.http package
- imednet.integrations package
ExportSinkMongoDbExportSinkNeo4jExportSinkNeo4jSinkConfigPartitionedStorageEnginePyArrowDatasetPartitionedStorageEnginePyArrowDatasetPartitionedStorageEngine.__init__()PyArrowDatasetPartitionedStorageEngine.compressionPyArrowDatasetPartitionedStorageEngine.existing_data_behaviorPyArrowDatasetPartitionedStorageEngine.staging_dir_namePyArrowDatasetPartitionedStorageEngine.use_dictionaryPyArrowDatasetPartitionedStorageEngine.write_form_table()
SinkConfigSnowflakeExportSinkSnowflakeSinkConfigSnowflakeSinkConfig.__init__()SnowflakeSinkConfig.accountSnowflakeSinkConfig.databaseSnowflakeSinkConfig.local_staging_dirSnowflakeSinkConfig.manifest_pathSnowflakeSinkConfig.passwordSnowflakeSinkConfig.schemaSnowflakeSinkConfig.stageSnowflakeSinkConfig.stage_prefixSnowflakeSinkConfig.tableSnowflakeSinkConfig.userSnowflakeSinkConfig.warehouse
export_to_csv()export_to_duckdb()export_to_duckdb_by_form()export_to_excel()export_to_hive_parquet()export_to_json()export_to_long_sql()export_to_mongodb()export_to_neo4j()export_to_parquet()export_to_snowflake()export_to_sql()export_to_sql_by_form()hive_parquet_query()- Submodules
- imednet.integrations.document module
- imednet.integrations.export module
- imednet.integrations.graph module
- imednet.integrations.parquet module
- imednet.integrations.parquet_engine module
PartitionedStorageEnginePyArrowDatasetPartitionedStorageEnginePyArrowDatasetPartitionedStorageEngine.__init__()PyArrowDatasetPartitionedStorageEngine.compressionPyArrowDatasetPartitionedStorageEngine.existing_data_behaviorPyArrowDatasetPartitionedStorageEngine.staging_dir_namePyArrowDatasetPartitionedStorageEngine.use_dictionaryPyArrowDatasetPartitionedStorageEngine.write_form_table()
- imednet.integrations.sink_base module
- imednet.integrations.warehouse module
- Manifest
- Optional dependencies
- Idempotency
- Usage
SnowflakeExportSinkSnowflakeSinkConfigSnowflakeSinkConfig.__init__()SnowflakeSinkConfig.accountSnowflakeSinkConfig.databaseSnowflakeSinkConfig.extraSnowflakeSinkConfig.local_staging_dirSnowflakeSinkConfig.manifest_pathSnowflakeSinkConfig.passwordSnowflakeSinkConfig.schemaSnowflakeSinkConfig.stageSnowflakeSinkConfig.stage_prefixSnowflakeSinkConfig.tableSnowflakeSinkConfig.userSnowflakeSinkConfig.warehouse
export_to_snowflake()
- imednet.models package
AdverseEventApiResponseBaseRecordRequestCodingCoding.codeCoding.coded_byCoding.coding_idCoding.date_codedCoding.dictionary_nameCoding.dictionary_versionCoding.form_idCoding.form_keyCoding.form_nameCoding.model_configCoding.reasonCoding.record_idCoding.revisionCoding.site_idCoding.site_nameCoding.study_keyCoding.subject_idCoding.subject_keyCoding.valueCoding.variable
CreateNewRecordRequestDeviceDeficiencyDeviceSafetyProfileDrugSafetyProfileErrorFormForm.allow_copyForm.date_createdForm.date_modifiedForm.disabledForm.embedded_logForm.enforce_ownershipForm.epro_formForm.form_idForm.form_keyForm.form_nameForm.form_typeForm.model_configForm.other_formsForm.revisionForm.study_keyForm.subject_record_reportForm.unscheduled_visitForm.user_agreement
FormStructureFormStructure.allow_copyFormStructure.date_createdFormStructure.date_modifiedFormStructure.disabledFormStructure.epro_formFormStructure.form_idFormStructure.form_keyFormStructure.form_nameFormStructure.form_typeFormStructure.from_form()FormStructure.model_configFormStructure.revisionFormStructure.variables
FormSummaryGeneralClinicalProfileImednetBaseModelIntervalInterval.actual_dateInterval.actual_date_formInterval.date_createdInterval.date_modifiedInterval.defined_using_intervalInterval.disabledInterval.due_date_will_be_inInterval.epro_grace_periodInterval.formsInterval.interval_descriptionInterval.interval_group_idInterval.interval_group_nameInterval.interval_idInterval.interval_nameInterval.interval_sequenceInterval.model_configInterval.negative_slackInterval.positive_slackInterval.study_keyInterval.timelineInterval.window_calculation_dateInterval.window_calculation_form
IntervalStructureIntervalStructure.date_createdIntervalStructure.date_modifiedIntervalStructure.disabledIntervalStructure.formsIntervalStructure.from_interval()IntervalStructure.interval_descriptionIntervalStructure.interval_group_nameIntervalStructure.interval_idIntervalStructure.interval_nameIntervalStructure.interval_sequenceIntervalStructure.model_config
JobJobStatusKeywordMappingRuleMetadataPaginationProtocolDeviationQueryQueryCommentRecordRecord.date_createdRecord.date_modifiedRecord.deletedRecord.form_idRecord.form_keyRecord.interval_idRecord.keywordsRecord.model_configRecord.parent_record_idRecord.record_dataRecord.record_idRecord.record_oidRecord.record_statusRecord.record_typeRecord.site_idRecord.study_keyRecord.subject_idRecord.subject_keyRecord.subject_oidRecord.visit_id
RecordDataRecordJobResponseRecordRevisionRecordRevision.data_revisionRecordRevision.date_createdRecordRevision.deletedRecordRevision.form_keyRecordRevision.interval_idRecordRevision.model_configRecordRevision.reason_for_changeRecordRevision.record_idRecordRevision.record_oidRecordRevision.record_revisionRecordRevision.record_revision_idRecordRevision.record_statusRecordRevision.roleRecordRevision.site_idRecordRevision.study_keyRecordRevision.subject_idRecordRevision.subject_keyRecordRevision.subject_oidRecordRevision.user
RegisterSubjectRequestRoleSiteSortFieldStandardsProfileStandardsProfileRegistryStudyStudyConfigurationStudyStructureSubjectSubjectKeywordTriageAnnotationTriageHistoryEntryTriageItemTriageStatusUpdateScheduledRecordRequestUserValidationViolationVariableVariable.blindedVariable.date_createdVariable.date_modifiedVariable.deletedVariable.disabledVariable.form_idVariable.form_keyVariable.form_nameVariable.labelVariable.model_configVariable.revisionVariable.sequenceVariable.study_keyVariable.variable_idVariable.variable_nameVariable.variable_oidVariable.variable_type
VisitWidgetConfigparse_bool()parse_datetime()parse_dict_or_default()parse_int_or_default()parse_list_or_default()parse_str_or_default()- Submodules
- imednet.models.base module
- imednet.models.codings module
CodingCoding.codeCoding.coded_byCoding.coding_idCoding.date_codedCoding.dictionary_nameCoding.dictionary_versionCoding.form_idCoding.form_keyCoding.form_nameCoding.model_configCoding.reasonCoding.record_idCoding.revisionCoding.site_idCoding.site_nameCoding.study_keyCoding.subject_idCoding.subject_keyCoding.valueCoding.variable
- imednet.models.forms module
FormForm.allow_copyForm.date_createdForm.date_modifiedForm.disabledForm.embedded_logForm.enforce_ownershipForm.epro_formForm.form_idForm.form_keyForm.form_nameForm.form_typeForm.model_configForm.other_formsForm.revisionForm.study_keyForm.subject_record_reportForm.unscheduled_visitForm.user_agreement
- imednet.models.intervals module
FormSummaryIntervalInterval.actual_dateInterval.actual_date_formInterval.date_createdInterval.date_modifiedInterval.defined_using_intervalInterval.disabledInterval.due_date_will_be_inInterval.epro_grace_periodInterval.formsInterval.interval_descriptionInterval.interval_group_idInterval.interval_group_nameInterval.interval_idInterval.interval_nameInterval.interval_sequenceInterval.model_configInterval.negative_slackInterval.positive_slackInterval.study_keyInterval.timelineInterval.window_calculation_dateInterval.window_calculation_form
- imednet.models.jobs module
- imednet.models.json_base module
- imednet.models.queries module
- imednet.models.record_revisions module
RecordRevisionRecordRevision.data_revisionRecordRevision.date_createdRecordRevision.deletedRecordRevision.form_keyRecordRevision.interval_idRecordRevision.model_configRecordRevision.reason_for_changeRecordRevision.record_idRecordRevision.record_oidRecordRevision.record_revisionRecordRevision.record_revision_idRecordRevision.record_statusRecordRevision.roleRecordRevision.site_idRecordRevision.study_keyRecordRevision.subject_idRecordRevision.subject_keyRecordRevision.subject_oidRecordRevision.user
- imednet.models.records module
BaseRecordRequestCreateNewRecordRequestKeywordRecordRecord.date_createdRecord.date_modifiedRecord.deletedRecord.form_idRecord.form_keyRecord.interval_idRecord.keywordsRecord.model_configRecord.parent_record_idRecord.record_dataRecord.record_idRecord.record_oidRecord.record_statusRecord.record_typeRecord.site_idRecord.study_keyRecord.subject_idRecord.subject_keyRecord.subject_oidRecord.visit_id
RecordDataRecordJobResponseRegisterSubjectRequestUpdateScheduledRecordRequest
- imednet.models.reporting module
- imednet.models.sites module
- imednet.models.standards module
- imednet.models.studies module
- imednet.models.study_config module
- imednet.models.study_structure module
FormStructureFormStructure.allow_copyFormStructure.date_createdFormStructure.date_modifiedFormStructure.disabledFormStructure.epro_formFormStructure.form_idFormStructure.form_keyFormStructure.form_nameFormStructure.form_typeFormStructure.from_form()FormStructure.model_configFormStructure.revisionFormStructure.variables
IntervalStructureIntervalStructure.date_createdIntervalStructure.date_modifiedIntervalStructure.disabledIntervalStructure.formsIntervalStructure.from_interval()IntervalStructure.interval_descriptionIntervalStructure.interval_group_nameIntervalStructure.interval_idIntervalStructure.interval_nameIntervalStructure.interval_sequenceIntervalStructure.model_config
StudyStructure
- imednet.models.subjects module
- imednet.models.triage module
- imednet.models.users module
- imednet.models.variables module
VariableVariable.blindedVariable.date_createdVariable.date_modifiedVariable.deletedVariable.disabledVariable.form_idVariable.form_keyVariable.form_nameVariable.labelVariable.model_configVariable.revisionVariable.sequenceVariable.study_keyVariable.variable_idVariable.variable_nameVariable.variable_oidVariable.variable_type
- imednet.models.visits module
- imednet.orchestration package
- imednet.pagination package
- imednet.testing package
- imednet.utils package
DataFramebuild_filter_string()configure_json_logging()format_iso_datetime()parse_iso_datetime()sanitize_base_url()sanitize_csv_formula()validate_partition_key()- Submodules
- imednet.utils.arrow module
- imednet.utils.dates module
- imednet.utils.filters module
- imednet.utils.json_logging module
- imednet.utils.pandas module
- imednet.utils.security module
- imednet.utils.typing module
- imednet.utils.url module
- imednet.utils.validators module
- imednet.validation package
AsyncSchemaCacheAsyncSchemaValidatorBaseSchemaCacheBaseSchemaValidatorDataDictionaryDataDictionaryLoaderSchemaCacheSchemaValidatorvalidate_record_data()- Submodules
- imednet.validation.cache module
- imednet.validation.data_dictionary module
- imednet.validation.schema module
Submodules
imednet.async_sdk module
imednet.config module
- class imednet.config.Config[source]
Bases:
objectConfig(api_key: ‘str’, security_key: ‘str’, base_url: ‘Optional[str]’ = None)
- __init__(api_key, security_key, base_url=None)
- Parameters:
api_key (str) –
security_key (str) –
base_url (str | None) –
- Return type:
None
-
api_key:
str
-
base_url:
Optional[str] = None
-
security_key:
str
imednet.constants module
Common constants used throughout the iMednet SDK.
This module centralizes configuration constants to avoid magic numbers and improve maintainability.
- imednet.constants.CONTENT_TYPE_JSON = 'application/json'
JSON content type value.
- imednet.constants.DEFAULT_BACKOFF_FACTOR = 1.0
Default backoff factor for exponential retry delays.
- imednet.constants.DEFAULT_BASE_URL = 'https://edc.prod.imednetapi.com'
Default base URL for the iMednet API.
- imednet.constants.DEFAULT_PAGE_SIZE = 100
Default number of items to fetch per page.
- imednet.constants.DEFAULT_RETRIES = 3
Default number of retry attempts for failed requests.
- imednet.constants.DEFAULT_TIMEOUT = 30.0
Default timeout in seconds for HTTP requests.
- imednet.constants.HEADER_ACCEPT = 'Accept'
HTTP Accept header name.
- imednet.constants.HEADER_API_KEY = 'x-api-key'
iMednet API key header name.
- imednet.constants.HEADER_CONTENT_TYPE = 'Content-Type'
HTTP Content-Type header name.
- imednet.constants.HEADER_EMAIL_NOTIFY = 'x-email-notify'
iMednet email notification header name.
- imednet.constants.HEADER_SECURITY_KEY = 'x-imn-security-key'
iMednet security key header name.
- imednet.constants.LARGE_PAGE_SIZE = 500
Page size for endpoints with large metadata (forms, intervals, variables).
- imednet.constants.MAX_SQLITE_COLUMNS = 2000
Maximum number of columns allowed in a SQLite table.
When exporting data to SQLite, tables exceeding this limit must be split into multiple tables.
- imednet.constants.TERMINAL_JOB_STATES = frozenset({'CANCELLED', 'COMPLETED', 'FAILED'})
Job states that indicate the job has finished processing.
These states are used by the job poller to determine when to stop polling. Jobs in these states will not transition to another state.
imednet.discovery module
Runtime discovery utilities for live tests and scripts.
- exception imednet.discovery.NoLiveDataError[source]
Bases:
RuntimeErrorRaised when required live data cannot be found.
- imednet.discovery.discover_form_key(sdk, study_key)[source]
Return the first subject record form key for
study_key.- Return type:
str- Parameters:
sdk (ImednetSDK) –
study_key (str) –
- imednet.discovery.discover_interval_name(sdk, study_key)[source]
Return the first non-disabled interval name for
study_key.- Return type:
str- Parameters:
sdk (ImednetSDK) –
study_key (str) –
- imednet.discovery.discover_site_name(sdk, study_key)[source]
Return the first eligible site name for
study_key.A site is eligible when its
site_enrollment_statusis one ofELIGIBLE_SITE_STATUSES. When no eligible site is found the encountered statuses are logged so callers can distinguish missing data from unsupported status vocabulary.- Return type:
str- Parameters:
sdk (ImednetSDK) –
study_key (str) –
- imednet.discovery.discover_study_key(sdk)[source]
Return the first study key available for the provided SDK.
- Return type:
str- Parameters:
sdk (ImednetSDK) –
- imednet.discovery.discover_subject_key(sdk, study_key)[source]
Return the first eligible subject key for
study_key.A subject is eligible when its
subject_statusis one ofELIGIBLE_SUBJECT_STATUSES. When no eligible subject is found the encountered statuses are logged so callers can distinguish missing data from unsupported status vocabulary.- Return type:
str- Parameters:
sdk (ImednetSDK) –
study_key (str) –
imednet.plugins module
Plugin contracts for the iMednet SDK.
This module defines the PluginProtocol that any third-party plugin
factory must satisfy in order to be discoverable via the imednet.plugins
entry-point group, together with the WorkflowsNamespaceProtocol that
the factory’s return value must implement.
Minimal plugin skeleton
A plugin package must:
Expose a factory callable under the
imednet.pluginsentry-point group with the name"workflows"(or another agreed name).The callable must accept a single argument — the
ImednetSDK(orAsyncImednetSDK) instance — and return an object that satisfiesWorkflowsNamespaceProtocol.
Example pyproject.toml snippet:
[tool.poetry.plugins."imednet.plugins"]
workflows = "myplugin.namespace:create_workflows"
Example factory:
# myplugin/namespace.py
from imednet.sdk import ImednetSDK
class MyWorkflows:
def __init__(self, sdk: ImednetSDK) -> None:
self.data_extraction = ...
self.query_management = ...
self.record_mapper = ...
self.record_update = ...
self.subject_data = ...
def create_workflows(sdk: ImednetSDK) -> MyWorkflows:
return MyWorkflows(sdk)
- class imednet.plugins.PluginProtocol[source]
Bases:
ProtocolProtocol that every iMednet plugin factory must satisfy.
A conforming factory is a callable that accepts an SDK instance and returns an object implementing
WorkflowsNamespaceProtocol.Example:
from imednet.plugins import PluginProtocol from imednet.sdk import ImednetSDK class MyWorkflows: def __init__(self, sdk: ImednetSDK) -> None: self.data_extraction = ... self.query_management = ... self.record_mapper = ... self.record_update = ... self.subject_data = ... def create_workflows(sdk: ImednetSDK) -> MyWorkflows: return MyWorkflows(sdk) # Verify conformance at import time (optional, for development use): assert isinstance(create_workflows, PluginProtocol)
- __init__(*args, **kwargs)
- class imednet.plugins.WorkflowsNamespaceProtocol[source]
Bases:
ProtocolMinimal interface that a workflows namespace object must expose.
Each attribute should be a workflow class instance wired to the SDK.
- __init__(*args, **kwargs)
-
data_extraction:
Any
-
query_management:
Any
-
record_mapper:
Any
-
record_update:
Any
-
subject_data:
Any
imednet.sdk module
Public entry-point for the iMednet SDK.
This module provides the ImednetSDK class which: - Manages configuration and authentication - Exposes all endpoint functionality through a unified interface - Provides context management for proper resource cleanup
- class imednet.sdk.AsyncImednetSDK[source]
Bases:
_BaseSDK,SDKConvenienceMixinAsync variant of
ImednetSDKusing the async HTTP client.Always use this class with
async withor callawait sdk.aclose()explicitly when done. Using the synchronous context manager (with) or synchronousclose()on this class will raise aTypeError.- __init__(api_key=None, security_key=None, base_url=None, timeout=30.0, retries=3, backoff_factor=1.0, retry_policy=None, async_client=None)[source]
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
timeout (float) –
retries (int) –
backoff_factor (float) –
retry_policy (RetryPolicy | None) –
async_client (AsyncClient | None) –
- Return type:
None
-
codings:
AsyncCodingsEndpoint
-
forms:
AsyncFormsEndpoint
-
intervals:
AsyncIntervalsEndpoint
-
jobs:
AsyncJobsEndpoint
-
queries:
AsyncQueriesEndpoint
-
record_revisions:
AsyncRecordRevisionsEndpoint
-
records:
AsyncRecordsEndpoint
- property retry_policy: RetryPolicy
-
sites:
AsyncSitesEndpoint
-
studies:
AsyncStudiesEndpoint
-
subjects:
AsyncSubjectsEndpoint
-
users:
AsyncUsersEndpoint
-
variables:
AsyncVariablesEndpoint
-
visits:
AsyncVisitsEndpoint
-
workflows:
WorkflowsNamespaceProtocol
- class imednet.sdk.ImednetSDK[source]
Bases:
_BaseSDK,SDKConvenienceMixinPublic entry-point for library users.
Provides access to all iMednet API endpoints and maintains configuration.
- __init__(api_key=None, security_key=None, base_url=None, timeout=30.0, retries=3, backoff_factor=1.0, retry_policy=None, client=None)[source]
Initialize the SDK with credentials and configuration.
- Parameters:
api_key (str | None) –
security_key (str | None) –
base_url (str | None) –
timeout (float) –
retries (int) –
backoff_factor (float) –
retry_policy (RetryPolicy | None) –
client (Client | None) –
- Return type:
None
-
codings:
CodingsEndpoint
-
forms:
FormsEndpoint
-
intervals:
IntervalsEndpoint
-
jobs:
JobsEndpoint
-
queries:
QueriesEndpoint
-
record_revisions:
RecordRevisionsEndpoint
-
records:
RecordsEndpoint
- property retry_policy: RetryPolicy
-
sites:
SitesEndpoint
-
studies:
StudiesEndpoint
-
subjects:
SubjectsEndpoint
-
users:
UsersEndpoint
-
variables:
VariablesEndpoint
-
visits:
VisitsEndpoint
-
workflows:
WorkflowsNamespaceProtocol
imednet.sdk_convenience module
Convenience mixin for the iMedNet SDK.
This module contains high-level helper methods that delegate to specific endpoints.
- imednet.sdk_convenience.AsyncJobPoller(*args, **kwargs)[source]
- Return type:
Any- Parameters:
args (Any) –
kwargs (Any) –
- class imednet.sdk_convenience.AsyncSDKProtocol[source]
Bases:
Protocol- __init__(*args, **kwargs)
-
codings:
AsyncCodingsEndpoint
-
forms:
AsyncFormsEndpoint
-
intervals:
AsyncIntervalsEndpoint
-
jobs:
AsyncJobsEndpoint
-
queries:
AsyncQueriesEndpoint
-
record_revisions:
AsyncRecordRevisionsEndpoint
-
records:
AsyncRecordsEndpoint
-
sites:
AsyncSitesEndpoint
-
studies:
AsyncStudiesEndpoint
-
subjects:
AsyncSubjectsEndpoint
-
users:
AsyncUsersEndpoint
-
variables:
AsyncVariablesEndpoint
-
visits:
AsyncVisitsEndpoint
- imednet.sdk_convenience.JobPoller(*args, **kwargs)[source]
- Return type:
Any- Parameters:
args (Any) –
kwargs (Any) –
- class imednet.sdk_convenience.SDKConvenienceMixin[source]
Bases:
objectMixin class providing convenience methods for the SDK.
These methods wrap endpoint calls to provide a flatter API surface.
- async async_get_codings(study_key=None, **filters)[source]
Asynchronously list codings.
- Return type:
List[Coding]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_forms(study_key=None, **filters)[source]
Asynchronously list forms.
- Return type:
List[Form]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_intervals(study_key=None, **filters)[source]
Asynchronously list intervals.
- Return type:
List[Interval]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_job(study_key, batch_id)[source]
Asynchronously get job status.
- Return type:
- Parameters:
self (AsyncSDKProtocol) –
study_key (str) –
batch_id (str) –
- async async_get_queries(study_key=None, **filters)[source]
Asynchronously list queries.
- Return type:
List[Query]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_record_revisions(study_key=None, **filters)[source]
Asynchronously list record revisions.
- Return type:
List[RecordRevision]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_records(study_key=None, **filters)[source]
Asynchronously list records.
- Return type:
List[Record]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_sites(study_key=None, **filters)[source]
Asynchronously list sites.
- Return type:
List[Site]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_studies(**filters)[source]
Asynchronously list studies.
- Return type:
List[Study]- Parameters:
self (AsyncSDKProtocol) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_subjects(study_key=None, **filters)[source]
Asynchronously list subjects.
- Return type:
List[Subject]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_users(study_key=None, **filters)[source]
Asynchronously list users.
- Return type:
List[User]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_variables(study_key=None, **filters)[source]
Asynchronously list variables.
- Return type:
List[Variable]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_get_visits(study_key=None, **filters)[source]
Asynchronously list visits.
- Return type:
List[Visit]- Parameters:
self (AsyncSDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- async async_poll_job(study_key, batch_id, *, interval=5, timeout=300)[source]
Asynchronously poll a job until it reaches a terminal state.
- Return type:
- Parameters:
self (AsyncSDKProtocol) –
study_key (str) –
batch_id (str) –
interval (int) –
timeout (int) –
- create_record(study_key, records_data, email_notify=None)[source]
Create records in the specified study.
- Return type:
- Parameters:
self (SDKProtocol) –
study_key (str) –
records_data (List[Dict[str, Any]]) –
email_notify (bool | str | None) –
- get_codings(study_key=None, **filters)[source]
List codings.
- Return type:
List[Coding]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_forms(study_key=None, **filters)[source]
List forms.
- Return type:
List[Form]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_intervals(study_key=None, **filters)[source]
List intervals.
- Return type:
List[Interval]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_job(study_key, batch_id)[source]
Get job status.
- Return type:
- Parameters:
self (SDKProtocol) –
study_key (str) –
batch_id (str) –
- get_queries(study_key=None, **filters)[source]
List queries.
- Return type:
List[Query]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_record_revisions(study_key=None, **filters)[source]
List record revisions.
- Return type:
List[RecordRevision]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_records(study_key=None, **filters)[source]
List records.
- Return type:
List[Record]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_sites(study_key=None, **filters)[source]
List sites.
- Return type:
List[Site]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_studies(**filters)[source]
List studies.
- Return type:
List[Study]- Parameters:
self (SDKProtocol) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_subjects(study_key=None, **filters)[source]
List subjects.
- Return type:
List[Subject]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_users(study_key=None, **filters)[source]
List users.
- Return type:
List[User]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_variables(study_key=None, **filters)[source]
List variables.
- Return type:
List[Variable]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- get_visits(study_key=None, **filters)[source]
List visits.
- Return type:
List[Visit]- Parameters:
self (SDKProtocol) –
study_key (str | None) –
filters (str | int | float | bool | None | Tuple[str, str | int | float | bool | None] | List[str | int | float | bool | None]) –
- poll_job(study_key, batch_id, *, interval=5, timeout=300)[source]
Poll a job until it reaches a terminal state.
- Return type:
- Parameters:
self (SDKProtocol) –
study_key (str) –
batch_id (str) –
interval (int) –
timeout (int) –
- class imednet.sdk_convenience.SDKProtocol[source]
Bases:
ProtocolProtocol defining the interface required by SDKConvenienceMixin.
- __init__(*args, **kwargs)
-
codings:
CodingsEndpoint
-
forms:
FormsEndpoint
-
intervals:
IntervalsEndpoint
-
jobs:
JobsEndpoint
-
queries:
QueriesEndpoint
-
record_revisions:
RecordRevisionsEndpoint
-
records:
RecordsEndpoint
-
sites:
SitesEndpoint
-
studies:
StudiesEndpoint
-
subjects:
SubjectsEndpoint
-
users:
UsersEndpoint
-
variables:
VariablesEndpoint
-
visits:
VisitsEndpoint