diff --git a/.github/PULL_REQUEST_TEMPLATE/new_container.md b/.github/PULL_REQUEST_TEMPLATE/new_container.md
index dcdff17b..29b8190d 100644
--- a/.github/PULL_REQUEST_TEMPLATE/new_container.md
+++ b/.github/PULL_REQUEST_TEMPLATE/new_container.md
@@ -2,7 +2,7 @@ You have implemented a new container and would like to contribute it? Great! Her
- [ ] Create a new feature directory and populate it with the package structure [described in the documentation](https://testcontainers-python.readthedocs.io/en/latest/#package-structure). Copying one of the existing features is likely the best way to get started.
- [ ] Implement the new feature (typically in `__init__.py`) and corresponding tests.
-- [ ] Add a line `-e file:[feature name]` to `requirements.in` and run `make requirements`. This command will find any new requirements and generate lock files to ensure reproducible builds (see the [pip-tools documentation](https://pip-tools.readthedocs.io/en/latest/) for details). Then run `pip install -r requirements/[your python version].txt` to install the new requirements.
- [ ] Update the feature `README.rst` and add it to the table of contents (`toctree` directive) in the top-level `README.rst`.
-- [ ] Add a line `[feature name]` to the list of components in the GitHub Action workflow in `.github/workflows/main.yml` to run tests, build, and publish your package when pushed to the `master` branch.
-- [ ] Rebase your development branch on `master` (or merge `master` into your development branch).
+- [ ] Add a line `[feature name]` to the list of components in the GitHub Action workflow in `.github/workflows/main.yml` to run tests, build, and publish your package when pushed to the `main` branch.
+- [ ] Rebase your development branch on `main` (or merge `main` into your development branch).
+- [ ] Add a line `-e file:[feature name]` to `requirements.in` and open a pull request. Opening a pull request will automatically generate lock files to ensure reproducible builds (see the [pip-tools documentation](https://pip-tools.readthedocs.io/en/latest/) for details). Finally, run `python get_requirements.py --pr=[your PR number]` to fetch the updated requirement files (the build needs to have succeeded).
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 893fa5f9..266d60dd 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -1,9 +1,9 @@
name: testcontainers documentation
on:
push:
- branches: [master]
+ branches: [main]
pull_request:
- branches: [master]
+ branches: [main]
jobs:
build:
@@ -15,10 +15,10 @@ jobs:
with:
python-version: "3.10"
cache: pip
- cache-dependency-path: requirements/3.10.txt
+ cache-dependency-path: requirements/ubuntu-latest-3.10.txt
- name: Install Python dependencies
run: |
pip install --upgrade pip
- pip install -r requirements/3.10.txt
+ pip install -r requirements/ubuntu-latest-3.10.txt
- name: Build documentation
run: make docs
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index be6d0bcd..84b8ca10 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,57 +1,62 @@
name: testcontainers packages
on:
push:
- branches: [master]
+ branches: [main]
pull_request:
- branches: [master]
+ branches: [main]
jobs:
build:
strategy:
matrix:
- python-version:
- - "3.7"
- - "3.8"
- - "3.9"
- - "3.10"
- - "3.11"
+ runtime:
+ - machine: ubuntu-latest
+ python-version: "3.7"
+ - machine: ubuntu-latest
+ python-version: "3.8"
+ - machine: ubuntu-latest
+ python-version: "3.9"
+ - machine: ubuntu-latest
+ python-version: "3.10"
+ - machine: ubuntu-latest
+ python-version: "3.11"
component:
- - arangodb
- - azurite
- - clickhouse
- - compose
- - core
- - elasticsearch
- - google
- - kafka
- - keycloak
- - localstack
- - meta
- - minio
- - mongodb
- - mssql
- - mysql
- - neo4j
- - nginx
- - opensearch
- - oracle
- - postgres
- - rabbitmq
- - redis
- - selenium
- runs-on: ubuntu-latest
+ - arangodb
+ - azurite
+ - clickhouse
+ - compose
+ - core
+ - elasticsearch
+ - google
+ - kafka
+ - keycloak
+ - localstack
+ - meta
+ - minio
+ - mongodb
+ - mssql
+ - mysql
+ - neo4j
+ - nginx
+ - opensearch
+ - oracle
+ - postgres
+ - rabbitmq
+ - redis
+ - selenium
+ runs-on: ${{ matrix.runtime.machine }}
steps:
- uses: actions/checkout@v3
- - name: Setup python ${{ matrix.python-version }}
+ - name: Setup python ${{ matrix.runtime.python-version }}
uses: actions/setup-python@v4
with:
- python-version: ${{ matrix.python-version }}
+ python-version: ${{ matrix.runtime.python-version }}
cache: pip
- cache-dependency-path: ${{ format('requirements/{0}.txt', matrix.python-version) }}
+ cache-dependency-path: ${{ format('requirements/{0}-{1}.txt', matrix.runtime.machine, matrix.runtime.python-version) }}
- name: Install Python dependencies
run: |
pip install --upgrade pip
- pip install -r requirements/${{ matrix.python-version }}.txt
+ pip install -r requirements/${{ matrix.runtime.machine }}-${{ matrix.runtime.python-version }}.txt
- name: Run docker diagnostics
if: matrix.component == 'core'
run: |
@@ -76,9 +81,10 @@ jobs:
- name: Upload the package to pypi
if: >
github.event_name == 'push'
- && github.ref == 'refs/heads/master'
+ && github.ref == 'refs/heads/main'
&& github.repository_owner == 'testcontainers'
- && matrix.python-version == '3.10'
+ && matrix.runtime.python-version == '3.10'
+ && matrix.runtime.machine == 'ubuntu-latest'
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/requirements.yml b/.github/workflows/requirements.yml
index 684447d4..72c41f30 100644
--- a/.github/workflows/requirements.yml
+++ b/.github/workflows/requirements.yml
@@ -1,35 +1,43 @@
name: testcontainers requirements
on:
push:
- branches: [master]
+ branches: [main]
pull_request:
- branches: [master]
+ branches: [main]
jobs:
requirements:
strategy:
+ fail-fast: false
matrix:
- python-version:
- - "3.7"
- - "3.8"
- - "3.9"
- - "3.10"
- - "3.11"
- runs-on: ubuntu-latest
+ runtime:
+ - machine: ubuntu-latest
+ python-version: "3.7"
+ - machine: ubuntu-latest
+ python-version: "3.8"
+ - machine: ubuntu-latest
+ python-version: "3.9"
+ - machine: ubuntu-latest
+ python-version: "3.10"
+ - machine: ubuntu-latest
+ python-version: "3.11"
+ - machine: windows-latest
+ python-version: "3.10"
+ - machine: macos-latest
+ python-version: "3.10"
+ runs-on: ${{ matrix.runtime.machine }}
steps:
- uses: actions/checkout@v3
- - name: Setup python ${{ matrix.python-version }}
+ - name: Setup python ${{ matrix.runtime.python-version }}
uses: actions/setup-python@v4
with:
- python-version: ${{ matrix.python-version }}
+ python-version: ${{ matrix.runtime.python-version }}
- name: Update pip and install pip-tools
run: pip install --upgrade pip pip-tools
- name: Build requirements
- run: |
- rm requirements/${{ matrix.python-version }}.txt
- pip-compile --resolver=backtracking -v --upgrade -o requirements/${{ matrix.python-version }}.txt
+ run: pip-compile --resolver=backtracking -v --upgrade -o requirements.txt
- name: Store requirements as artifact
uses: actions/upload-artifact@v3
with:
- name: requirements-${{ matrix.python-version }}.txt
- path: requirements/${{ matrix.python-version }}.txt
+ name: requirements-${{ matrix.runtime.machine }}-${{ matrix.runtime.python-version }}.txt
+ path: requirements.txt
diff --git a/.gitignore b/.gitignore
index a2c62686..3da297de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -72,3 +72,4 @@ venv
.DS_Store
.python-version
.env
+.github-token
diff --git a/Makefile b/Makefile
index 4eaf1cc4..501172c9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,6 @@
PYTHON_VERSIONS = 3.7 3.8 3.9 3.10 3.11
PYTHON_VERSION ?= 3.10
IMAGE = testcontainers-python:${PYTHON_VERSION}
-REQUIREMENTS = $(addprefix requirements/,${PYTHON_VERSIONS:=.txt})
RUN = docker run --rm -it
# Get all directories that contain a setup.py and get the directory name.
PACKAGES = $(subst /,,$(dir $(wildcard */setup.py)))
@@ -26,7 +25,7 @@ ${DISTRIBUTIONS} : %/dist : %/setup.py
# Targets to run the test suite for each package.
tests : ${TESTS}
${TESTS} : %/tests :
- pytest -svx --cov-report=term-missing --cov=testcontainers.$* --tb=short $*/tests
+ pytest -svx --cov-report=term-missing --cov=testcontainers.$* --tb=short --strict-markers $*/tests
# Targets to lint the code.
lint : ${LINT}
@@ -43,7 +42,7 @@ ${UPLOAD} : %/upload :
fi
# Targets to build docker images
-image: requirements/${PYTHON_VERSION}.txt
+image: requirements/ubunut-latest-${PYTHON_VERSION}.txt
docker build --build-arg version=${PYTHON_VERSION} -t ${IMAGE} .
# Targets to run tests in docker containers
@@ -63,13 +62,6 @@ doctest : ${DOCTESTS}
${DOCTESTS} : %/doctest :
sphinx-build -b doctest -c doctests $* docs/_build
-# Targets to build requirement files
-requirements : ${REQUIREMENTS}
-${REQUIREMENTS} : requirements/%.txt : requirements.in */setup.py
- mkdir -p $(dir $@)
- ${RUN} -w /workspace -v `pwd`:/workspace --platform=linux/amd64 python:$* bash -c \
- "pip install pip-tools && pip-compile --resolver=backtracking -v --upgrade -o $@ $<"
-
# Remove any generated files.
clean :
rm -rf docs/_build
diff --git a/README.rst b/README.rst
index 08145687..f490e76b 100644
--- a/README.rst
+++ b/README.rst
@@ -108,11 +108,4 @@ Testcontainers is a collection of `implicit namespace packages `__ documentation for details). Then run :code:`pip install -r requirements/[your python version].txt` to install the new requirements.
-4. Update the feature :code:`README.rst` and add it to the table of contents (:code:`toctree` directive) in the top-level :code:`README.rst`.
-5. Add a line :code:`[feature name]` to the list of components in the GitHub Action workflow in :code:`.github/workflows/main.yml` to run tests, build, and publish your package when pushed to the :code:`master` branch.
-6. Rebase your development branch on :code:`master` (or merge :code:`master` into your development branch).
+You want to contribute a new feature or container? Great! You can do that in six steps as outlined `here __`.
diff --git a/get_requirements.py b/get_requirements.py
new file mode 100644
index 00000000..b1ebc6db
--- /dev/null
+++ b/get_requirements.py
@@ -0,0 +1,94 @@
+import argparse
+import io
+import pathlib
+import requests
+import shutil
+import tempfile
+import zipfile
+
+
+def __main__() -> None:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--owner", default="testcontainers")
+ parser.add_argument("--repo", default="testcontainers-python")
+ parser.add_argument("--run", help="GitHub Action run id")
+ parser.add_argument("--pr", help="GitHub PR number")
+ parser.add_argument("--branch", default="main")
+ parser.add_argument("--token", help="GitHub autentication token")
+ args = parser.parse_args()
+
+ # Get an access token.
+ if args.token:
+ token = args.token
+ elif (path := pathlib.Path(".github-token")).is_file():
+ token = path.read_text().strip()
+ else:
+ token = input("we need a GitHub access token to fetch the requirements; please visit "
+ "https://github.com/settings/tokens/new, create a token with `public_repo` "
+ "scope, and paste it here: ").strip()
+ cache = input("do you want to cache the token in a `.github-token` file [Ny]? ")
+ if cache.lower().startswith("y"):
+ path.write_text(token)
+
+ headers = {
+ "Authorization": f"Bearer {token}",
+ }
+ base_url = f"https://api.github.com/repos/{args.owner}/{args.repo}"
+
+ if args.run: # Run id was specified.
+ run = args.run
+ elif args.pr: # PR was specified, let's get the most recent run id.
+ print(f"fetching most recent commit for PR #{args.pr}")
+ response = requests.get(f"{base_url}/pulls/{args.pr}", headers=headers)
+ response.raise_for_status()
+ response = response.json()
+ head_sha = response["head"]["sha"]
+ else: # Nothing was specified, let's get the most recent run id on the main branch.
+ print(f"fetching most recent commit for branch `{args.branch}`")
+ response = requests.get(f"{base_url}/branches/{args.branch}", headers=headers)
+ response.raise_for_status()
+ response = response.json()
+ head_sha = response["commit"]["sha"]
+
+ # List all completed runs and find the one that generated the requirements.
+ response = requests.get(f"{base_url}/actions/runs", headers=headers, params={
+ "head_sha": head_sha,
+ "status": "success",
+ })
+ response.raise_for_status()
+ response = response.json()
+
+ # Get the requirements run.
+ runs = [run for run in response["workflow_runs"] if
+ run["path"].endswith("requirements.yml")]
+ if len(runs) != 1:
+ raise RuntimeError(f"could not identify unique workflow run: {runs}")
+ run = runs[0]["id"]
+
+ # Get all the artifacts.
+ print(f"fetching artifacts for run {run} ...")
+ url = f"{base_url}/actions/runs/{run}/artifacts"
+ response = requests.get(url, headers=headers)
+ response.raise_for_status()
+ response = response.json()
+ artifacts = response["artifacts"]
+ print(f"discovered {len(artifacts)} artifacts")
+
+ # Get the content for each artifact and save it.
+ for artifact in artifacts:
+ name: str = artifact["name"]
+ name = name.removeprefix("requirements-")
+ print(f"fetching artifact {name} ...")
+ response = requests.get(artifact["archive_download_url"], headers=headers)
+ response.raise_for_status()
+ with zipfile.ZipFile(io.BytesIO(response.content)) as zip, \
+ tempfile.TemporaryDirectory() as tempdir:
+ zip.extract("requirements.txt", tempdir)
+ shutil.move(pathlib.Path(tempdir) / "requirements.txt",
+ pathlib.Path("requirements") / name)
+
+ print("done")
+
+
+if __name__ == "__main__":
+ __main__()
diff --git a/requirements/macos-latest-3.10.txt b/requirements/macos-latest-3.10.txt
new file mode 100644
index 00000000..429a054f
--- /dev/null
+++ b/requirements/macos-latest-3.10.txt
@@ -0,0 +1,445 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --output-file=requirements.txt --resolver=backtracking
+#
+-e file:meta
+ # via -r requirements.in
+-e file:arangodb
+ # via -r requirements.in
+-e file:azurite
+ # via -r requirements.in
+-e file:clickhouse
+ # via -r requirements.in
+-e file:compose
+ # via -r requirements.in
+-e file:core
+ # via
+ # -r requirements.in
+ # testcontainers
+ # testcontainers-arangodb
+ # testcontainers-azurite
+ # testcontainers-clickhouse
+ # testcontainers-compose
+ # testcontainers-elasticsearch
+ # testcontainers-gcp
+ # testcontainers-kafka
+ # testcontainers-keycloak
+ # testcontainers-localstack
+ # testcontainers-minio
+ # testcontainers-mongodb
+ # testcontainers-mssql
+ # testcontainers-mysql
+ # testcontainers-neo4j
+ # testcontainers-nginx
+ # testcontainers-opensearch
+ # testcontainers-oracle
+ # testcontainers-postgres
+ # testcontainers-rabbitmq
+ # testcontainers-redis
+ # testcontainers-selenium
+-e file:elasticsearch
+ # via -r requirements.in
+-e file:google
+ # via -r requirements.in
+-e file:kafka
+ # via -r requirements.in
+-e file:keycloak
+ # via -r requirements.in
+-e file:localstack
+ # via -r requirements.in
+-e file:minio
+ # via -r requirements.in
+-e file:mongodb
+ # via -r requirements.in
+-e file:mssql
+ # via -r requirements.in
+-e file:mysql
+ # via -r requirements.in
+-e file:neo4j
+ # via -r requirements.in
+-e file:nginx
+ # via -r requirements.in
+-e file:opensearch
+ # via -r requirements.in
+-e file:oracle
+ # via -r requirements.in
+-e file:postgres
+ # via -r requirements.in
+-e file:rabbitmq
+ # via -r requirements.in
+-e file:redis
+ # via -r requirements.in
+-e file:selenium
+ # via -r requirements.in
+alabaster==0.7.13
+ # via sphinx
+asn1crypto==1.5.1
+ # via scramp
+async-generator==1.10
+ # via trio
+async-timeout==4.0.2
+ # via redis
+attrs==23.1.0
+ # via
+ # jsonschema
+ # outcome
+ # trio
+azure-core==1.26.4
+ # via azure-storage-blob
+azure-storage-blob==12.16.0
+ # via testcontainers-azurite
+babel==2.12.1
+ # via sphinx
+bcrypt==4.0.1
+ # via paramiko
+bleach==6.0.0
+ # via readme-renderer
+boto3==1.26.129
+ # via testcontainers-localstack
+botocore==1.29.129
+ # via
+ # boto3
+ # s3transfer
+cachetools==5.3.0
+ # via google-auth
+certifi==2022.12.7
+ # via
+ # minio
+ # opensearch-py
+ # requests
+ # selenium
+cffi==1.15.1
+ # via
+ # cryptography
+ # pynacl
+charset-normalizer==3.1.0
+ # via requests
+clickhouse-driver==0.2.6
+ # via testcontainers-clickhouse
+coverage[toml]==7.2.5
+ # via pytest-cov
+cryptography==36.0.2
+ # via
+ # -r requirements.in
+ # azure-storage-blob
+ # paramiko
+cx-oracle==8.3.0
+ # via testcontainers-oracle
+deprecation==2.1.0
+ # via python-keycloak
+distro==1.8.0
+ # via docker-compose
+dnspython==2.3.0
+ # via pymongo
+docker[ssh]==6.1.0
+ # via
+ # docker-compose
+ # testcontainers-core
+docker-compose==1.29.2
+ # via testcontainers-compose
+dockerpty==0.4.1
+ # via docker-compose
+docopt==0.6.2
+ # via docker-compose
+docutils==0.19
+ # via
+ # readme-renderer
+ # sphinx
+ecdsa==0.18.0
+ # via python-jose
+entrypoints==0.3
+ # via flake8
+exceptiongroup==1.1.1
+ # via
+ # pytest
+ # trio
+ # trio-websocket
+flake8==3.7.9
+ # via -r requirements.in
+google-api-core[grpc]==2.11.0
+ # via google-cloud-pubsub
+google-auth==2.17.3
+ # via google-api-core
+google-cloud-pubsub==2.16.1
+ # via testcontainers-gcp
+googleapis-common-protos[grpc]==1.59.0
+ # via
+ # google-api-core
+ # grpc-google-iam-v1
+ # grpcio-status
+greenlet==2.0.2
+ # via sqlalchemy
+grpc-google-iam-v1==0.12.6
+ # via google-cloud-pubsub
+grpcio==1.54.0
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+ # googleapis-common-protos
+ # grpc-google-iam-v1
+ # grpcio-status
+grpcio-status==1.54.0
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+h11==0.14.0
+ # via wsproto
+idna==3.4
+ # via
+ # requests
+ # trio
+imagesize==1.4.1
+ # via sphinx
+importlib-metadata==6.6.0
+ # via
+ # keyring
+ # twine
+iniconfig==2.0.0
+ # via pytest
+isodate==0.6.1
+ # via azure-storage-blob
+jaraco-classes==3.2.3
+ # via keyring
+jinja2==3.1.2
+ # via sphinx
+jmespath==1.0.1
+ # via
+ # boto3
+ # botocore
+jsonschema==3.2.0
+ # via docker-compose
+kafka-python==2.0.2
+ # via testcontainers-kafka
+keyring==23.13.1
+ # via twine
+markdown-it-py==2.2.0
+ # via rich
+markupsafe==2.1.2
+ # via jinja2
+mccabe==0.6.1
+ # via flake8
+mdurl==0.1.2
+ # via markdown-it-py
+minio==7.1.14
+ # via testcontainers-minio
+more-itertools==9.1.0
+ # via jaraco-classes
+neo4j==5.8.0
+ # via testcontainers-neo4j
+opensearch-py==2.2.0
+ # via testcontainers-opensearch
+outcome==1.2.0
+ # via trio
+packaging==23.1
+ # via
+ # deprecation
+ # docker
+ # pytest
+ # sphinx
+paramiko==3.1.0
+ # via docker
+pg8000==1.29.4
+ # via -r requirements.in
+pika==1.3.2
+ # via testcontainers-rabbitmq
+pkginfo==1.9.6
+ # via twine
+pluggy==1.0.0
+ # via pytest
+proto-plus==1.22.2
+ # via google-cloud-pubsub
+protobuf==4.22.4
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+ # googleapis-common-protos
+ # grpc-google-iam-v1
+ # grpcio-status
+ # proto-plus
+psycopg2-binary==2.9.6
+ # via testcontainers-postgres
+pyasn1==0.5.0
+ # via
+ # pyasn1-modules
+ # python-jose
+ # rsa
+pyasn1-modules==0.3.0
+ # via google-auth
+pycodestyle==2.5.0
+ # via flake8
+pycparser==2.21
+ # via cffi
+pyflakes==2.1.1
+ # via flake8
+pygments==2.15.1
+ # via
+ # readme-renderer
+ # rich
+ # sphinx
+pyjwt==2.6.0
+ # via python-arango
+pymongo==4.3.3
+ # via testcontainers-mongodb
+pymssql==2.2.7
+ # via testcontainers-mssql
+pymysql==1.0.3
+ # via testcontainers-mysql
+pynacl==1.5.0
+ # via paramiko
+pyrsistent==0.19.3
+ # via jsonschema
+pysocks==1.7.1
+ # via urllib3
+pytest==7.3.1
+ # via
+ # -r requirements.in
+ # pytest-cov
+pytest-cov==4.0.0
+ # via -r requirements.in
+python-arango==7.5.7
+ # via testcontainers-arangodb
+python-dateutil==2.8.2
+ # via
+ # botocore
+ # opensearch-py
+ # pg8000
+python-dotenv==0.21.1
+ # via docker-compose
+python-jose==3.3.0
+ # via python-keycloak
+python-keycloak==2.16.1
+ # via testcontainers-keycloak
+pytz==2023.3
+ # via
+ # clickhouse-driver
+ # neo4j
+pytz-deprecation-shim==0.1.0.post0
+ # via tzlocal
+pyyaml==5.4.1
+ # via docker-compose
+readme-renderer==37.3
+ # via twine
+redis==4.5.4
+ # via testcontainers-redis
+requests==2.30.0
+ # via
+ # azure-core
+ # docker
+ # docker-compose
+ # google-api-core
+ # opensearch-py
+ # python-arango
+ # python-keycloak
+ # requests-toolbelt
+ # sphinx
+ # twine
+requests-toolbelt==0.10.1
+ # via
+ # python-arango
+ # python-keycloak
+ # twine
+rfc3986==2.0.0
+ # via twine
+rich==13.3.5
+ # via twine
+rsa==4.9
+ # via
+ # google-auth
+ # python-jose
+s3transfer==0.6.1
+ # via boto3
+scramp==1.4.4
+ # via pg8000
+selenium==4.9.0
+ # via testcontainers-selenium
+six==1.16.0
+ # via
+ # azure-core
+ # bleach
+ # dockerpty
+ # ecdsa
+ # google-auth
+ # isodate
+ # jsonschema
+ # opensearch-py
+ # python-dateutil
+ # websocket-client
+sniffio==1.3.0
+ # via trio
+snowballstemmer==2.2.0
+ # via sphinx
+sortedcontainers==2.4.0
+ # via trio
+sphinx==7.0.0
+ # via -r requirements.in
+sphinxcontrib-applehelp==1.0.4
+ # via sphinx
+sphinxcontrib-devhelp==1.0.2
+ # via sphinx
+sphinxcontrib-htmlhelp==2.0.1
+ # via sphinx
+sphinxcontrib-jsmath==1.0.1
+ # via sphinx
+sphinxcontrib-qthelp==1.0.3
+ # via sphinx
+sphinxcontrib-serializinghtml==1.1.5
+ # via sphinx
+sqlalchemy==2.0.12
+ # via
+ # testcontainers-mssql
+ # testcontainers-mysql
+ # testcontainers-oracle
+ # testcontainers-postgres
+texttable==1.6.7
+ # via docker-compose
+tomli==2.0.1
+ # via
+ # coverage
+ # pytest
+trio==0.22.0
+ # via
+ # selenium
+ # trio-websocket
+trio-websocket==0.10.2
+ # via selenium
+twine==4.0.2
+ # via -r requirements.in
+typing-extensions==4.5.0
+ # via
+ # azure-core
+ # azure-storage-blob
+ # sqlalchemy
+tzdata==2023.3
+ # via pytz-deprecation-shim
+tzlocal==4.3
+ # via clickhouse-driver
+urllib3[socks]==1.26.15
+ # via
+ # botocore
+ # docker
+ # minio
+ # opensearch-py
+ # python-arango
+ # requests
+ # selenium
+ # testcontainers-core
+ # twine
+webencodings==0.5.1
+ # via bleach
+websocket-client==0.59.0
+ # via
+ # docker
+ # docker-compose
+wheel==0.40.0
+ # via -r requirements.in
+wrapt==1.15.0
+ # via testcontainers-core
+wsproto==1.2.0
+ # via trio-websocket
+zipp==3.15.0
+ # via importlib-metadata
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/requirements/3.10.txt b/requirements/ubuntu-latest-3.10.txt
similarity index 97%
rename from requirements/3.10.txt
rename to requirements/ubuntu-latest-3.10.txt
index f1a64157..ce657327 100644
--- a/requirements/3.10.txt
+++ b/requirements/ubuntu-latest-3.10.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile --output-file=requirements/3.10.txt --resolver=backtracking requirements.in
+# pip-compile --output-file=requirements.txt --resolver=backtracking
#
-e file:meta
# via -r requirements.in
@@ -96,9 +96,9 @@ bcrypt==4.0.1
# via paramiko
bleach==6.0.0
# via readme-renderer
-boto3==1.26.127
+boto3==1.26.129
# via testcontainers-localstack
-botocore==1.29.127
+botocore==1.29.129
# via
# boto3
# s3transfer
@@ -134,7 +134,7 @@ distro==1.8.0
# via docker-compose
dnspython==2.3.0
# via pymongo
-docker[ssh]==6.0.1
+docker[ssh]==6.1.0
# via
# docker-compose
# testcontainers-core
@@ -163,7 +163,7 @@ google-api-core[grpc]==2.11.0
# via google-cloud-pubsub
google-auth==2.17.3
# via google-api-core
-google-cloud-pubsub==2.16.0
+google-cloud-pubsub==2.16.1
# via testcontainers-gcp
googleapis-common-protos[grpc]==1.59.0
# via
@@ -247,7 +247,7 @@ paramiko==3.1.0
# via docker
pg8000==1.29.4
# via -r requirements.in
-pika==1.3.1
+pika==1.3.2
# via testcontainers-rabbitmq
pkginfo==1.9.6
# via twine
diff --git a/requirements/3.11.txt b/requirements/ubuntu-latest-3.11.txt
similarity index 97%
rename from requirements/3.11.txt
rename to requirements/ubuntu-latest-3.11.txt
index cbd63b4a..cac9cd54 100644
--- a/requirements/3.11.txt
+++ b/requirements/ubuntu-latest-3.11.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --output-file=requirements/3.11.txt --resolver=backtracking requirements.in
+# pip-compile --output-file=requirements.txt --resolver=backtracking
#
-e file:meta
# via -r requirements.in
@@ -96,9 +96,9 @@ bcrypt==4.0.1
# via paramiko
bleach==6.0.0
# via readme-renderer
-boto3==1.26.127
+boto3==1.26.129
# via testcontainers-localstack
-botocore==1.29.127
+botocore==1.29.129
# via
# boto3
# s3transfer
@@ -134,7 +134,7 @@ distro==1.8.0
# via docker-compose
dnspython==2.3.0
# via pymongo
-docker[ssh]==6.0.1
+docker[ssh]==6.1.0
# via
# docker-compose
# testcontainers-core
@@ -160,7 +160,7 @@ google-api-core[grpc]==2.11.0
# via google-cloud-pubsub
google-auth==2.17.3
# via google-api-core
-google-cloud-pubsub==2.16.0
+google-cloud-pubsub==2.16.1
# via testcontainers-gcp
googleapis-common-protos[grpc]==1.59.0
# via
@@ -244,7 +244,7 @@ paramiko==3.1.0
# via docker
pg8000==1.29.4
# via -r requirements.in
-pika==1.3.1
+pika==1.3.2
# via testcontainers-rabbitmq
pkginfo==1.9.6
# via twine
diff --git a/requirements/3.7.txt b/requirements/ubuntu-latest-3.7.txt
similarity index 98%
rename from requirements/3.7.txt
rename to requirements/ubuntu-latest-3.7.txt
index a19856f0..fbe67cf4 100644
--- a/requirements/3.7.txt
+++ b/requirements/ubuntu-latest-3.7.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --output-file=requirements/3.7.txt --resolver=backtracking requirements.in
+# pip-compile --output-file=requirements.txt --resolver=backtracking
#
-e file:meta
# via -r requirements.in
@@ -100,9 +100,9 @@ bcrypt==4.0.1
# via paramiko
bleach==6.0.0
# via readme-renderer
-boto3==1.26.127
+boto3==1.26.129
# via testcontainers-localstack
-botocore==1.29.127
+botocore==1.29.129
# via
# boto3
# s3transfer
@@ -140,7 +140,7 @@ distro==1.8.0
# via docker-compose
dnspython==2.3.0
# via pymongo
-docker[ssh]==6.0.1
+docker[ssh]==6.1.0
# via
# docker-compose
# testcontainers-core
@@ -169,7 +169,7 @@ google-api-core[grpc]==2.11.0
# via google-cloud-pubsub
google-auth==2.17.3
# via google-api-core
-google-cloud-pubsub==2.16.0
+google-cloud-pubsub==2.16.1
# via testcontainers-gcp
googleapis-common-protos[grpc]==1.59.0
# via
@@ -264,7 +264,7 @@ paramiko==3.1.0
# via docker
pg8000==1.29.4
# via -r requirements.in
-pika==1.3.1
+pika==1.3.2
# via testcontainers-rabbitmq
pkginfo==1.9.6
# via twine
diff --git a/requirements/3.8.txt b/requirements/ubuntu-latest-3.8.txt
similarity index 98%
rename from requirements/3.8.txt
rename to requirements/ubuntu-latest-3.8.txt
index 530e0fd6..70a86aa0 100644
--- a/requirements/3.8.txt
+++ b/requirements/ubuntu-latest-3.8.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.8
# by the following command:
#
-# pip-compile --output-file=requirements/3.8.txt --resolver=backtracking requirements.in
+# pip-compile --output-file=requirements.txt --resolver=backtracking
#
-e file:meta
# via -r requirements.in
@@ -100,9 +100,9 @@ bcrypt==4.0.1
# via paramiko
bleach==6.0.0
# via readme-renderer
-boto3==1.26.127
+boto3==1.26.129
# via testcontainers-localstack
-botocore==1.29.127
+botocore==1.29.129
# via
# boto3
# s3transfer
@@ -138,7 +138,7 @@ distro==1.8.0
# via docker-compose
dnspython==2.3.0
# via pymongo
-docker[ssh]==6.0.1
+docker[ssh]==6.1.0
# via
# docker-compose
# testcontainers-core
@@ -167,7 +167,7 @@ google-api-core[grpc]==2.11.0
# via google-cloud-pubsub
google-auth==2.17.3
# via google-api-core
-google-cloud-pubsub==2.16.0
+google-cloud-pubsub==2.16.1
# via testcontainers-gcp
googleapis-common-protos[grpc]==1.59.0
# via
@@ -254,7 +254,7 @@ paramiko==3.1.0
# via docker
pg8000==1.29.4
# via -r requirements.in
-pika==1.3.1
+pika==1.3.2
# via testcontainers-rabbitmq
pkginfo==1.9.6
# via twine
diff --git a/requirements/3.9.txt b/requirements/ubuntu-latest-3.9.txt
similarity index 98%
rename from requirements/3.9.txt
rename to requirements/ubuntu-latest-3.9.txt
index 5009c1f7..a1e4dd7f 100644
--- a/requirements/3.9.txt
+++ b/requirements/ubuntu-latest-3.9.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --output-file=requirements/3.9.txt --resolver=backtracking requirements.in
+# pip-compile --output-file=requirements.txt --resolver=backtracking
#
-e file:meta
# via -r requirements.in
@@ -96,9 +96,9 @@ bcrypt==4.0.1
# via paramiko
bleach==6.0.0
# via readme-renderer
-boto3==1.26.127
+boto3==1.26.129
# via testcontainers-localstack
-botocore==1.29.127
+botocore==1.29.129
# via
# boto3
# s3transfer
@@ -134,7 +134,7 @@ distro==1.8.0
# via docker-compose
dnspython==2.3.0
# via pymongo
-docker[ssh]==6.0.1
+docker[ssh]==6.1.0
# via
# docker-compose
# testcontainers-core
@@ -163,7 +163,7 @@ google-api-core[grpc]==2.11.0
# via google-cloud-pubsub
google-auth==2.17.3
# via google-api-core
-google-cloud-pubsub==2.16.0
+google-cloud-pubsub==2.16.1
# via testcontainers-gcp
googleapis-common-protos[grpc]==1.59.0
# via
@@ -248,7 +248,7 @@ paramiko==3.1.0
# via docker
pg8000==1.29.4
# via -r requirements.in
-pika==1.3.1
+pika==1.3.2
# via testcontainers-rabbitmq
pkginfo==1.9.6
# via twine
diff --git a/requirements/windows-latest-3.10.txt b/requirements/windows-latest-3.10.txt
new file mode 100644
index 00000000..c567ecf4
--- /dev/null
+++ b/requirements/windows-latest-3.10.txt
@@ -0,0 +1,457 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --output-file=requirements.txt --resolver=backtracking
+#
+-e file:meta
+ # via -r requirements.in
+-e file:arangodb
+ # via -r requirements.in
+-e file:azurite
+ # via -r requirements.in
+-e file:clickhouse
+ # via -r requirements.in
+-e file:compose
+ # via -r requirements.in
+-e file:core
+ # via
+ # -r requirements.in
+ # testcontainers
+ # testcontainers-arangodb
+ # testcontainers-azurite
+ # testcontainers-clickhouse
+ # testcontainers-compose
+ # testcontainers-elasticsearch
+ # testcontainers-gcp
+ # testcontainers-kafka
+ # testcontainers-keycloak
+ # testcontainers-localstack
+ # testcontainers-minio
+ # testcontainers-mongodb
+ # testcontainers-mssql
+ # testcontainers-mysql
+ # testcontainers-neo4j
+ # testcontainers-nginx
+ # testcontainers-opensearch
+ # testcontainers-oracle
+ # testcontainers-postgres
+ # testcontainers-rabbitmq
+ # testcontainers-redis
+ # testcontainers-selenium
+-e file:elasticsearch
+ # via -r requirements.in
+-e file:google
+ # via -r requirements.in
+-e file:kafka
+ # via -r requirements.in
+-e file:keycloak
+ # via -r requirements.in
+-e file:localstack
+ # via -r requirements.in
+-e file:minio
+ # via -r requirements.in
+-e file:mongodb
+ # via -r requirements.in
+-e file:mssql
+ # via -r requirements.in
+-e file:mysql
+ # via -r requirements.in
+-e file:neo4j
+ # via -r requirements.in
+-e file:nginx
+ # via -r requirements.in
+-e file:opensearch
+ # via -r requirements.in
+-e file:oracle
+ # via -r requirements.in
+-e file:postgres
+ # via -r requirements.in
+-e file:rabbitmq
+ # via -r requirements.in
+-e file:redis
+ # via -r requirements.in
+-e file:selenium
+ # via -r requirements.in
+alabaster==0.7.13
+ # via sphinx
+asn1crypto==1.5.1
+ # via scramp
+async-generator==1.10
+ # via trio
+async-timeout==4.0.2
+ # via redis
+attrs==23.1.0
+ # via
+ # jsonschema
+ # outcome
+ # trio
+azure-core==1.26.4
+ # via azure-storage-blob
+azure-storage-blob==12.16.0
+ # via testcontainers-azurite
+babel==2.12.1
+ # via sphinx
+bcrypt==4.0.1
+ # via paramiko
+bleach==6.0.0
+ # via readme-renderer
+boto3==1.26.129
+ # via testcontainers-localstack
+botocore==1.29.129
+ # via
+ # boto3
+ # s3transfer
+cachetools==5.3.0
+ # via google-auth
+certifi==2022.12.7
+ # via
+ # minio
+ # opensearch-py
+ # requests
+ # selenium
+cffi==1.15.1
+ # via
+ # cryptography
+ # pynacl
+ # trio
+charset-normalizer==3.1.0
+ # via requests
+clickhouse-driver==0.2.6
+ # via testcontainers-clickhouse
+colorama==0.4.6
+ # via
+ # docker-compose
+ # pytest
+ # sphinx
+coverage[toml]==7.2.5
+ # via pytest-cov
+cryptography==36.0.2
+ # via
+ # -r requirements.in
+ # azure-storage-blob
+ # paramiko
+cx-oracle==8.3.0
+ # via testcontainers-oracle
+deprecation==2.1.0
+ # via python-keycloak
+distro==1.8.0
+ # via docker-compose
+dnspython==2.3.0
+ # via pymongo
+docker[ssh]==6.1.0
+ # via
+ # docker-compose
+ # testcontainers-core
+docker-compose==1.29.2
+ # via testcontainers-compose
+dockerpty==0.4.1
+ # via docker-compose
+docopt==0.6.2
+ # via docker-compose
+docutils==0.19
+ # via
+ # readme-renderer
+ # sphinx
+ecdsa==0.18.0
+ # via python-jose
+entrypoints==0.3
+ # via flake8
+exceptiongroup==1.1.1
+ # via
+ # pytest
+ # trio
+ # trio-websocket
+flake8==3.7.9
+ # via -r requirements.in
+google-api-core[grpc]==2.11.0
+ # via google-cloud-pubsub
+google-auth==2.17.3
+ # via google-api-core
+google-cloud-pubsub==2.16.1
+ # via testcontainers-gcp
+googleapis-common-protos[grpc]==1.59.0
+ # via
+ # google-api-core
+ # grpc-google-iam-v1
+ # grpcio-status
+greenlet==2.0.2
+ # via sqlalchemy
+grpc-google-iam-v1==0.12.6
+ # via google-cloud-pubsub
+grpcio==1.54.0
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+ # googleapis-common-protos
+ # grpc-google-iam-v1
+ # grpcio-status
+grpcio-status==1.54.0
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+h11==0.14.0
+ # via wsproto
+idna==3.4
+ # via
+ # requests
+ # trio
+imagesize==1.4.1
+ # via sphinx
+importlib-metadata==6.6.0
+ # via
+ # keyring
+ # twine
+iniconfig==2.0.0
+ # via pytest
+isodate==0.6.1
+ # via azure-storage-blob
+jaraco-classes==3.2.3
+ # via keyring
+jinja2==3.1.2
+ # via sphinx
+jmespath==1.0.1
+ # via
+ # boto3
+ # botocore
+jsonschema==3.2.0
+ # via docker-compose
+kafka-python==2.0.2
+ # via testcontainers-kafka
+keyring==23.13.1
+ # via twine
+markdown-it-py==2.2.0
+ # via rich
+markupsafe==2.1.2
+ # via jinja2
+mccabe==0.6.1
+ # via flake8
+mdurl==0.1.2
+ # via markdown-it-py
+minio==7.1.14
+ # via testcontainers-minio
+more-itertools==9.1.0
+ # via jaraco-classes
+neo4j==5.8.0
+ # via testcontainers-neo4j
+opensearch-py==2.2.0
+ # via testcontainers-opensearch
+outcome==1.2.0
+ # via trio
+packaging==23.1
+ # via
+ # deprecation
+ # docker
+ # pytest
+ # sphinx
+paramiko==3.1.0
+ # via docker
+pg8000==1.29.4
+ # via -r requirements.in
+pika==1.3.2
+ # via testcontainers-rabbitmq
+pkginfo==1.9.6
+ # via twine
+pluggy==1.0.0
+ # via pytest
+proto-plus==1.22.2
+ # via google-cloud-pubsub
+protobuf==4.22.4
+ # via
+ # google-api-core
+ # google-cloud-pubsub
+ # googleapis-common-protos
+ # grpc-google-iam-v1
+ # grpcio-status
+ # proto-plus
+psycopg2-binary==2.9.6
+ # via testcontainers-postgres
+pyasn1==0.5.0
+ # via
+ # pyasn1-modules
+ # python-jose
+ # rsa
+pyasn1-modules==0.3.0
+ # via google-auth
+pycodestyle==2.5.0
+ # via flake8
+pycparser==2.21
+ # via cffi
+pyflakes==2.1.1
+ # via flake8
+pygments==2.15.1
+ # via
+ # readme-renderer
+ # rich
+ # sphinx
+pyjwt==2.6.0
+ # via python-arango
+pymongo==4.3.3
+ # via testcontainers-mongodb
+pymssql==2.2.7
+ # via testcontainers-mssql
+pymysql==1.0.3
+ # via testcontainers-mysql
+pynacl==1.5.0
+ # via paramiko
+pyrsistent==0.19.3
+ # via jsonschema
+pysocks==1.7.1
+ # via urllib3
+pytest==7.3.1
+ # via
+ # -r requirements.in
+ # pytest-cov
+pytest-cov==4.0.0
+ # via -r requirements.in
+python-arango==7.5.7
+ # via testcontainers-arangodb
+python-dateutil==2.8.2
+ # via
+ # botocore
+ # opensearch-py
+ # pg8000
+python-dotenv==0.21.1
+ # via docker-compose
+python-jose==3.3.0
+ # via python-keycloak
+python-keycloak==2.16.1
+ # via testcontainers-keycloak
+pytz==2023.3
+ # via
+ # clickhouse-driver
+ # neo4j
+pytz-deprecation-shim==0.1.0.post0
+ # via tzlocal
+pywin32==306
+ # via docker
+pywin32-ctypes==0.2.0
+ # via keyring
+pyyaml==5.4.1
+ # via docker-compose
+readme-renderer==37.3
+ # via twine
+redis==4.5.4
+ # via testcontainers-redis
+requests==2.30.0
+ # via
+ # azure-core
+ # docker
+ # docker-compose
+ # google-api-core
+ # opensearch-py
+ # python-arango
+ # python-keycloak
+ # requests-toolbelt
+ # sphinx
+ # twine
+requests-toolbelt==0.10.1
+ # via
+ # python-arango
+ # python-keycloak
+ # twine
+rfc3986==2.0.0
+ # via twine
+rich==13.3.5
+ # via twine
+rsa==4.9
+ # via
+ # google-auth
+ # python-jose
+s3transfer==0.6.1
+ # via boto3
+scramp==1.4.4
+ # via pg8000
+selenium==4.9.0
+ # via testcontainers-selenium
+six==1.16.0
+ # via
+ # azure-core
+ # bleach
+ # dockerpty
+ # ecdsa
+ # google-auth
+ # isodate
+ # jsonschema
+ # opensearch-py
+ # python-dateutil
+ # websocket-client
+sniffio==1.3.0
+ # via trio
+snowballstemmer==2.2.0
+ # via sphinx
+sortedcontainers==2.4.0
+ # via trio
+sphinx==7.0.0
+ # via -r requirements.in
+sphinxcontrib-applehelp==1.0.4
+ # via sphinx
+sphinxcontrib-devhelp==1.0.2
+ # via sphinx
+sphinxcontrib-htmlhelp==2.0.1
+ # via sphinx
+sphinxcontrib-jsmath==1.0.1
+ # via sphinx
+sphinxcontrib-qthelp==1.0.3
+ # via sphinx
+sphinxcontrib-serializinghtml==1.1.5
+ # via sphinx
+sqlalchemy==2.0.12
+ # via
+ # testcontainers-mssql
+ # testcontainers-mysql
+ # testcontainers-oracle
+ # testcontainers-postgres
+texttable==1.6.7
+ # via docker-compose
+tomli==2.0.1
+ # via
+ # coverage
+ # pytest
+trio==0.22.0
+ # via
+ # selenium
+ # trio-websocket
+trio-websocket==0.10.2
+ # via selenium
+twine==4.0.2
+ # via -r requirements.in
+typing-extensions==4.5.0
+ # via
+ # azure-core
+ # azure-storage-blob
+ # sqlalchemy
+tzdata==2023.3
+ # via
+ # pytz-deprecation-shim
+ # tzlocal
+tzlocal==4.3
+ # via clickhouse-driver
+urllib3[socks]==1.26.15
+ # via
+ # botocore
+ # docker
+ # minio
+ # opensearch-py
+ # python-arango
+ # requests
+ # selenium
+ # testcontainers-core
+ # twine
+webencodings==0.5.1
+ # via bleach
+websocket-client==0.59.0
+ # via
+ # docker
+ # docker-compose
+wheel==0.40.0
+ # via -r requirements.in
+wrapt==1.15.0
+ # via testcontainers-core
+wsproto==1.2.0
+ # via trio-websocket
+zipp==3.15.0
+ # via importlib-metadata
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools