Skip to content

Commit 36ddf93

Browse files
authored
Merge pull request #13 from dmsnback/dev
Dev
2 parents addc216 + 286438f commit 36ddf93

34 files changed

Lines changed: 1226 additions & 15 deletions

.dockerignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
__pycache__
2+
.env
3+
.git
4+
.venv
5+
.idea

.flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[flake8]
22
max-line-length = 79
3-
extend-ignore = E501, W503, E203, E402, E712
3+
extend-ignore = E501, W503, E203, E402, E712, W605
44
exclude =
55
.git,
66
backend/alembic/versions/*,

.github/workflows/main.yml

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
name: Satire Pulp parser
22

3-
on: [push]
3+
on:
4+
push:
5+
branches:
6+
- "**"
7+
pull_request:
48

59
jobs:
610
lint:
@@ -30,3 +34,79 @@ jobs:
3034

3135
- name: Flake8 Check
3236
run: flake8 .
37+
38+
tests:
39+
name: Pytest
40+
runs-on: ubuntu-latest
41+
42+
steps:
43+
- name: Checkout code
44+
uses: actions/checkout@v4
45+
46+
- name: Setup Python
47+
uses: actions/setup-python@v4
48+
with:
49+
python-version: "3.11"
50+
51+
- name: Upgrade pip
52+
run: python -m pip install --upgrade pip
53+
54+
- name: Install Dependencies
55+
run: pip install -r requirements.txt
56+
57+
- name: Run Pytest
58+
run: pytest -v
59+
60+
push_branch_dev_to_docker_hub:
61+
name: Build and Push Docker(dev)
62+
runs-on: ubuntu-latest
63+
needs: lint
64+
65+
if: github.ref == 'refs/heads/dev'
66+
67+
steps:
68+
- name: Check out the repo
69+
uses: actions/checkout@v4
70+
71+
- name: Setup Docker Buildx
72+
uses: docker/setup-buildx-action@v3
73+
74+
- name: Login to Docker
75+
uses: docker/login-action@v3
76+
with:
77+
username: ${{ secrets.DOCKER_USERNAME }}
78+
password: ${{ secrets.DOCKER_PASSWORD }}
79+
80+
- name: Push to Docker Hub
81+
uses: docker/build-push-action@v5
82+
with:
83+
push: true
84+
tags: |
85+
dmsn/satire_pulp_parser:dev
86+
87+
push_branch_main_to_docker_hub:
88+
name: Build and Push Docker(prod)
89+
runs-on: ubuntu-latest
90+
needs: lint
91+
92+
if: github.ref == 'refs/heads/main'
93+
94+
steps:
95+
- name: Check out the repo
96+
uses: actions/checkout@v4
97+
98+
- name: Setup Docker Buildx
99+
uses: docker/setup-buildx-action@v3
100+
101+
- name: Login to Docker
102+
uses: docker/login-action@v3
103+
with:
104+
username: ${{ secrets.DOCKER_USERNAME }}
105+
password: ${{ secrets.DOCKER_PASSWORD }}
106+
107+
- name: Push to Docker Hub
108+
uses: docker/build-push-action@v5
109+
with:
110+
push: true
111+
tags: |
112+
dmsn/satire_pulp_parser:prod

.gitignore

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ local_settings.py
6161
db.sqlite3
6262
db.sqlite3-journal
6363

64+
6465
# Flask stuff:
6566
instance/
6667
.webassets-cache
@@ -169,11 +170,8 @@ dmypy.json
169170
cython_debug/
170171

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

178176
# Abstra
179177
# Abstra is an AI-powered process automation framework.
@@ -205,3 +203,9 @@ cython_debug/
205203
marimo/_static/
206204
marimo/_lsp/
207205
__marimo__/
206+
207+
208+
.DS_Store
209+
210+
*.db
211+
last_id.txt

Dockerfile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM python:3.11-slim
2+
LABEL maintainer="Dmitry Titenkov <lt200711@yandex.ru>"
3+
LABEL version="1.0"
4+
LABEL description="Satire Pulp parser"
5+
WORKDIR /app
6+
COPY requirements.txt .
7+
RUN pip3 install -r /app/requirements.txt --no-cache-dir
8+
COPY . .

README.md

Lines changed: 165 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,165 @@
1-
# satire_pulp_parser
2-
Парсер с сайта сатирических новостей [Панорама](https://panorama.pub/ "Перейти")
3-
4-
![Satire Pulp parser](https://github.com/dmsnback/satire_pulp_parser/actions/workflows/main.yml/badge.svg)
5-
![Python](https://img.shields.io/badge/python-3.11-blue)
6-
![Tests](https://img.shields.io/badge/tests-pytest-brightgreen)
7-
![Black](https://img.shields.io/badge/code%20style-black-000000)
8-
![License](https://img.shields.io/badge/license-MIT-green)
1+
<a name="Начало"></a>
2+
3+
## Satire Pulp Parser
4+
5+
![Satire Pulp parser](https://github.com/dmsnback/satire_pulp_parser/actions/workflows/main.yml/badge.svg) ![Python](https://img.shields.io/badge/python-3.11-blue) ![Tests](https://img.shields.io/badge/tests-pytest-brightgreen) ![Black](https://img.shields.io/badge/code%20style-black-000000) ![License](https://img.shields.io/badge/license-MIT-green)
6+
7+
8+
- [Описание](#Описание)
9+
- [Технологии](#Технологии)
10+
- [Тестирование](#Тестирование)
11+
- [Шаблон заполнения .env-файла](#Шаблон)
12+
- [Запуск проекта](#Запуск)
13+
- [Автор](#Автор)
14+
15+
<a name="Описание"></a>
16+
17+
### Описание
18+
19+
Проект представляет собой парсер сатирических новостей с сайта [Панорама](https://panorama.pub/ "Перейти") и Telegram-бот для автоматической рассылки новых публикаций пользователям.
20+
21+
**Возможности:**
22+
23+
```md
24+
- Парсинг новостей с сайта panorama.pub
25+
- Сохранение новостей в PostgreSQL
26+
- Автоматическая рассылка новых новостей через Telegram-бот
27+
- Планировщик запуска парсера каждые 20 минут
28+
- Асинхронная работа бота с данными
29+
```
30+
31+
Парсер написан с использованием **Scrapy**, **SQLAlchemy**, **PostgreSQL** и **Python Telegram Bot**
32+
33+
В проекте настроен **CI pipeline** с использованием **GitHub Actions**:
34+
35+
```md
36+
- Автоматическая проверка кода (black, isort, flake8)
37+
- Запуск unit-тестов (`pytest`)
38+
- Сборка Docker-образа
39+
- Публикация образа в **Docker Hub** при пуше в соответствующие ветки
40+
```
41+
42+
```md
43+
Проект адаптирован для использования **PostgreSQL** и развёртывания в контейнерах **Docker**.
44+
```
45+
46+
> [Вернуться в начало](#Начало)
47+
48+
<a name="Технологии"></a>
49+
50+
### Технологии
51+
52+
[![Python](https://img.shields.io/badge/Python-1000?style=for-the-badge&logo=python&logoColor=ffffff&labelColor=000000&color=000000)](https://www.python.org)
53+
[![Scrapy](https://img.shields.io/badge/Scrapy-1000?style=for-the-badge&logo=scrapy&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.scrapy.org/en/latest/index.html)
54+
[![python_telegram_bot](https://img.shields.io/badge/python_telegram_bot-1000?style=for-the-badge&logo=telegram&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.python-telegram-bot.org/en/stable/index.html)
55+
[![Postgres](https://img.shields.io/badge/Postgres-1000?style=for-the-badge&logo=postgresql&logoColor=ffffff&labelColor=000000&color=000000)](https://www.postgresql.org)
56+
[![SQLAlchemy](https://img.shields.io/badge/SQLAlchemy-1000?style=for-the-badge&logo=sqlalchemy&logoColor=ffffff&labelColor=000000&color=000000)](https://www.sqlalchemy.org)
57+
[![Docker](https://img.shields.io/badge/Docker-1000?style=for-the-badge&logo=docker&logoColor=ffffff&labelColor=000000&color=000000)](https://www.docker.com)
58+
[![Pytest](https://img.shields.io/badge/Pytest-1000?style=for-the-badge&logo=pytest&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.pytest.org/en/stable/index.htmlc)
59+
[![GitHub Actions](https://img.shields.io/badge/github%20actions-%232671E5.svg?style=for-the-badge&logo=githubactions&logoColor=ffffff&labelColor=000000&color=000000)](https://github.com/features/actions)
60+
61+
> [Вернуться в начало](#Начало)
62+
63+
<a name="Тестирование"></a>
64+
65+
### Тестирование
66+
67+
В проекте реализованы **unit-тесты** с использованием `pytest`.
68+
69+
Запуск тестов локально:
70+
71+
```python
72+
pytest -v
73+
```
74+
75+
> [Вернуться в начало](#Начало)
76+
77+
<a name="Шаблон"></a>
78+
79+
### Шаблон заполнения .env-файла
80+
81+
> `env.example` с дефолтными значениями расположен в корневой папке
82+
83+
```python
84+
TELEGRAM_TOKEN=1234567890:Telegram-Token # Токен Telegram бота
85+
DATABASE_URL_SYNC = postgresql+psycopg2://postgres:postgres@db:5432/satire_pulp_db # Указываем адрес БД (Синхронная версия)
86+
DATABASE_URL_ASYNC=postgresql+asyncpg://postgres:postgres@db:5432/satire_pulp_db # Указываем адрес БД (Асинхронная версия)
87+
POSTGRES_DB = satire_pulp_db # Имя базы дданных
88+
POSTGRES_USER = postgres # Имя юзера PostgreSQL
89+
POSTGRES_PASSWORD = yourpassword # Пароль юзера PostgreSQL
90+
POSTGRES_HOST=db # Имя сервиса PostgreSQL в docker-compose
91+
POSTGRES_PORT=5432 # Порт PostgreSQL внутри контейнера
92+
```
93+
94+
> [Вернуться в начало](#Начало)
95+
96+
<a name="Запуск"></a>
97+
98+
### Запуск проекта
99+
100+
- Склонируйте репозиторий
101+
102+
```python
103+
git clone git@github.com:dmsnback/satire_pulp_parser.git
104+
```
105+
106+
- Установите и активируйте виртуальное окружение
107+
108+
```python
109+
python3 -m venv venv
110+
```
111+
112+
Для `Windows`
113+
114+
```python
115+
source venv/Scripts/activate
116+
```
117+
118+
Для `Mac/Linux`
119+
120+
```python
121+
source venv/bin/activate
122+
```
123+
124+
- Установите зависимости из файла
125+
`requirements.txt`
126+
127+
```python
128+
python3 -m pip install --upgrade pip
129+
```
130+
131+
```python
132+
pip install -r requirements.txt
133+
```
134+
135+
- Запускаем Docker контейнеры (db, bot)
136+
137+
```python
138+
docker-compose up -d db bot
139+
```
140+
141+
- Создаём таблицы в БД
142+
143+
```python
144+
docker-compose exec bot python -m db.init_db
145+
```
146+
147+
- Перезапускаем Docker контейнеры
148+
149+
```python
150+
docker-compose up -d
151+
```
152+
153+
- После запуска запустите бота командой ```/start```
154+
155+
> Команда ```/show_news``` пришлёт последние 10 новостей из базы, если они ещё не были отправлены, далее бот будет присылать только новые новости, которые появятся на сайте.
156+
157+
> [Вернуться в начало](#Начало)
158+
159+
<a name="Автор"></a>
160+
161+
### Автор
162+
163+
- [Титенков Дмитрий](https://github.com/dmsnback)
164+
165+
> [Вернуться в начало](#Начало)

bot/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)