diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 5a488df..c2c98d6 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -3,15 +3,12 @@ updates:
- package-ecosystem: pip
directory: "/"
schedule:
- interval: daily
+ interval: "weekly"
# Raise pull requests for version updates
# to pip against the `develop` branch
target-branch: "develop"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
- # Check for updates to GitHub Actions every weekday
- interval: "daily"
- # Raise pull requests for version updates
- # to pip against the `develop` branch
+ interval: "weekly"
target-branch: "develop"
diff --git a/.github/workflows/build-pipeline.yml b/.github/workflows/build-pipeline.yml
new file mode 100644
index 0000000..205c39b
--- /dev/null
+++ b/.github/workflows/build-pipeline.yml
@@ -0,0 +1,135 @@
+# When code is pushed to a branch, run linting and tests, and
+# then automatically increment the version number as appropriate for the branch source.
+name: Lint and Test
+
+# Controls when the workflow will run
+on:
+ # Triggers the workflow on push events
+ push:
+ branches: [ develop, release/**, main, feature/**, issue/**, issues/** ]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+jobs:
+ run_tests:
+ uses: ./.github/workflows/reusable_run_tests.yml
+
+ bump_version:
+ needs: run_tests
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+
+ - name: Install Poetry
+ uses: abatilo/actions-poetry@v2.3.0
+ with:
+ poetry-version: 1.3.2
+
+ - name: Get version
+ id: get-version
+ run: |
+ echo "current_version=$(poetry version | awk '{print $2}')" >> $GITHUB_OUTPUT
+ echo "pyproject_name=$(poetry version | awk '{print $1}')" >> $GITHUB_ENV
+
+# - name: Bump pre-alpha version
+# # If triggered by push to a feature branch
+# if: |
+# ${{ startsWith(github.ref, 'refs/heads/issue') }} ||
+# ${{ startsWith(github.ref, 'refs/heads/dependabot/') }} ||
+# ${{ startsWith(github.ref, 'refs/heads/feature/') }}
+# run: |
+# new_ver="${{ steps.get-version.outputs.current_version }}+$(git rev-parse --short ${GITHUB_SHA})"
+# poetry version $new_ver
+# echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
+#
+# - name: Bump alpha version
+# # If triggered by push to the develop branch
+# if: ${{ github.ref == 'refs/heads/develop' }}
+# run: |
+# poetry version prerelease
+# echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
+# echo "venue=sit" >> $GITHUB_ENV
+#
+# - name: Bump rc version
+# # If triggered by push to a release branch
+# if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
+# env:
+# # True if the version already has a 'rc' pre-release identifier
+# BUMP_RC: ${{ contains(steps.get-version.outputs.current_version, 'rc') }}
+# run: |
+# if [ "$BUMP_RC" = true ]; then
+# poetry version prerelease
+# else
+# poetry version ${GITHUB_REF#refs/heads/release/}rc1
+# fi
+# echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
+# echo "venue=uat" >> $GITHUB_ENV
+#
+# - name: Release version
+# # If triggered by push to the main branch
+# if: ${{ startsWith(github.ref, 'refs/heads/main') }}
+# env:
+# CURRENT_VERSION: ${{ steps.get-version.outputs.current_version }}
+# # Remove rc* from the end of version string
+# # The ${string%%substring} syntax below deletes the longest match of $substring from back of $string.
+# run: |
+# poetry version ${CURRENT_VERSION%%rc*}
+# echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
+# echo "venue=ops" >> $GITHUB_ENV
+#
+# - name: Commit Version Bump
+# # If building develop, a release branch, or main then we commit the version bump back to the repo
+# if: |
+# github.ref == 'refs/heads/develop' ||
+# github.ref == 'refs/heads/main' ||
+# startsWith(github.ref, 'refs/heads/release')
+# run: |
+# git config --global user.name 'batchee bot'
+# git config --global user.email 'batchee@noreply.github.com'
+# git commit -am "/version ${{ env.software_version }}"
+# git push
+#
+# - name: Push Tag
+# if: |
+# github.ref == 'refs/heads/develop' ||
+# github.ref == 'refs/heads/main' ||
+# startsWith(github.ref, 'refs/heads/release')
+# run: |
+# git config user.name "${GITHUB_ACTOR}"
+# git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
+# git tag -a "${{ env.software_version }}" -m "Version ${{ env.software_version }}"
+# git push origin "${{ env.software_version }}"
+
+# - name: Build Python Artifact
+# run: |
+# poetry build
+#
+# - uses: actions/upload-artifact@v3
+# with:
+# name: python-artifact
+# path: dist/*
+#
+# - name: Publish to test.pypi.org
+# id: pypi-test-publish
+# if: |
+# github.ref == 'refs/heads/develop' ||
+# startsWith(github.ref, 'refs/heads/release')
+# env:
+# POETRY_PYPI_TOKEN_TESTPYPI: ${{secrets.POETRY_PYPI_TOKEN_TESTPYPI}}
+# run: |
+# poetry config repositories.testpypi https://test.pypi.org/legacy/
+# poetry publish -r testpypi
+#
+# - name: Publish to pypi.org
+# if: ${{ github.ref == 'refs/heads/main' }}
+# id: pypi-publish
+# env:
+# POETRY_PYPI_TOKEN_PYPI: ${{secrets.POETRY_PYPI_TOKEN_PYPI}}
+# run: |
+# poetry publish
diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml
deleted file mode 100644
index eb942d6..0000000
--- a/.github/workflows/on_push.yml
+++ /dev/null
@@ -1,107 +0,0 @@
-name: Lint and Test
-
-# Controls when the workflow will run
-on:
- # Triggers the workflow on push events
- push:
- branches: [ develop, release/**, main, feature/**, issue/**, issues/** ]
-
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
-
-jobs:
- run_tests:
- uses: ./.github/workflows/run_tests.yml
-
- bump_version:
- needs: run_tests
- runs-on: ubuntu-20.04
-
- steps:
- - name: Retrieve repository
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v4
- with:
- python-version: '3.10'
-
- - name: Install Poetry
- uses: abatilo/actions-poetry@v2.3.0
- with:
- poetry-version: 1.3.2
-
- - name: Get version
- id: get-version
- run: |
- echo "current_version=$(poetry version | awk '{print $2}')" >> $GITHUB_OUTPUT
- echo "pyproject_name=$(poetry version | awk '{print $1}')" >> $GITHUB_ENV
-
- - name: Bump pre-alpha version
- # If triggered by push to a feature branch
- if: |
- ${{ startsWith(github.ref, 'refs/heads/issue') }} ||
- ${{ startsWith(github.ref, 'refs/heads/dependabot/') }} ||
- ${{ startsWith(github.ref, 'refs/heads/feature/') }}
- run: |
- new_ver="${{ steps.get-version.outputs.current_version }}+$(git rev-parse --short ${GITHUB_SHA})"
- poetry version $new_ver
- echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
-
- - name: Bump alpha version
- # If triggered by push to the develop branch
- if: ${{ github.ref == 'refs/heads/develop' }}
- run: |
- poetry version prerelease
- echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
- echo "venue=sit" >> $GITHUB_ENV
-
- - name: Bump rc version
- # If triggered by push to a release branch
- if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
- env:
- # True if the version already has a 'rc' pre-release identifier
- BUMP_RC: ${{ contains(steps.get-version.outputs.current_version, 'rc') }}
- run: |
- if [ "$BUMP_RC" = true ]; then
- poetry version prerelease
- else
- poetry version ${GITHUB_REF#refs/heads/release/}rc1
- fi
- echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
- echo "venue=uat" >> $GITHUB_ENV
-
- - name: Release version
- # If triggered by push to the main branch
- if: ${{ startsWith(github.ref, 'refs/heads/main') }}
- env:
- CURRENT_VERSION: ${{ steps.get-version.outputs.current_version }}
- # Remove rc* from end of version string
- # The ${string%%substring} syntax below deletes the longest match of $substring from back of $string.
- run: |
- poetry version ${CURRENT_VERSION%%rc*}
- echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
- echo "venue=ops" >> $GITHUB_ENV
-
-# - name: Commit Version Bump
-# # If building develop, a release branch, or main then we commit the version bump back to the repo
-# if: |
-# github.ref == 'refs/heads/develop' ||
-# github.ref == 'refs/heads/main' ||
-# startsWith(github.ref, 'refs/heads/release')
-# run: |
-# git config --global user.name 'batchee bot'
-# git config --global user.email 'batchee@noreply.github.com'
-# git commit -am "/version ${{ env.software_version }}"
-# git push
-#
-# - name: Push Tag
-# if: |
-# github.ref == 'refs/heads/develop' ||
-# github.ref == 'refs/heads/main' ||
-# startsWith(github.ref, 'refs/heads/release')
-# run: |
-# git config user.name "${GITHUB_ACTOR}"
-# git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
-# git tag -a "${{ env.software_version }}" -m "Version ${{ env.software_version }}"
-# git push origin "${{ env.software_version }}"
diff --git a/.github/workflows/run_tests_on_pull_requests.yml b/.github/workflows/pull-request-received.yml
similarity index 50%
rename from .github/workflows/run_tests_on_pull_requests.yml
rename to .github/workflows/pull-request-received.yml
index 3a0b4c1..fbfe8c5 100644
--- a/.github/workflows/run_tests_on_pull_requests.yml
+++ b/.github/workflows/pull-request-received.yml
@@ -1,3 +1,4 @@
+# When a pull request is opened, run linting and tests.
name: Receive PR
# read-only repo token
@@ -5,11 +6,8 @@ name: Receive PR
on:
pull_request:
# Sequence of patterns matched against refs/heads
- branches:
- - feature/**
- - issue/**
- - issues/**
+ branches: [ feature/**, issue/**, issues/** ]
jobs:
build_and_test:
- uses: ./.github/workflows/run_tests.yml
+ uses: ./.github/workflows/reusable_run_tests.yml
diff --git a/.github/workflows/release-created.yml b/.github/workflows/release-created.yml
new file mode 100644
index 0000000..62a79d7
--- /dev/null
+++ b/.github/workflows/release-created.yml
@@ -0,0 +1,40 @@
+# As soon as a release branch is pushed, the minor version on develop is bumped automatically.
+# This allows further development to continue on develop for ‘the next’ release.
+name: Release Branch Created
+
+# Run whenever a ref is created https://docs.github.com/en/actions/reference/events-that-trigger-workflows#create
+on:
+ create
+
+jobs:
+ # First job in the workflow builds and verifies the software artifacts
+ bump:
+ name: Bump minor version on develop
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+ # Only run if ref created was a release branch
+ if:
+ ${{ startsWith(github.ref, 'refs/heads/release/') }}
+ steps:
+ # Checks-out the develop branch
+ - uses: actions/checkout@v4
+ with:
+ ref: 'refs/heads/develop'
+# - uses: actions/setup-python@v4
+# with:
+# python-version: '3.10'
+# - name: Install Poetry
+# uses: abatilo/actions-poetry@v2.3.0
+# with:
+# poetry-version: 1.3.2
+## - name: Bump minor version
+## run: |
+## poetry version ${GITHUB_REF#refs/heads/release/}
+## poetry version preminor
+## echo "software_version=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV
+## - name: Commit Version Bump
+## run: |
+## git config --global user.name 'batchee bot'
+## git config --global user.email 'batchee@noreply.github.com'
+## git commit -am "/version ${{ env.software_version }}"
+## git push
diff --git a/.github/workflows/reusable_run_tests.yml b/.github/workflows/reusable_run_tests.yml
new file mode 100644
index 0000000..7337a29
--- /dev/null
+++ b/.github/workflows/reusable_run_tests.yml
@@ -0,0 +1,56 @@
+# This workflow will install Python dependencies, run tests,
+# and report test results and code coverage as artifacts. It will
+# be called by the workflow that runs tests against new PRs and as
+# a first step in the workflow that publishes new Docker images.
+
+name: A reusable workflow to build and run the unit test suite
+
+on:
+ workflow_call:
+ workflow_dispatch:
+
+jobs:
+ build_and_test:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: [ '3.10' ]
+
+ name: Python ${{ matrix.python-version }} tests
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Set up Poetry
+ uses: abatilo/actions-poetry@v2.3.0
+ with:
+ poetry-version: 1.3.2
+
+ - name: Install package
+ run: poetry install
+
+ - name: Lint
+ run: |
+ poetry run ruff batcher
+
+ - name: Run tests with coverage
+ run: |
+ poetry run pytest --cov=batcher --cov-report=xml:build/reports/coverage.xml --cov-report=html:build/reports/coverage.html tests/
+
+ - name: Archive code coverage report (xml)
+ if: ${{ always() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: code coverage report (xml)
+ path: build/reports/coverage.xml
+
+ - name: Archive code coverage report (HTML)
+ if: ${{ always() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: code coverage report (HTML)
+ path: build/reports/coverage.html
diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml
deleted file mode 100644
index 64733a9..0000000
--- a/.github/workflows/run_tests.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-# This workflow will install Python dependencies, run tests,
-# and report test results and code coverage as artifacts. It will
-# be called by the workflow that run tests against new PRs and as
-# a first step in the workflow that publishes new Docker images.
-
-name: A reusable workflow to build and run the unit test suite
-
-on:
- workflow_call:
- workflow_dispatch:
-
-jobs:
- build_and_test:
- runs-on: ubuntu-latest
-
- steps:
- - name: Retrieve repository
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v4
- with:
- python-version: '3.10'
-
- - name: Set up Poetry
- uses: abatilo/actions-poetry@v2.3.0
- with:
- poetry-version: 1.3.2
-
- - name: Install package
- run: poetry install
-
- - name: Run linting
- run: |
- poetry run ruff batcher
-
- - name: Run tests with coverage
- run: |
- poetry run coverage run -m pytest >& test_results.txt
- # poetry run pytest tests/test_filename_grouping.py >& test_results.txt
- # TODO: expand tests to include full concatenation runs, i.e., don't just run test_group_handling.py
-
- - name: Generate coverage report
- if: ${{ always() }}
- run: |
- poetry run coverage report -m >& coverage_report.txt
- poetry run coverage html --dir htmlcov
-
- - name: Archive test results
- if: ${{ always() }}
- uses: actions/upload-artifact@v3
- with:
- name: test result
- path: test_results.txt
-
- - name: Archive code coverage report (plain text)
- if: ${{ always() }}
- uses: actions/upload-artifact@v3
- with:
- name: code coverage report (plain text)
- path: coverage_report.txt
-
- - name: Archive code coverage report (HTML)
- if: ${{ always() }}
- uses: actions/upload-artifact@v3
- with:
- name: code coverage report (HTML)
- path: htmlcov/*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 2aa0f30..ba7dee6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -38,9 +38,3 @@ repos:
- id: yamllint
args: ["-d {extends: relaxed, rules: {line-length: {max: 120}}}"]
stages: [commit, push]
-
- - repo: https://github.com/pryorda/dockerfilelint-precommit-hooks
- rev: v0.1.0
- hooks:
- - id: dockerfilelint
- stages: [commit, push]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1468387..f8b85f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,9 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
+- [issue/6](https://github.com/danielfromearth/batchee/issues/6): Create Adapter code that processes a Harmony Message and STAC Catalog
+- [issue/7](https://github.com/danielfromearth/batchee/issues/7): Create working Docker image
- [issue/13](https://github.com/danielfromearth/batchee/issues/13): Add simple command line interface for testing
+- [issue/16](https://github.com/danielfromearth/batchee/issues/16): Add a logo
### Changed
- [issue/11](https://github.com/danielfromearth/batchee/issues/11): Rename from concat_batcher to batchee
+- [issue/21](https://github.com/danielfromearth/batchee/issues/21): Improve CICD workflows
### Deprecated
### Removed
### Fixed
diff --git a/docker/Dockerfile b/Dockerfile
similarity index 59%
rename from docker/Dockerfile
rename to Dockerfile
index 353fea4..96036d1 100644
--- a/docker/Dockerfile
+++ b/Dockerfile
@@ -5,12 +5,14 @@ RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
gcc \
libnetcdf-dev \
- libhdf5-dev \
- hdf5-helpers \
+ #libhdf5-dev \
+ #hdf5-helpers \
&& pip3 install --upgrade pip \
&& pip3 install cython \
+ && pip3 install poetry \
&& apt-get clean
+
# Create a new user
RUN adduser --quiet --disabled-password --shell /bin/sh --home /home/dockeruser --gecos "" --uid 1000 dockeruser
USER dockeruser
@@ -27,13 +29,25 @@ ARG DIST_PATH
USER root
RUN mkdir -p /worker && chown dockeruser /worker
+COPY pyproject.toml /worker
+# COPY ../pyproject.toml /worker
USER dockeruser
+
WORKDIR /worker
+# ENV PYTHONPATH=${PYTHONPATH}:${PWD}
+
COPY --chown=dockeruser $DIST_PATH $DIST_PATH
USER dockeruser
-RUN pip3 install --no-cache-dir --force --user --index-url https://pypi.org/simple/ --extra-index-url https://test.pypi.org/simple/ $SOURCE \
- && rm -rf $DIST_PATH
+#RUN pip3 install --no-cache-dir --force --user --index-url https://pypi.org/simple/ --extra-index-url https://test.pypi.org/simple/ $SOURCE \
+# && rm -rf $DIST_PATH
-# Run the Batchee Harmony service
-ENTRYPOINT ["batchee_harmony"]
\ No newline at end of file
+#install poetry as root
+USER root
+RUN poetry config virtualenvs.create false
+RUN poetry install --no-dev
+
+USER dockeruser
+COPY --chown=dockeruser ./docker-entrypoint.sh docker-entrypoint.sh
+# Run the service
+ENTRYPOINT ["./docker-entrypoint.sh"]
diff --git a/README.md b/README.md
index 9d5373b..0811fa8 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,40 @@
+[](stitchee_9_hex)
+
+
# Overview
_____
-_Batchee_ is used to group together filenames so that concatenation operations can be performed on
-batches.
+_Batchee_ groups together filenames so that further operations (such as concatenation) can be performed separately on each group of files.
+
+## Installing
+_____
+
+For local development, one can clone the repository and then use poetry or pip from the local directory:
+
+```shell
+git clone
+```
+
+###### (Option A) using poetry:
+i) Follow the instructions for installing `poetry` [here](https://python-poetry.org/docs/).
+
+ii) Run ```poetry install``` from the repository directory.
+
+###### (Option B) using pip: Run ```pip install .``` from the repository directory.
+
+## Usage
+_____
+
+```shell
+batchee [file_names ...]
+```
+
+###### Or, If installed using a `poetry` environment:
+```shell
+poetry run batchee [file_names ...]
+```
+
+#### Options
+
+- `-h`, `--help` show this help message and exit
+- `-v`, `--verbose` Enable verbose output to stdout; useful for debugging
diff --git a/batcher/harmony/__init__.py b/batcher/harmony/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/batcher/harmony_cli.py b/batcher/harmony/cli.py
similarity index 54%
rename from batcher/harmony_cli.py
rename to batcher/harmony/cli.py
index cec149e..802d373 100644
--- a/batcher/harmony_cli.py
+++ b/batcher/harmony/cli.py
@@ -1,33 +1,28 @@
"""A Harmony CLI wrapper around the concatenate-batcher"""
-import sys
from argparse import ArgumentParser
import harmony
-from .harmony_adapter import ConcatBatching as HarmonyAdapter
+from batcher.harmony.service_adapter import ConcatBatching as HarmonyAdapter
-def main(argv, **kwargs):
- """Main Harmony CLI entrypoint
+def main(config: harmony.util.Config = None) -> None:
+ """Parse command line arguments and invoke the service to respond to them.
- Parses command line arguments and invokes the appropriate method to respond to them
+ Parameters
+ ----------
+ config : harmony.util.Config
+ harmony.util.Config is injectable for tests
Returns
-------
None
"""
-
- config = None
- # Optional: harmony.util.Config is injectable for tests
- if "config" in kwargs:
- config = kwargs.get("config")
-
parser = ArgumentParser(
prog="Pre-concatenate-batching", description="Run the pre-concatenate-batching service"
)
harmony.setup_cli(parser)
-
- args = parser.parse_args(argv[1:])
+ args = parser.parse_args()
if harmony.is_harmony_cli(args):
harmony.run_cli(parser, args, HarmonyAdapter, cfg=config)
else:
@@ -35,4 +30,4 @@ def main(argv, **kwargs):
if __name__ == "__main__":
- main(sys.argv)
+ main()
diff --git a/batcher/harmony/service_adapter.py b/batcher/harmony/service_adapter.py
new file mode 100644
index 0000000..31bff4b
--- /dev/null
+++ b/batcher/harmony/service_adapter.py
@@ -0,0 +1,117 @@
+from uuid import uuid4
+
+import pystac
+from harmony.adapter import BaseHarmonyAdapter
+from harmony.util import bbox_to_geometry
+from pystac import Item
+from pystac.item import Asset
+
+from batcher.harmony.util import (
+ _get_netcdf_urls,
+ _get_output_bounding_box,
+ _get_output_date_range,
+)
+from batcher.tempo_filename_parser import get_batch_indices
+
+
+class ConcatBatching(BaseHarmonyAdapter):
+ """
+ A harmony-service-lib wrapper around the concatenate-batcher module.
+ This wrapper does not support Harmony calls that do not have STAC catalogs
+ as support for this behavior is being depreciated in harmony-service-lib
+ """
+
+ def __init__(self, message, catalog=None, config=None):
+ """
+ Constructs the adapter
+
+ Parameters
+ ----------
+ message : harmony.Message
+ The Harmony input which needs acting upon
+ catalog : pystac.Catalog
+ A STAC catalog containing the files on which to act
+ config : harmony.util.Config
+ The configuration values for this runtime environment.
+ """
+ super().__init__(message, catalog=catalog, config=config)
+
+ def invoke(self):
+ """
+ Primary entrypoint into the service wrapper. Overrides BaseHarmonyAdapter.invoke
+ """
+ if not self.catalog:
+ # Message-only support is being depreciated in Harmony, so we should expect to
+ # only see requests with catalogs when invoked with a newer Harmony instance
+ # https://github.com/nasa/harmony-service-lib-py/blob/21bcfbda17caf626fb14d2ac4f8673be9726b549/harmony/adapter.py#L71
+ raise RuntimeError("Invoking Batchee without a STAC catalog is not supported")
+
+ return self.message, self.process_catalog(self.catalog)
+
+ def process_catalog(self, catalog: pystac.Catalog):
+ """Converts a list of STAC catalogs into a list of lists of STAC catalogs."""
+ self.logger.info("process_catalog() started.")
+ try:
+ result = catalog.clone()
+ result.id = str(uuid4())
+ result.clear_children()
+
+ # Get all the items from the catalog, including from child or linked catalogs
+ items = list(self.get_all_catalog_items(catalog))
+
+ self.logger.info(f"length of items==={len(items)}.")
+
+ # Quick return if catalog contains no items
+ if len(items) == 0:
+ return result
+
+ # # --- Get granule filepaths (urls) ---
+ netcdf_urls: list[str] = _get_netcdf_urls(items)
+ self.logger.info(f"netcdf_urls==={netcdf_urls}.")
+
+ # --- Map each granule to an index representing the batch to which it belongs ---
+ batch_indices: list[int] = get_batch_indices(netcdf_urls, self.logger)
+ sorted(set(batch_indices), key=batch_indices.index)
+ self.logger.info(f"batch_indices==={batch_indices}.")
+
+ # --- Construct a dictionary with a separate key for each batch ---
+ grouped: dict[int, list[Item]] = {}
+ for k, v in zip(batch_indices, items):
+ grouped.setdefault(k, []).append(v)
+
+ # --- Construct a STAC Catalog that holds multiple Items (which represent each TEMPO scan),
+ # and each Item holds multiple Assets (which represent each granule).
+ result.clear_items()
+
+ for batch_id, batch_items in grouped.items():
+ batch_urls: list[str] = _get_netcdf_urls(batch_items)
+ bounding_box = _get_output_bounding_box(batch_items)
+ properties = _get_output_date_range(batch_items)
+
+ self.logger.info(f"constructing new pystac.Item for batch_id==={batch_id}.")
+
+ # Construct a new pystac.Item with every granule in the batch as a pystac.Asset
+ output_item = Item(
+ str(uuid4()), bbox_to_geometry(bounding_box), bounding_box, None, properties
+ )
+
+ for idx, item in enumerate(batch_items):
+ output_item.add_asset(
+ f"data_{idx}",
+ Asset(
+ batch_urls[idx],
+ title=batch_urls[idx],
+ media_type="application/x-netcdf4",
+ roles=["data"],
+ ),
+ )
+
+ result.add_item(output_item)
+
+ self.logger.info("STAC catalog creation complete.")
+
+ return result
+
+ except Exception as service_exception:
+ self.logger.error(service_exception, exc_info=1)
+ raise service_exception
diff --git a/batcher/harmony/util.py b/batcher/harmony/util.py
new file mode 100644
index 0000000..f77aeb9
--- /dev/null
+++ b/batcher/harmony/util.py
@@ -0,0 +1,98 @@
+"""Misc utility functions"""
+from datetime import datetime
+
+from pystac import Asset, Item
+
+VALID_EXTENSIONS = (".nc4", ".nc")
+VALID_MEDIA_TYPES = ["application/x-netcdf", "application/x-netcdf4"]
+
+
+def _is_netcdf_asset(asset: Asset) -> bool:
+ """Check that a `pystac.Asset` is a valid NetCDF-4 granule. This can be
+ ascertained via either the media type or by checking the extension of
+ granule itself if that media type is absent.
+
+ """
+ return asset.media_type in VALID_MEDIA_TYPES or (
+ asset.media_type is None and asset.href.lower().endswith(VALID_EXTENSIONS)
+ )
+
+
+def _get_item_url(item: Item) -> str | None:
+ """Check the `pystac.Item` for the first asset with the `data` role and a
+ valid input format. If there are no matching assets, return None
+
+ """
+ return next(
+ (
+ asset.href
+ for asset in item.assets.values()
+ if "data" in (asset.roles or []) and _is_netcdf_asset(asset)
+ ),
+ None,
+ )
+
+
+def _get_netcdf_urls(items: list[Item]) -> list[str]:
+ """Iterate through a list of `pystac.Item` instances, from the input
+ `pystac.Catalog`. Extract the `pystac.Asset.href` for the first asset
+ of each item that has a role of "data". If there are any items that do
+ not have a data asset, then raise an exception.
+
+ """
+ catalog_urls = [_get_item_url(item) for item in items]
+
+ if None in catalog_urls:
+ raise RuntimeError("Some input granules do not have NetCDF-4 assets.")
+
+ return catalog_urls # type: ignore[return-value]
+
+
+def _get_output_bounding_box(input_items: list[Item]) -> list[float]:
+ """Create a bounding box that is the maximum combined extent of all input
+ `pystac.Item` bounding box extents.
+
+ """
+ bounding_box = input_items[0].bbox
+
+ for item in input_items:
+ bounding_box[0] = min(bounding_box[0], item.bbox[0])
+ bounding_box[1] = min(bounding_box[1], item.bbox[1])
+ bounding_box[2] = max(bounding_box[2], item.bbox[2])
+ bounding_box[3] = max(bounding_box[3], item.bbox[3])
+
+ return bounding_box
+
+
+def _get_output_date_range(input_items: list[Item]) -> dict[str, str]:
+ """Create a dictionary of start and end datetime, which encompasses the
+ full temporal range of all input `pystac.Item` instances. This output
+ dictionary will be used for the `properties` of the output Zarr store
+ `pystac.Item`.
+
+ """
+ start_datetime, end_datetime = _get_item_date_range(input_items[0])
+
+ for item in input_items:
+ new_start_datetime, new_end_datetime = _get_item_date_range(item)
+ start_datetime = min(start_datetime, new_start_datetime)
+ end_datetime = max(end_datetime, new_end_datetime)
+
+ return {"start_datetime": start_datetime.isoformat(), "end_datetime": end_datetime.isoformat()}
+
+
+def _get_item_date_range(item: Item) -> tuple[datetime, datetime]:
+ """A helper function to retrieve the temporal range from a `pystac.Item`
+ instance. If the `pystac.Item.datetime` property exists, there is a
+ single datetime associated with the granule, otherwise there will be a
+ start and end time contained within the `pystac.Item` metadata.
+
+ """
+ if item.datetime is None:
+ start_datetime = item.common_metadata.start_datetime
+ end_datetime = item.common_metadata.end_datetime
+ else:
+ start_datetime = item.datetime
+ end_datetime = item.datetime
+
+ return start_datetime, end_datetime
diff --git a/batcher/harmony_adapter.py b/batcher/harmony_adapter.py
deleted file mode 100644
index 80c1976..0000000
--- a/batcher/harmony_adapter.py
+++ /dev/null
@@ -1,104 +0,0 @@
-from harmony.adapter import BaseHarmonyAdapter
-from pystac import Catalog, Item
-from pystac.item import Asset
-
-from batcher.tempo_filename_parser import get_unique_day_scan_categories
-
-VALID_EXTENSIONS = (".nc4", ".nc")
-VALID_MEDIA_TYPES = ["application/x-netcdf", "application/x-netcdf4"]
-
-
-def _is_netcdf_asset(asset: Asset) -> bool:
- """Check that a `pystac.Asset` is a valid NetCDF-4 granule. This can be
- ascertained via either the media type or by checking the extension of
- granule itself if that media type is absent.
-
- """
- return asset.media_type in VALID_MEDIA_TYPES or (
- asset.media_type is None and asset.href.lower().endswith(VALID_EXTENSIONS)
- )
-
-
-def _get_item_url(item: Item) -> str | None:
- """Check the `pystac.Item` for the first asset with the `data` role and a
- valid input format. If there are no matching assets, return None
-
- """
- return next(
- (
- asset.href
- for asset in item.assets.values()
- if "data" in (asset.roles or []) and _is_netcdf_asset(asset)
- ),
- None,
- )
-
-
-def _get_netcdf_urls(items: list[Item]) -> list[str]:
- """Iterate through a list of `pystac.Item` instances, from the input
- `pystac.Catalog`. Extract the `pystac.Asset.href` for the first asset
- of each item that has a role of "data". If there are any items that do
- not have a data asset, then raise an exception.
-
- """
- catalog_urls = [_get_item_url(item) for item in items]
-
- if None in catalog_urls:
- raise RuntimeError("Some input granules do not have NetCDF-4 assets.")
-
- return catalog_urls # type: ignore[return-value]
-
-
-class ConcatBatching(BaseHarmonyAdapter):
- """
- A harmony-service-lib wrapper around the concatenate-batcher module.
- This wrapper does not support Harmony calls that do not have STAC catalogs
- as support for this behavior is being depreciated in harmony-service-lib
- """
-
- def __init__(self, message, catalog=None, config=None):
- """
- Constructs the adapter
-
- Parameters
- ----------
- message : harmony.Message
- The Harmony input which needs acting upon
- catalog : pystac.Catalog
- A STAC catalog containing the files on which to act
- config : harmony.util.Config
- The configuration values for this runtime environment.
- """
- super().__init__(message, catalog=catalog, config=config)
-
- def invoke(self):
- """
- Primary entrypoint into the service wrapper. Overrides BaseHarmonyAdapter.invoke
- """
- if not self.catalog:
- # Message-only support is being depreciated in Harmony, so we should expect to
- # only see requests with catalogs when invoked with a newer Harmony instance
- # https://github.com/nasa/harmony-service-lib-py/blob/21bcfbda17caf626fb14d2ac4f8673be9726b549/harmony/adapter.py#L71
- raise RuntimeError("Invoking Batcher without a STAC catalog is not supported")
-
- return self.message, self.process_items_many_to_one()
-
- def process_items_many_to_one(self):
- """Converts a list of STAC catalogs into a list of lists of STAC catalogs."""
- try:
- items: list[Catalog] = list(self.get_all_catalog_items(self.catalog))
- netcdf_urls: list[str] = _get_netcdf_urls(items)
-
- batch_indices: list[int] = get_unique_day_scan_categories(netcdf_urls)
- unique_category_indices: list[int] = sorted(set(batch_indices), key=batch_indices.index)
-
- grouped: dict[int, list[Catalog]] = {}
- for k, v in zip(batch_indices, items):
- grouped.setdefault(k, []).append(v)
- catalogs: list[list[Catalog]] = [grouped[k] for k in unique_category_indices]
-
- return catalogs
-
- except Exception as service_exception:
- self.logger.error(service_exception, exc_info=1)
- raise service_exception
diff --git a/batcher/tempo_filename_parser.py b/batcher/tempo_filename_parser.py
index c75e04e..06488d4 100644
--- a/batcher/tempo_filename_parser.py
+++ b/batcher/tempo_filename_parser.py
@@ -4,6 +4,8 @@
from argparse import ArgumentParser
from pathlib import Path
+default_logger = logging.getLogger(__name__)
+
tempo_granule_filename_pattern = re.compile(
r"^.*TEMPO_"
r"(?P[1-9A-Z]+)"
@@ -17,13 +19,15 @@
)
-def get_unique_day_scan_categories(filenames: list) -> list[int]:
+def get_batch_indices(filenames: list, logger: logging.Logger = default_logger) -> list[int]:
"""
Returns
-------
list[int]
- category integer for each filename in the original list, e.g. [0, 0, 0, 1, 1, 1, ...]
+ batch index for each filename in the original list, e.g. [0, 0, 0, 1, 1, 1, ...]
"""
+ logger.info(f"get_batch_indices() starting --- with {len(filenames)} filenames")
+
# Make a new list with days and scans, e.g. [('20130701', 'S009'), ('20130701', 'S009'), ...]
day_and_scans: list[tuple[str, str]] = []
for name in filenames:
@@ -32,19 +36,21 @@ def get_unique_day_scan_categories(filenames: list) -> list[int]:
match_dict = matches.groupdict()
day_and_scans.append((match_dict["day_in_granule"], match_dict["daily_scan_id"]))
- # Unique categories are determined, while keeping the same order
+ # Unique day-scans are determined (while keeping the same order). Each will be its own batch.
unique_day_scans: list[tuple[str, str]] = sorted(set(day_and_scans), key=day_and_scans.index)
+ logger.info(f"unique_day_scans==={unique_day_scans}.")
+
# Map each day/scan to an integer
- category_mapper: dict[tuple[str, str], int] = {
+ batch_mapper: dict[tuple[str, str], int] = {
day_scan: idx for idx, day_scan in enumerate(unique_day_scans)
}
# Generate a new list with the integer representation for each entry in the original list
- return [category_mapper[day_scan] for day_scan in day_and_scans]
+ return [batch_mapper[day_scan] for day_scan in day_and_scans]
-def main():
+def main() -> list[list[str]]:
"""Main CLI entrypoint"""
parser = ArgumentParser(
@@ -69,7 +75,7 @@ def main():
input_filenames = [str(Path(f).resolve()) for f in args.file_names]
- batch_indices = get_unique_day_scan_categories(input_filenames)
+ batch_indices = get_batch_indices(input_filenames)
unique_category_indices: list[int] = sorted(set(batch_indices), key=batch_indices.index)
logging.info(f"batch_indices = {batch_indices}")
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
new file mode 100755
index 0000000..9ce02d6
--- /dev/null
+++ b/docker-entrypoint.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -e
+
+if [ "$1" = 'batchee' ]; then
+ exec batchee "$@"
+elif [ "$1" = 'batchee_harmony' ]; then
+ exec batchee_harmony "$@"
+else
+ exec batchee_harmony "$@"
+fi
diff --git a/docker/Readme.md b/docker/Readme.md
deleted file mode 100644
index 5f05138..0000000
--- a/docker/Readme.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Batchee Service Docker Image
-
-This directory contains the `Dockerfile` used to build the Docker image capable of running the Batchee service.
-
-## Building
-
-The docker image is setup to install the Batchee project into userspace using pip. It will look
-in both PyPi and TestPyPi indexes unless building from a local wheel file.
\ No newline at end of file
diff --git a/poetry.lock b/poetry.lock
index 1872cb6..a2af622 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2,33 +2,28 @@
[[package]]
name = "black"
-version = "23.9.1"
+version = "23.10.1"
description = "The uncompromising code formatter."
optional = false
python-versions = ">=3.8"
files = [
- {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"},
- {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"},
- {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"},
- {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"},
- {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"},
- {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"},
- {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"},
- {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"},
- {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"},
- {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"},
- {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"},
- {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"},
- {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"},
- {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"},
- {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"},
- {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"},
- {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"},
- {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"},
- {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"},
- {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"},
- {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"},
- {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"},
+ {file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"},
+ {file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"},
+ {file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"},
+ {file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"},
+ {file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"},
+ {file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"},
+ {file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"},
+ {file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"},
+ {file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"},
+ {file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"},
+ {file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"},
+ {file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"},
+ {file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"},
+ {file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"},
+ {file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"},
+ {file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"},
+ {file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"},
]
[package.dependencies]
@@ -48,17 +43,17 @@ uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "boto3"
-version = "1.28.58"
+version = "1.28.73"
description = "The AWS SDK for Python"
optional = false
python-versions = ">= 3.7"
files = [
- {file = "boto3-1.28.58-py3-none-any.whl", hash = "sha256:71dcd596a82b5341c6941117b9228897bfb1e2b58f73e60e1fdda1b02a847cc8"},
- {file = "boto3-1.28.58.tar.gz", hash = "sha256:2f18d2dac5d9229e8485b556eb58b7b95fca91bbf002f63bf9c39209f513f6e6"},
+ {file = "boto3-1.28.73-py3-none-any.whl", hash = "sha256:bbe377a288b6b12b526fae3b3d743318c6868626cf67e1e97f104345a5194b1e"},
+ {file = "boto3-1.28.73.tar.gz", hash = "sha256:a61cf96f7e196b1450afdf4856b7ea0e58080752e687b0011157be96934489be"},
]
[package.dependencies]
-botocore = ">=1.31.58,<1.32.0"
+botocore = ">=1.31.73,<1.32.0"
jmespath = ">=0.7.1,<2.0.0"
s3transfer = ">=0.7.0,<0.8.0"
@@ -67,19 +62,19 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
[[package]]
name = "botocore"
-version = "1.31.58"
+version = "1.31.73"
description = "Low-level, data-driven core of boto 3."
optional = false
python-versions = ">= 3.7"
files = [
- {file = "botocore-1.31.58-py3-none-any.whl", hash = "sha256:83a3ca4d9247fdbde76c654137e6ab648bd976f652ce2354def1715c838af505"},
- {file = "botocore-1.31.58.tar.gz", hash = "sha256:002f8bdca8efde50ae7267f342bc1d03a71d76024ce3949e4ffdd1151581c53e"},
+ {file = "botocore-1.31.73-py3-none-any.whl", hash = "sha256:6e9caaa7205e0c0505f4868a4053e96eaf3f4b6bce0368a46970a8efeeacb492"},
+ {file = "botocore-1.31.73.tar.gz", hash = "sha256:5334c22d5a3f4643931896137c57b2496fef005b039d87d8740e7a28eb31519d"},
]
[package.dependencies]
jmespath = ">=0.7.1,<2.0.0"
python-dateutil = ">=2.1,<3.0.0"
-urllib3 = ">=1.25.4,<1.27"
+urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""}
[package.extras]
crt = ["awscrt (==0.16.26)"]
@@ -161,101 +156,101 @@ pycparser = "*"
[[package]]
name = "charset-normalizer"
-version = "3.3.0"
+version = "3.3.1"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"},
- {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"},
- {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"},
- {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"},
- {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"},
- {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"},
- {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"},
- {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"},
+ {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"},
+ {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"},
+ {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"},
+ {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"},
+ {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"},
+ {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"},
+ {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"},
+ {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"},
]
[[package]]
@@ -344,6 +339,9 @@ files = [
{file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"},
]
+[package.dependencies]
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
+
[package.extras]
toml = ["tomli"]
@@ -430,38 +428,38 @@ files = [
[[package]]
name = "mypy"
-version = "1.5.1"
+version = "1.6.1"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"},
- {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"},
- {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"},
- {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"},
- {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"},
- {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"},
- {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"},
- {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"},
- {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"},
- {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"},
- {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"},
- {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"},
- {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"},
- {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"},
- {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"},
- {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"},
- {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"},
- {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"},
- {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"},
- {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"},
- {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"},
- {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"},
- {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"},
- {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"},
- {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"},
- {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"},
- {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"},
+ {file = "mypy-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e5012e5cc2ac628177eaac0e83d622b2dd499e28253d4107a08ecc59ede3fc2c"},
+ {file = "mypy-1.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8fbb68711905f8912e5af474ca8b78d077447d8f3918997fecbf26943ff3cbb"},
+ {file = "mypy-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a1ad938fee7d2d96ca666c77b7c494c3c5bd88dff792220e1afbebb2925b5e"},
+ {file = "mypy-1.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b96ae2c1279d1065413965c607712006205a9ac541895004a1e0d4f281f2ff9f"},
+ {file = "mypy-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:40b1844d2e8b232ed92e50a4bd11c48d2daa351f9deee6c194b83bf03e418b0c"},
+ {file = "mypy-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81af8adaa5e3099469e7623436881eff6b3b06db5ef75e6f5b6d4871263547e5"},
+ {file = "mypy-1.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8c223fa57cb154c7eab5156856c231c3f5eace1e0bed9b32a24696b7ba3c3245"},
+ {file = "mypy-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8032e00ce71c3ceb93eeba63963b864bf635a18f6c0c12da6c13c450eedb183"},
+ {file = "mypy-1.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c46b51de523817a0045b150ed11b56f9fff55f12b9edd0f3ed35b15a2809de0"},
+ {file = "mypy-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:19f905bcfd9e167159b3d63ecd8cb5e696151c3e59a1742e79bc3bcb540c42c7"},
+ {file = "mypy-1.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:82e469518d3e9a321912955cc702d418773a2fd1e91c651280a1bda10622f02f"},
+ {file = "mypy-1.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4473c22cc296425bbbce7e9429588e76e05bc7342da359d6520b6427bf76660"},
+ {file = "mypy-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a0d7d24dfb26729e0a068639a6ce3500e31d6655df8557156c51c1cb874ce7"},
+ {file = "mypy-1.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cfd13d47b29ed3bbaafaff7d8b21e90d827631afda134836962011acb5904b71"},
+ {file = "mypy-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:eb4f18589d196a4cbe5290b435d135dee96567e07c2b2d43b5c4621b6501531a"},
+ {file = "mypy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41697773aa0bf53ff917aa077e2cde7aa50254f28750f9b88884acea38a16169"},
+ {file = "mypy-1.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7274b0c57737bd3476d2229c6389b2ec9eefeb090bbaf77777e9d6b1b5a9d143"},
+ {file = "mypy-1.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbaf4662e498c8c2e352da5f5bca5ab29d378895fa2d980630656178bd607c46"},
+ {file = "mypy-1.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bb8ccb4724f7d8601938571bf3f24da0da791fe2db7be3d9e79849cb64e0ae85"},
+ {file = "mypy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:68351911e85145f582b5aa6cd9ad666c8958bcae897a1bfda8f4940472463c45"},
+ {file = "mypy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:49ae115da099dcc0922a7a895c1eec82c1518109ea5c162ed50e3b3594c71208"},
+ {file = "mypy-1.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b27958f8c76bed8edaa63da0739d76e4e9ad4ed325c814f9b3851425582a3cd"},
+ {file = "mypy-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:925cd6a3b7b55dfba252b7c4561892311c5358c6b5a601847015a1ad4eb7d332"},
+ {file = "mypy-1.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8f57e6b6927a49550da3d122f0cb983d400f843a8a82e65b3b380d3d7259468f"},
+ {file = "mypy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a43ef1c8ddfdb9575691720b6352761f3f53d85f1b57d7745701041053deff30"},
+ {file = "mypy-1.6.1-py3-none-any.whl", hash = "sha256:4cbe68ef919c28ea561165206a2dcb68591c50f3bcf777932323bc208d949cf1"},
+ {file = "mypy-1.6.1.tar.gz", hash = "sha256:4d01c00d09a0be62a4ca3f933e315455bde83f37f892ba4b08ce92f3cf44bcc1"},
]
[package.dependencies]
@@ -593,13 +591,13 @@ validation = ["jsonschema (==3.2.0)"]
[[package]]
name = "pytest"
-version = "7.4.2"
+version = "7.4.3"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"},
- {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"},
+ {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
+ {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
]
[package.dependencies]
@@ -613,6 +611,24 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
[package.extras]
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+[[package]]
+name = "pytest-cov"
+version = "4.1.0"
+description = "Pytest plugin for measuring coverage."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
+ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
+]
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
+
[[package]]
name = "python-dateutil"
version = "2.8.2"
@@ -661,28 +677,28 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "ruff"
-version = "0.0.292"
+version = "0.1.3"
description = "An extremely fast Python linter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
- {file = "ruff-0.0.292-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:02f29db018c9d474270c704e6c6b13b18ed0ecac82761e4fcf0faa3728430c96"},
- {file = "ruff-0.0.292-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:69654e564342f507edfa09ee6897883ca76e331d4bbc3676d8a8403838e9fade"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c3c91859a9b845c33778f11902e7b26440d64b9d5110edd4e4fa1726c41e0a4"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4476f1243af2d8c29da5f235c13dca52177117935e1f9393f9d90f9833f69e4"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be8eb50eaf8648070b8e58ece8e69c9322d34afe367eec4210fdee9a555e4ca7"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9889bac18a0c07018aac75ef6c1e6511d8411724d67cb879103b01758e110a81"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6bdfabd4334684a4418b99b3118793f2c13bb67bf1540a769d7816410402a205"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7c77c53bfcd75dbcd4d1f42d6cabf2485d2e1ee0678da850f08e1ab13081a8"},
- {file = "ruff-0.0.292-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e087b24d0d849c5c81516ec740bf4fd48bf363cfb104545464e0fca749b6af9"},
- {file = "ruff-0.0.292-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f160b5ec26be32362d0774964e218f3fcf0a7da299f7e220ef45ae9e3e67101a"},
- {file = "ruff-0.0.292-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ac153eee6dd4444501c4bb92bff866491d4bfb01ce26dd2fff7ca472c8df9ad0"},
- {file = "ruff-0.0.292-py3-none-musllinux_1_2_i686.whl", hash = "sha256:87616771e72820800b8faea82edd858324b29bb99a920d6aa3d3949dd3f88fb0"},
- {file = "ruff-0.0.292-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b76deb3bdbea2ef97db286cf953488745dd6424c122d275f05836c53f62d4016"},
- {file = "ruff-0.0.292-py3-none-win32.whl", hash = "sha256:e854b05408f7a8033a027e4b1c7f9889563dd2aca545d13d06711e5c39c3d003"},
- {file = "ruff-0.0.292-py3-none-win_amd64.whl", hash = "sha256:f27282bedfd04d4c3492e5c3398360c9d86a295be00eccc63914438b4ac8a83c"},
- {file = "ruff-0.0.292-py3-none-win_arm64.whl", hash = "sha256:7f67a69c8f12fbc8daf6ae6d36705037bde315abf8b82b6e1f4c9e74eb750f68"},
- {file = "ruff-0.0.292.tar.gz", hash = "sha256:1093449e37dd1e9b813798f6ad70932b57cf614e5c2b5c51005bf67d55db33ac"},
+ {file = "ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:b46d43d51f7061652eeadb426a9e3caa1e0002470229ab2fc19de8a7b0766901"},
+ {file = "ruff-0.1.3-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b8afeb9abd26b4029c72adc9921b8363374f4e7edb78385ffaa80278313a15f9"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca3cf365bf32e9ba7e6db3f48a4d3e2c446cd19ebee04f05338bc3910114528b"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4874c165f96c14a00590dcc727a04dca0cfd110334c24b039458c06cf78a672e"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec2dd31eed114e48ea42dbffc443e9b7221976554a504767ceaee3dd38edeb8"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dc3ec4edb3b73f21b4aa51337e16674c752f1d76a4a543af56d7d04e97769613"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e3de9ed2e39160800281848ff4670e1698037ca039bda7b9274f849258d26ce"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c595193881922cc0556a90f3af99b1c5681f0c552e7a2a189956141d8666fe8"},
+ {file = "ruff-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f75e670d529aa2288cd00fc0e9b9287603d95e1536d7a7e0cafe00f75e0dd9d"},
+ {file = "ruff-0.1.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76dd49f6cd945d82d9d4a9a6622c54a994689d8d7b22fa1322983389b4892e20"},
+ {file = "ruff-0.1.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:918b454bc4f8874a616f0d725590277c42949431ceb303950e87fef7a7d94cb3"},
+ {file = "ruff-0.1.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8859605e729cd5e53aa38275568dbbdb4fe882d2ea2714c5453b678dca83784"},
+ {file = "ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0b6c55f5ef8d9dd05b230bb6ab80bc4381ecb60ae56db0330f660ea240cb0d4a"},
+ {file = "ruff-0.1.3-py3-none-win32.whl", hash = "sha256:3e7afcbdcfbe3399c34e0f6370c30f6e529193c731b885316c5a09c9e4317eef"},
+ {file = "ruff-0.1.3-py3-none-win_amd64.whl", hash = "sha256:7a18df6638cec4a5bd75350639b2bb2a2366e01222825562c7346674bdceb7ea"},
+ {file = "ruff-0.1.3-py3-none-win_arm64.whl", hash = "sha256:12fd53696c83a194a2db7f9a46337ce06445fb9aa7d25ea6f293cf75b21aca9f"},
+ {file = "ruff-0.1.3.tar.gz", hash = "sha256:3ba6145369a151401d5db79f0a47d50e470384d0d89d0d6f7fab0b589ad07c34"},
]
[[package]]
@@ -754,4 +770,4 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "2eddcedad9f6e921f2e1b770870a16780915ca6765fc63cc2c0a8130744fe001"
+content-hash = "13d72d5e93ac5ddb6bd054b98d9cf04ed920d251e91e623fb0a48a17b777cf2e"
diff --git a/pyproject.toml b/pyproject.toml
index 3399aed..1c090dd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,17 +15,18 @@ packages = [
python = "^3.10"
harmony-service-lib = "^1.0.23"
-[tool.poetry.group.dev.dependencies]
-pytest = "^7.4.2"
-black = "^23.9.1"
-mypy = "^1.5.1"
-ruff = "^0.0.292"
-coverage = "^7.3.2"
-
[tool.poetry.scripts]
-batchee_harmony = 'batcher.harmony_cli:main'
+batchee_harmony = 'batcher.harmony.cli:main'
batchee = 'batcher.tempo_filename_parser:main'
+[tool.poetry.group.dev.dependencies]
+coverage = "^7.3.2"
+ruff = "^0.1.3"
+pytest = "^7.4.3"
+black = "^23.10.1"
+mypy = "^1.6.1"
+pytest-cov = "^4.1.0"
+
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
diff --git a/tests/test_filename_grouping.py b/tests/test_filename_grouping.py
index 945a79a..83ae365 100644
--- a/tests/test_filename_grouping.py
+++ b/tests/test_filename_grouping.py
@@ -1,4 +1,4 @@
-from batcher.tempo_filename_parser import get_unique_day_scan_categories
+from batcher.tempo_filename_parser import get_batch_indices
example_filenames = [
"TEMPO_HCHO_L2_V01_20130701T212354Z_S009G05.nc",
@@ -11,6 +11,6 @@
def test_grouping():
- results = get_unique_day_scan_categories(example_filenames)
+ results = get_batch_indices(example_filenames)
assert results == [0, 0, 0, 1, 1, 1]