diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b55dce0..38c3618 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,40 +1,74 @@ --- name: CI +env: + IMAGE_NAME: research-template + PUBLIC_IMAGE_NAME: ghcr.io/opensafely/research-template + REGISTRY: ghcr.io + on: + workflow_dispatch: + pull_request: push: + branches: [main] jobs: - check: + build-and-test: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 + - uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0 + # Lint the dockerfile before building + with: + failure-threshold: error - uses: "opensafely-core/setup-action@v1" with: - python-version: "3.11" install-just: true - - name: Check formatting, linting and import sorting - run: just check - test: - runs-on: ubuntu-latest + - name: Build docker image + run: just build + + - name: Test docker image + run: just smoke-test + + - name: Save docker image + run: | + docker save research-template | gzip > /tmp/research-template.tar.gz + + - name: Upload docker image + uses: actions/upload-artifact@v4 + with: + name: research-template-image + path: /tmp/research-template.tar.gz + + publish: + needs: [build] + + runs-on: ubuntu-22.04 + + permissions: + contents: read + packages: write + + if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - uses: "opensafely-core/setup-action@v1" with: - python-version: "3.11" install-just: true - - name: Run tests -# env: # Add environment variables required for tests - run: | - just test - lint-dockerfile: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0 + - name: Download docker image + uses: actions/download-artifact@v4 with: - failure-threshold: error + name: research-template-image + path: /tmp/image + + - name: Import docker image + run: gunzip -c /tmp/image/research-template.tar.gz | docker load + + - name: Publish image + run: | + echo ${{ secrets.GITHUB_TOKEN }} | docker login $REGISTRY -u ${{ github.actor }} --password-stdin + docker tag $IMAGE_NAME $PUBLIC_IMAGE_NAME:latest + docker push $PUBLIC_IMAGE_NAME:latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index a9dd67e..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,35 +0,0 @@ -default_language_version: - python: python3.11 - -repos: - - repo: local - hooks: - - id: black - name: black - entry: just black - language: system - types: [python] - require_serial: true - - id: ruff - name: ruff - entry: just ruff - language: system - types: [python] - require_serial: true - - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.1.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: debug-statements - - id: check-ast - - id: check-json - - id: check-toml - - id: check-yaml - - id: detect-private-key - - - repo: https://github.com/stratasan/hadolint-pre-commit - rev: cdefcb0 - hooks: - - id: hadolint diff --git a/DEVELOPERS.md b/DEVELOPERS.md index c955e07..a636141 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -18,17 +18,6 @@ source <(just --completions bash) just # shortcut for just --list ``` +## Build instructions -## Local development environment - - -Set up a local development environment with: -``` -just dev_setup -``` - -## Tests -Run the tests with: -``` -just test -``` +Run `just build` to build the Docker image. diff --git a/Dockerfile b/Dockerfile index a888825..faf0a99 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,51 @@ -# All Dockerfiles should start from this base image -# Provide the TAG environment variable, or replace with the image version required -FROM ghcr.io/opensafely-core/base-docker:$TAG +FROM rocker/rstudio:4.0.5 + +LABEL org.opencontainers.image.source https://github.com/opensafely/research-template + +# we are going to use an apt cache on the host, so disable the default debian +# docker clean up that deletes that cache on every apt install +RUN rm -f /etc/apt/apt.conf.d/docker-clean + +# Install python 3.10. This is the version used by the python-docker +# image, used for analyses using the OpenSAFELY pipeline. +# +# DL3042: we always want latest package versions when we rebuild +# DL3013: using an apt cache on the host instead +# hadolint ignore=DL3042,DL3013 +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +RUN --mount=type=cache,target=/var/cache/apt \ + echo "deb http://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu focal main" > /etc/apt/sources.list.d/deadsnakes-ppa.list &&\ + /usr/lib/apt/apt-helper download-file 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf23c5a6cf475977595c89f51ba6932366a755776' /etc/apt/trusted.gpg.d/deadsnakes.asc &&\ + apt-get update &&\ + apt-get install -y --no-install-recommends curl python3.10 python3.10-distutils python3.10-venv &&\ + # Pip for Python 3.10 isn't included in deadsnakes, so install separately + curl https://bootstrap.pypa.io/get-pip.py | python3.10 &&\ + # Set default python, so that the Python virtualenv works as expected + rm /usr/bin/python3 &&\ + ln -s /usr/bin/python3.10 /usr/bin/python3 + +# install renv +RUN --mount=type=cache,target=/cache,id=/cache-2004 R -e 'install.packages("renv", destdir="/cache"); renv::init(bare = TRUE)' + +# copy the renv directory from the OpenSAFELY R action image +# +# DL3022: hadolint can't access a network and doesn't behave +# as expected when a reference is made to an external image. +# hadolint ignore=DL3022 +COPY --from=ghcr.io/opensafely-core/r /renv/ /renv/ + +# Copy the Python virtualenv from OpenSAFELY Python action image +# +# DL3022: hadolint can't access a network and doesn't behave +# as expected when a reference is made to an external image. +# hadolint ignore=DL3022 +COPY --from=ghcr.io/opensafely-core/python:v2 /opt/venv /opt/venv + +# Create a local user and give it sudo (aka root) permissions +RUN usermod -aG sudo rstudio &&\ + echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers + +# Required for installing opensafely cli +ENV PATH="/home/rstudio/.local/bin:${PATH}" + +USER rstudio diff --git a/README.md b/README.md index b157628..fac3eaf 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,6 @@ -# research-template-docker - -This is a template for an OpenSAFELY Core repository. - -Put your project description here. - -New repo checklist: -- [ ] Does the repo require a Dockerfile? - If not, delete: - - Dockerfile - - - .dockerignore - - hadolint pre-commit hook from `.pre-commit-config.yaml` - - `lint-dockerfile` action from `.github/workflows/main.yml` -- [ ] Is this a Django project? - If so, you probably need to add the following per-file ignores to `.flake8` - ``` - per-file-ignores = - manage.py:INP001 - gunicorn.conf.py:INP001 - ``` -- [ ] Will this project be installed with pip? - If so, delete `requirements.prod.in` and switch references in the `justfile` to `pyproject.toml` -- [ ] Update DEVELOPERS.md with any project-specific requirements and commands -- [ ] Update commands in `justfile` +# Research Template Docker +This provides the devcontainer Docker image used by repos created from the OpenSAFELY [research template](https://github.com/opensafely/research-template). ## Developer docs diff --git a/docs/adr/0000-record-architecture-decisions.md b/docs/adr/0000-record-architecture-decisions.md new file mode 100644 index 0000000..46ec8ea --- /dev/null +++ b/docs/adr/0000-record-architecture-decisions.md @@ -0,0 +1,19 @@ +# 0. Record architecture decisions + +Date: 2024-04-29 + +## Status + +Accepted + +## Context + +We need to record the architectural decisions made on this project. + +## Decision + +We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). + +## Consequences + +See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools). diff --git a/justfile b/justfile index 982695e..f09579e 100644 --- a/justfile +++ b/justfile @@ -1,168 +1,11 @@ -export VIRTUAL_ENV := env_var_or_default("VIRTUAL_ENV", ".venv") - -export BIN := VIRTUAL_ENV + if os_family() == "unix" { "/bin" } else { "/Scripts" } -export PIP := BIN + if os_family() == "unix" { "/python -m pip" } else { "/python.exe -m pip" } - -export DEFAULT_PYTHON := if os_family() == "unix" { "python3.11" } else { "python" } - +set dotenv-load := true # list available commands default: @"{{ just_executable() }}" --list +build: + docker build . -# clean up temporary files -clean: - rm -rf .venv - - -# ensure valid virtualenv -virtualenv: - #!/usr/bin/env bash - set -euo pipefail - - # allow users to specify python version in .env - PYTHON_VERSION=${PYTHON_VERSION:-$DEFAULT_PYTHON} - - # create venv and upgrade pip - test -d $VIRTUAL_ENV || { $PYTHON_VERSION -m venv $VIRTUAL_ENV && $PIP install --upgrade pip; } - - # ensure we have pip-tools so we can run pip-compile - test -e $BIN/pip-compile || $PIP install pip-tools - - -_compile src dst *args: virtualenv - #!/usr/bin/env bash - set -euo pipefail - - # exit if src file is older than dst file (-nt = 'newer than', but we negate with || to avoid error exit code) - test "${FORCE:-}" = "true" -o {{ src }} -nt {{ dst }} || exit 0 - $BIN/pip-compile --allow-unsafe --generate-hashes --output-file={{ dst }} {{ src }} {{ args }} - - -# update requirements.prod.txt if requirements.prod.in has changed -requirements-prod *args: - "{{ just_executable() }}" _compile requirements.prod.in requirements.prod.txt {{ args }} - - -# update requirements.dev.txt if requirements.dev.in has changed -requirements-dev *args: requirements-prod - "{{ just_executable() }}" _compile requirements.dev.in requirements.dev.txt {{ args }} - - -# ensure prod requirements installed and up to date -prodenv: requirements-prod - #!/usr/bin/env bash - set -euo pipefail - - # exit if .txt file has not changed since we installed them (-nt == "newer than', but we negate with || to avoid error exit code) - test requirements.prod.txt -nt $VIRTUAL_ENV/.prod || exit 0 - - $PIP install -r requirements.prod.txt - touch $VIRTUAL_ENV/.prod - - -# && dependencies are run after the recipe has run. Needs just>=0.9.9. This is -# a killer feature over Makefiles. -# -# ensure dev requirements installed and up to date -devenv: prodenv requirements-dev && install-precommit - #!/usr/bin/env bash - set -euo pipefail - - # exit if .txt file has not changed since we installed them (-nt == "newer than', but we negate with || to avoid error exit code) - test requirements.dev.txt -nt $VIRTUAL_ENV/.dev || exit 0 - - $PIP install -r requirements.dev.txt - touch $VIRTUAL_ENV/.dev - - -# ensure precommit is installed -install-precommit: - #!/usr/bin/env bash - set -euo pipefail - - BASE_DIR=$(git rev-parse --show-toplevel) - test -f $BASE_DIR/.git/hooks/pre-commit || $BIN/pre-commit install - - -# upgrade dev or prod dependencies (specify package to upgrade single package, all by default) -upgrade env package="": virtualenv - #!/usr/bin/env bash - set -euo pipefail - - opts="--upgrade" - test -z "{{ package }}" || opts="--upgrade-package {{ package }}" - FORCE=true "{{ just_executable() }}" requirements-{{ env }} $opts - - -# *args is variadic, 0 or more. This allows us to do `just test -k match`, for example. -# Run the tests -test *args: devenv - $BIN/coverage run --module pytest {{ args }} - $BIN/coverage report || $BIN/coverage html - - -black *args=".": devenv - $BIN/black --check {{ args }} - -ruff *args=".": devenv - $BIN/ruff check {{ args }} - -# run the various dev checks but does not change any files -check: black ruff - - -# fix formatting and import sort ordering -fix: devenv - $BIN/black . - $BIN/ruff --fix . - - -# Run the dev project -run: devenv - echo "Not implemented yet" - - - -# Remove built assets and collected static files -assets-clean: - rm -rf assets/dist - rm -rf staticfiles - - -# Install the Node.js dependencies -assets-install: - #!/usr/bin/env bash - set -euo pipefail - - # exit if lock file has not changed since we installed them. -nt == "newer than", - # but we negate with || to avoid error exit code - test package-lock.json -nt node_modules/.written || exit 0 - - npm ci - touch node_modules/.written - - -# Build the Node.js assets -assets-build: - #!/usr/bin/env bash - set -euo pipefail - - # find files which are newer than dist/.written in the src directory. grep - # will exit with 1 if there are no files in the result. We negate this - # with || to avoid error exit code - # we wrap the find in an if in case dist/.written is missing so we don't - # trigger a failure prematurely - if test -f assets/dist/.written; then - find assets/src -type f -newer assets/dist/.written | grep -q . || exit 0 - fi - - npm run build - touch assets/dist/.written - - -assets: assets-install assets-build - - -assets-rebuild: assets-clean assets +smoke-test: + docker run --rm research-template ls /opt/venv/bin/python3.10 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 0273082..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,46 +0,0 @@ -[tool.coverage.run] -branch = true -dynamic_context = "test_function" -omit = [ - ".venv/*", -] - -[tool.coverage.report] -fail_under = 100 -skip_covered = true -show_missing = true - -[tool.coverage.html] -show_contexts = true - -[tool.pytest.ini_options] - -[tool.ruff] -line-length = 88 -exclude = [ - ".direnv", - ".git", - ".github", - ".ipynb_checkpoints", - ".pytest_cache", - ".venv", - "__pycache__", - "docker", - "htmlcov", - "venv", -] -extend-select = [ - "A", # flake8-builtins - "I", # isort - "INP", # flake8-no-pep420 - "ISC", # flake8-implicit-str-concat - "UP", # pyupgrade - "W", # pycodestyle warning -] -extend-ignore = [ - "E501", - "E731", -] - -[tool.ruff.isort] -lines-after-imports = 2 diff --git a/requirements.dev.in b/requirements.dev.in deleted file mode 100644 index a0d0115..0000000 --- a/requirements.dev.in +++ /dev/null @@ -1,13 +0,0 @@ ---constraint requirements.prod.txt - -# Additional dev requirements -# To generate a requirements file that includes both prod and dev requirements, run: -# pip-compile --generate-hashes --output-file=requirements.dev.txt requirements.dev.in - -black -coverage -pip-tools -pre-commit -pytest -pyyaml==6.0.1 -ruff diff --git a/requirements.dev.txt b/requirements.dev.txt deleted file mode 100644 index 36d9340..0000000 --- a/requirements.dev.txt +++ /dev/null @@ -1,242 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --allow-unsafe --generate-hashes --output-file=requirements.dev.txt requirements.dev.in -# -black==24.2.0 \ - --hash=sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8 \ - --hash=sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8 \ - --hash=sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd \ - --hash=sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9 \ - --hash=sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31 \ - --hash=sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92 \ - --hash=sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f \ - --hash=sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29 \ - --hash=sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4 \ - --hash=sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693 \ - --hash=sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218 \ - --hash=sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a \ - --hash=sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23 \ - --hash=sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0 \ - --hash=sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982 \ - --hash=sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894 \ - --hash=sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540 \ - --hash=sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430 \ - --hash=sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b \ - --hash=sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2 \ - --hash=sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6 \ - --hash=sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d - # via -r requirements.dev.in -build==1.0.3 \ - --hash=sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b \ - --hash=sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f - # via pip-tools -cfgv==3.3.0 \ - --hash=sha256:9e600479b3b99e8af981ecdfc80a0296104ee610cab48a5ae4ffd0b668650eb1 \ - --hash=sha256:b449c9c6118fe8cca7fa5e00b9ec60ba08145d281d52164230a69211c5d597a1 - # via pre-commit -click==8.0.1 \ - --hash=sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a \ - --hash=sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6 - # via - # black - # pip-tools -coverage==7.4.3 \ - --hash=sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa \ - --hash=sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003 \ - --hash=sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f \ - --hash=sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c \ - --hash=sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e \ - --hash=sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0 \ - --hash=sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9 \ - --hash=sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52 \ - --hash=sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e \ - --hash=sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454 \ - --hash=sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0 \ - --hash=sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079 \ - --hash=sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352 \ - --hash=sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f \ - --hash=sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30 \ - --hash=sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe \ - --hash=sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113 \ - --hash=sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765 \ - --hash=sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc \ - --hash=sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e \ - --hash=sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501 \ - --hash=sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7 \ - --hash=sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2 \ - --hash=sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f \ - --hash=sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4 \ - --hash=sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524 \ - --hash=sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c \ - --hash=sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51 \ - --hash=sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840 \ - --hash=sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6 \ - --hash=sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee \ - --hash=sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e \ - --hash=sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45 \ - --hash=sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba \ - --hash=sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d \ - --hash=sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3 \ - --hash=sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10 \ - --hash=sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e \ - --hash=sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb \ - --hash=sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9 \ - --hash=sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a \ - --hash=sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47 \ - --hash=sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1 \ - --hash=sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3 \ - --hash=sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914 \ - --hash=sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328 \ - --hash=sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6 \ - --hash=sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d \ - --hash=sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0 \ - --hash=sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94 \ - --hash=sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc \ - --hash=sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2 - # via -r requirements.dev.in -distlib==0.3.6 \ - --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ - --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e - # via virtualenv -filelock==3.9.0 \ - --hash=sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de \ - --hash=sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d - # via virtualenv -identify==2.2.11 \ - --hash=sha256:7abaecbb414e385752e8ce02d8c494f4fbc780c975074b46172598a28f1ab839 \ - --hash=sha256:a0e700637abcbd1caae58e0463861250095dfe330a8371733a471af706a4a29a - # via pre-commit -iniconfig==1.1.1 \ - --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ - --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 - # via pytest -mypy-extensions==0.4.3 \ - --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ - --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 - # via black -nodeenv==1.6.0 \ - --hash=sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b \ - --hash=sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7 - # via pre-commit -packaging==23.0 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 - # via - # black - # build - # pytest -pathspec==0.9.0 \ - --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ - --hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1 - # via black -pip-tools==7.4.0 \ - --hash=sha256:a92a6ddfa86ff389fe6ace381d463bc436e2c705bd71d52117c25af5ce867bb7 \ - --hash=sha256:b67432fd0759ed834c5367f9e0ce8c95441acecfec9c8e24b41aca166757adf0 - # via -r requirements.dev.in -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 - # via - # black - # virtualenv -pluggy==1.4.0 \ - --hash=sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981 \ - --hash=sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be - # via pytest -pre-commit==3.6.2 \ - --hash=sha256:ba637c2d7a670c10daedc059f5c49b5bd0aadbccfcd7ec15592cf9665117532c \ - --hash=sha256:c3ef34f463045c88658c5b99f38c1e297abdcc0ff13f98d3370055fbbfabc67e - # via -r requirements.dev.in -pyproject-hooks==1.0.0 \ - --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ - --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 - # via - # build - # pip-tools -pytest==8.0.2 \ - --hash=sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd \ - --hash=sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096 - # via -r requirements.dev.in -pyyaml==6.0.1 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via - # -r requirements.dev.in - # pre-commit -ruff==0.2.2 \ - --hash=sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6 \ - --hash=sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e \ - --hash=sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c \ - --hash=sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9 \ - --hash=sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e \ - --hash=sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3 \ - --hash=sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba \ - --hash=sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001 \ - --hash=sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726 \ - --hash=sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e \ - --hash=sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd \ - --hash=sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d \ - --hash=sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39 \ - --hash=sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325 \ - --hash=sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d \ - --hash=sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73 \ - --hash=sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca - # via -r requirements.dev.in -virtualenv==20.17.1 \ - --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ - --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 - # via pre-commit -wheel==0.38.1 \ - --hash=sha256:7a95f9a8dc0924ef318bd55b616112c70903192f524d120acc614f59547a9e1f \ - --hash=sha256:ea041edf63f4ccba53ad6e035427997b3bb10ee88a4cd014ae82aeb9eea77bb9 - # via pip-tools - -# The following packages are considered to be unsafe in a requirements file: -pip==23.3 \ - --hash=sha256:bb7d4f69f488432e4e96394612f43ab43dd478d073ef7422604a570f7157561e \ - --hash=sha256:bc38bb52bc286514f8f7cb3a1ba5ed100b76aaef29b521d48574329331c5ae7b - # via pip-tools -setuptools==67.6.1 \ - --hash=sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a \ - --hash=sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078 - # via pip-tools diff --git a/requirements.prod.in b/requirements.prod.in deleted file mode 100644 index 06b80ca..0000000 --- a/requirements.prod.in +++ /dev/null @@ -1,4 +0,0 @@ -# Main prod requirements - -# To generate requirements file, run: -# pip-compile --generate-hashes --output-file=requirements.prod.txt requirements.prod.in diff --git a/requirements.prod.txt b/requirements.prod.txt deleted file mode 100644 index 2a042f5..0000000 --- a/requirements.prod.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -# This file is autogenerated by pip-compile with python 3.11 -# To update, run: -# -# pip-compile --allow-unsafe --generate-hashes --output-file=requirements.prod.txt requirements.prod.in -#