Metadata-Version: 2.4
Name: dkist-processing-test
Version: 1.39.1rc1
Summary: Example instrument code used by the DKIST science data processing pipelines to test processing infrastructure
Author-email: NSO / AURA <dkistdc@nso.edu>
License: BSD-3-Clause
Project-URL: Homepage, https://nso.edu/dkist/data-center/
Project-URL: Repository, https://bitbucket.org/dkistdc/dkist-processing-test/
Project-URL: Help, https://nso.atlassian.net/servicedesk/customer/portal/5
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.13
Description-Content-Type: text/x-rst
Requires-Dist: dkist-processing-common==12.6.0rc1
Requires-Dist: dkist-header-validator==5.3.0
Requires-Dist: dkist-service-configuration==4.2.0
Requires-Dist: dkist-fits-specifications==4.21.0
Requires-Dist: numba==0.61.2
Requires-Dist: astropy==7.0.2
Requires-Dist: numpy==2.2.5
Requires-Dist: dkist-spectral-lines==3.0.0
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-xdist; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: pytest-mock; extra == "test"
Requires-Dist: dkist-data-simulator>=5.2.6; extra == "test"
Requires-Dist: dkist-processing-test[inventory]; extra == "test"
Requires-Dist: dkist-processing-test[asdf]; extra == "test"
Requires-Dist: dkist-processing-test[quality]; extra == "test"
Provides-Extra: inventory
Requires-Dist: dkist-processing-common[inventory]; extra == "inventory"
Requires-Dist: dkist-inventory==1.11.4; extra == "inventory"
Provides-Extra: asdf
Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
Requires-Dist: dkist-inventory[asdf]==1.11.4; extra == "asdf"
Provides-Extra: quality
Requires-Dist: dkist-quality==2.0.0; extra == "quality"
Provides-Extra: frozen
Requires-Dist: Deprecated==1.3.1; extra == "frozen"
Requires-Dist: ImageIO==2.37.2; extra == "frozen"
Requires-Dist: Jinja2==3.1.6; extra == "frozen"
Requires-Dist: Mako==1.3.10; extra == "frozen"
Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
Requires-Dist: PyJWT==2.11.0; extra == "frozen"
Requires-Dist: PyYAML==6.0.3; extra == "frozen"
Requires-Dist: PyYAML-ft==8.0.0; extra == "frozen"
Requires-Dist: Pygments==2.19.2; extra == "frozen"
Requires-Dist: SQLAlchemy==2.0.46; extra == "frozen"
Requires-Dist: SQLAlchemy-JSONField==1.0.2; extra == "frozen"
Requires-Dist: SQLAlchemy-Utils==0.42.1; extra == "frozen"
Requires-Dist: a2wsgi==1.10.10; extra == "frozen"
Requires-Dist: aioftp==0.27.2; extra == "frozen"
Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
Requires-Dist: aiohttp==3.13.3; extra == "frozen"
Requires-Dist: aiosignal==1.4.0; extra == "frozen"
Requires-Dist: aiosmtplib==5.1.0; extra == "frozen"
Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
Requires-Dist: alembic==1.18.4; extra == "frozen"
Requires-Dist: amqp==5.3.1; extra == "frozen"
Requires-Dist: annotated-doc==0.0.4; extra == "frozen"
Requires-Dist: annotated-types==0.7.0; extra == "frozen"
Requires-Dist: anyio==4.12.1; extra == "frozen"
Requires-Dist: apache-airflow==3.1.7; extra == "frozen"
Requires-Dist: apache-airflow-core==3.1.7; extra == "frozen"
Requires-Dist: apache-airflow-providers-celery==3.16.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-compat==1.13.1; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-io==1.7.1; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-sql==1.31.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-postgres==6.5.4; extra == "frozen"
Requires-Dist: apache-airflow-providers-smtp==2.4.2; extra == "frozen"
Requires-Dist: apache-airflow-providers-standard==1.11.1; extra == "frozen"
Requires-Dist: apache-airflow-task-sdk==1.1.7; extra == "frozen"
Requires-Dist: argcomplete==3.6.3; extra == "frozen"
Requires-Dist: asdf==3.5.0; extra == "frozen"
Requires-Dist: asdf_standard==1.5.0; extra == "frozen"
Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
Requires-Dist: asgiref==3.11.1; extra == "frozen"
Requires-Dist: asteval==1.0.8; extra == "frozen"
Requires-Dist: astropy==7.0.2; extra == "frozen"
Requires-Dist: astropy-iers-data==0.2026.2.16.0.48.25; extra == "frozen"
Requires-Dist: asyncpg==0.31.0; extra == "frozen"
Requires-Dist: attrs==25.4.0; extra == "frozen"
Requires-Dist: babel==2.18.0; extra == "frozen"
Requires-Dist: billiard==4.2.4; extra == "frozen"
Requires-Dist: boto3==1.42.51; extra == "frozen"
Requires-Dist: botocore==1.42.51; extra == "frozen"
Requires-Dist: cadwyn==5.4.6; extra == "frozen"
Requires-Dist: celery==5.6.2; extra == "frozen"
Requires-Dist: certifi==2026.1.4; extra == "frozen"
Requires-Dist: cffi==2.0.0; extra == "frozen"
Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
Requires-Dist: click==8.3.1; extra == "frozen"
Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
Requires-Dist: click-repl==0.3.0; extra == "frozen"
Requires-Dist: colorlog==6.10.1; extra == "frozen"
Requires-Dist: contourpy==1.3.3; extra == "frozen"
Requires-Dist: cron_descriptor==2.0.6; extra == "frozen"
Requires-Dist: croniter==6.0.0; extra == "frozen"
Requires-Dist: cryptography==46.0.5; extra == "frozen"
Requires-Dist: cycler==0.12.1; extra == "frozen"
Requires-Dist: dacite==1.9.2; extra == "frozen"
Requires-Dist: decorator==5.2.1; extra == "frozen"
Requires-Dist: dill==0.4.1; extra == "frozen"
Requires-Dist: dkist-header-validator==5.3.0; extra == "frozen"
Requires-Dist: dkist-processing-common==12.6.0rc1; extra == "frozen"
Requires-Dist: dkist-processing-core==7.0.2; extra == "frozen"
Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
Requires-Dist: dkist-processing-test==1.39.1rc1; extra == "frozen"
Requires-Dist: dkist-service-configuration==4.2.0; extra == "frozen"
Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
Requires-Dist: dkist_fits_specifications==4.21.0; extra == "frozen"
Requires-Dist: dnspython==2.8.0; extra == "frozen"
Requires-Dist: email-validator==2.3.0; extra == "frozen"
Requires-Dist: fastapi==0.117.1; extra == "frozen"
Requires-Dist: fastapi-cli==0.0.23; extra == "frozen"
Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
Requires-Dist: flower==2.0.1; extra == "frozen"
Requires-Dist: fonttools==4.61.1; extra == "frozen"
Requires-Dist: frozenlist==1.8.0; extra == "frozen"
Requires-Dist: fsspec==2026.2.0; extra == "frozen"
Requires-Dist: globus-sdk==4.4.0; extra == "frozen"
Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
Requires-Dist: gqlclient==1.2.3; extra == "frozen"
Requires-Dist: greenback==1.3.0; extra == "frozen"
Requires-Dist: greenlet==3.3.1; extra == "frozen"
Requires-Dist: grpcio==1.78.0; extra == "frozen"
Requires-Dist: h11==0.16.0; extra == "frozen"
Requires-Dist: httpcore==1.0.9; extra == "frozen"
Requires-Dist: httptools==0.7.1; extra == "frozen"
Requires-Dist: httpx==0.28.1; extra == "frozen"
Requires-Dist: humanize==4.15.0; extra == "frozen"
Requires-Dist: idna==3.11; extra == "frozen"
Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
Requires-Dist: importlib_metadata==8.7.1; extra == "frozen"
Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
Requires-Dist: jmespath==1.1.0; extra == "frozen"
Requires-Dist: jsonschema==4.26.0; extra == "frozen"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
Requires-Dist: kombu==5.6.2; extra == "frozen"
Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
Requires-Dist: libcst==1.8.6; extra == "frozen"
Requires-Dist: linkify-it-py==2.0.3; extra == "frozen"
Requires-Dist: llvmlite==0.44.0; extra == "frozen"
Requires-Dist: lmfit==1.3.4; extra == "frozen"
Requires-Dist: lockfile==0.12.2; extra == "frozen"
Requires-Dist: loguru==0.7.3; extra == "frozen"
Requires-Dist: markdown-it-py==4.0.0; extra == "frozen"
Requires-Dist: matplotlib==3.10.8; extra == "frozen"
Requires-Dist: mdurl==0.1.2; extra == "frozen"
Requires-Dist: methodtools==0.4.7; extra == "frozen"
Requires-Dist: more-itertools==10.8.0; extra == "frozen"
Requires-Dist: moviepy==2.2.1; extra == "frozen"
Requires-Dist: msgspec==0.20.0; extra == "frozen"
Requires-Dist: multidict==6.7.1; extra == "frozen"
Requires-Dist: natsort==8.4.0; extra == "frozen"
Requires-Dist: nbformat==5.10.4; extra == "frozen"
Requires-Dist: numba==0.61.2; extra == "frozen"
Requires-Dist: numpy==2.2.5; extra == "frozen"
Requires-Dist: object-clerk==1.0.0; extra == "frozen"
Requires-Dist: opentelemetry-api==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-asgi==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-botocore==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-celery==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-dbapi==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-fastapi==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pika==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-psycopg2==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pymongo==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-redis==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-requests==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-system-metrics==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
Requires-Dist: opentelemetry-proto==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-sdk==1.39.1; extra == "frozen"
Requires-Dist: opentelemetry-semantic-conventions==0.60b1; extra == "frozen"
Requires-Dist: opentelemetry-util-http==0.60b1; extra == "frozen"
Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
Requires-Dist: packaging==26.0; extra == "frozen"
Requires-Dist: pandas==3.0.0; extra == "frozen"
Requires-Dist: parfive==2.3.1; extra == "frozen"
Requires-Dist: pathspec==1.0.4; extra == "frozen"
Requires-Dist: pendulum==3.2.0; extra == "frozen"
Requires-Dist: pika==1.3.2; extra == "frozen"
Requires-Dist: pillow==11.3.0; extra == "frozen"
Requires-Dist: pip==26.0.1; extra == "frozen"
Requires-Dist: platformdirs==4.9.2; extra == "frozen"
Requires-Dist: pluggy==1.6.0; extra == "frozen"
Requires-Dist: pooch==1.9.0; extra == "frozen"
Requires-Dist: proglog==0.1.12; extra == "frozen"
Requires-Dist: prometheus_client==0.24.1; extra == "frozen"
Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
Requires-Dist: propcache==0.4.1; extra == "frozen"
Requires-Dist: protobuf==6.33.5; extra == "frozen"
Requires-Dist: psutil==7.2.2; extra == "frozen"
Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
Requires-Dist: pycparser==3.0; extra == "frozen"
Requires-Dist: pydantic==2.12.5; extra == "frozen"
Requires-Dist: pydantic-settings==2.13.0; extra == "frozen"
Requires-Dist: pydantic_core==2.41.5; extra == "frozen"
Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
Requires-Dist: pygtrie==2.5.0; extra == "frozen"
Requires-Dist: pyparsing==3.3.2; extra == "frozen"
Requires-Dist: python-daemon==3.1.2; extra == "frozen"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
Requires-Dist: python-multipart==0.0.22; extra == "frozen"
Requires-Dist: python-slugify==8.0.4; extra == "frozen"
Requires-Dist: pytz==2025.2; extra == "frozen"
Requires-Dist: redis==6.4.0; extra == "frozen"
Requires-Dist: referencing==0.37.0; extra == "frozen"
Requires-Dist: requests==2.32.5; extra == "frozen"
Requires-Dist: rich==14.3.2; extra == "frozen"
Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
Requires-Dist: rich-toolkit==0.19.4; extra == "frozen"
Requires-Dist: rpds-py==0.30.0; extra == "frozen"
Requires-Dist: s3transfer==0.16.0; extra == "frozen"
Requires-Dist: scipy==1.17.0; extra == "frozen"
Requires-Dist: semantic-version==2.10.0; extra == "frozen"
Requires-Dist: setproctitle==1.3.7; extra == "frozen"
Requires-Dist: shellingham==1.5.4; extra == "frozen"
Requires-Dist: six==1.17.0; extra == "frozen"
Requires-Dist: sniffio==1.3.1; extra == "frozen"
Requires-Dist: solar-wavelength-calibration==2.0.1; extra == "frozen"
Requires-Dist: sqids==0.5.1; extra == "frozen"
Requires-Dist: sqlparse==0.5.5; extra == "frozen"
Requires-Dist: starlette==0.48.0; extra == "frozen"
Requires-Dist: structlog==25.5.0; extra == "frozen"
Requires-Dist: sunpy==7.1.0; extra == "frozen"
Requires-Dist: svcs==25.1.0; extra == "frozen"
Requires-Dist: tabulate==0.9.0; extra == "frozen"
Requires-Dist: talus==1.3.4; extra == "frozen"
Requires-Dist: tenacity==8.5.0; extra == "frozen"
Requires-Dist: termcolor==3.3.0; extra == "frozen"
Requires-Dist: text-unidecode==1.3; extra == "frozen"
Requires-Dist: tornado==6.5.4; extra == "frozen"
Requires-Dist: tqdm==4.67.3; extra == "frozen"
Requires-Dist: traitlets==5.14.3; extra == "frozen"
Requires-Dist: typer==0.24.0; extra == "frozen"
Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
Requires-Dist: tzdata==2025.3; extra == "frozen"
Requires-Dist: tzlocal==5.3.1; extra == "frozen"
Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
Requires-Dist: uncertainties==3.2.3; extra == "frozen"
Requires-Dist: universal_pathlib==0.2.6; extra == "frozen"
Requires-Dist: urllib3==2.6.3; extra == "frozen"
Requires-Dist: uuid6==2025.0.1; extra == "frozen"
Requires-Dist: uvicorn==0.41.0; extra == "frozen"
Requires-Dist: uvloop==0.22.1; extra == "frozen"
Requires-Dist: vine==5.1.0; extra == "frozen"
Requires-Dist: voluptuous==0.16.0; extra == "frozen"
Requires-Dist: watchfiles==1.1.1; extra == "frozen"
Requires-Dist: wcwidth==0.6.0; extra == "frozen"
Requires-Dist: websockets==16.0; extra == "frozen"
Requires-Dist: wirerope==1.0.0; extra == "frozen"
Requires-Dist: wrapt==1.17.3; extra == "frozen"
Requires-Dist: yamale==6.1.0; extra == "frozen"
Requires-Dist: yarl==1.22.0; extra == "frozen"
Requires-Dist: zipp==3.23.0; extra == "frozen"

