Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Build and Deploy

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

- name: Build and Push bot
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/jeopardy-bot:latest -f app/bot/Dockerfile .
docker push ${{ secrets.DOCKER_USERNAME }}/jeopardy-bot:latest

- name: Build and Push admin
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/jeopardy-admin:latest -f app/admin/Dockerfile .
docker push ${{ secrets.DOCKER_USERNAME }}/jeopardy-admin:latest

- name: Build and Push poller
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/jeopardy-poller:latest -f app/poller/Dockerfile .
docker push ${{ secrets.DOCKER_USERNAME }}/jeopardy-poller:latest

- name: Build and Push migrator
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/jeopardy-migrator:latest -f app/admin/Dockerfile .
docker push ${{ secrets.DOCKER_USERNAME }}/jeopardy-migrator:latest

- name: Deploy on remote VPS
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd jeopardybot
git pull
docker-compose -f prod.docker-compose.yml pull
docker-compose -f prod.docker-compose.yml up -d
34 changes: 29 additions & 5 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,37 @@
name: Check homework
name: Check Project

on: [push]

jobs:
lint:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.12
- name: Install ruff
run: pip install ruff==0.4.2
- run: ruff format --check && ruff check --no-fix
- name: Install uv
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
- name: Install dependencies
run: uv pip install --system -r requirements.txt
- name: Check by ruff
run: ruff check .

mypy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.12
- name: Install uv
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
- name: Install dependencies
run: uv pip install --system -r requirements.txt
- name: Check by mypy
run: mypy .

43 changes: 0 additions & 43 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# Created by https://www.toptal.com/developers/gitignore/api/python
# Edit at https://www.toptal.com/developers/gitignore?templates=python

### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down Expand Up @@ -30,12 +27,6 @@ share/python-wheels/
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt
Expand Down Expand Up @@ -86,33 +77,6 @@ target/
profile_default/
ipython_config.py

# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

Expand Down Expand Up @@ -156,13 +120,6 @@ dmypy.json
# Cython debug symbols
cython_debug/

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml
Expand Down
11 changes: 11 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.5
hooks:
- id: ruff

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.15.0
hooks:
- id: mypy
language: system
29 changes: 29 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
migrations:
alembic revision --autogenerate

migrate:
alembic upgrade head

db: migrate migrations migrate

dumpdata:
python -m app.fixtures.fixtures dump ./app/fixtures/data.json

loaddata:
python -m app.fixtures.fixtures load ./app/fixtures/data.json

down:
docker compose down

up:
docker compose up --build -d

reset: down up migrate loaddata

ruff:
ruff check .

mypy:
mypy .

lint: ruff mypy
137 changes: 2 additions & 135 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,136 +1,3 @@
# Памятка по работе с проектом
Схема состояний: <https://www.figma.com/board/avff8wPCkN4Smc3v2ihi1c>

