Skip to content

Commit c4cb4cd

Browse files
committed
Добавлено описание проекта
1 parent d958f16 commit c4cb4cd

File tree

7 files changed

+75
-14
lines changed

7 files changed

+75
-14
lines changed

Makefile

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,19 @@ fix:
1717
test:
1818
uv run pytest
1919

20-
# Проверяет покрытие кода тестами и формирует отчет в файле coverage.xml
21-
# Далее этот файл использует SonarCloud для анализа
20+
21+
# Команда проверяет покрытие кода тестами и выводит отчет в консоли.
22+
# Примечание.
23+
# Данный проект тестируется с помощью воркфлоу .github\workflows\hexlet-check.yml,
24+
# где задействован фреймворк playwright для браузерного тестирования.
25+
# Браузерное тестирование подходит для данного проекта лучше, чем подмена зависимостей для
26+
# приложения flask и базы данных.
27+
# Т.к. браузерное тестирование для данного случая более соответствует принципу
28+
# тестирования "черного ящика".
29+
# Поэтому доп. тесты в данном приложении реализованы минимально.
2230
test-coverage:
23-
uv run pytest --cov=page_analyzer --cov-report xml
31+
uv run pytest --cov=page_analyzer
32+
2433

2534
# Прогоняет сначала тесты, потом проверку линтером
2635
check: test lint

README.md

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
1313
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=bugs)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
1414
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
15-
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=coverage)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
1615
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
1716
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
1817
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=experiment0_python-project-83&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=experiment0_python-project-83)
@@ -23,27 +22,36 @@
2322

2423
## О проекте
2524

26-
> Проект находится в стадии реализации.
25+
Данный проект создан в процессе прохождения курса [Python-разработчик](https://ru.hexlet.io/programs/python).\
26+
В нем реализовано web-приложение на Flask для проверки доступности сайтов и анализа заполнения тегов, значимых для SEO.
2727

2828
## Демонстрация работы
2929

30-
Проект развернут на платформе `render.com`: \
30+
Проект развернут на платформе [render.com](https://render.com/) и доступен по ссылке: \
3131
https://python-project-83-jgqi.onrender.com/
3232

33+
> **Примечание.** \
34+
Поскольку для деплоя сайта используется бесплатный тариф, \
35+
платформа `render.com` утилизует ресурсы, которые не используются какое-то время.\
36+
Поэтому при открытии сайта, возможно, загрузка сайта начнется с процесса его сборки \
37+
и нужно будет подождать ее окончания.\
38+
Также на `render.com` довольно нестабильное соединение с БД.\
39+
В случае появления ошибок, нужно обновить страницу.
40+
41+
[Видео с демо работы сайта](https://disk.yandex.ru/i/j4X0FTNm-kY-CA)
42+
3343
## Инструкция по локальному запуску
3444

3545
1. Проверить, установлена ли утилита `uv`:
3646
```sh
3747
uv --version
3848
```
39-
4049
Если не установлена, то нужно установить [по инструкции](https://docs.astral.sh/uv/getting-started/installation/#installation-methods).
4150

4251
2. Проверить, установлена ли утилита `make`:
4352
```sh
4453
make --version
4554
```
46-
4755
Если не установлена, то установить [на windows](https://stackoverflow.com/questions/32127524/how-can-i-install-and-use-make-in-windows) или [на ubuntu](https://andreyex.ru/ubuntu/kak-ustanovit-make-na-ubuntu/).
4856

4957
3.
@@ -56,9 +64,19 @@ https://python-project-83-jgqi.onrender.com/
5664
5765
# Установить зависимости
5866
make install
67+
```
5968

69+
4. Создать в корне проекта файл `.env` для переменных среды.
70+
```sh
71+
touch .env
72+
```
73+
И добавить в него переменные среды по аналогии с образцом из файла [.env-example](./.env-example) \
74+
В переменной `DATABASE_URL` указывается путь для соединения с БД PostgreSQL. \
75+
Если она не установлена, ее нужно установить [по инструкции](https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayushhih--ot-ustanovki-do-pervyh-zaprosov-250851).
76+
77+
5.
78+
```sh
6079
# Запустить локальный сервер
6180
make dev
62-
```
63-
64-
Перейти по ссылке http://127.0.0.1:5000
81+
```
82+
Перейти по ссылке http://127.0.0.1:5000

database.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
DROP TABLE IF EXISTS urls;
21
DROP TABLE IF EXISTS url_checks;
2+
DROP TABLE IF EXISTS urls;
33

44
CREATE TABLE urls (
55
id SERIAL PRIMARY KEY,

page_analyzer/app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def urls_post():
111111
return render_template(ERROR_TEMPLATE), 422
112112

113113

114-
@app.route("/urls/<id>")
114+
@app.route("/urls/<int:id>")
115115
def urls_show(id):
116116
url_data = urls_model.find_by_id(id)
117117

@@ -130,7 +130,7 @@ def urls_show(id):
130130
)
131131

132132

133-
@app.post("/urls/<id>/checks")
133+
@app.post("/urls/<int:id>/checks")
134134
def urls_checks_post(id):
135135
url_data = urls_model.find_by_id(id)
136136

page_analyzer/models/MixedModel.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def get_last_url_checks(self) -> list[LastUrlCheck]:
4242

4343
try:
4444
with conn.cursor(cursor_factory=RealDictCursor) as cursor:
45+
# В данном запросе нужно расположить новые записи выше.
46+
# Поскольку id записи в общем случае не должен соответствовать
47+
# порядку записей, то сортируем их по времени добавления.
4548
cursor.execute(
4649
"""SELECT url_id, name, status_code, created_at FROM (
4750
SELECT

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from pathlib import Path
2+
23
import pytest
34

45

tests/test_app.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import pytest
2+
3+
from page_analyzer import app
4+
5+
6+
@pytest.fixture
7+
def client():
8+
app.config["TESTING"] = True
9+
client = app.test_client()
10+
11+
yield client
12+
13+
14+
def test_index_route(client):
15+
response = client.get("/")
16+
html = response.data.decode()
17+
18+
assert response.status_code == 200
19+
assert '<h1 class="display-3">Анализатор страниц</h1>' in html
20+
assert \
21+
'<label for="text" class="visually-hidden">Url для проверки</label>' \
22+
in html
23+
24+
25+
def test_404(client):
26+
response = client.get("/not_found_page")
27+
html = response.data.decode()
28+
29+
assert response.status_code == 404
30+
assert "<h1>Страница не найдена</h1>" in html

0 commit comments

Comments
 (0)