Compare commits
5 Commits
bc0f7c81df
...
05029106f6
| Author | SHA1 | Date | |
|---|---|---|---|
| 05029106f6 | |||
| 8549700752 | |||
| f5c9b69b45 | |||
| 0ab9a70645 | |||
| d1a0f20c49 |
@@ -109,7 +109,7 @@ aiogram is a modern and fully asynchronous framework for Telegram bot developmen
|
||||
|
||||
### [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/)
|
||||
|
||||
@@ -268,7 +268,7 @@ Default login: `admin`
|
||||
|
||||
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:
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
+19
-13
@@ -33,6 +33,7 @@ services:
|
||||
published: 8080
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
|
||||
backend-initdb:
|
||||
@@ -81,6 +82,7 @@ services:
|
||||
published: 13241
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
|
||||
backend-celery-worker:
|
||||
@@ -108,7 +110,8 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
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:
|
||||
redis:
|
||||
restart: false
|
||||
@@ -173,7 +176,7 @@ services:
|
||||
target: /data
|
||||
|
||||
redis-exporter:
|
||||
image: docker.io/oliver006/redis_exporter:v1.67.0-alpine
|
||||
image: docker.io/oliver006/redis_exporter:v1.74.0-alpine
|
||||
depends_on:
|
||||
redis:
|
||||
restart: false
|
||||
@@ -188,7 +191,7 @@ services:
|
||||
shm_size: 4mb
|
||||
|
||||
postgres:
|
||||
image: docker.io/postgres:17-alpine3.21
|
||||
image: docker.io/postgres:17-alpine3.22
|
||||
configs:
|
||||
- source: postgres_config
|
||||
target: /etc/postgresql/postgresql.conf
|
||||
@@ -216,7 +219,7 @@ services:
|
||||
target: /var/lib/postgresql/data
|
||||
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter:v0.16.0
|
||||
image: quay.io/prometheuscommunity/postgres-exporter:v0.17.1
|
||||
depends_on:
|
||||
postgres:
|
||||
restart: false
|
||||
@@ -231,9 +234,9 @@ services:
|
||||
shm_size: 4mb
|
||||
|
||||
pgadmin:
|
||||
image: docker.io/dpage/pgadmin4:9
|
||||
image: docker.io/dpage/pgadmin4:9.5
|
||||
configs:
|
||||
- source: pgadmin_servers
|
||||
- source: pgadmin_servers_config
|
||||
target: /pgadmin4/servers.json
|
||||
depends_on:
|
||||
postgres:
|
||||
@@ -258,6 +261,7 @@ services:
|
||||
published: 13242
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
secrets:
|
||||
- source: pgadmin_password
|
||||
@@ -269,7 +273,7 @@ services:
|
||||
target: /var/lib/pgadmin
|
||||
|
||||
grafana:
|
||||
image: docker.io/grafana/grafana-oss:11.5.0
|
||||
image: docker.io/grafana/grafana-oss:12.0.2
|
||||
configs:
|
||||
- source: grafana_config
|
||||
target: /usr/share/grafana/conf/defaults.ini
|
||||
@@ -287,6 +291,7 @@ services:
|
||||
published: 13243
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
shm_size: 4mb
|
||||
volumes:
|
||||
@@ -301,9 +306,8 @@ services:
|
||||
target: /etc/grafana/scripts
|
||||
|
||||
prometheus:
|
||||
image: docker.io/prom/prometheus:v3.1.0
|
||||
command:
|
||||
- "--config.file=/etc/prometheus/prometheus.yaml"
|
||||
image: docker.io/prom/prometheus:v3.5.0
|
||||
command: --config.file=/etc/prometheus/prometheus.yaml
|
||||
configs:
|
||||
- source: prometheus_config
|
||||
target: /etc/prometheus/prometheus.yaml
|
||||
@@ -320,6 +324,7 @@ services:
|
||||
published: 13244
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
shm_size: 4mb
|
||||
volumes:
|
||||
@@ -328,8 +333,8 @@ services:
|
||||
target: /prometheus
|
||||
|
||||
minio:
|
||||
image: docker.io/minio/minio:RELEASE.2025-07-18T21-56-31Z
|
||||
command: server --console-address ":9001"
|
||||
image: docker.io/minio/minio:RELEASE.2025-02-03T21-03-04Z
|
||||
healthcheck:
|
||||
test: ["CMD", "mc", "ready", "local"]
|
||||
interval: 1m30s
|
||||
@@ -348,18 +353,19 @@ services:
|
||||
published: 13245
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
- name: console
|
||||
target: 9001
|
||||
published: 13246
|
||||
host_ip: 127.0.0.1
|
||||
protocol: tcp
|
||||
app_protocol: http
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- type: volume
|
||||
source: minio_data
|
||||
target: /data
|
||||
|
||||
|
||||
volumes:
|
||||
redis_data:
|
||||
postgres_data:
|
||||
@@ -373,7 +379,7 @@ configs:
|
||||
file: ./infrastructure/redis/redis.conf
|
||||
postgres_config:
|
||||
file: ./infrastructure/postgres/postgresql.conf
|
||||
pgadmin_servers:
|
||||
pgadmin_servers_config:
|
||||
file: ./infrastructure/pgadmin/servers.json
|
||||
grafana_config:
|
||||
file: ./infrastructure/grafana/grafana.ini
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
AIOGRAM_BOT_TOKEN=
|
||||
AIOGRAM_BACKEND_URL=http://backend:8080
|
||||
REDIS_URI=redis://redis:6379
|
||||
MINIO_ENDPOINT=minio:9000
|
||||
MINIO_ENDPOINT=http://minio:9000
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 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
|
||||
|
||||
@@ -17,7 +17,7 @@ RUN uv sync --no-dev --no-install-project --no-cache
|
||||
|
||||
|
||||
# Stage 2: Start the application
|
||||
FROM docker.io/python:3.11-alpine3.20
|
||||
FROM docker.io/python:3.13-alpine3.22
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -39,4 +39,4 @@ 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 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", "-" ]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 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
|
||||
|
||||
@@ -17,11 +17,12 @@ RUN uv sync --no-dev --no-install-project --no-cache
|
||||
|
||||
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
|
||||
FROM docker.io/nginx:latest
|
||||
FROM docker.io/nginx:1.29-alpine-slim
|
||||
|
||||
COPY --from=builder /app/static /usr/share/nginx/html
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
CMD [ "nginx", "-g", "daemon off;" ]
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
Ensure you have the following installed on your system:
|
||||
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.12)
|
||||
- [uv](https://docs.astral.sh/uv/)
|
||||
- [Docker](https://www.docker.com/) (for containerized setup)
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.14)
|
||||
- [uv](https://docs.astral.sh/uv/) (latest version recommended)
|
||||
- [Docker](https://www.docker.com/) (for containerized setup, latest version recommended)
|
||||
|
||||
## Basic setup
|
||||
|
||||
|
||||
@@ -49,8 +49,12 @@ def get_generate_ad_text_result(
|
||||
if task_result.status == celery.states.PENDING:
|
||||
raise Http404
|
||||
|
||||
result = task_result.result
|
||||
if task_result.status != celery.states.SUCCESS:
|
||||
result = None
|
||||
|
||||
return status.OK, schemas.Promise(
|
||||
task_id=task_result.task_id,
|
||||
status=task_result.status,
|
||||
result=task_result.result,
|
||||
result=result,
|
||||
)
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# noqa: A005
|
||||
|
||||
@@ -41,10 +41,10 @@ class Advertiser(BaseModel):
|
||||
(
|
||||
Decimal(str(total_clicks))
|
||||
/ Decimal(str(total_impressions))
|
||||
* Decimal("100")
|
||||
* Decimal(100)
|
||||
)
|
||||
if total_impressions > 0
|
||||
else Decimal("0")
|
||||
else Decimal(0)
|
||||
)
|
||||
|
||||
return {
|
||||
@@ -115,9 +115,9 @@ class Advertiser(BaseModel):
|
||||
conversion = (
|
||||
Decimal(str(metrics["clicks_count"]))
|
||||
/ Decimal(str(metrics["impressions_count"]))
|
||||
* Decimal("100")
|
||||
* Decimal(100)
|
||||
if metrics["impressions_count"] > 0
|
||||
else Decimal("0")
|
||||
else Decimal(0)
|
||||
)
|
||||
|
||||
daily_stats.append(
|
||||
|
||||
@@ -256,10 +256,10 @@ class Campaign(BaseModel):
|
||||
(
|
||||
Decimal(str(clicks_count))
|
||||
/ Decimal(str(impressions_count))
|
||||
* Decimal("100")
|
||||
* Decimal(100)
|
||||
)
|
||||
if impressions_count > 0
|
||||
else Decimal("0")
|
||||
else Decimal(0)
|
||||
)
|
||||
spent_impressions = Decimal(str(impressions.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
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
# ruff: noqa: PLC0415
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
|
||||
import os
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
[project]
|
||||
name = "adnova-backend"
|
||||
version = "0.1.0"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<3.12"
|
||||
dependencies = [
|
||||
"celery>=5.4.0",
|
||||
"colorlog>=6.9.0",
|
||||
"django-cors-headers>=4.6.0",
|
||||
"django-environ>=0.11.2",
|
||||
"django-extensions>=3.2.3",
|
||||
"django-guid>=3.5.0",
|
||||
"django-health-check>=3.18.3",
|
||||
"django-minio-storage>=0.5.7",
|
||||
"django-ninja>=1.3.0",
|
||||
"django-stubs-ext>=5.1.3",
|
||||
"gunicorn>=23.0.0",
|
||||
"httpx>=0.28.1",
|
||||
"pillow>=11.1.0",
|
||||
"psycopg2-binary>=2.9.10",
|
||||
"pydantic>=2.10.5",
|
||||
"pyjwt>=2.10.1",
|
||||
"python-json-logger>=3.2.1",
|
||||
"pytz>=2024.2",
|
||||
"redis>=5.2.1",
|
||||
"yandex-cloud-ml-sdk>=0.3.1",
|
||||
"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-guid>=3.5.1,<4.0.0",
|
||||
"django-health-check>=3.18.3,<4.0.0",
|
||||
"django-minio-storage>=0.5.7,<0.6.0",
|
||||
"django-ninja>=1.3.0,<2.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",
|
||||
"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",
|
||||
"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]
|
||||
dev = [
|
||||
"coverage>=7.6.12",
|
||||
"django-debug-toolbar>=4.4.6",
|
||||
"django-stubs[compatible-mypy]>=5.1.3",
|
||||
"mypy>=1.15.0",
|
||||
"ruff>=0.9.3",
|
||||
"coverage",
|
||||
"django-debug-toolbar>=5.2,<5.3",
|
||||
"django-stubs[compatible-mypy]",
|
||||
"mypy",
|
||||
"ruff",
|
||||
]
|
||||
|
||||
[tool.ruff]
|
||||
@@ -66,7 +66,7 @@ extend-include = []
|
||||
fix = false
|
||||
fix-only = false
|
||||
force-exclude = true
|
||||
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"]
|
||||
include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
|
||||
indent-width = 4
|
||||
line-length = 79
|
||||
namespace-packages = []
|
||||
@@ -81,20 +81,20 @@ unsafe-fixes = false
|
||||
|
||||
[tool.ruff.analyze]
|
||||
detect-string-imports = true
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
|
||||
[tool.ruff.format]
|
||||
docstring-code-format = true
|
||||
docstring-code-format = true
|
||||
docstring-code-line-length = 79
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
|
||||
[tool.ruff.lint]
|
||||
allowed-confusables = ["ℹ"]
|
||||
@@ -109,26 +109,26 @@ extend-unsafe-fixes = []
|
||||
external = []
|
||||
fixable = ["ALL"]
|
||||
ignore = [
|
||||
"ARG",
|
||||
"D",
|
||||
"ANN401",
|
||||
"COM812",
|
||||
"DJ001",
|
||||
"DJ007",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"N813",
|
||||
"PLR2004",
|
||||
"PT009",
|
||||
"PT027",
|
||||
"RUF001",
|
||||
"S311",
|
||||
"ANN401",
|
||||
"ARG",
|
||||
"COM812",
|
||||
"D",
|
||||
"DJ001",
|
||||
"DJ007",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"N813",
|
||||
"PLR2004",
|
||||
"PT009",
|
||||
"PT027",
|
||||
"RUF001",
|
||||
"S311",
|
||||
]
|
||||
logger-objects = []
|
||||
per-file-ignores = {}
|
||||
preview = false
|
||||
select = ["ALL"]
|
||||
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"]
|
||||
task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
|
||||
typing-modules = []
|
||||
unfixable = []
|
||||
|
||||
@@ -136,26 +136,26 @@ unfixable = []
|
||||
max-args = 6
|
||||
|
||||
[tool.mypy]
|
||||
plugins = ["mypy_django_plugin.main"]
|
||||
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]
|
||||
django_settings_module = "config.settings"
|
||||
strict_settings = false
|
||||
strict_settings = false
|
||||
|
||||
[tool.coverage.run]
|
||||
omit = [
|
||||
"manage.py",
|
||||
"config/wsgi.py",
|
||||
"config/asgi.py",
|
||||
"config/urls.py",
|
||||
"config/settings.py",
|
||||
"config/handlers.py",
|
||||
"config/errors.py",
|
||||
"integrations/yandexai/*"
|
||||
"config/asgi.py",
|
||||
"config/errors.py",
|
||||
"config/handlers.py",
|
||||
"config/settings.py",
|
||||
"config/urls.py",
|
||||
"config/wsgi.py",
|
||||
"integrations/yandexai/*",
|
||||
"manage.py",
|
||||
]
|
||||
|
||||
[tool.coverage.report]
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
AIOGRAM_BOT_TOKEN=
|
||||
AIOGRAM_BACKEND_ADDRESS=http://localhost:8080
|
||||
REDIS_URI=redis://localhost:6379
|
||||
MINIO_ENDPOINT=localhost:9000
|
||||
MINIO_ENDPOINT=http://localhost:9000
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 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
|
||||
|
||||
@@ -17,7 +17,7 @@ RUN uv sync --no-dev --no-install-project --no-cache
|
||||
|
||||
|
||||
# Stage 2: Start the application
|
||||
FROM docker.io/python:3.11-alpine3.20
|
||||
FROM docker.io/python:3.13-alpine3.22
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -34,4 +34,4 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONOPTIMIZE=2 \
|
||||
PATH="/opt/venv/bin:$PATH"
|
||||
|
||||
CMD python main.py
|
||||
CMD [ "python", "main.py" ]
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
Ensure you have the following installed on your system:
|
||||
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.12)
|
||||
- [uv](https://docs.astral.sh/uv/)
|
||||
- [Docker](https://www.docker.com/) (for containerized setup)
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.14)
|
||||
- [uv](https://docs.astral.sh/uv/) (latest version recommended)
|
||||
- [Docker](https://www.docker.com/) (for containerized setup, latest version recommended)
|
||||
|
||||
## Basic setup
|
||||
|
||||
|
||||
@@ -13,4 +13,4 @@ API_ENDPOINT = os.getenv("AIOGRAM_BACKEND_URL", "http://localhost:8080")
|
||||
|
||||
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")
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
[project]
|
||||
name = "adnova-telegram_bot"
|
||||
version = "0.1.0"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<3.12"
|
||||
dependencies = [
|
||||
"aiogram-dialog>=2.3.1",
|
||||
"aiogram>=3.17.0",
|
||||
"cachetools>=5.5.1",
|
||||
"httpx>=0.28.1",
|
||||
"openapi-python-client>=0.23.1",
|
||||
"python-dotenv>=1.0.1",
|
||||
"redis>=5.2.1",
|
||||
"aiogram-dialog>=2.4.0,<3.0.0",
|
||||
"aiogram>=3.17.0,<4.0.0",
|
||||
"cachetools>=5.0.0,<6.0.0",
|
||||
"httpx>=0.28.0,<0.29.0",
|
||||
"python-dotenv>=1.1.0,<2.0.0",
|
||||
"redis>=6.2.0,<7.0.0",
|
||||
]
|
||||
name = "adnova-telegram_bot"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<3.14"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"ruff>=0.9.6",
|
||||
]
|
||||
dev = ["ruff"]
|
||||
|
||||
[tool.ruff]
|
||||
builtins = []
|
||||
@@ -49,7 +46,7 @@ extend-include = []
|
||||
fix = false
|
||||
fix-only = false
|
||||
force-exclude = true
|
||||
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"]
|
||||
include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
|
||||
indent-width = 4
|
||||
line-length = 79
|
||||
namespace-packages = []
|
||||
@@ -64,20 +61,20 @@ unsafe-fixes = false
|
||||
|
||||
[tool.ruff.analyze]
|
||||
detect-string-imports = true
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
|
||||
[tool.ruff.format]
|
||||
docstring-code-format = true
|
||||
docstring-code-format = true
|
||||
docstring-code-line-length = 79
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
|
||||
[tool.ruff.lint]
|
||||
allowed-confusables = ["ℹ"]
|
||||
@@ -92,23 +89,23 @@ extend-unsafe-fixes = []
|
||||
external = []
|
||||
fixable = ["ALL"]
|
||||
ignore = [
|
||||
"ARG",
|
||||
"D",
|
||||
"ANN401",
|
||||
"COM812",
|
||||
"DJ001",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"N813",
|
||||
"PLR2004",
|
||||
"RUF001",
|
||||
"TC002",
|
||||
"ANN401",
|
||||
"ARG",
|
||||
"COM812",
|
||||
"D",
|
||||
"DJ001",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"N813",
|
||||
"PLR2004",
|
||||
"RUF001",
|
||||
"TC002",
|
||||
]
|
||||
logger-objects = []
|
||||
per-file-ignores = {}
|
||||
preview = false
|
||||
select = ["ALL"]
|
||||
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"]
|
||||
task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
|
||||
typing-modules = []
|
||||
unfixable = []
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# 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
|
||||
|
||||
|
||||
+4
-4
@@ -4,10 +4,10 @@
|
||||
|
||||
Ensure you have the following installed on your system:
|
||||
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.12)
|
||||
- [uv](https://docs.astral.sh/uv/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
- [Docker compose](https://docs.docker.com/compose/) (latest versions)
|
||||
- [Python](https://www.python.org/) (>=3.10,<3.14)
|
||||
- [uv](https://docs.astral.sh/uv/) (latest version recommended)
|
||||
- [Docker](https://www.docker.com/) (latest version recommended)
|
||||
- [Docker compose](https://docs.docker.com/compose/) (latest version recommended)
|
||||
|
||||
## Warning
|
||||
|
||||
|
||||
+36
-51
@@ -1,18 +1,12 @@
|
||||
[project]
|
||||
name = "adnova-e2e-tests"
|
||||
version = "0.1.0"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<3.12"
|
||||
dependencies = [
|
||||
"httpx>=0.28.1",
|
||||
"pytest>=8.3.4",
|
||||
"python-dotenv>=1.0.1",
|
||||
]
|
||||
dependencies = ["httpx>=0.28.1", "pytest>=8.3.4", "python-dotenv>=1.0.1"]
|
||||
name = "adnova-tests-e2e"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<3.14"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"ruff>=0.9.6",
|
||||
]
|
||||
dev = ["ruff"]
|
||||
|
||||
[tool.ruff]
|
||||
builtins = []
|
||||
@@ -45,7 +39,7 @@ extend-include = []
|
||||
fix = false
|
||||
fix-only = false
|
||||
force-exclude = true
|
||||
include = ["*.py", "*.pyi", "*.ipynb", "**/pyproject.toml"]
|
||||
include = ["**/pyproject.toml", "*.ipynb", "*.py", "*.pyi"]
|
||||
indent-width = 4
|
||||
line-length = 79
|
||||
namespace-packages = []
|
||||
@@ -60,50 +54,41 @@ unsafe-fixes = false
|
||||
|
||||
[tool.ruff.analyze]
|
||||
detect-string-imports = true
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
direction = "Dependencies"
|
||||
exclude = []
|
||||
include-dependencies = {}
|
||||
preview = false
|
||||
|
||||
[tool.ruff.format]
|
||||
docstring-code-format = true
|
||||
docstring-code-format = true
|
||||
docstring-code-line-length = 79
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
exclude = []
|
||||
indent-style = "space"
|
||||
line-ending = "lf"
|
||||
preview = false
|
||||
quote-style = "double"
|
||||
skip-magic-trailing-comma = false
|
||||
|
||||
[tool.ruff.lint]
|
||||
allowed-confusables = ["ℹ"]
|
||||
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
||||
exclude = ["tests.py"]
|
||||
explicit-preview-rules = false
|
||||
extend-fixable = []
|
||||
allowed-confusables = ["ℹ"]
|
||||
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
||||
exclude = ["tests.py"]
|
||||
explicit-preview-rules = false
|
||||
extend-fixable = []
|
||||
extend-per-file-ignores = {}
|
||||
extend-safe-fixes = []
|
||||
extend-select = []
|
||||
extend-unsafe-fixes = []
|
||||
external = []
|
||||
fixable = ["ALL"]
|
||||
ignore = [
|
||||
"ARG",
|
||||
"D",
|
||||
"ANN401",
|
||||
"COM812",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"N813",
|
||||
"S101",
|
||||
]
|
||||
logger-objects = []
|
||||
per-file-ignores = {}
|
||||
preview = false
|
||||
select = ["ALL"]
|
||||
task-tags = ["TODO", "FIXME", "HACK", "WORKOUT"]
|
||||
typing-modules = []
|
||||
unfixable = []
|
||||
extend-safe-fixes = []
|
||||
extend-select = []
|
||||
extend-unsafe-fixes = []
|
||||
external = []
|
||||
fixable = ["ALL"]
|
||||
ignore = ["ANN401", "ARG", "COM812", "D", "FBT001", "FBT002", "N813", "S101"]
|
||||
logger-objects = []
|
||||
per-file-ignores = {}
|
||||
preview = false
|
||||
select = ["ALL"]
|
||||
task-tags = ["FIXME", "HACK", "TODO", "WORKOUT"]
|
||||
typing-modules = []
|
||||
unfixable = []
|
||||
|
||||
[tool.ruff.lint.pylint]
|
||||
max-args = 6
|
||||
|
||||
Reference in New Issue
Block a user