dkist-processing-test
---------------------

|codecov|

Overview
--------
The dkist-processing-test library serves as an example implementation of a Tasks and Workflows using the
`dkist-processing-core <https://pypi.org/project/dkist-processing-core/>`_ framework and
`dkist-processing-common <https://pypi.org/project/dkist-processing-common/>`_ Tasks.

The recommended project structure is to separate tasks and workflows into separate packages.

Build
-----
Artifacts are built through `bitbucket pipelines <bitbucket-pipelines.yml>`_

The pipeline can be used in other repos with a modification of the package and artifact locations
to use the names relevant to the target repo.

e.g. dkist-processing-test -> dkist-processing-vbi and dkist_processing_test -> dkist_processing_vbi

Deployment
----------
Deployment is done with `turtlebot <https://bitbucket.org/dkistdc/turtlebot/src/master/>`_ and follows
the process detailed in `dkist-processing-core <https://pypi.org/project/dkist-processing-core/>`_

Environment Variables
---------------------

.. list-table::
   :widths: 10 90
   :header-rows: 1

   * - Variable
     - Field Info
   * - LOGURU_LEVEL
     - annotation=str required=False default='INFO' alias_priority=2 validation_alias='LOGURU_LEVEL' description='Log level for the application'
   * - MESH_CONFIG
     - annotation=dict[str, MeshService] required=False default_factory=dict alias_priority=2 validation_alias='MESH_CONFIG' description='Service mesh configuration' examples=[{'upstream_service_name': {'mesh_address': 'localhost', 'mesh_port': 6742}}]
   * - RETRY_CONFIG
     - annotation=RetryConfig required=False default_factory=RetryConfig description='Retry configuration for the service'
   * - OTEL_SERVICE_NAME
     - annotation=str required=False default='unknown-service-name' alias_priority=2 validation_alias='OTEL_SERVICE_NAME' description='Service name for OpenTelemetry'
   * - DKIST_SERVICE_VERSION
     - annotation=str required=False default='unknown-service-version' alias_priority=2 validation_alias='DKIST_SERVICE_VERSION' description='Service version for OpenTelemetry'
   * - NOMAD_ALLOC_ID
     - annotation=str required=False default='unknown-allocation-id' alias_priority=2 validation_alias='NOMAD_ALLOC_ID' description='Nomad allocation ID for OpenTelemetry'
   * - NOMAD_ALLOC_NAME
     - annotation=str required=False default='unknown-allocation-name' alias='NOMAD_ALLOC_NAME' alias_priority=2 description='Allocation name for the deployed container the task is running on.'
   * - NOMAD_GROUP_NAME
     - annotation=str required=False default='unknown-allocation-group' alias='NOMAD_GROUP_NAME' alias_priority=2 description='Allocation group for the deployed container the task is running on'
   * - OTEL_EXPORTER_OTLP_TRACES_INSECURE
     - annotation=bool required=False default=True description='Use insecure connection for OTLP traces'
   * - OTEL_EXPORTER_OTLP_METRICS_INSECURE
     - annotation=bool required=False default=True description='Use insecure connection for OTLP metrics'
   * - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='OTLP traces endpoint. Overrides mesh configuration' examples=['localhost:4317']
   * - OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='OTLP metrics endpoint. Overrides mesh configuration' examples=['localhost:4317']
   * - OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
     - annotation=list[str] required=False default_factory=list description='List of instrumentations to disable. https://opentelemetry.io/docs/zero-code/python/configuration/' examples=[['pika', 'requests']]
   * - OTEL_PYTHON_FASTAPI_EXCLUDED_URLS
     - annotation=str required=False default='health' description='Comma separated list of URLs to exclude from OpenTelemetry instrumentation in FastAPI.' examples=['client/.*/info,healthcheck']
   * - SYSTEM_METRIC_INSTRUMENTATION_CONFIG
     - annotation=Union[dict[str, bool], NoneType] required=False default=None description='Configuration for system metric instrumentation. https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/system_metrics/system_metrics.html' examples=[{'system.memory.usage': ['used', 'free', 'cached'], 'system.cpu.time': ['idle', 'user', 'system', 'irq'], 'system.network.io': ['transmit', 'receive'], 'process.runtime.memory': ['rss', 'vms'], 'process.runtime.cpu.time': ['user', 'system'], 'process.runtime.context_switches': ['involuntary', 'voluntary']}]
   * - ISB_USERNAME
     - annotation=str required=False default='guest' description='Username for the interservice-bus.'
   * - ISB_PASSWORD
     - annotation=str required=False default='guest' description='Password for the interservice-bus.'
   * - ISB_EXCHANGE
     - annotation=str required=False default='master.direct.x' description='Exchange for the interservice-bus.'
   * - ISB_QUEUE_TYPE
     - annotation=str required=False default='classic' description='Queue type for the interservice-bus.' examples=['quorum', 'classic']
   * - BUILD_VERSION
     - annotation=str required=False default='dev' description='Fallback build version for workflow tasks.'
   * - MAX_FILE_DESCRIPTORS
     - annotation=int required=False default=1024 description='Maximum number of file descriptors to allow the process.'
   * - GQL_AUTH_TOKEN
     - annotation=Union[str, NoneType] required=False default='dev' description='The auth token for the metadata-store-api.'
   * - OBJECT_STORE_ACCESS_KEY
     - annotation=Union[str, NoneType] required=False default=None description='The access key for the object store.'
   * - OBJECT_STORE_SECRET_KEY
     - annotation=Union[str, NoneType] required=False default=None description='The secret key for the object store.'
   * - OBJECT_STORE_USE_SSL
     - annotation=bool required=False default=False description='Whether to use SSL for the object store connection.'
   * - MULTIPART_THRESHOLD
     - annotation=Union[int, NoneType] required=False default=None description='Multipart threshold for the object store.'
   * - S3_CLIENT_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 client configuration for the object store.'
   * - S3_UPLOAD_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 upload configuration for the object store.'
   * - S3_DOWNLOAD_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 download configuration for the object store.'
   * - GLOBUS_MAX_RETRIES
     - annotation=int required=False default=5 description='Max retries for transient errors on calls to the globus api.'
   * - GLOBUS_INBOUND_CLIENT_CREDENTIALS
     - annotation=list[GlobusClientCredential] required=False default_factory=list description='Globus client credentials for inbound transfers.' examples=[[{'client_id': 'id1', 'client_secret': 'secret1'}, {'client_id': 'id2', 'client_secret': 'secret2'}]]
   * - GLOBUS_OUTBOUND_CLIENT_CREDENTIALS
     - annotation=list[GlobusClientCredential] required=False default_factory=list description='Globus client credentials for outbound transfers.' examples=[[{'client_id': 'id3', 'client_secret': 'secret3'}, {'client_id': 'id4', 'client_secret': 'secret4'}]]
   * - OBJECT_STORE_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='Object store Globus Endpoint ID.'
   * - SCRATCH_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='Scratch Globus Endpoint ID.'
   * - SCRATCH_BASE_PATH
     - annotation=str required=False default='scratch/' description='Base path for scratch storage.'
   * - SCRATCH_INVENTORY_DB_COUNT
     - annotation=int required=False default=16 description='Number of databases in the scratch inventory (redis).'
   * - DOCS_BASE_URL
     - annotation=str required=False default='my_test_url' description='Base URL for the documentation site.'

Development
-----------

.. code-block:: bash

    git clone git@bitbucket.org:dkistdc/dkist-processing-test.git
    cd dkist-processing-test
    pre-commit install
    pip install -e .[test]
    pytest -v --cov dkist_processing_test

Deployment
----------

When a new release is ready to be built the following steps need to be taken:

1. Freezing Dependencies
#########################

A new "frozen" extra is generated by the `dkist-dev-tools <https://bitbucket.org/dkistdc/dkist-dev-tools/src/main/>`_
package. If you don't have `dkist-dev-tools` installed please follow the directions from that repo.

To freeze dependencies run

.. code-block:: bash

    ddt freeze vX.Y.Z[rcK]

Where "vX.Y.Z[rcK]" is the version about to be released.

2. Tag and Push
###############

Once all commits are in place add a git tag that will define the released version, then push the tags up to Bitbucket:

.. code-block:: bash

    git tag vX.Y.Z[rcK]
    git push --tags origin BRANCH

In the case of an rc, BRANCH will likely be your development branch. For full releases BRANCH should be "main".

.. |codecov| image:: https://codecov.io/bb/dkistdc/dkist-processing-test/graph/badge.svg?token=U004CWS46G
   :target: https://codecov.io/bb/dkistdc/dkist-processing-test
