Use pip-tools to handle Python deps (#3892)

[pip-tools](https://github.com/jazzband/pip-tools) helps making builds
deterministic, controlling deps (and indirect deps) upgrades (and
versions consistency) avoiding unexpected (and potentially breaking)
changes.

We keep our direct deps in `requirements.in` from which we generate the
`requirements.txt` (where *all* deps are pinned). We also constrain dev
(and enterprise) deps based on base requirements.

Check how to [update
deps](https://github.com/jazzband/pip-tools?tab=readme-ov-file#updating-requirements).
This commit is contained in:
Matias Bordese 2024-02-20 14:44:15 -03:00 committed by GitHub
parent 0599c8f918
commit c1b279aab8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 751 additions and 80 deletions

View file

@ -127,7 +127,8 @@ jobs:
# makemigrations --check = Exit with a non-zero status if model changes are missing migrations
# and don't actually write them.
run: |
pip install -r requirements.txt -r requirements-dev.txt
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt
python manage.py makemigrations --check
python manage.py lintmigrations
@ -184,7 +185,8 @@ jobs:
working-directory: engine
run: |
apt-get update && apt-get install -y netcat-traditional
pip install -r requirements.txt -r requirements-dev.txt
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt
./wait_for_test_mysql_start.sh && pytest -x
unit-test-backend-postgresql-rabbitmq:
@ -233,7 +235,8 @@ jobs:
- name: Unit Test Backend
working-directory: engine
run: |
pip install -r requirements.txt -r requirements-dev.txt
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt
pytest -x
unit-test-backend-sqlite-redis:
@ -272,7 +275,8 @@ jobs:
working-directory: engine
run: |
apt-get update && apt-get install -y netcat-traditional
pip install -r requirements.txt -r requirements-dev.txt
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt
pytest -x
unit-test-pd-migrator:
@ -288,7 +292,8 @@ jobs:
- name: Unit Test PD Migrator
working-directory: tools/pagerduty-migrator
run: |
pip install -r requirements.txt
pip install pip-tools
pip-sync requirements.txt
pytest -x
mypy:
@ -306,7 +311,8 @@ jobs:
- name: mypy Static Type Checking
working-directory: engine
run: |
pip install -r requirements.txt -r requirements-dev.txt
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt
mypy .
end-to-end-tests:

View file

@ -28,6 +28,10 @@ DEV_HELM_FILE = $(DEV_ENV_DIR)/helm-local.yml
DEV_HELM_USER_SPECIFIC_FILE = $(DEV_ENV_DIR)/helm-local.dev.yml
ENGINE_DIR = ./engine
VENV_DIR = ./venv
REQUIREMENTS_DEV_IN = $(ENGINE_DIR)/requirements-dev.in
REQUIREMENTS_DEV_TXT = $(ENGINE_DIR)/requirements-dev.txt
REQUIREMENTS_IN = $(ENGINE_DIR)/requirements.in
REQUIREMENTS_TXT = $(ENGINE_DIR)/requirements.txt
REQUIREMENTS_ENTERPRISE_TXT = $(ENGINE_DIR)/requirements-enterprise.txt
SQLITE_DB_FILE = $(ENGINE_DIR)/oncall.db
@ -237,20 +241,29 @@ backend-debug-disable: _backend-debug-disable stop start
define backend_command
export `grep -v '^#' $(DEV_ENV_FILE) | xargs -0` && \
export BROKER_TYPE=$(BROKER_TYPE) && \
. ./venv/bin/activate && \
cd engine && \
$(1)
endef
backend-bootstrap:
pip install -U pip wheel
pip install -r $(REQUIREMENTS_TXT)
python3.11 -m venv $(VENV_DIR)
$(VENV_DIR)/bin/pip install -U pip wheel pip-tools
$(VENV_DIR)/bin/pip-sync $(REQUIREMENTS_TXT) $(REQUIREMENTS_DEV_TXT)
@if [ -f $(REQUIREMENTS_ENTERPRISE_TXT) ]; then \
pip install -r $(REQUIREMENTS_ENTERPRISE_TXT); \
$(VENV_DIR)/bin/pip install -r $(REQUIREMENTS_ENTERPRISE_TXT); \
fi
backend-migrate:
$(call backend_command,python manage.py migrate)
backend-compile-deps:
pip-compile --strip-extras $(REQUIREMENTS_IN)
pip-compile --strip-extras $(REQUIREMENTS_DEV_IN)
backend-upgrade-deps:
pip-compile --strip-extras --upgrade $(REQUIREMENTS_IN)
run-backend-server:
$(call backend_command,python manage.py runserver 0.0.0.0:8080)

View file

@ -44,7 +44,7 @@ docker_build_sub(
live_update=[
sync("./engine/", "/etc/app"),
run(
"cd /etc/app && pip install -r requirements.txt",
"cd /etc/app && pip install pip-tools && pip-sync",
trigger="./engine/requirements.txt",
),
],

View file

@ -189,13 +189,11 @@ See the `django-silk` documentation [here](https://github.com/jazzband/django-si
By default everything runs inside Docker. If you would like to run the backend services outside of Docker
(for integrating w/ PyCharm for example), follow these instructions:
1. Create a Python 3.11 virtual environment using a method of your choosing (ex.
[venv](https://docs.python.org/3.11/library/venv.html) or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)).
Make sure the virtualenv is "activated".
1. Make sure you have Python 3.11 installed.
2. `postgres` is a dependency on some of our Python dependencies (notably `psycopg2`
([docs](https://www.psycopg.org/docs/install.html#prerequisites))). Please visit
[here](https://www.postgresql.org/download/) for installation instructions.
3. `make backend-bootstrap` - installs all backend dependencies
3. `make backend-bootstrap` - will create the virtual env and install all backend dependencies
4. Modify your `.env.dev` by copying the contents of one of `.env.mysql.dev`, `.env.postgres.dev`,
or `.env.sqlite.dev` into `.env.dev` (you should exclude the `GF_` prefixed environment variables).
@ -209,6 +207,22 @@ By default everything runs inside Docker. If you would like to run the backend s
- `make run-backend-server` - runs the HTTP server
- `make run-backend-celery` - runs Celery workers
### Adding or updating Python dependencies
We are using [pip-tools](https://github.com/jazzband/pip-tools) to manage our dependencies. It helps
making builds deterministic, controlling deps (and indirect deps) upgrades (and versions consistency)
avoiding unexpected (and potentially breaking) changes.
We keep our direct deps in `requirements.in` from which we generate (through `pip-compile`) the
`requirements.txt` (where all deps are pinned). We also constrain dev (and enterprise) deps based
on our base requirements. Check [how to update deps](https://github.com/jazzband/pip-tools?tab=readme-ov-file#updating-requirements).
`pip install -r requirements.txt` will keep working (the difference is that this should never
bring additional dependencies or different versions not listed there), and when starting an env
from scratch, it would be the same as running `pip-sync`. `pip-sync` on the other hand will also
ensure to clean up any deps not listed in the requirements, keeping the env exactly as described
in `requirements.txt`.
## UI E2E Tests
We've developed a suite of "end-to-end" integration tests using [Playwright](https://playwright.dev/). These tests

View file

@ -0,0 +1,16 @@
-c requirements.txt
celery-types==0.18.0
django-filter-stubs==0.1.3
django-stubs[compatible-mypy]==4.2.2
djangorestframework-stubs[compatible-mypy]==3.14.2
httpretty==1.1.4
mypy==1.4.1
pre-commit==2.15.0
pytest==7.3.1
pytest-django==4.5.2
pytest-xdist[psutil]==3.5.0
pytest_factoryboy==2.5.1
types-beautifulsoup4==4.12.0.5
types-PyMySQL==1.0.19.7
types-python-dateutil==2.8.19.13
types-requests==2.31.0.1

View file

@ -1,15 +1,169 @@
#
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile --strip-extras ./engine/requirements-dev.in
#
asgiref==3.7.2
# via
# -c ./engine/requirements.txt
# django
celery-types==0.18.0
# via -r ./engine/requirements-dev.in
certifi==2024.2.2
# via
# -c ./engine/requirements.txt
# requests
cfgv==3.4.0
# via pre-commit
charset-normalizer==3.3.2
# via
# -c ./engine/requirements.txt
# requests
distlib==0.3.8
# via virtualenv
django==4.2.10
# via
# -c ./engine/requirements.txt
# django-stubs
# django-stubs-ext
django-filter-stubs==0.1.3
django-stubs[compatible-mypy]==4.2.2
djangorestframework-stubs[compatible-mypy]==3.14.2
mypy==1.4.1
pre-commit==2.15.0
pytest==7.3.1
pytest-django==4.5.2
pytest_factoryboy==2.5.1
types-beautifulsoup4==4.12.0.5
types-PyMySQL==1.0.19.7
types-python-dateutil==2.8.19.13
types-requests==2.31.0.1
# via -r ./engine/requirements-dev.in
django-stubs==4.2.2
# via
# -r ./engine/requirements-dev.in
# django-filter-stubs
# django-stubs
# djangorestframework-stubs
django-stubs-ext==4.2.7
# via django-stubs
djangorestframework-stubs==3.14.2
# via
# -r ./engine/requirements-dev.in
# django-filter-stubs
# djangorestframework-stubs
execnet==2.0.2
# via pytest-xdist
factory-boy==2.12.0
# via
# -c ./engine/requirements.txt
# pytest-factoryboy
faker==23.1.0
# via
# -c ./engine/requirements.txt
# factory-boy
filelock==3.13.1
# via virtualenv
httpretty==1.1.4
pytest-xdist[psutil]==3.5.0
# via -r ./engine/requirements-dev.in
identify==2.5.34
# via pre-commit
idna==3.6
# via
# -c ./engine/requirements.txt
# requests
inflection==0.5.1
# via
# -c ./engine/requirements.txt
# pytest-factoryboy
iniconfig==2.0.0
# via pytest
mypy==1.4.1
# via
# -r ./engine/requirements-dev.in
# django-filter-stubs
# django-stubs
# djangorestframework-stubs
mypy-extensions==1.0.0
# via mypy
nodeenv==1.8.0
# via pre-commit
packaging==23.2
# via pytest
platformdirs==4.2.0
# via virtualenv
pluggy==1.4.0
# via pytest
pre-commit==2.15.0
# via -r ./engine/requirements-dev.in
psutil==5.9.4
# via
# -c ./engine/requirements.txt
# pytest-xdist
pytest==7.3.1
# via
# -r ./engine/requirements-dev.in
# pytest-django
# pytest-factoryboy
# pytest-xdist
pytest-django==4.5.2
# via -r ./engine/requirements-dev.in
pytest-factoryboy==2.5.1
# via -r ./engine/requirements-dev.in
pytest-xdist==3.5.0
# via
# -r ./engine/requirements-dev.in
# pytest-xdist
python-dateutil==2.8.2
# via
# -c ./engine/requirements.txt
# faker
pyyaml==6.0.1
# via
# -c ./engine/requirements.txt
# pre-commit
requests==2.31.0
# via
# -c ./engine/requirements.txt
# djangorestframework-stubs
six==1.16.0
# via
# -c ./engine/requirements.txt
# python-dateutil
sqlparse==0.4.4
# via
# -c ./engine/requirements.txt
# django
toml==0.10.2
# via
# -c ./engine/requirements.txt
# pre-commit
types-beautifulsoup4==4.12.0.5
# via -r ./engine/requirements-dev.in
types-html5lib==1.1.11.20240106
# via types-beautifulsoup4
types-pymysql==1.0.19.7
# via -r ./engine/requirements-dev.in
types-python-dateutil==2.8.19.13
# via -r ./engine/requirements-dev.in
types-pytz==2024.1.0.20240203
# via django-stubs
types-pyyaml==6.0.12.12
# via
# django-stubs
# djangorestframework-stubs
types-requests==2.31.0.1
# via
# -r ./engine/requirements-dev.in
# djangorestframework-stubs
types-urllib3==1.26.25.14
# via types-requests
typing-extensions==4.9.0
# via
# -c ./engine/requirements.txt
# celery-types
# django-filter-stubs
# django-stubs
# django-stubs-ext
# djangorestframework-stubs
# mypy
# pytest-factoryboy
urllib3==1.26.18
# via
# -c ./engine/requirements.txt
# requests
virtualenv==20.25.0
# via pre-commit
# The following packages are considered to be unsafe in a requirements file:
# setuptools

58
engine/requirements.in Normal file
View file

@ -0,0 +1,58 @@
babel==2.12.1
beautifulsoup4==4.12.2
celery[redis]==5.3.1
cryptography==38.0.4 # version 39.0.0 introduced an issue - https://stackoverflow.com/a/75053968/3902555
django==4.2.10
django-add-default-value==0.10.0
django-amazon-ses==4.0.1
django-anymail==8.6
django-cors-headers==3.7.0
# pyroscope-io==0.8.1
django-dbconn-retry==0.1.7
django-debug-toolbar==4.1
django-deprecate-fields==0.1.1
django-filter==2.4.0
django-ipware==4.0.2
django-log-request-id==1.6.0
django-migration-linter==4.1.0
django-mirage-field==1.3.0
django-mysql==4.6.0
django-polymorphic==3.1.0
django-ratelimit==2.0.0
django-redis==5.4.0
django-rest-polymorphic==0.1.10
django-silk==5.0.3
django-sns-view==0.1.2
djangorestframework==3.14.0
factory-boy<3.0
drf-spectacular==0.26.5
emoji==2.4.0
grpcio==1.57.0
fcm-django @ https://github.com/grafana/fcm-django/archive/refs/tags/v1.0.12r1.tar.gz#sha256=7ec7cd9d353fc9edf19a4acd4fa14090a31d83d02ac986c5e5e081dea29f564f
hiredis==2.2.3
humanize==0.5.1
icalendar==5.0.10
lxml==4.9.2
markdown2==2.4.10
opentelemetry-exporter-otlp-proto-grpc==1.15.0
opentelemetry-instrumentation-celery==0.36b0
opentelemetry-instrumentation-pymysql==0.36b0
opentelemetry-instrumentation-wsgi==0.36b0
phonenumbers==8.10.0
prometheus_client==0.16.0
psutil==5.9.4
psycopg2==2.9.3
pymdown-extensions==10.0
PyMySQL==1.1.0
python-telegram-bot==13.13
recurring-ical-events==2.1.0
redis==5.0.1
regex==2021.11.2
requests==2.31.0
slack-export-viewer==1.1.4
slack_sdk==3.21.3
social-auth-app-django==5.3.0
twilio~=6.37.0
urllib3==1.26.18
uwsgi==2.0.21
whitenoise==5.3.0

View file

@ -1,58 +1,468 @@
django==4.2.10
djangorestframework==3.14.0
slack_sdk==3.21.3
whitenoise==5.3.0
twilio~=6.37.0
phonenumbers==8.10.0
celery[amqp,redis]==5.3.1
redis==5.0.1
humanize==0.5.1
uwsgi==2.0.21
django-cors-headers==3.7.0
django-debug-toolbar==4.1
django-sns-view==0.1.2
python-telegram-bot==13.13
django-silk==5.0.3
django-redis==5.4.0
hiredis==2.2.3
django-ratelimit==2.0.0
django-filter==2.4.0
icalendar==5.0.10
recurring-ical-events==2.1.0
slack-export-viewer==1.1.4
beautifulsoup4==4.12.2
social-auth-app-django==5.3.0
cryptography==38.0.4 # version 39.0.0 introduced an issue - https://stackoverflow.com/a/75053968/3902555
factory-boy<3.0
django-log-request-id==1.6.0
django-polymorphic==3.1.0
django-rest-polymorphic==0.1.10
https://github.com/grafana/fcm-django/archive/refs/tags/v1.0.12r1.tar.gz
django-mirage-field==1.3.0
django-mysql==4.6.0
PyMySQL==1.1.0
psycopg2==2.9.3
emoji==2.4.0
regex==2021.11.2
psutil==5.9.4
django-migration-linter==4.1.0
django-add-default-value==0.10.0
opentelemetry-instrumentation-celery==0.36b0
opentelemetry-instrumentation-pymysql==0.36b0
opentelemetry-instrumentation-wsgi==0.36b0
opentelemetry-exporter-otlp-proto-grpc==1.15.0
# pyroscope-io==0.8.1
django-dbconn-retry==0.1.7
django-ipware==4.0.2
django-anymail==8.6
django-amazon-ses==4.0.1
django-deprecate-fields==0.1.1
pymdown-extensions==10.0
requests==2.31.0
urllib3==1.26.18
prometheus_client==0.16.0
lxml==4.9.2
#
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile --strip-extras ./engine/requirements.in
#
amqp==5.2.0
# via kombu
appdirs==1.4.4
# via django-migration-linter
apscheduler==3.6.3
# via python-telegram-bot
asgiref==3.7.2
# via django
attrs==23.2.0
# via
# jsonschema
# referencing
autopep8==2.0.4
# via django-silk
babel==2.12.1
# via -r ./engine/requirements.in
backoff==2.2.1
# via opentelemetry-exporter-otlp-proto-grpc
beautifulsoup4==4.12.2
# via -r ./engine/requirements.in
billiard==4.2.0
# via celery
blinker==1.7.0
# via flask
boto3==1.34.41
# via django-amazon-ses
botocore==1.34.41
# via
# boto3
# s3transfer
cachecontrol==0.14.0
# via firebase-admin
cachetools==4.2.2
# via
# google-auth
# python-telegram-bot
celery==5.3.1
# via
# -r ./engine/requirements.in
# celery
certifi==2024.2.2
# via
# python-telegram-bot
# requests
cffi==1.16.0
# via
# cryptography
# django-sns-view
charset-normalizer==3.3.2
# via requests
click==8.1.7
# via
# celery
# click-didyoumean
# click-plugins
# click-repl
# flask
# slack-export-viewer
click-didyoumean==0.3.0
# via celery
click-plugins==1.1.1
# via celery
click-repl==0.3.0
# via celery
cryptography==38.0.4
# via
# -r ./engine/requirements.in
# django-mirage-field
# pyopenssl
# social-auth-core
defusedxml==0.8.0rc2
# via
# python3-openid
# social-auth-core
deprecated==1.2.14
# via opentelemetry-api
django==4.2.10
# via
# -r ./engine/requirements.in
# django-add-default-value
# django-amazon-ses
# django-anymail
# django-cors-headers
# django-debug-toolbar
# django-deprecate-fields
# django-filter
# django-log-request-id
# django-migration-linter
# django-mysql
# django-polymorphic
# django-redis
# django-rest-polymorphic
# django-silk
# django-sns-view
# djangorestframework
# drf-spectacular
# fcm-django
# social-auth-app-django
django-add-default-value==0.10.0
# via -r ./engine/requirements.in
django-amazon-ses==4.0.1
# via -r ./engine/requirements.in
django-anymail==8.6
# via -r ./engine/requirements.in
django-cors-headers==3.7.0
# via -r ./engine/requirements.in
django-dbconn-retry==0.1.7
# via -r ./engine/requirements.in
django-debug-toolbar==4.1.0
# via -r ./engine/requirements.in
django-deprecate-fields==0.1.1
# via -r ./engine/requirements.in
django-filter==2.4.0
# via -r ./engine/requirements.in
django-ipware==4.0.2
# via -r ./engine/requirements.in
django-log-request-id==1.6.0
# via -r ./engine/requirements.in
django-migration-linter==4.1.0
# via -r ./engine/requirements.in
django-mirage-field==1.3.0
# via -r ./engine/requirements.in
django-mysql==4.6.0
# via -r ./engine/requirements.in
django-polymorphic==3.1.0
# via
# -r ./engine/requirements.in
# django-rest-polymorphic
django-ratelimit==2.0.0
# via -r ./engine/requirements.in
django-redis==5.4.0
# via -r ./engine/requirements.in
django-rest-polymorphic==0.1.10
# via -r ./engine/requirements.in
django-silk==5.0.3
# via -r ./engine/requirements.in
django-sns-view==0.1.2
# via -r ./engine/requirements.in
djangorestframework==3.14.0
# via
# -r ./engine/requirements.in
# django-rest-polymorphic
# drf-spectacular
drf-spectacular==0.26.5
# via -r ./engine/requirements.in
emoji==2.4.0
# via
# -r ./engine/requirements.in
# slack-export-viewer
factory-boy==2.12.0
# via -r ./engine/requirements.in
faker==23.1.0
# via factory-boy
fcm-django @ https://github.com/grafana/fcm-django/archive/refs/tags/v1.0.12r1.tar.gz#sha256=7ec7cd9d353fc9edf19a4acd4fa14090a31d83d02ac986c5e5e081dea29f564f
# via -r ./engine/requirements.in
firebase-admin==5.4.0
# via fcm-django
flask==3.0.2
# via slack-export-viewer
google-api-core==2.17.0
# via
# firebase-admin
# google-api-core
# google-api-python-client
# google-cloud-core
# google-cloud-firestore
# google-cloud-storage
google-api-python-client==2.118.0
# via firebase-admin
google-auth==2.27.0
# via
# google-api-core
# google-api-python-client
# google-auth-httplib2
# google-cloud-core
# google-cloud-storage
google-auth-httplib2==0.2.0
# via google-api-python-client
google-cloud-core==2.4.1
# via
# google-cloud-firestore
# google-cloud-storage
google-cloud-firestore==2.14.0
# via firebase-admin
google-cloud-storage==2.14.0
# via firebase-admin
google-crc32c==1.5.0
# via
# google-cloud-storage
# google-resumable-media
google-resumable-media==2.7.0
# via google-cloud-storage
googleapis-common-protos==1.62.0
# via
# google-api-core
# grpcio-status
# opentelemetry-exporter-otlp-proto-grpc
gprof2dot==2022.7.29
# via django-silk
grpcio==1.57.0
# via
# -r ./engine/requirements.in
# google-api-core
# grpcio-status
# opentelemetry-exporter-otlp-proto-grpc
grpcio-status==1.57.0
# via google-api-core
hiredis==2.2.3
# via -r ./engine/requirements.in
httplib2==0.22.0
# via
# google-api-python-client
# google-auth-httplib2
humanize==0.5.1
# via -r ./engine/requirements.in
icalendar==5.0.10
# via
# -r ./engine/requirements.in
# recurring-ical-events
# x-wr-timezone
idna==3.6
# via requests
inflection==0.5.1
# via drf-spectacular
itsdangerous==2.1.2
# via flask
jinja2==3.1.3
# via flask
jmespath==1.0.1
# via
# boto3
# botocore
jsonschema==4.21.1
# via drf-spectacular
jsonschema-specifications==2023.12.1
# via jsonschema
kombu==5.3.5
# via celery
lxml==4.9.2
# via -r ./engine/requirements.in
markdown==3.5.2
# via pymdown-extensions
markdown2==2.4.10
# via
# -r ./engine/requirements.in
# slack-export-viewer
markupsafe==2.1.5
# via
# jinja2
# werkzeug
msgpack==1.0.7
# via cachecontrol
oauthlib==3.2.2
# via
# requests-oauthlib
# social-auth-core
opentelemetry-api==1.15.0
# via
# opentelemetry-exporter-otlp-proto-grpc
# opentelemetry-instrumentation
# opentelemetry-instrumentation-celery
# opentelemetry-instrumentation-dbapi
# opentelemetry-instrumentation-pymysql
# opentelemetry-instrumentation-wsgi
# opentelemetry-sdk
opentelemetry-exporter-otlp-proto-grpc==1.15.0
# via -r ./engine/requirements.in
opentelemetry-instrumentation==0.36b0
# via
# opentelemetry-instrumentation-celery
# opentelemetry-instrumentation-dbapi
# opentelemetry-instrumentation-pymysql
# opentelemetry-instrumentation-wsgi
opentelemetry-instrumentation-celery==0.36b0
# via -r ./engine/requirements.in
opentelemetry-instrumentation-dbapi==0.36b0
# via opentelemetry-instrumentation-pymysql
opentelemetry-instrumentation-pymysql==0.36b0
# via -r ./engine/requirements.in
opentelemetry-instrumentation-wsgi==0.36b0
# via -r ./engine/requirements.in
opentelemetry-proto==1.15.0
# via opentelemetry-exporter-otlp-proto-grpc
opentelemetry-sdk==1.15.0
# via opentelemetry-exporter-otlp-proto-grpc
opentelemetry-semantic-conventions==0.36b0
# via
# opentelemetry-instrumentation-celery
# opentelemetry-instrumentation-dbapi
# opentelemetry-instrumentation-wsgi
# opentelemetry-sdk
opentelemetry-util-http==0.36b0
# via opentelemetry-instrumentation-wsgi
pem==23.1.0
# via django-sns-view
phonenumbers==8.10.0
# via -r ./engine/requirements.in
prometheus-client==0.16.0
# via -r ./engine/requirements.in
prompt-toolkit==3.0.43
# via click-repl
proto-plus==1.23.0
# via google-cloud-firestore
protobuf==4.25.2
# via
# google-api-core
# google-cloud-firestore
# googleapis-common-protos
# grpcio-status
# opentelemetry-proto
# proto-plus
psutil==5.9.4
# via -r ./engine/requirements.in
psycopg2==2.9.3
# via -r ./engine/requirements.in
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
pyasn1-modules==0.3.0
# via google-auth
pycodestyle==2.11.1
# via autopep8
pycparser==2.21
# via cffi
pyjwt==2.8.0
# via
# social-auth-core
# twilio
pymdown-extensions==10.0
# via -r ./engine/requirements.in
pymysql==1.1.0
# via -r ./engine/requirements.in
pyopenssl==23.2.0
# via django-sns-view
pyparsing==3.1.1
# via httplib2
python-dateutil==2.8.2
# via
# botocore
# celery
# faker
# icalendar
# recurring-ical-events
python-telegram-bot==13.13
# via -r ./engine/requirements.in
python3-openid==3.2.0
# via social-auth-core
pytz==2024.1
# via
# apscheduler
# djangorestframework
# icalendar
# python-telegram-bot
# recurring-ical-events
# twilio
# x-wr-timezone
pyyaml==6.0.1
# via
# drf-spectacular
# pymdown-extensions
recurring-ical-events==2.1.0
# via -r ./engine/requirements.in
redis==5.0.1
# via
# -r ./engine/requirements.in
# celery
# django-redis
referencing==0.33.0
# via
# jsonschema
# jsonschema-specifications
regex==2021.11.2
# via -r ./engine/requirements.in
requests==2.31.0
# via
# -r ./engine/requirements.in
# cachecontrol
# django-anymail
# django-sns-view
# google-api-core
# google-cloud-storage
# requests-oauthlib
# social-auth-core
# twilio
requests-oauthlib==1.3.1
# via social-auth-core
rpds-py==0.18.0
# via
# jsonschema
# referencing
rsa==4.9
# via google-auth
s3transfer==0.10.0
# via boto3
six==1.16.0
# via
# apscheduler
# django-rest-polymorphic
# python-dateutil
# twilio
slack-export-viewer==1.1.4
# via -r ./engine/requirements.in
slack-sdk==3.21.3
# via -r ./engine/requirements.in
social-auth-app-django==5.3.0
# via -r ./engine/requirements.in
social-auth-core==4.5.2
# via social-auth-app-django
soupsieve==2.5
# via beautifulsoup4
sqlparse==0.4.4
# via
# django
# django-debug-toolbar
# django-silk
toml==0.10.2
# via django-migration-linter
tornado==6.4
# via python-telegram-bot
tqdm==4.66.2
# via django-mirage-field
twilio==6.37.0
# via -r ./engine/requirements.in
typing-extensions==4.9.0
# via opentelemetry-sdk
tzdata==2024.1
# via celery
tzlocal==5.2
# via apscheduler
uritemplate==4.1.1
# via
# drf-spectacular
# google-api-python-client
urllib3==1.26.18
# via
# -r ./engine/requirements.in
# botocore
# requests
uwsgi==2.0.21
# via -r ./engine/requirements.in
vine==5.1.0
# via
# amqp
# celery
# kombu
wcwidth==0.2.13
# via prompt-toolkit
werkzeug==3.0.1
# via flask
whitenoise==5.3.0
# via -r ./engine/requirements.in
wrapt==1.16.0
# via
# deprecated
# opentelemetry-instrumentation
# opentelemetry-instrumentation-dbapi
x-wr-timezone==0.0.6
# via recurring-ical-events
# The following packages are considered to be unsafe in a requirements file:
# setuptools