aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.dockerignore3
-rw-r--r--.github/CONTRIBUTING.md81
-rw-r--r--.github/workflows/lint.yaml6
-rw-r--r--.github/workflows/test.yaml5
-rw-r--r--Dockerfile18
-rw-r--r--Makefile43
-rw-r--r--Pipfile42
-rw-r--r--Pipfile.lock332
-rw-r--r--requirements/coverage.in3
-rw-r--r--requirements/coverage.pip10
-rw-r--r--requirements/coveralls.in3
-rw-r--r--requirements/coveralls.pip28
-rw-r--r--requirements/lint.in4
-rw-r--r--requirements/lint.pip28
-rw-r--r--requirements/pip-tools.in6
-rw-r--r--requirements/pip-tools.pip22
-rw-r--r--requirements/requirements.in7
-rw-r--r--requirements/requirements.pip29
18 files changed, 217 insertions, 453 deletions
diff --git a/.dockerignore b/.dockerignore
index d030b2f..30ecfd4 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -4,7 +4,6 @@
# Make exceptions for what's needed
!snekbox
!config/
+!requirements/
!tests
-!Pipfile
-!Pipfile.lock
!LICENSE
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index ddb1c5c..5f9e6b3 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -6,83 +6,34 @@ The Contributing Guidelines for Python Discord projects can be found [on our web
## Initial Setup
-A Python 3.10 interpreter and the [pipenv] package are required. Once those requirements are satisfied, install the project's dependencies:
+A Python 3.10 interpreter and `make` are required. A virtual environment is also recommended. Once that is set up, install the project's dependencies with `make setup`.
-```
-pipenv sync --dev
-```
-
-Follow that up with setting up the pre-commit hook:
-
-```
-pipenv run precommit
-```
-
-Now Flake8 will run and lint staged changes whenever an attempt to commit the changes is made. Flake8 can still be invoked manually:
-
-```
-pipenv run lint
-```
+This also installs a git pre-commit hook so that the linter runs upon a commit.
+Manual invocation is still possible with `make lint`.
## Running snekbox
-Use Docker Compose to start snekbox in development mode. The optional `--build` argument can be passed to force the image to be rebuilt.
-
-```
-docker-compose up
-```
+Use `docker-compose up` to start snekbox in development mode. The optional `--build` argument can be passed to force the image to be rebuilt.
The container has all development dependencies. The repository on the host is mounted within the container; changes made to local files will also affect the container.
-To build a normal container that can be used in production, run
-
-```
-pipenv run build
-```
+To build a normal container that can be used in production, run `make build`.
Refer to the [README] for how to run the container normally.
## Running Tests
-Tests are run through coverage.py using unittest. To run the tests within a development container, run
-
-```
-pipenv run test
-```
+Tests are run through coverage.py using unittest. To run the tests within a development container, run `make test`.
## Coverage
-To see a coverage report, run
+To see a coverage report, run `make report`.
-```
-pipenv run report
-```
-
-Alternatively, a report can be generated as HTML with
-
-```
-pipenv run coverage html
-```
-
-The HTML will output to `./htmlcov/` by default.
-
-The report cannot be generated on Windows directly due to the difference in file separators in the paths. Instead, launch a shell in the container (see below) and use `coverage report` or `coverage html` (do not invoke through Pipenv).
+The report cannot be generated on Windows directly due to the difference in file separators in the paths. Instead, launch a shell in the container (see below) and use `coverage report`.
## Launching a Shell in the Container
-A bash shell can be launched in the development container using
-
-```
-pipenv run devsh
-```
-
-This creates a new container which will get deleted once the shell session ends.
-
-It's possible to run a command directly; it supports the same arguments that `bash` supports.
-
-```bash
-pipenv run devsh -c 'echo hello'
-```
+A bash shell can be launched in the development container using `make devsh`. This creates a new container which will get deleted once the shell session ends.
### Invoking NsJail
@@ -92,17 +43,23 @@ NsJail can be invoked in a more direct manner that does not require using a web
python -m snekbox 'print("hello world!")' --time_limit 0 --- -m timeit
```
-With this command, NsJail uses the same configuration normally used through the web API. It also has an alias, `pipenv run eval`.
+With this command, NsJail uses the same configuration normally used through the web API.
+
+## Managing Dependencies
+
+pip-tools is used to compile required Python packages and all their transitive
+dependencies. All files are located in the `requirements` directory. The `*.in` files are the input files and the `*.pip` files are the compiled outputs.
+
+To add or change a dependency, modify the appropriate `*.in` file(s) and then run `make upgrade` to recompile. The make command compiles the files in a certain order. When adding a new `*.in` file, it should also be included in the make command. Furthermore, the new file should be constrained by the files compiled before it, and the files compiled after it should be constrained by the new file.
-## Updating NsJail
+### Updating NsJail
Updating NsJail mainly involves two steps:
1. Change the version used by the `git clone` command in the [Dockerfile]
-2. Use `pipenv run protoc` to generate new Python code from the config protobuf
+2. Use `python -m scripts.protoc` to generate new Python code from the config protobuf
Other things to look out for are breaking changes to NsJail's config format, its command-line interface, or its logging format. Additionally, dependencies may have to be adjusted in the Dockerfile to get a new version to build or run.
-[pipenv]: https://docs.pipenv.org/en/latest/
[readme]: README.md
[Dockerfile]: Dockerfile
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
index 4a5288d..d53738b 100644
--- a/.github/workflows/lint.yaml
+++ b/.github/workflows/lint.yaml
@@ -18,9 +18,11 @@ jobs:
uses: actions/setup-python@v2
with:
python-version: "3.10"
+ cache: pip
+ cache-dependency-path: requirements/lint.pip
- - name: Install pre-commit
- run: pip install pre-commit~=2.9.3
+ - name: Install Python dependencies
+ run: pip install -U -r requirements/lint.pip
- name: Pre-commit environment cache
uses: actions/cache@v2
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 77ef1fc..f7f3635 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -66,7 +66,6 @@ jobs:
needs: test
steps:
- # Needed for the .coveragerc file.
- name: Checkout code
uses: actions/checkout@v2
@@ -74,9 +73,11 @@ jobs:
uses: actions/setup-python@v2
with:
python-version: "3.10"
+ cache: pip
+ cache-dependency-path: requirements/coveralls.pip
- name: Install dependencies
- run: pip install coverage~=6.0 coveralls~=3.3
+ run: pip install -U -r requirements/coveralls.pip
- name: Download coverage data
uses: actions/download-artifact@v2
diff --git a/Dockerfile b/Dockerfile
index b0d2702..c207a2b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -26,10 +26,7 @@ FROM python:3.10-slim-buster as base
ENV PATH=/root/.local/bin:$PATH \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=false \
- PIP_USER=1 \
- PIPENV_DONT_USE_PYENV=1 \
- PIPENV_HIDE_EMOJIS=1 \
- PIPENV_NOSPIN=1
+ PIP_USER=1
RUN apt-get -y update \
&& apt-get install -y \
@@ -37,7 +34,6 @@ RUN apt-get -y update \
libnl-route-3-200=3.4.* \
libprotobuf17=3.6.* \
&& rm -rf /var/lib/apt/lists/*
-RUN pip install pipenv==2020.11.15
COPY --from=builder /nsjail/nsjail /usr/sbin/
RUN chmod +x /usr/sbin/nsjail
@@ -45,13 +41,13 @@ RUN chmod +x /usr/sbin/nsjail
# ------------------------------------------------------------------------------
FROM base as venv
-COPY Pipfile Pipfile.lock /snekbox/
+COPY requirements/ /snekbox/requirements/
WORKDIR /snekbox
-# Pipenv installs to the default user site since PIP_USER is set.
-RUN pipenv install --deploy --system
+# pip installs to the default user site since PIP_USER is set.
+RUN pip install -U -r requirements/requirements.pip
-# This must come after the first pipenv command! From the docs:
+# This must come after the first pip command! From the docs:
# All RUN instructions following an ARG instruction use the ARG variable
# implicitly (as an environment variable), thus can cause a cache miss.
ARG DEV
@@ -59,13 +55,13 @@ ARG DEV
# Install numpy when in dev mode; one of the unit tests needs it.
RUN if [ -n "${DEV}" ]; \
then \
- pipenv install --deploy --system --dev \
+ pip install -U -r requirements/coverage.pip \
&& PYTHONUSERBASE=/snekbox/user_base pip install numpy~=1.19; \
fi
# At the end to avoid re-installing dependencies when only a config changes.
# It's in the venv image because the final image is not used during development.
-COPY config/ /snekbox/config
+COPY config/ /snekbox/config/
# ------------------------------------------------------------------------------
FROM venv
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..ffb3385
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,43 @@
+PIP_COMPILE_CMD = pip-compile -q -U
+
+.PHONY: install-piptools
+install-piptools:
+ pip install -U -q -r requirements/pip-tools.pip
+
+.PHONY: setup
+setup: install-piptools
+ pip-sync requirements/coverage.pip \
+ requirements/lint.pip \
+ requirements/requirements.pip
+ pre-commit install
+
+.PHONY: upgrade
+upgrade: install-piptools
+ $(PIP_COMPILE_CMD) -o requirements/requirements.pip requirements/requirements.in
+ $(PIP_COMPILE_CMD) -o requirements/coverage.pip requirements/coverage.in
+ $(PIP_COMPILE_CMD) -o requirements/coveralls.pip requirements/coveralls.in
+ $(PIP_COMPILE_CMD) -o requirements/lint.pip requirements/lint.in
+ $(PIP_COMPILE_CMD) -o requirements/pip-tools.pip requirements/pip-tools.in
+
+.PHONY: lint
+lint: setup
+ pre-commit run --all-files
+
+# Fix ownership of the coverage file even if tests fail & preserve exit code
+# Install numpy because a test checks if it's importable
+.PHONY: test
+test:
+ docker-compose run --entrypoint /bin/bash --rm snekbox -c \
+ 'env PYTHONUSERBASE=/snekbox/user_base pip install numpy && coverage run -m unittest; e=$?; chown --reference=. .coverage; exit $e'
+
+.PHONY: report
+report: setup
+ coverage report
+
+.PHONY: build
+build:
+ docker build -t ghcr.io/python-discord/snekbox:latest .
+
+.PHONY: devsh
+devsh:
+ docker-compose run --entrypoint /bin/bash --rm snekbox
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index 893245e..0000000
--- a/Pipfile
+++ /dev/null
@@ -1,42 +0,0 @@
-[[source]]
-url = "https://pypi.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-falcon = "~= 2.0.0"
-gunicorn = "~= 20.0"
-jsonschema = "~= 3.2"
-protobuf = "== 3.19.*"
-sentry-sdk = {extras = ["falcon"], version = "~= 0.19.3"}
-
-[dev-packages]
-coverage = "~= 6.0"
-pre-commit = "~= 2.9.3"
-
-[requires]
-python_version = "3.10"
-
-[scripts]
-eval = "python -m snekbox"
-webserver = "gunicorn -c config/gunicorn.conf.py snekbox.api.app"
-
-# Linting
-lint = "pre-commit run --all-files"
-precommit = "pre-commit install"
-
-# Testing
-report = "coverage report"
-# Fix ownership of the coverage file even if tests fail & preserve exit code
-# Install numpy because a test checks if it's importable
-test = """
- docker-compose run --entrypoint /bin/bash --rm snekbox -c \
- 'env PYTHONUSERBASE=/snekbox/user_base pip install numpy && coverage run -m unittest; e=$?; chown --reference=. .coverage; exit $e'
-"""
-
-# Docker
-build = "docker build -t ghcr.io/python-discord/snekbox:latest ."
-devsh = "docker-compose run --entrypoint /bin/bash --rm snekbox"
-
-# Other
-protoc = "python -m scripts.protoc"
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index 3d369dc..0000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,332 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "3b7dae836f01cec71b524f63a6e446fe93aee3fcd39ebd0f38a17db90a3aa96f"
- },
- "pipfile-spec": 6,
- "requires": {
- "python_version": "3.10"
- },
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "attrs": {
- "hashes": [
- "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4",
- "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==21.4.0"
- },
- "certifi": {
- "hashes": [
- "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7",
- "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2022.5.18.1"
- },
- "falcon": {
- "hashes": [
- "sha256:18157af2a4fc3feedf2b5dcc6196f448639acf01c68bc33d4d5a04c3ef87f494",
- "sha256:24adcd2b29a8ffa9d552dc79638cd21736a3fb04eda7d102c6cebafdaadb88ad",
- "sha256:54f2cb4b687035b2a03206dbfc538055cc48b59a953187b0458aa1b574d47b53",
- "sha256:59d1e8c993b9a37ea06df9d72cf907a46cc8063b30717cdac2f34d1658b6f936",
- "sha256:733033ec80c896e30a43ab3e776856096836787197a44eb21022320a61311983",
- "sha256:74cf1d18207381c665b9e6292d65100ce146d958707793174b03869dc6e614f4",
- "sha256:95bf6ce986c1119aef12c9b348f4dee9c6dcc58391bdd0bc2b0bf353c2b15986",
- "sha256:9712975adcf8c6e12876239085ad757b8fdeba223d46d23daef82b47658f83a9",
- "sha256:a5ebb22a04c9cc65081938ee7651b4e3b4d2a28522ea8ec04c7bdd2b3e9e8cd8",
- "sha256:aa184895d1ad4573fbfaaf803563d02f019ebdf4790e41cc568a330607eae439",
- "sha256:e3782b7b92fefd46a6ad1fd8fe63fe6c6f1b7740a95ca56957f48d1aee34b357",
- "sha256:e9efa0791b5d9f9dd9689015ea6bce0a27fcd5ecbcd30e6d940bffa4f7f03389",
- "sha256:eea593cf466b9c126ce667f6d30503624ef24459f118c75594a69353b6c3d5fc",
- "sha256:f93351459f110b4c1ee28556aef9a791832df6f910bea7b3f616109d534df06b"
- ],
- "index": "pypi",
- "version": "==2.0.0"
- },
- "gunicorn": {
- "hashes": [
- "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e",
- "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"
- ],
- "index": "pypi",
- "version": "==20.1.0"
- },
- "jsonschema": {
- "hashes": [
- "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163",
- "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
- ],
- "index": "pypi",
- "version": "==3.2.0"
- },
- "protobuf": {
- "hashes": [
- "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c",
- "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb",
- "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9",
- "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4",
- "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca",
- "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58",
- "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b",
- "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909",
- "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2",
- "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368",
- "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2",
- "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13",
- "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0",
- "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e",
- "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee",
- "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a",
- "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616",
- "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e",
- "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a",
- "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26",
- "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7",
- "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934",
- "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f",
- "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f",
- "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07",
- "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"
- ],
- "index": "pypi",
- "version": "==3.19.4"
- },
- "pyrsistent": {
- "hashes": [
- "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c",
- "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc",
- "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e",
- "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26",
- "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec",
- "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286",
- "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045",
- "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec",
- "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8",
- "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c",
- "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca",
- "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22",
- "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a",
- "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96",
- "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc",
- "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1",
- "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07",
- "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6",
- "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b",
- "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5",
- "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.18.1"
- },
- "sentry-sdk": {
- "extras": [
- "falcon"
- ],
- "hashes": [
- "sha256:0a711ec952441c2ec89b8f5d226c33bc697914f46e876b44a4edd3e7864cf4d0",
- "sha256:737a094e49a529dd0fdcaafa9e97cf7c3d5eb964bd229821d640bc77f3502b3f"
- ],
- "index": "pypi",
- "version": "==0.19.5"
- },
- "setuptools": {
- "hashes": [
- "sha256:68e45d17c9281ba25dc0104eadd2647172b3472d9e01f911efa57965e8d51a36",
- "sha256:a43bdedf853c670e5fed28e5623403bad2f73cf02f9a2774e91def6bda8265a7"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==62.3.2"
- },
- "six": {
- "hashes": [
- "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.16.0"
- },
- "urllib3": {
- "hashes": [
- "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14",
- "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
- "version": "==1.26.9"
- }
- },
- "develop": {
- "cfgv": {
- "hashes": [
- "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426",
- "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"
- ],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==3.3.1"
- },
- "coverage": {
- "hashes": [
- "sha256:00c8544510f3c98476bbd58201ac2b150ffbcce46a8c3e4fb89ebf01998f806a",
- "sha256:016d7f5cf1c8c84f533a3c1f8f36126fbe00b2ec0ccca47cc5731c3723d327c6",
- "sha256:03014a74023abaf5a591eeeaf1ac66a73d54eba178ff4cb1fa0c0a44aae70383",
- "sha256:033ebec282793bd9eb988d0271c211e58442c31077976c19c442e24d827d356f",
- "sha256:21e6686a95025927775ac501e74f5940cdf6fe052292f3a3f7349b0abae6d00f",
- "sha256:26f8f92699756cb7af2b30720de0c5bb8d028e923a95b6d0c891088025a1ac8f",
- "sha256:2e76bd16f0e31bc2b07e0fb1379551fcd40daf8cdf7e24f31a29e442878a827c",
- "sha256:341e9c2008c481c5c72d0e0dbf64980a4b2238631a7f9780b0fe2e95755fb018",
- "sha256:3cfd07c5889ddb96a401449109a8b97a165be9d67077df6802f59708bfb07720",
- "sha256:4002f9e8c1f286e986fe96ec58742b93484195defc01d5cc7809b8f7acb5ece3",
- "sha256:50ed480b798febce113709846b11f5d5ed1e529c88d8ae92f707806c50297abf",
- "sha256:543e172ce4c0de533fa892034cce260467b213c0ea8e39da2f65f9a477425211",
- "sha256:5a78cf2c43b13aa6b56003707c5203f28585944c277c1f3f109c7b041b16bd39",
- "sha256:5cd698341626f3c77784858427bad0cdd54a713115b423d22ac83a28303d1d95",
- "sha256:60c2147921da7f4d2d04f570e1838db32b95c5509d248f3fe6417e91437eaf41",
- "sha256:62d382f7d77eeeaff14b30516b17bcbe80f645f5cf02bb755baac376591c653c",
- "sha256:69432946f154c6add0e9ede03cc43b96e2ef2733110a77444823c053b1ff5166",
- "sha256:727dafd7f67a6e1cad808dc884bd9c5a2f6ef1f8f6d2f22b37b96cb0080d4f49",
- "sha256:742fb8b43835078dd7496c3c25a1ec8d15351df49fb0037bffb4754291ef30ce",
- "sha256:750e13834b597eeb8ae6e72aa58d1d831b96beec5ad1d04479ae3772373a8088",
- "sha256:7b546cf2b1974ddc2cb222a109b37c6ed1778b9be7e6b0c0bc0cf0438d9e45a6",
- "sha256:83bd142cdec5e4a5c4ca1d4ff6fa807d28460f9db919f9f6a31babaaa8b88426",
- "sha256:8d2e80dd3438e93b19e1223a9850fa65425e77f2607a364b6fd134fcd52dc9df",
- "sha256:9229d074e097f21dfe0643d9d0140ee7433814b3f0fc3706b4abffd1e3038632",
- "sha256:968ed5407f9460bd5a591cefd1388cc00a8f5099de9e76234655ae48cfdbe2c3",
- "sha256:9c82f2cd69c71698152e943f4a5a6b83a3ab1db73b88f6e769fabc86074c3b08",
- "sha256:a00441f5ea4504f5abbc047589d09e0dc33eb447dc45a1a527c8b74bfdd32c65",
- "sha256:a022394996419142b33a0cf7274cb444c01d2bb123727c4bb0b9acabcb515dea",
- "sha256:af5b9ee0fc146e907aa0f5fb858c3b3da9199d78b7bb2c9973d95550bd40f701",
- "sha256:b5578efe4038be02d76c344007b13119b2b20acd009a88dde8adec2de4f630b5",
- "sha256:b84ab65444dcc68d761e95d4d70f3cfd347ceca5a029f2ffec37d4f124f61311",
- "sha256:c53ad261dfc8695062fc8811ac7c162bd6096a05a19f26097f411bdf5747aee7",
- "sha256:cc173f1ce9ffb16b299f51c9ce53f66a62f4d975abe5640e976904066f3c835d",
- "sha256:d548edacbf16a8276af13063a2b0669d58bbcfca7c55a255f84aac2870786a61",
- "sha256:d55fae115ef9f67934e9f1103c9ba826b4c690e4c5bcf94482b8b2398311bf9c",
- "sha256:d8099ea680201c2221f8468c372198ceba9338a5fec0e940111962b03b3f716a",
- "sha256:e35217031e4b534b09f9b9a5841b9344a30a6357627761d4218818b865d45055",
- "sha256:e4f52c272fdc82e7c65ff3f17a7179bc5f710ebc8ce8a5cadac81215e8326740",
- "sha256:e637ae0b7b481905358624ef2e81d7fb0b1af55f5ff99f9ba05442a444b11e45",
- "sha256:eef5292b60b6de753d6e7f2d128d5841c7915fb1e3321c3a1fe6acfe76c38052",
- "sha256:fb45fe08e1abc64eb836d187b20a59172053999823f7f6ef4f18a819c44ba16f"
- ],
- "index": "pypi",
- "version": "==6.4"
- },
- "distlib": {
- "hashes": [
- "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b",
- "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"
- ],
- "version": "==0.3.4"
- },
- "filelock": {
- "hashes": [
- "sha256:b795f1b42a61bbf8ec7113c341dad679d772567b936fbd1bf43c9a238e673e20",
- "sha256:c7b5fdb219b398a5b28c8e4c1893ef5f98ece6a38c6ab2c22e26ec161556fed6"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.7.0"
- },
- "identify": {
- "hashes": [
- "sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa",
- "sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==2.5.1"
- },
- "nodeenv": {
- "hashes": [
- "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b",
- "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"
- ],
- "version": "==1.6.0"
- },
- "platformdirs": {
- "hashes": [
- "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788",
- "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==2.5.2"
- },
- "pre-commit": {
- "hashes": [
- "sha256:6c86d977d00ddc8a60d68eec19f51ef212d9462937acf3ea37c7adec32284ac0",
- "sha256:ee784c11953e6d8badb97d19bc46b997a3a9eded849881ec587accd8608d74a4"
- ],
- "index": "pypi",
- "version": "==2.9.3"
- },
- "pyyaml": {
- "hashes": [
- "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
- "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
- "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
- "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
- "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
- "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
- "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
- "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
- "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
- "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
- "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
- "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
- "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
- "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
- "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
- "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
- "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
- "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
- "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
- "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
- "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
- "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
- "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
- "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
- "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
- "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
- "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
- "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
- "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
- "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
- "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
- "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
- "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==6.0"
- },
- "six": {
- "hashes": [
- "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.16.0"
- },
- "toml": {
- "hashes": [
- "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
- "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
- ],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.10.2"
- },
- "virtualenv": {
- "hashes": [
- "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a",
- "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==20.14.1"
- }
- }
-}
diff --git a/requirements/coverage.in b/requirements/coverage.in
new file mode 100644
index 0000000..7f38b54
--- /dev/null
+++ b/requirements/coverage.in
@@ -0,0 +1,3 @@
+-c requirements.pip
+
+coverage[toml]>=6.3.1
diff --git a/requirements/coverage.pip b/requirements/coverage.pip
new file mode 100644
index 0000000..fcc14da
--- /dev/null
+++ b/requirements/coverage.pip
@@ -0,0 +1,10 @@
+#
+# This file is autogenerated by pip-compile with python 3.10
+# To update, run:
+#
+# pip-compile --output-file=requirements/coverage.pip requirements/coverage.in
+#
+coverage[toml]==6.4
+ # via -r requirements/coverage.in
+tomli==2.0.1
+ # via coverage
diff --git a/requirements/coveralls.in b/requirements/coveralls.in
new file mode 100644
index 0000000..28d4959
--- /dev/null
+++ b/requirements/coveralls.in
@@ -0,0 +1,3 @@
+-c coverage.pip
+
+coveralls>=3.3.1
diff --git a/requirements/coveralls.pip b/requirements/coveralls.pip
new file mode 100644
index 0000000..cd16e7c
--- /dev/null
+++ b/requirements/coveralls.pip
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with python 3.10
+# To update, run:
+#
+# pip-compile --output-file=requirements/coveralls.pip requirements/coveralls.in
+#
+certifi==2022.5.18.1
+ # via requests
+charset-normalizer==2.0.12
+ # via requests
+coverage[toml]==6.4
+ # via
+ # -c requirements/coverage.pip
+ # coveralls
+coveralls==3.3.1
+ # via -r requirements/coveralls.in
+docopt==0.6.2
+ # via coveralls
+idna==3.3
+ # via requests
+requests==2.27.1
+ # via coveralls
+tomli==2.0.1
+ # via
+ # -c requirements/coverage.pip
+ # coverage
+urllib3==1.26.9
+ # via requests
diff --git a/requirements/lint.in b/requirements/lint.in
new file mode 100644
index 0000000..18bac76
--- /dev/null
+++ b/requirements/lint.in
@@ -0,0 +1,4 @@
+-c coverage.pip
+-c requirements.pip
+
+pre-commit>=2.13
diff --git a/requirements/lint.pip b/requirements/lint.pip
new file mode 100644
index 0000000..a399b6f
--- /dev/null
+++ b/requirements/lint.pip
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with python 3.10
+# To update, run:
+#
+# pip-compile --output-file=requirements/lint.pip requirements/lint.in
+#
+cfgv==3.3.1
+ # via pre-commit
+distlib==0.3.4
+ # via virtualenv
+filelock==3.7.0
+ # via virtualenv
+identify==2.5.1
+ # via pre-commit
+nodeenv==1.6.0
+ # via pre-commit
+platformdirs==2.5.2
+ # via virtualenv
+pre-commit==2.19.0
+ # via -r requirements/lint.in
+pyyaml==6.0
+ # via pre-commit
+six==1.16.0
+ # via virtualenv
+toml==0.10.2
+ # via pre-commit
+virtualenv==20.14.1
+ # via pre-commit
diff --git a/requirements/pip-tools.in b/requirements/pip-tools.in
new file mode 100644
index 0000000..e459df9
--- /dev/null
+++ b/requirements/pip-tools.in
@@ -0,0 +1,6 @@
+-c coverage.pip
+-c lint.pip
+-c requirements.pip
+
+# Minimum version which supports pip>=22.1
+pip-tools>=6.6.1
diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip
new file mode 100644
index 0000000..46d53d0
--- /dev/null
+++ b/requirements/pip-tools.pip
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with python 3.10
+# To update, run:
+#
+# pip-compile --output-file=requirements/pip-tools.pip requirements/pip-tools.in
+#
+click==8.1.3
+ # via pip-tools
+pep517==0.12.0
+ # via pip-tools
+pip-tools==6.6.2
+ # via -r requirements/pip-tools.in
+tomli==2.0.1
+ # via
+ # -c requirements/coverage.pip
+ # pep517
+wheel==0.37.1
+ # via pip-tools
+
+# The following packages are considered to be unsafe in a requirements file:
+# pip
+# setuptools
diff --git a/requirements/requirements.in b/requirements/requirements.in
new file mode 100644
index 0000000..775ad39
--- /dev/null
+++ b/requirements/requirements.in
@@ -0,0 +1,7 @@
+# Sentry's Falcon integration relies on api_helpers. See falconry/falcon#1902
+falcon>=3.0.1
+
+gunicorn>=20
+jsonschema>=4.0
+protobuf>=3.19
+sentry-sdk[falcon]>=1.5.4
diff --git a/requirements/requirements.pip b/requirements/requirements.pip
new file mode 100644
index 0000000..21b6678
--- /dev/null
+++ b/requirements/requirements.pip
@@ -0,0 +1,29 @@
+#
+# This file is autogenerated by pip-compile with python 3.10
+# To update, run:
+#
+# pip-compile --output-file=requirements/requirements.pip requirements/requirements.in
+#
+attrs==21.4.0
+ # via jsonschema
+certifi==2022.5.18.1
+ # via sentry-sdk
+falcon==3.1.0
+ # via
+ # -r requirements/requirements.in
+ # sentry-sdk
+gunicorn==20.1.0
+ # via -r requirements/requirements.in
+jsonschema==4.5.1
+ # via -r requirements/requirements.in
+protobuf==4.21.1
+ # via -r requirements/requirements.in
+pyrsistent==0.18.1
+ # via jsonschema
+sentry-sdk[falcon]==1.5.12
+ # via -r requirements/requirements.in
+urllib3==1.26.9
+ # via sentry-sdk
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools