Metadata-Version: 2.4
Name: dkist-processing-test
Version: 1.36.1
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.12
Requires-Python: >=3.12
Description-Content-Type: text/x-rst
Requires-Dist: dkist-processing-common==11.7.0
Requires-Dist: dkist-header-validator==5.2.1
Requires-Dist: dkist-service-configuration==4.1.7
Requires-Dist: dkist-fits-specifications==4.17.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.10.0; extra == "inventory"
Provides-Extra: asdf
Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
Requires-Dist: dkist-inventory[asdf]==1.10.0; extra == "asdf"
Provides-Extra: quality
Requires-Dist: dkist-quality==2.0.0; extra == "quality"
Provides-Extra: frozen
Requires-Dist: ConfigUpdater==3.2; extra == "frozen"
Requires-Dist: Deprecated==1.2.18; extra == "frozen"
Requires-Dist: Flask==2.2.5; extra == "frozen"
Requires-Dist: Flask-AppBuilder==4.5.3; extra == "frozen"
Requires-Dist: Flask-Babel==2.0.0; extra == "frozen"
Requires-Dist: Flask-Caching==2.3.1; extra == "frozen"
Requires-Dist: Flask-JWT-Extended==4.7.1; extra == "frozen"
Requires-Dist: Flask-Limiter==3.12; extra == "frozen"
Requires-Dist: Flask-Login==0.6.3; extra == "frozen"
Requires-Dist: Flask-SQLAlchemy==2.5.1; extra == "frozen"
Requires-Dist: Flask-Session==0.5.0; extra == "frozen"
Requires-Dist: Flask-WTF==1.2.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.10.1; extra == "frozen"
Requires-Dist: PyYAML==6.0.3; extra == "frozen"
Requires-Dist: Pygments==2.19.2; extra == "frozen"
Requires-Dist: SQLAlchemy==1.4.54; extra == "frozen"
Requires-Dist: SQLAlchemy-JSONField==1.0.2; extra == "frozen"
Requires-Dist: SQLAlchemy-Utils==0.42.0; extra == "frozen"
Requires-Dist: WTForms==3.2.1; extra == "frozen"
Requires-Dist: Werkzeug==2.2.3; extra == "frozen"
Requires-Dist: aioftp==0.27.2; extra == "frozen"
Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
Requires-Dist: aiohttp==3.13.0; extra == "frozen"
Requires-Dist: aiosignal==1.4.0; extra == "frozen"
Requires-Dist: aiosmtplib==4.0.2; extra == "frozen"
Requires-Dist: alembic==1.16.5; extra == "frozen"
Requires-Dist: amqp==5.3.1; extra == "frozen"
Requires-Dist: annotated-types==0.7.0; extra == "frozen"
Requires-Dist: anyio==4.11.0; extra == "frozen"
Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-celery==3.10.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-compat==1.7.4; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-io==1.6.3; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-sql==1.28.1; extra == "frozen"
Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
Requires-Dist: apache-airflow-providers-ftp==3.13.2; extra == "frozen"
Requires-Dist: apache-airflow-providers-http==5.3.4; extra == "frozen"
Requires-Dist: apache-airflow-providers-imap==3.9.2; extra == "frozen"
Requires-Dist: apache-airflow-providers-postgres==6.3.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-smtp==2.3.1; extra == "frozen"
Requires-Dist: apache-airflow-providers-sqlite==4.1.2; extra == "frozen"
Requires-Dist: apispec==6.8.4; extra == "frozen"
Requires-Dist: argcomplete==3.6.2; extra == "frozen"
Requires-Dist: asdf==3.5.0; extra == "frozen"
Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
Requires-Dist: asgiref==3.10.0; extra == "frozen"
Requires-Dist: asteval==1.0.6; extra == "frozen"
Requires-Dist: astropy==7.0.2; extra == "frozen"
Requires-Dist: astropy-iers-data==0.2025.10.6.0.35.25; extra == "frozen"
Requires-Dist: asyncpg==0.30.0; extra == "frozen"
Requires-Dist: attrs==25.4.0; extra == "frozen"
Requires-Dist: babel==2.17.0; extra == "frozen"
Requires-Dist: billiard==4.2.2; extra == "frozen"
Requires-Dist: blinker==1.9.0; extra == "frozen"
Requires-Dist: boto3==1.40.48; extra == "frozen"
Requires-Dist: botocore==1.40.48; extra == "frozen"
Requires-Dist: cachelib==0.13.0; extra == "frozen"
Requires-Dist: celery==5.3.1; extra == "frozen"
Requires-Dist: certifi==2025.10.5; extra == "frozen"
Requires-Dist: cffi==2.0.0; extra == "frozen"
Requires-Dist: charset-normalizer==3.4.3; extra == "frozen"
Requires-Dist: click==8.3.0; 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: clickclick==20.10.2; extra == "frozen"
Requires-Dist: colorama==0.4.6; extra == "frozen"
Requires-Dist: colorlog==6.9.0; extra == "frozen"
Requires-Dist: connexion==2.14.2; 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.2; 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.0; extra == "frozen"
Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
Requires-Dist: dkist-processing-common==11.7.0; extra == "frozen"
Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
Requires-Dist: dkist-processing-test==1.36.1; extra == "frozen"
Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
Requires-Dist: dkist_fits_specifications==4.17.0; extra == "frozen"
Requires-Dist: dnspython==2.8.0; extra == "frozen"
Requires-Dist: email-validator==2.3.0; extra == "frozen"
Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
Requires-Dist: flower==2.0.1; extra == "frozen"
Requires-Dist: fonttools==4.60.1; extra == "frozen"
Requires-Dist: frozenlist==1.8.0; extra == "frozen"
Requires-Dist: fsspec==2025.9.0; extra == "frozen"
Requires-Dist: globus-sdk==3.65.0; extra == "frozen"
Requires-Dist: google-re2==1.1.20250805; extra == "frozen"
Requires-Dist: googleapis-common-protos==1.70.0; extra == "frozen"
Requires-Dist: gqlclient==1.2.3; extra == "frozen"
Requires-Dist: greenlet==3.2.4; extra == "frozen"
Requires-Dist: grpcio==1.75.1; extra == "frozen"
Requires-Dist: gunicorn==23.0.0; extra == "frozen"
Requires-Dist: h11==0.16.0; extra == "frozen"
Requires-Dist: httpcore==1.0.9; extra == "frozen"
Requires-Dist: httpx==0.28.1; extra == "frozen"
Requires-Dist: humanize==4.13.0; extra == "frozen"
Requires-Dist: idna==3.10; extra == "frozen"
Requires-Dist: imageio==2.37.0; extra == "frozen"
Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
Requires-Dist: inflection==0.5.1; extra == "frozen"
Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
Requires-Dist: jmespath==1.0.1; extra == "frozen"
Requires-Dist: jsonschema==4.25.1; extra == "frozen"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
Requires-Dist: jupyter_core==5.8.1; extra == "frozen"
Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
Requires-Dist: kombu==5.5.4; extra == "frozen"
Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
Requires-Dist: limits==5.6.0; 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: marshmallow==3.26.1; extra == "frozen"
Requires-Dist: marshmallow-oneofschema==3.2.0; extra == "frozen"
Requires-Dist: marshmallow-sqlalchemy==0.28.2; extra == "frozen"
Requires-Dist: matplotlib==3.10.7; extra == "frozen"
Requires-Dist: mdit-py-plugins==0.5.0; 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: multidict==6.7.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.37.0; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-asgi==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-botocore==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-celery==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-dbapi==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-fastapi==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pika==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-psycopg2==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pymongo==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-redis==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-requests==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-system-metrics==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
Requires-Dist: opentelemetry-proto==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-sdk==1.37.0; extra == "frozen"
Requires-Dist: opentelemetry-semantic-conventions==0.58b0; extra == "frozen"
Requires-Dist: opentelemetry-util-http==0.58b0; extra == "frozen"
Requires-Dist: ordered-set==4.1.0; extra == "frozen"
Requires-Dist: packaging==25.0; extra == "frozen"
Requires-Dist: pandas==2.3.3; extra == "frozen"
Requires-Dist: parfive==2.2.0; extra == "frozen"
Requires-Dist: pathlib_abc==0.5.1; extra == "frozen"
Requires-Dist: pathspec==0.12.1; extra == "frozen"
Requires-Dist: pendulum==3.1.0; extra == "frozen"
Requires-Dist: pika==1.3.2; extra == "frozen"
Requires-Dist: pillow==11.3.0; extra == "frozen"
Requires-Dist: pip==25.2; extra == "frozen"
Requires-Dist: platformdirs==4.5.0; extra == "frozen"
Requires-Dist: pluggy==1.6.0; extra == "frozen"
Requires-Dist: pooch==1.8.2; extra == "frozen"
Requires-Dist: prison==0.2.1; extra == "frozen"
Requires-Dist: proglog==0.1.12; extra == "frozen"
Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
Requires-Dist: propcache==0.4.1; extra == "frozen"
Requires-Dist: protobuf==6.32.1; extra == "frozen"
Requires-Dist: psutil==7.1.0; extra == "frozen"
Requires-Dist: psycopg2-binary==2.9.10; extra == "frozen"
Requires-Dist: pycparser==2.23; extra == "frozen"
Requires-Dist: pydantic==2.12.0; extra == "frozen"
Requires-Dist: pydantic-settings==2.11.0; extra == "frozen"
Requires-Dist: pydantic_core==2.41.1; extra == "frozen"
Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
Requires-Dist: pyparsing==3.2.5; 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.1.1; extra == "frozen"
Requires-Dist: python-nvd3==0.16.0; 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.36.2; extra == "frozen"
Requires-Dist: requests==2.32.5; extra == "frozen"
Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
Requires-Dist: rich==13.9.4; extra == "frozen"
Requires-Dist: rich-argparse==1.7.1; extra == "frozen"
Requires-Dist: rpds-py==0.27.1; extra == "frozen"
Requires-Dist: s3transfer==0.14.0; extra == "frozen"
Requires-Dist: scipy==1.16.2; extra == "frozen"
Requires-Dist: semantic-version==2.10.0; extra == "frozen"
Requires-Dist: setproctitle==1.3.7; extra == "frozen"
Requires-Dist: six==1.17.0; extra == "frozen"
Requires-Dist: sniffio==1.3.1; extra == "frozen"
Requires-Dist: solar-wavelength-calibration==1.0.1; extra == "frozen"
Requires-Dist: sqids==0.5.1; extra == "frozen"
Requires-Dist: sqlparse==0.5.3; extra == "frozen"
Requires-Dist: sunpy==7.0.2; 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.1.0; extra == "frozen"
Requires-Dist: text-unidecode==1.3; extra == "frozen"
Requires-Dist: tornado==6.5.2; extra == "frozen"
Requires-Dist: tqdm==4.67.1; extra == "frozen"
Requires-Dist: traitlets==5.14.3; extra == "frozen"
Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
Requires-Dist: tzdata==2025.2; 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.3.3; extra == "frozen"
Requires-Dist: urllib3==2.5.0; extra == "frozen"
Requires-Dist: vine==5.1.0; extra == "frozen"
Requires-Dist: voluptuous==0.15.2; extra == "frozen"
Requires-Dist: wcwidth==0.2.14; extra == "frozen"
Requires-Dist: wirerope==1.0.0; extra == "frozen"
Requires-Dist: wrapt==1.17.3; extra == "frozen"
Requires-Dist: yamale==6.0.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'
   * - 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.'
   * - 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_TRANSPORT_PARAMS
     - annotation=dict required=False default_factory=dict description='Globus transfer parameters.'
   * - GLOBUS_CLIENT_ID
     - annotation=Union[str, NoneType] required=False default=None description='Globus client ID for inbound/outbound transfers.'
   * - GLOBUS_CLIENT_SECRET
     - annotation=Union[str, NoneType] required=False default=None description='Globus client secret for inbound/outbound transfers.'
   * - 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
