From cb9692089f55cd006bb25b94200ad7b66efd670e Mon Sep 17 00:00:00 2001 From: ITQ Date: Thu, 12 Feb 2026 14:44:25 +0300 Subject: [PATCH] chore(): infrastructure improvements --- .env.template | 3 + compose.yaml | 2 + deploy/compose/compose.backend.yaml | 10 +- deploy/compose/compose.proxy.yaml | 21 +++ deploy/compose/compose.yaml | 1 + infrastructure/configs/backend/.env.template | 10 +- infrastructure/configs/caddy/Caddyfile | 51 ++++++ infrastructure/configs/grafana/.env.template | 2 + .../configs/victoriametrics/vmagent.yaml | 4 + src/backend/Containerfile | 2 +- src/backend/api/urls.py | 6 +- src/backend/justfile | 5 + src/backend/pyproject.toml | 45 ++--- src/backend/scripts/entrypoint.sh | 0 src/backend/uv.lock | 166 +----------------- tests/README.md | 2 +- tests/e2e/scripts/check | 8 - tests/e2e/tests/test_ad_text_generation.py | 52 ------ tests/e2e/tests/test_backend_health.py | 14 +- 19 files changed, 134 insertions(+), 270 deletions(-) create mode 100644 deploy/compose/compose.proxy.yaml create mode 100644 infrastructure/configs/caddy/Caddyfile mode change 100644 => 100755 src/backend/scripts/entrypoint.sh delete mode 100755 tests/e2e/scripts/check delete mode 100644 tests/e2e/tests/test_ad_text_generation.py diff --git a/.env.template b/.env.template index 6d11973..eb164e6 100644 --- a/.env.template +++ b/.env.template @@ -14,3 +14,6 @@ GRAFANA_PYROSCOPE_PORT=14611 # Backend DJANGO_PORT=14609 DJANGO_STATICFILES_PORT=14610 + +# Proxy +CADDY_PORT=80 diff --git a/compose.yaml b/compose.yaml index 93da861..08e8e7e 100644 --- a/compose.yaml +++ b/compose.yaml @@ -8,5 +8,7 @@ x-defaults: &defaults include: - path: ./deploy/compose/compose.yaml <<: *defaults + - path: ./deploy/compose/compose.proxy.yaml + <<: *defaults - path: ./deploy/compose/compose.backend.yaml <<: *defaults diff --git a/deploy/compose/compose.backend.yaml b/deploy/compose/compose.backend.yaml index 356e757..29346cb 100644 --- a/deploy/compose/compose.backend.yaml +++ b/deploy/compose/compose.backend.yaml @@ -3,6 +3,7 @@ services: build: context: ./src/backend dockerfile: Containerfile + target: app tags: - lotty-backend:latest pull: true @@ -40,6 +41,7 @@ services: build: context: ./src/backend dockerfile: Containerfile + target: app tags: - lotty-backend:latest pull: true @@ -66,7 +68,8 @@ services: backend-staticfiles: build: context: ./src/backend - dockerfile: Containerfile.staticfiles + dockerfile: Containerfile + target: staticfiles tags: - lotty-backend-staticfiles:latest pull: true @@ -76,8 +79,8 @@ services: - path: ./infrastructure/configs/backend/.env required: false healthcheck: - test: ["CMD-SHELL", "nginx", "-t", "||", "exit 1"] - interval: 1m30s + test: ["CMD", "wget", "-qO-", "http://localhost:1080"] + interval: 30s timeout: 5s start_period: 5s start_interval: 2s @@ -98,6 +101,7 @@ services: build: context: ./src/backend dockerfile: Containerfile + target: app tags: - lotty-backend:latest pull: true diff --git a/deploy/compose/compose.proxy.yaml b/deploy/compose/compose.proxy.yaml new file mode 100644 index 0000000..ff23fde --- /dev/null +++ b/deploy/compose/compose.proxy.yaml @@ -0,0 +1,21 @@ +services: + caddy: + image: docker.io/caddy:2-alpine + configs: + - source: caddy_config + target: /etc/caddy/Caddyfile + ports: + - name: http + target: 80 + published: 80 + host_ip: 0.0.0.0 + protocol: tcp + app_protocol: http + networks: + - default + restart: unless-stopped + shm_size: 4mb + +configs: + caddy_config: + file: ./infrastructure/configs/caddy/Caddyfile diff --git a/deploy/compose/compose.yaml b/deploy/compose/compose.yaml index 0158d2b..2c79d7d 100644 --- a/deploy/compose/compose.yaml +++ b/deploy/compose/compose.yaml @@ -104,6 +104,7 @@ services: mc mb default/loki; mc mb default/tempo; mc mb default/pyroscope; + mc mb default/backend; mc policy set public default/loki; true" depends_on: s3: diff --git a/infrastructure/configs/backend/.env.template b/infrastructure/configs/backend/.env.template index 2c75f86..9a63365 100644 --- a/infrastructure/configs/backend/.env.template +++ b/infrastructure/configs/backend/.env.template @@ -5,8 +5,8 @@ DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost,http://127.0.0.1 DJANGO_CORS_ALLOWED_ORIGINS=* DJANGO_INTERNAL_IPS=127.0.0.1 DJANGO_LANGUAGE_CODE=en-us -DJANGO_STATIC_URL=http://localhost:13241/ -REDIS_URI=redis://valkey:6379 +DJANGO_STATIC_URL=static/ +REDIS_URI=redis://default:valkey@valkey:6379 DJANGO_DB_URI=postgresql://postgres:postgres@postgresql/postgres DJANGO_CONN_MAX_AGE=300 DJANGO_SILKY_PYTHON_PROFILER= @@ -16,8 +16,6 @@ DJANGO_SUPERUSER_USERNAME=admin DJANGO_SUPERUSER_EMAIL=admin@mail.com DJANGO_SUPERUSER_PASSWORD=admin -# Observability (OpenTelemetry) - OTEL_ENABLED=False OTEL_SERVICE_NAME=backend-django OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 @@ -25,12 +23,10 @@ OTEL_TRACES_EXPORTER=otlp OTEL_METRICS_EXPORTER=otlp OTEL_LOGS_EXPORTER=otlp -# Storages (S3) - AWS_ACCESS_KEY_ID=access AWS_SECRET_ACCESS_KEY=storage-secret AWS_STORAGE_BUCKET_NAME=backend -AWS_S3_ENDPOINT_URL=s3:9000 +AWS_S3_ENDPOINT_URL=http://s3:9000 AWS_S3_REGION_NAME=local AWS_S3_USE_SSL=False AWS_S3_VERIFY=False diff --git a/infrastructure/configs/caddy/Caddyfile b/infrastructure/configs/caddy/Caddyfile new file mode 100644 index 0000000..f9a613e --- /dev/null +++ b/infrastructure/configs/caddy/Caddyfile @@ -0,0 +1,51 @@ +{ + log { + output stdout + format json + level INFO + } +} + +:80 { + encode gzip zstd + + handle_path /static/* { + uri strip_prefix /static + reverse_proxy backend-staticfiles:80 { + fail_duration 30s + max_fails 10 + } + } + + handle_path /grafana/* { + reverse_proxy grafana:3000 { + fail_duration 30s + max_fails 10 + health_uri /grafana + health_interval 10s + health_timeout 2s + } + } + + handle { + request_body { + max_size 5976883 + } + + reverse_proxy backend:8080 { + fail_duration 30s + max_fails 10 + + health_uri /ready + health_interval 10s + health_timeout 2s + } + } +} + +:8404 { + metrics /metrics + log { + output discard + } +} diff --git a/infrastructure/configs/grafana/.env.template b/infrastructure/configs/grafana/.env.template index 97e3590..383c4c2 100644 --- a/infrastructure/configs/grafana/.env.template +++ b/infrastructure/configs/grafana/.env.template @@ -1 +1,3 @@ GF_SECURITY_ADMIN_PASSWORD=prooooood +GF_SERVER_ROOT_URL=http://localhost:80/grafana +GF_SERVER_SERVE_FROM_SUB_PATH=true diff --git a/infrastructure/configs/victoriametrics/vmagent.yaml b/infrastructure/configs/victoriametrics/vmagent.yaml index 7b858b0..36305f1 100644 --- a/infrastructure/configs/victoriametrics/vmagent.yaml +++ b/infrastructure/configs/victoriametrics/vmagent.yaml @@ -18,3 +18,7 @@ scrape_configs: static_configs: - targets: - localhost:8429 + - job_name: caddy + static_configs: + - targets: + - caddy:8404 diff --git a/src/backend/Containerfile b/src/backend/Containerfile index 27e8e0c..fb7bed2 100644 --- a/src/backend/Containerfile +++ b/src/backend/Containerfile @@ -51,7 +51,7 @@ USER app EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --start-interval=2s --retries=3 \ - CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:8080/health?format=json || exit 1 + CMD wget -qO- http://127.0.0.1:8080/health || exit 1 ENTRYPOINT ["scripts/entrypoint.sh"] diff --git a/src/backend/api/urls.py b/src/backend/api/urls.py index b70bd14..4789ef4 100644 --- a/src/backend/api/urls.py +++ b/src/backend/api/urls.py @@ -9,9 +9,7 @@ urlpatterns = [ path( "health", HealthCheckView.as_view( - checks=[ - "health_check.Memory" - ], + checks=["health_check.Memory"], ), name="liveness", ), @@ -25,6 +23,6 @@ urlpatterns = [ "health_check.Storage", ], ), - name="readiness" + name="readiness", ), ] diff --git a/src/backend/justfile b/src/backend/justfile index 3e378ee..beeb376 100644 --- a/src/backend/justfile +++ b/src/backend/justfile @@ -56,6 +56,11 @@ test: test-coverage: @ uv run coverage run --source="." manage.py test +# show coverage report +[group('test')] +show-coverage: + @ uv run coverage report + # generates migrations [group('generate')] generate-migrations: diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 58b0a16..e72fae4 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -1,45 +1,48 @@ [project] dependencies = [ - "celery>=5.5.0,<6.0.0", - "colorlog>=6.9.0,<7.0.0", - "django-cors-headers>=4.7.0,<5.0.0", "django-environ>=0.12.0,<1.0.0", "django-extensions>=4.1.0,<5.0.0", + "django-stubs-ext>=5.1.3,<6.0.0", + "django-cors-headers>=4.7.0,<5.0.0", + + "django-ninja>=1.3.0,<2.0.0", + "orjson>=3.10.15,<4.0.0", + "pydantic>=2.10.5,<3.0.0", + + "pyjwt>=2.10.1,<3.0.0", + + "django-redis>=6.0.0,<7.0.0", + "psycopg2-binary>=2.9.10,<3.0.0", + "redis>=6.2.0,<7.0.0", + + "celery>=5.5.0,<6.0.0", + + "django-storages[s3]>=1.14,<2.0", + "django-guid>=3.5.1,<4.0.0", "django-health-check>=3.18.3,<4.0.0", - "django-storages[s3]>=1.14,<2.0", - "django-ninja>=1.3.0,<2.0.0", "django-prometheus>=2.4.1,<3.0.0", - "django-redis>=6.0.0,<7.0.0", "django-silk[formatting]>=5.4.0,<6.0.0", - "django-stubs-ext>=5.1.3,<6.0.0", - "gunicorn>=23.0.0,<24.0.0", - "httpx>=0.28.1,<0.29.0", + + "colorlog>=6.9.0,<7.0.0", + "python-json-logger>=3.2.1,<4.0.0", + "opentelemetry-api>=1.35.0", "opentelemetry-distro>=0.56b0", "opentelemetry-exporter-otlp>=1.35.0", - "opentelemetry-exporter-zipkin-proto-http>=1.11.1", + "opentelemetry-sdk>=1.35.0", "opentelemetry-instrumentation-asyncio>=0.56b0", "opentelemetry-instrumentation-celery>=0.56b0", "opentelemetry-instrumentation-dbapi>=0.56b0", "opentelemetry-instrumentation-django>=0.56b0", - "opentelemetry-instrumentation-httpx>=0.56b0", "opentelemetry-instrumentation-psycopg2>=0.56b0", "opentelemetry-instrumentation-requests>=0.56b0", - "opentelemetry-instrumentation-sqlite3>=0.56b0", "opentelemetry-instrumentation-threading>=0.56b0", "opentelemetry-instrumentation-urllib>=0.56b0", "opentelemetry-instrumentation-urllib3>=0.56b0", "opentelemetry-instrumentation-wsgi>=0.56b0", - "opentelemetry-sdk>=1.35.0", - "orjson>=3.10.15,<4.0.0", - "pillow>=11.1.0,<12.0.0", - "psycopg2-binary>=2.9.10,<3.0.0", - "pydantic>=2.10.5,<3.0.0", - "pyjwt>=2.10.1,<3.0.0", - "python-json-logger>=3.2.1,<4.0.0", - "pytz>=2024.2,<2025.0", - "redis>=6.2.0,<7.0.0", + + "gunicorn>=23.0.0,<24.0.0", "uvicorn[standard]>=0.34.0,<1.0.0", "uvicorn-worker>=0.2.0,<1.0.0", ] diff --git a/src/backend/scripts/entrypoint.sh b/src/backend/scripts/entrypoint.sh old mode 100644 new mode 100755 diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 13a0dcf..b1e2f32 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -570,19 +570,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - [[package]] name = "httptools" version = "0.7.1" @@ -605,21 +592,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, ] -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - [[package]] name = "idna" version = "3.11" @@ -725,31 +697,25 @@ dependencies = [ { name = "django-storages", extra = ["s3"] }, { name = "django-stubs-ext" }, { name = "gunicorn" }, - { name = "httpx" }, { name = "opentelemetry-api" }, { name = "opentelemetry-distro" }, { name = "opentelemetry-exporter-otlp" }, - { name = "opentelemetry-exporter-zipkin-proto-http" }, { name = "opentelemetry-instrumentation-asyncio" }, { name = "opentelemetry-instrumentation-celery" }, { name = "opentelemetry-instrumentation-dbapi" }, { name = "opentelemetry-instrumentation-django" }, - { name = "opentelemetry-instrumentation-httpx" }, { name = "opentelemetry-instrumentation-psycopg2" }, { name = "opentelemetry-instrumentation-requests" }, - { name = "opentelemetry-instrumentation-sqlite3" }, { name = "opentelemetry-instrumentation-threading" }, { name = "opentelemetry-instrumentation-urllib" }, { name = "opentelemetry-instrumentation-urllib3" }, { name = "opentelemetry-instrumentation-wsgi" }, { name = "opentelemetry-sdk" }, { name = "orjson" }, - { name = "pillow" }, { name = "psycopg2-binary" }, { name = "pydantic" }, { name = "pyjwt" }, { name = "python-json-logger" }, - { name = "pytz" }, { name = "redis" }, { name = "uvicorn", extra = ["standard"] }, { name = "uvicorn-worker" }, @@ -772,7 +738,7 @@ requires-dist = [ { name = "django-environ", specifier = ">=0.12.0,<1.0.0" }, { name = "django-extensions", specifier = ">=4.1.0,<5.0.0" }, { name = "django-guid", specifier = ">=3.5.1,<4.0.0" }, - { name = "django-health-check", extras = ["psutil"], specifier = ">=3.18.3,<5.0.0" }, + { name = "django-health-check", specifier = ">=3.18.3,<4.0.0" }, { name = "django-ninja", specifier = ">=1.3.0,<2.0.0" }, { name = "django-prometheus", specifier = ">=2.4.1,<3.0.0" }, { name = "django-redis", specifier = ">=6.0.0,<7.0.0" }, @@ -780,31 +746,25 @@ requires-dist = [ { name = "django-storages", extras = ["s3"], specifier = ">=1.14,<2.0" }, { name = "django-stubs-ext", specifier = ">=5.1.3,<6.0.0" }, { name = "gunicorn", specifier = ">=23.0.0,<24.0.0" }, - { name = "httpx", specifier = ">=0.28.1,<0.29.0" }, { name = "opentelemetry-api", specifier = ">=1.35.0" }, { name = "opentelemetry-distro", specifier = ">=0.56b0" }, { name = "opentelemetry-exporter-otlp", specifier = ">=1.35.0" }, - { name = "opentelemetry-exporter-zipkin-proto-http", specifier = ">=1.11.1" }, { name = "opentelemetry-instrumentation-asyncio", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-celery", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-dbapi", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-django", specifier = ">=0.56b0" }, - { name = "opentelemetry-instrumentation-httpx", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-psycopg2", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-requests", specifier = ">=0.56b0" }, - { name = "opentelemetry-instrumentation-sqlite3", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-threading", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-urllib", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-urllib3", specifier = ">=0.56b0" }, { name = "opentelemetry-instrumentation-wsgi", specifier = ">=0.56b0" }, { name = "opentelemetry-sdk", specifier = ">=1.35.0" }, { name = "orjson", specifier = ">=3.10.15,<4.0.0" }, - { name = "pillow", specifier = ">=11.1.0,<12.0.0" }, { name = "psycopg2-binary", specifier = ">=2.9.10,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.5,<3.0.0" }, { name = "pyjwt", specifier = ">=2.10.1,<3.0.0" }, { name = "python-json-logger", specifier = ">=3.2.1,<4.0.0" }, - { name = "pytz", specifier = ">=2024.2,<2025.0" }, { name = "redis", specifier = ">=6.2.0,<7.0.0" }, { name = "uvicorn", extras = ["standard"], specifier = ">=0.34.0,<1.0.0" }, { name = "uvicorn-worker", specifier = ">=0.2.0,<1.0.0" }, @@ -943,36 +903,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/f1/b27d3e2e003cd9a3592c43d099d2ed8d0a947c15281bf8463a256db0b46c/opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl", hash = "sha256:d9f5207183dd752a412c4cd564ca8875ececba13be6e9c6c370ffb752fd59985", size = 19641, upload-time = "2025-12-11T13:32:22.248Z" }, ] -[[package]] -name = "opentelemetry-exporter-zipkin-json" -version = "1.11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-sdk" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b5/9f/4f1ce08f37eae9de39929ee9d247ca32dea0a4aa6425934cb542668d8f81/opentelemetry-exporter-zipkin-json-1.11.1.tar.gz", hash = "sha256:0190947d1ce6f1c90ad4fe799e39af77efd8e984ae5b74885da7b3290cdff875", size = 17819, upload-time = "2022-04-21T21:02:50.052Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/74/d4369676d088434fede00d3592ac227b7502052ac031b72817d4a27e2171/opentelemetry_exporter_zipkin_json-1.11.1-py3-none-any.whl", hash = "sha256:405b4ef12207d55a768348471add1f59a5fd74dd0d0ad4a3281a0694a85fb76c", size = 16290, upload-time = "2022-04-21T21:02:26.117Z" }, -] - -[[package]] -name = "opentelemetry-exporter-zipkin-proto-http" -version = "1.11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-zipkin-json" }, - { name = "opentelemetry-sdk" }, - { name = "protobuf" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/cd/2bd290ba645528c456e1cb112fd4dd87f41f2f2e84857dcfbb6354b90bc8/opentelemetry-exporter-zipkin-proto-http-1.11.1.tar.gz", hash = "sha256:595fc729158e208c8e756553fb5ea52d85f6132e0ce161d0695be3f8c807a4bf", size = 19301, upload-time = "2022-04-21T21:02:51.031Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/23/b84eb97c097d568571fa17346827384ca75a6912f05d70125e1170e479be/opentelemetry_exporter_zipkin_proto_http-1.11.1-py3-none-any.whl", hash = "sha256:08b40dae4ebdf06ad28c6a3d7b70bf9fac4328de56a53fbdd5ac461582bc6e21", size = 14146, upload-time = "2022-04-21T21:02:27.418Z" }, -] - [[package]] name = "opentelemetry-instrumentation" version = "0.60b1" @@ -1048,22 +978,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bc/05/6b348ea989f7a9e1e6311fa653e113bd39f4506771323e27a639c2a1ea54/opentelemetry_instrumentation_django-0.60b1-py3-none-any.whl", hash = "sha256:3f6b4ba201eee35406dab965b254eed0c64fa1ef42e4a7b0296ad1b30e8e3f81", size = 21172, upload-time = "2025-12-11T13:35:57.365Z" }, ] -[[package]] -name = "opentelemetry-instrumentation-httpx" -version = "0.60b1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/08/11208bcfcab4fc2023252c3f322aa397fd9ad948355fea60f5fc98648603/opentelemetry_instrumentation_httpx-0.60b1.tar.gz", hash = "sha256:a506ebaf28c60112cbe70ad4f0338f8603f148938cb7b6794ce1051cd2b270ae", size = 20611, upload-time = "2025-12-11T13:37:01.661Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/59/b98e84eebf745ffc75397eaad4763795bff8a30cbf2373a50ed4e70646c5/opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl", hash = "sha256:f37636dd742ad2af83d896ba69601ed28da51fa4e25d1ab62fde89ce413e275b", size = 15701, upload-time = "2025-12-11T13:36:04.56Z" }, -] - [[package]] name = "opentelemetry-instrumentation-psycopg2" version = "0.60b1" @@ -1093,20 +1007,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/7f/969b59a5acccb4c35317421843d63d7853ad7a18078ca3a9b80c248be448/opentelemetry_instrumentation_requests-0.60b1-py3-none-any.whl", hash = "sha256:eec9fac3fab84737f663a2e08b12cb095b4bd67643b24587a8ecfa3cf4d0ca4c", size = 13141, upload-time = "2025-12-11T13:36:23.696Z" }, ] -[[package]] -name = "opentelemetry-instrumentation-sqlite3" -version = "0.60b1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-instrumentation-dbapi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/44/33/fafa354b529a7e9b5a5dc4155953bae1ff71622334a420d19f7e1d65e7cc/opentelemetry_instrumentation_sqlite3-0.60b1.tar.gz", hash = "sha256:d716b9d89d31dc426ccedefcdbf96cba1897dfe020d21e5e5ea82a782d03e1d6", size = 7922, upload-time = "2025-12-11T13:37:13.655Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/64/be1c8a6d17cf2860f41206828cbabe39b71345cc95626b91c84f48e96066/opentelemetry_instrumentation_sqlite3-0.60b1-py3-none-any.whl", hash = "sha256:7666853b9df186b81e587320aaa03da3f1ce46ba9277b62d8ea20a745886031c", size = 9338, upload-time = "2025-12-11T13:36:25.854Z" }, -] - [[package]] name = "opentelemetry-instrumentation-threading" version = "0.60b1" @@ -1271,61 +1171,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] -[[package]] -name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, -] - [[package]] name = "prometheus-client" version = "0.24.1" @@ -1536,15 +1381,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163, upload-time = "2025-03-07T07:08:25.627Z" }, ] -[[package]] -name = "pytz" -version = "2024.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692, upload-time = "2024-09-11T02:24:47.91Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002, upload-time = "2024-09-11T02:24:45.8Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" diff --git a/tests/README.md b/tests/README.md index d0f0126..df06abf 100644 --- a/tests/README.md +++ b/tests/README.md @@ -12,7 +12,7 @@ See [services/backend/README.md](../src/backend/README.md#testing). ### Backend service -![backend coverage](../assets/images/backend-coverage.png) +TODO() ## Running e2e tests diff --git a/tests/e2e/scripts/check b/tests/e2e/scripts/check deleted file mode 100755 index 7f50734..0000000 --- a/tests/e2e/scripts/check +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -GREEN='\033[1;32m' -NC='\033[0m' - -uvx ruff format . -uvx ruff check . --fix -printf "${GREEN}Linters/formatters runned${NC}\n" diff --git a/tests/e2e/tests/test_ad_text_generation.py b/tests/e2e/tests/test_ad_text_generation.py deleted file mode 100644 index 98e836b..0000000 --- a/tests/e2e/tests/test_ad_text_generation.py +++ /dev/null @@ -1,52 +0,0 @@ -import logging -import time -from http import HTTPStatus as status - -from httpx import Client - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - - -def test_generate_ad_text(client: Client) -> None: - """ - Tests integration between: - - backend - - redis - - yandexgpt - - celery - """ - - payload = { - "advertiser_name": "Центральный Университет", - "ad_title": "Всероссийский кейс-чемпионат DEADLINE", - } - response = client.post("/generate/ad_text", json=payload) - assert response.status_code == status.OK - - response_data = response.json() - assert "task_id" in response_data, "Missing task_id in response" - - task_id = response_data["task_id"] - start_time = time.time() - - while True: - result_response = client.get(f"/generate/ad_text/{task_id}/result") - assert result_response.status_code in (status.OK, status.NOT_FOUND) - result_data = result_response.json() - - if ( - result_data.get("status") == "SUCCESS" - and result_response.status_code == status.OK - ): - assert isinstance(result_data.get("result"), str), ( - "Result must be a string" - ) - elapsed_time = time.time() - start_time - logger.info( - "Task %s completed in %.2f seconds", task_id, elapsed_time - ) - logger.info("Generated Ad Text: %s", result_data["result"]) - break - - time.sleep(1) diff --git a/tests/e2e/tests/test_backend_health.py b/tests/e2e/tests/test_backend_health.py index 7a9a33e..8ca8559 100644 --- a/tests/e2e/tests/test_backend_health.py +++ b/tests/e2e/tests/test_backend_health.py @@ -9,15 +9,13 @@ logger = logging.getLogger(__name__) def test_healthcheck(client: Client) -> None: """ - Tests integration between: - - redis - - celery - - postgres - - minio - - yandexgpt + Tests integration with: + - valkey + - postgresql + - rustfs """ - response = client.get("/health?format=json") + response = client.get("/ready?format=json") assert response.status_code == status.OK response_data = response.json() @@ -25,7 +23,7 @@ def test_healthcheck(client: Client) -> None: unhealthy_services = [ service for service, status in response_data.items() - if status != "working" + if status != "OK" ] for service in unhealthy_services: