Compare commits

...

5 Commits

Author SHA1 Message Date
ITQ 05029106f6 chore(deps): update images tags in compose 2025-07-22 21:58:06 +03:00
ITQ 8549700752 chore: services code refactor 2025-07-22 21:56:18 +03:00
ITQ f5c9b69b45 feat: added logos 2025-07-22 21:54:27 +03:00
ITQ 0ab9a70645 chore(deps): updated versions 2025-07-22 21:54:10 +03:00
ITQ d1a0f20c49 chore(telegram_bot): small improvements 2025-07-20 00:05:11 +03:00
23 changed files with 205 additions and 209 deletions
+2 -2
View File
@@ -109,7 +109,7 @@ aiogram is a modern and fully asynchronous framework for Telegram bot developmen
### [Redis](https://redis.io/) ### [Redis](https://redis.io/)
Redis is an in-memory data structure store often used as a database, cache, and message broker. It supports various data structures and offers high performance for read and write operations, making it suitable for caching and real-time analytics. Very popular and has big community for today. In project used as fsm for aiogram (to avoid data loss on restart), caches (current_date, mlscores, clicks, views) for backend and as broker for Celery. Redis is an in-memory data structure store often used as a database, cache, and message broker. It supports various data structures and offers high performance for read and write operations, making it suitable for caching and real-time analytics. Very popular and has big community for today. In project used as fsm for aiogram (to avoid data loss on restart), caches (mlscores, clicks, views) for backend and as broker for Celery.
### [Postgres](https://www.postgresql.org/) ### [Postgres](https://www.postgresql.org/)
@@ -268,7 +268,7 @@ Default login: `admin`
Default password: `proooooood` Default password: `proooooood`
Analytics dashboard when deployed with default docker compose: [localhost:13243/d/adnova-statistics/statistics](http://localhost:13243/d/adnova-statisticss/statistics). You can enter advertiser id and get detailed advertiser statistics and also detailed statistics for each advertiser's campaign. Analytics dashboard when deployed with default docker compose: [localhost:13243/d/adnova-advertiser-statistics](http://localhost:13243/d/adnova-advertiser-statistics/statistics). You can enter advertiser id and get detailed advertiser statistics and also detailed statistics for each advertiser's campaign.
Demonstration: Demonstration:
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+19 -13
View File
@@ -33,6 +33,7 @@ services:
published: 8080 published: 8080
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
backend-initdb: backend-initdb:
@@ -81,6 +82,7 @@ services:
published: 13241 published: 13241
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
backend-celery-worker: backend-celery-worker:
@@ -108,7 +110,8 @@ services:
restart: unless-stopped restart: unless-stopped
celery-exporter: celery-exporter:
image: docker.io/danihodovic/celery-exporter:0.11.1 image: docker.io/danihodovic/celery-exporter:0.12.2
command: --retry-interval=5
depends_on: depends_on:
redis: redis:
restart: false restart: false
@@ -173,7 +176,7 @@ services:
target: /data target: /data
redis-exporter: redis-exporter:
image: docker.io/oliver006/redis_exporter:v1.67.0-alpine image: docker.io/oliver006/redis_exporter:v1.74.0-alpine
depends_on: depends_on:
redis: redis:
restart: false restart: false
@@ -188,7 +191,7 @@ services:
shm_size: 4mb shm_size: 4mb
postgres: postgres:
image: docker.io/postgres:17-alpine3.21 image: docker.io/postgres:17-alpine3.22
configs: configs:
- source: postgres_config - source: postgres_config
target: /etc/postgresql/postgresql.conf target: /etc/postgresql/postgresql.conf
@@ -216,7 +219,7 @@ services:
target: /var/lib/postgresql/data target: /var/lib/postgresql/data
postgres-exporter: postgres-exporter:
image: quay.io/prometheuscommunity/postgres-exporter:v0.16.0 image: quay.io/prometheuscommunity/postgres-exporter:v0.17.1
depends_on: depends_on:
postgres: postgres:
restart: false restart: false
@@ -231,9 +234,9 @@ services:
shm_size: 4mb shm_size: 4mb
pgadmin: pgadmin:
image: docker.io/dpage/pgadmin4:9 image: docker.io/dpage/pgadmin4:9.5
configs: configs:
- source: pgadmin_servers - source: pgadmin_servers_config
target: /pgadmin4/servers.json target: /pgadmin4/servers.json
depends_on: depends_on:
postgres: postgres:
@@ -258,6 +261,7 @@ services:
published: 13242 published: 13242
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
secrets: secrets:
- source: pgadmin_password - source: pgadmin_password
@@ -269,7 +273,7 @@ services:
target: /var/lib/pgadmin target: /var/lib/pgadmin
grafana: grafana:
image: docker.io/grafana/grafana-oss:11.5.0 image: docker.io/grafana/grafana-oss:12.0.2
configs: configs:
- source: grafana_config - source: grafana_config
target: /usr/share/grafana/conf/defaults.ini target: /usr/share/grafana/conf/defaults.ini
@@ -287,6 +291,7 @@ services:
published: 13243 published: 13243
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
shm_size: 4mb shm_size: 4mb
volumes: volumes:
@@ -301,9 +306,8 @@ services:
target: /etc/grafana/scripts target: /etc/grafana/scripts
prometheus: prometheus:
image: docker.io/prom/prometheus:v3.1.0 image: docker.io/prom/prometheus:v3.5.0
command: command: --config.file=/etc/prometheus/prometheus.yaml
- "--config.file=/etc/prometheus/prometheus.yaml"
configs: configs:
- source: prometheus_config - source: prometheus_config
target: /etc/prometheus/prometheus.yaml target: /etc/prometheus/prometheus.yaml
@@ -320,6 +324,7 @@ services:
published: 13244 published: 13244
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
shm_size: 4mb shm_size: 4mb
volumes: volumes:
@@ -328,8 +333,8 @@ services:
target: /prometheus target: /prometheus
minio: minio:
image: docker.io/minio/minio:RELEASE.2025-07-18T21-56-31Z
command: server --console-address ":9001" command: server --console-address ":9001"
image: docker.io/minio/minio:RELEASE.2025-02-03T21-03-04Z
healthcheck: healthcheck:
test: ["CMD", "mc", "ready", "local"] test: ["CMD", "mc", "ready", "local"]
interval: 1m30s interval: 1m30s
@@ -348,18 +353,19 @@ services:
published: 13245 published: 13245
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
- name: console - name: console
target: 9001 target: 9001
published: 13246 published: 13246
host_ip: 127.0.0.1 host_ip: 127.0.0.1
protocol: tcp protocol: tcp
app_protocol: http
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- type: volume - type: volume
source: minio_data source: minio_data
target: /data target: /data
volumes: volumes:
redis_data: redis_data:
postgres_data: postgres_data:
@@ -373,7 +379,7 @@ configs:
file: ./infrastructure/redis/redis.conf file: ./infrastructure/redis/redis.conf
postgres_config: postgres_config:
file: ./infrastructure/postgres/postgresql.conf file: ./infrastructure/postgres/postgresql.conf
pgadmin_servers: pgadmin_servers_config:
file: ./infrastructure/pgadmin/servers.json file: ./infrastructure/pgadmin/servers.json
grafana_config: grafana_config:
file: ./infrastructure/grafana/grafana.ini file: ./infrastructure/grafana/grafana.ini
+1 -1
View File
@@ -1,4 +1,4 @@
AIOGRAM_BOT_TOKEN= AIOGRAM_BOT_TOKEN=
AIOGRAM_BACKEND_URL=http://backend:8080 AIOGRAM_BACKEND_URL=http://backend:8080
REDIS_URI=redis://redis:6379 REDIS_URI=redis://redis:6379
MINIO_ENDPOINT=minio:9000 MINIO_ENDPOINT=http://minio:9000
+4 -4
View File
@@ -1,7 +1,7 @@
# Stage 1: Install dependencies # Stage 1: Install dependencies
FROM docker.io/python:3.11-alpine3.20 AS builder FROM docker.io/python:3.13-alpine3.22 AS builder
COPY --from=ghcr.io/astral-sh/uv:0.4.30 /uv /uvx /bin/ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app WORKDIR /app
@@ -17,7 +17,7 @@ RUN uv sync --no-dev --no-install-project --no-cache
# Stage 2: Start the application # Stage 2: Start the application
FROM docker.io/python:3.11-alpine3.20 FROM docker.io/python:3.13-alpine3.22
WORKDIR /app WORKDIR /app
@@ -39,4 +39,4 @@ EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --start-interval=2s --retries=3 \ 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 --no-verbose --tries=1 --spider http://127.0.0.1:8080/health?format=json || exit 1
CMD gunicorn config.wsgi --workers=8 -b 0.0.0.0:8080 --access-logfile - --error-logfile - CMD [ "gunicorn", "config.wsgi", "--workers=8", "-b", "0.0.0.0:8080", "--access-logfile", "-", "--error-logfile", "-" ]
+6 -5
View File
@@ -1,7 +1,7 @@
# Stage 1: Install dependencies and compile staticfiles # Stage 1: Install dependencies and compile staticfiles
FROM docker.io/python:3.11-alpine3.20 AS builder FROM docker.io/python:3.13-alpine3.22 AS builder
COPY --from=ghcr.io/astral-sh/uv:0.4.30 /uv /uvx /bin/ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app WORKDIR /app
@@ -17,11 +17,12 @@ RUN uv sync --no-dev --no-install-project --no-cache
COPY . . COPY . .
RUN uv run python manage.py collectstatic --noinput RUN uv run --no-dev python manage.py collectstatic --noinput
# Stage 2: Start nginx and serve staticfiles # Stage 2: Start nginx and serve staticfiles
FROM docker.io/nginx:latest FROM docker.io/nginx:1.29-alpine-slim
COPY --from=builder /app/static /usr/share/nginx/html COPY --from=builder /app/static /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"] CMD [ "nginx", "-g", "daemon off;" ]
+3 -3
View File
@@ -4,9 +4,9 @@
Ensure you have the following installed on your system: Ensure you have the following installed on your system:
- [Python](https://www.python.org/) (>=3.10,<3.12) - [Python](https://www.python.org/) (>=3.10,<3.14)
- [uv](https://docs.astral.sh/uv/) - [uv](https://docs.astral.sh/uv/) (latest version recommended)
- [Docker](https://www.docker.com/) (for containerized setup) - [Docker](https://www.docker.com/) (for containerized setup, latest version recommended)
## Basic setup ## Basic setup
+5 -1
View File
@@ -49,8 +49,12 @@ def get_generate_ad_text_result(
if task_result.status == celery.states.PENDING: if task_result.status == celery.states.PENDING:
raise Http404 raise Http404
result = task_result.result
if task_result.status != celery.states.SUCCESS:
result = None
return status.OK, schemas.Promise( return status.OK, schemas.Promise(
task_id=task_result.task_id, task_id=task_result.task_id,
status=task_result.status, status=task_result.status,
result=task_result.result, result=result,
) )
-1
View File
@@ -1 +0,0 @@
# noqa: A005
+4 -4
View File
@@ -41,10 +41,10 @@ class Advertiser(BaseModel):
( (
Decimal(str(total_clicks)) Decimal(str(total_clicks))
/ Decimal(str(total_impressions)) / Decimal(str(total_impressions))
* Decimal("100") * Decimal(100)
) )
if total_impressions > 0 if total_impressions > 0
else Decimal("0") else Decimal(0)
) )
return { return {
@@ -115,9 +115,9 @@ class Advertiser(BaseModel):
conversion = ( conversion = (
Decimal(str(metrics["clicks_count"])) Decimal(str(metrics["clicks_count"]))
/ Decimal(str(metrics["impressions_count"])) / Decimal(str(metrics["impressions_count"]))
* Decimal("100") * Decimal(100)
if metrics["impressions_count"] > 0 if metrics["impressions_count"] > 0
else Decimal("0") else Decimal(0)
) )
daily_stats.append( daily_stats.append(
+2 -2
View File
@@ -256,10 +256,10 @@ class Campaign(BaseModel):
( (
Decimal(str(clicks_count)) Decimal(str(clicks_count))
/ Decimal(str(impressions_count)) / Decimal(str(impressions_count))
* Decimal("100") * Decimal(100)
) )
if impressions_count > 0 if impressions_count > 0
else Decimal("0") else Decimal(0)
) )
spent_impressions = Decimal(str(impressions.get("spent", 0) or 0)) spent_impressions = Decimal(str(impressions.get("spent", 0) or 0))
spent_clicks = Decimal(str(clicks.get("spent", 0) or 0)) spent_clicks = Decimal(str(clicks.get("spent", 0) or 0))
@@ -1,4 +1,4 @@
# ruff: noqa: E501, W291 # ruff: noqa: E501
import logging import logging
from django.conf import settings from django.conf import settings
+1
View File
@@ -1,4 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
# ruff: noqa: PLC0415
"""Django's command-line utility for administrative tasks.""" """Django's command-line utility for administrative tasks."""
import os import os
+42 -42
View File
@@ -1,38 +1,38 @@
[project] [project]
name = "adnova-backend"
version = "0.1.0"
readme = "README.md"
requires-python = ">=3.10,<3.12"
dependencies = [ dependencies = [
"celery>=5.4.0", "celery>=5.5.0,<6.0.0",
"colorlog>=6.9.0", "colorlog>=6.9.0,<7.0.0",
"django-cors-headers>=4.6.0", "django-cors-headers>=4.7.0,<5.0.0",
"django-environ>=0.11.2", "django-environ>=0.12.0,<1.0.0",
"django-extensions>=3.2.3", "django-extensions>=4.1.0,<5.0.0",
"django-guid>=3.5.0", "django-guid>=3.5.1,<4.0.0",
"django-health-check>=3.18.3", "django-health-check>=3.18.3,<4.0.0",
"django-minio-storage>=0.5.7", "django-minio-storage>=0.5.7,<0.6.0",
"django-ninja>=1.3.0", "django-ninja>=1.3.0,<2.0.0",
"django-stubs-ext>=5.1.3", "django-stubs-ext>=5.1.3,<6.0.0",
"gunicorn>=23.0.0", "gunicorn>=23.0.0,<24.0.0",
"httpx>=0.28.1", "httpx>=0.28.1,<0.29.0",
"pillow>=11.1.0", "pillow>=11.1.0,<12.0.0",
"psycopg2-binary>=2.9.10", "psycopg2-binary>=2.9.10,<3.0.0",
"pydantic>=2.10.5", "pydantic>=2.10.5,<3.0.0",
"pyjwt>=2.10.1", "pyjwt>=2.10.1,<3.0.0",
"python-json-logger>=3.2.1", "python-json-logger>=3.2.1,<4.0.0",
"pytz>=2024.2", "pytz>=2024.2,<2025.0",
"redis>=5.2.1", "redis>=6.2.0,<7.0.0",
"yandex-cloud-ml-sdk>=0.3.1", "yandex-cloud-ml-sdk>=0.3.1,<0.4.0",
] ]
name = "adnova-backend"
readme = "README.md"
requires-python = ">=3.10,<3.14"
version = "0.1.0"
[dependency-groups] [dependency-groups]
dev = [ dev = [
"coverage>=7.6.12", "coverage",
"django-debug-toolbar>=4.4.6", "django-debug-toolbar>=5.2,<5.3",
"django-stubs[compatible-mypy]>=5.1.3", "django-stubs[compatible-mypy]",
"mypy>=1.15.0", "mypy",
"ruff>=0.9.3", "ruff",
] ]
[tool.ruff] [tool.ruff]
@@ -66,7 +66,7 @@ extend-include = []
fix = false fix = false
fix-only = false fix-only = false
force-exclude = true force-exclude = true
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"] include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
indent-width = 4 indent-width = 4
line-length = 79 line-length = 79
namespace-packages = [] namespace-packages = []
@@ -109,10 +109,10 @@ extend-unsafe-fixes = []
external = [] external = []
fixable = ["ALL"] fixable = ["ALL"]
ignore = [ ignore = [
"ARG",
"D",
"ANN401", "ANN401",
"ARG",
"COM812", "COM812",
"D",
"DJ001", "DJ001",
"DJ007", "DJ007",
"FBT001", "FBT001",
@@ -128,7 +128,7 @@ logger-objects = []
per-file-ignores = {} per-file-ignores = {}
preview = false preview = false
select = ["ALL"] select = ["ALL"]
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"] task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
typing-modules = [] typing-modules = []
unfixable = [] unfixable = []
@@ -136,11 +136,11 @@ unfixable = []
max-args = 6 max-args = 6
[tool.mypy] [tool.mypy]
plugins = ["mypy_django_plugin.main"]
ignore_missing_imports = true ignore_missing_imports = true
strict = false
show_error_context = false
no_implicit_optional = false no_implicit_optional = false
plugins = ["mypy_django_plugin.main"]
show_error_context = false
strict = false
[tool.django-stubs] [tool.django-stubs]
django_settings_module = "config.settings" django_settings_module = "config.settings"
@@ -148,14 +148,14 @@ strict_settings = false
[tool.coverage.run] [tool.coverage.run]
omit = [ omit = [
"manage.py",
"config/wsgi.py",
"config/asgi.py", "config/asgi.py",
"config/urls.py",
"config/settings.py",
"config/handlers.py",
"config/errors.py", "config/errors.py",
"integrations/yandexai/*" "config/handlers.py",
"config/settings.py",
"config/urls.py",
"config/wsgi.py",
"integrations/yandexai/*",
"manage.py",
] ]
[tool.coverage.report] [tool.coverage.report]
+1 -1
View File
@@ -4,4 +4,4 @@
AIOGRAM_BOT_TOKEN= AIOGRAM_BOT_TOKEN=
AIOGRAM_BACKEND_ADDRESS=http://localhost:8080 AIOGRAM_BACKEND_ADDRESS=http://localhost:8080
REDIS_URI=redis://localhost:6379 REDIS_URI=redis://localhost:6379
MINIO_ENDPOINT=localhost:9000 MINIO_ENDPOINT=http://localhost:9000
+4 -4
View File
@@ -1,7 +1,7 @@
# Stage 1: Install dependencies # Stage 1: Install dependencies
FROM docker.io/python:3.11-alpine3.20 AS builder FROM docker.io/python:3.13-alpine3.22 AS builder
COPY --from=ghcr.io/astral-sh/uv:0.4.30 /uv /uvx /bin/ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app WORKDIR /app
@@ -17,7 +17,7 @@ RUN uv sync --no-dev --no-install-project --no-cache
# Stage 2: Start the application # Stage 2: Start the application
FROM docker.io/python:3.11-alpine3.20 FROM docker.io/python:3.13-alpine3.22
WORKDIR /app WORKDIR /app
@@ -34,4 +34,4 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONOPTIMIZE=2 \ PYTHONOPTIMIZE=2 \
PATH="/opt/venv/bin:$PATH" PATH="/opt/venv/bin:$PATH"
CMD python main.py CMD [ "python", "main.py" ]
+3 -3
View File
@@ -4,9 +4,9 @@
Ensure you have the following installed on your system: Ensure you have the following installed on your system:
- [Python](https://www.python.org/) (>=3.10,<3.12) - [Python](https://www.python.org/) (>=3.10,<3.14)
- [uv](https://docs.astral.sh/uv/) - [uv](https://docs.astral.sh/uv/) (latest version recommended)
- [Docker](https://www.docker.com/) (for containerized setup) - [Docker](https://www.docker.com/) (for containerized setup, latest version recommended)
## Basic setup ## Basic setup
+1 -1
View File
@@ -13,4 +13,4 @@ API_ENDPOINT = os.getenv("AIOGRAM_BACKEND_URL", "http://localhost:8080")
REDIS_URI = os.getenv("REDIS_URI", "redis://localhost:6379") REDIS_URI = os.getenv("REDIS_URI", "redis://localhost:6379")
MINIO_URL = f"http://{os.getenv('MINIO_ENDPOINT', 'localhost:9000')}" MINIO_URL = os.getenv("MINIO_ENDPOINT", "http://localhost:9000")
+15 -18
View File
@@ -1,22 +1,19 @@
[project] [project]
name = "adnova-telegram_bot"
version = "0.1.0"
readme = "README.md"
requires-python = ">=3.10,<3.12"
dependencies = [ dependencies = [
"aiogram-dialog>=2.3.1", "aiogram-dialog>=2.4.0,<3.0.0",
"aiogram>=3.17.0", "aiogram>=3.17.0,<4.0.0",
"cachetools>=5.5.1", "cachetools>=5.0.0,<6.0.0",
"httpx>=0.28.1", "httpx>=0.28.0,<0.29.0",
"openapi-python-client>=0.23.1", "python-dotenv>=1.1.0,<2.0.0",
"python-dotenv>=1.0.1", "redis>=6.2.0,<7.0.0",
"redis>=5.2.1",
] ]
name = "adnova-telegram_bot"
readme = "README.md"
requires-python = ">=3.10,<3.14"
version = "0.1.0"
[dependency-groups] [dependency-groups]
dev = [ dev = ["ruff"]
"ruff>=0.9.6",
]
[tool.ruff] [tool.ruff]
builtins = [] builtins = []
@@ -49,7 +46,7 @@ extend-include = []
fix = false fix = false
fix-only = false fix-only = false
force-exclude = true force-exclude = true
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"] include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
indent-width = 4 indent-width = 4
line-length = 79 line-length = 79
namespace-packages = [] namespace-packages = []
@@ -92,10 +89,10 @@ extend-unsafe-fixes = []
external = [] external = []
fixable = ["ALL"] fixable = ["ALL"]
ignore = [ ignore = [
"ARG",
"D",
"ANN401", "ANN401",
"ARG",
"COM812", "COM812",
"D",
"DJ001", "DJ001",
"FBT001", "FBT001",
"FBT002", "FBT002",
@@ -108,7 +105,7 @@ logger-objects = []
per-file-ignores = {} per-file-ignores = {}
preview = false preview = false
select = ["ALL"] select = ["ALL"]
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"] task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
typing-modules = [] typing-modules = []
unfixable = [] unfixable = []
+1 -1
View File
@@ -1,6 +1,6 @@
# AdNova Tests # AdNova Tests
There is `unit` and `e2e` tests available, unit tests are placed all around `backend` service folder and `e2e` tests placed [here](./e2e/). There is `unit` and `e2e` tests available, `unit` tests are placed all around `backend` service folder and `e2e` tests placed [here](./e2e/).
## Running unit tests ## Running unit tests
+4 -4
View File
@@ -4,10 +4,10 @@
Ensure you have the following installed on your system: Ensure you have the following installed on your system:
- [Python](https://www.python.org/) (>=3.10,<3.12) - [Python](https://www.python.org/) (>=3.10,<3.14)
- [uv](https://docs.astral.sh/uv/) - [uv](https://docs.astral.sh/uv/) (latest version recommended)
- [Docker](https://www.docker.com/) - [Docker](https://www.docker.com/) (latest version recommended)
- [Docker compose](https://docs.docker.com/compose/) (latest versions) - [Docker compose](https://docs.docker.com/compose/) (latest version recommended)
## Warning ## Warning
+8 -23
View File
@@ -1,18 +1,12 @@
[project] [project]
name = "adnova-e2e-tests" dependencies = ["httpx>=0.28.1", "pytest>=8.3.4", "python-dotenv>=1.0.1"]
version = "0.1.0" name = "adnova-tests-e2e"
readme = "README.md" readme = "README.md"
requires-python = ">=3.10,<3.12" requires-python = ">=3.10,<3.14"
dependencies = [ version = "0.1.0"
"httpx>=0.28.1",
"pytest>=8.3.4",
"python-dotenv>=1.0.1",
]
[dependency-groups] [dependency-groups]
dev = [ dev = ["ruff"]
"ruff>=0.9.6",
]
[tool.ruff] [tool.ruff]
builtins = [] builtins = []
@@ -45,7 +39,7 @@ extend-include = []
fix = false fix = false
fix-only = false fix-only = false
force-exclude = true force-exclude = true
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"] include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
indent-width = 4 indent-width = 4
line-length = 79 line-length = 79
namespace-packages = [] namespace-packages = []
@@ -87,21 +81,12 @@ extend-select = []
extend-unsafe-fixes = [] extend-unsafe-fixes = []
external = [] external = []
fixable = ["ALL"] fixable = ["ALL"]
ignore = [ ignore = ["ANN401", "ARG", "COM812", "D", "FBT001", "FBT002", "N813", "S101"]
"ARG",
"D",
"ANN401",
"COM812",
"FBT001",
"FBT002",
"N813",
"S101",
]
logger-objects = [] logger-objects = []
per-file-ignores = {} per-file-ignores = {}
preview = false preview = false
select = ["ALL"] select = ["ALL"]
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"] task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
typing-modules = [] typing-modules = []
unfixable = [] unfixable = []