## Начало работы с проектом
Для начала работы с проектом необходимо создать репозиторий по [шаблону](https://github.com/ktsstudio/backend-school-template-project). Для этого используйте кнопку "Use this template".

<img width="579" alt="image" src="https://github.com/ktsstudio/backend-school-template-project/assets/79798334/1566de18-2be5-4570-b327-fa212f909ab0">

После этого его можно локально клонировать себе на компьютер:

``` sh
git clone <ссылка на репозиторий>
```

---
## Ветки dev и main
После того как скопируете репозиторий, скорее всего, вы будете находиться в main-ветке.

Как правило, ветка `main` (`master`) содержит в себе _production-ready_ код, т.е. именно из этой ветки проект будет катиться. Поэтому сама разработка из этой ветки обычно не ведется, туда делают merge финальных изменений.

Создадим ветку dev:
``` sh
git checkout -b dev
```

Dev — чаще всего общая тестовая ветка. От `dev-ветки` ответвляются `feature-ветки`, в которые добавляется новая функциональность, тестируется, проходит ревью и "сливается" в `dev-ветку`.

Создадим `feature`-ветку:
``` sh
git checkout -b <<название ветки>>
```

После чего создается [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).

`Pull request (PR)` позволяет другим разработчикам провести ревью и оставить комментарии к написанному коду, прежде чем проверять его и делать релиз.


---
## Работа в репозитории

### Gitignore

Файл .gitignore содержит информацию о том, какие файлы не следует сохранять в удаленный репозиторий – локальные конфиги, файлы библиотек, специфичные файлы IDE или операционной системы.

Самый простой способ составить подходящий `.gitignore` файл — воспользоваться ресурсом [gitignore.io](https://www.toptal.com/developers/gitignore/)


Обратите внимание, что в шаблоне проекта уже присутствует файл `.gitignore`. Остается убедиться, что у вас нет каких-то дополнительных файлов, которые следует туда добавить.

---
### Виртуальное окружение

#### Создание виртуального окружения

Виртуальное окружение позволяет разделять проекты, зависимости и даже версии языка.

**Пример.** Есть два проекта. Один использует библиотеку `example` версии 1, второй – версии 2. Они не могут существовать одновременно, и версии могут конфликтовать из-за каких-то других зависимостей. Поэтому мы создаем два виртуальных окружения, каждое для своего проекта. `PyCharm` может создавать их автоматически. `Python` будет видеть только библиотеки из своего виртуального окружения, что существенно облегчит сосуществование множества проектов на одном компьютере.

**Создадим:**
``` sh
python -m venv <название окружения>
```

> Принято называть окружение `env` или `venv` -– `([virtual] environment)`.

Задать версию языка для виртуального окружения, например 3.12:
```
python3.12 -m venv <название окружения>
```

> Обратите внимание, что для этого нужно чтобы эта версия была установлена в системе.


#### Активация
**Для Linux/MacOS:**
``` sh
source <название окружения>/bin/activate
```

**Для Windows:**
``` sh
<название окружения>\Scripts\activate.bat
```

---
### Зависимости
В файл `requirements.txt` принято записывать зависимости проекта – список библиотек и их версий, без которых проект не сможет запуститься. Добавляя в проект использование новой библиотеки, обязательно нужно записать ее в `requirements.txt`. При релизе зависимости устанавливаются из же этого файла.

Пример файла:
```requirements.txt
aiohttp==3.8.1
black==22.6.0
freezegun==1.2.1
pytest==7.1.2
pytest-aiohttp==1.0.4
```

Если в новой версии из библиотеки будет удалено что-то важное для проекта, то ничего не сломается, потому что мы фиксируемся на старой версии. В дальнейшем мы можем вручную обновить версию и сразу проследить, что при обновлении все работает как нужно. Либо что-то починить, если сломалось.

Установить все необходимые библиотеки можно при помощи команды…
```sh
pip install <библиотека>
```

…либо:
```sh
pip install -r requirements.txt
```

Лучше всего ставить библиотеки в виртуальное окружение.

---
### Ruff
[Библиотека](https://docs.astral.sh/ruff/) для автоматического форматирования кода и проверки его на ошибки. Рекомендуется использовать, чтобы код был читаемым и соответствовал `pep-8`. Для применения потребуется поставить библиотеку в виртуальное окружение.

**Отформатировать код:**
```sh
ruff format
```

**Проверить код**
```sh
ruff check --fix
```

В файле `pyproject.toml` можно сконфигурировать библиотеку.

Например:
```toml
[tool.ruff]
line-length = 80
indent-width = 4
target-version = "py312"
```

> Обратите внимание, что в `pyproject.toml` для вас уже добавлена рекомендуемая конфигурация.
> По договоренности с вашим ментором конфигурацию можно отредактировать.
Схема базы данных: <https://dbdiagram.io/d/67f980d24f7afba1844c4b78>
51 changes: 51 additions & 0 deletions alembic.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[alembic]
script_location = app/core/database/migrations
file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s

prepend_sys_path = .
version_path_separator = os

[post_write_hooks]
hooks = ruff_format, ruff_fix

ruff_format.type = exec
ruff_format.executable = ruff
ruff_format.options = format REVISION_SCRIPT_FILENAME

ruff_fix.type = exec
ruff_fix.executable = ruff
ruff_fix.options = check --fix REVISION_SCRIPT_FILENAME

[loggers]
keys = root,sqlalchemy,alembic

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = WARNING
handlers = console
qualname =

[logger_sqlalchemy]
level = WARNING
handlers =
qualname = sqlalchemy.engine

[logger_alembic]
level = INFO
handlers =
qualname = alembic

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
Loading
Loading