Skip to content
This repository was archived by the owner on Jul 3, 2025. It is now read-only.
Open
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
190 changes: 190 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Virtual environment
venv/
ENV/
env/
.venv/
env.bak/
env.bak.bak/

# Pip environment
pip-log.txt
pip-delete-this-directory.txt

# 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

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/
build/doctrees
build/html
build/latex
build/man
build/rst
build/xml

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# dotenv
.env

# Editors and IDEs
.vscode/
.idea/
*.sublime-project
*.sublime-workspace

# macOS
.DS_Store
.AppleDouble
.LSOverride

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/

# Generated files
*.log
*.csv
*.dat
*.tmp

# JetBrains
.idea/
*.iml
*.iws
*.ipr

# Anaconda
.conda/
.env

# PyCharm
__pycache__/
.idea/
.vscode/
*.iml
.DS_Store
*.pyc
*.pyo
.Python
env/
venv/
ENV/
env.bak/
env.bak.bak/
.pytest_cache/
.coverage
.coverage.*
.cache
.hypothesis/
htmlcov/
.tox/
.pytest_cache/

# mypy
.mypy_cache/

# Coverage
htmlcov/
.coverage

# Logs
*.log

# Local env files
.env
.env.*

# MongoDB data
data/db/

# Sanic config and temp files

sanic.log
*.pid
*.lock


# Miscellaneous
.vscode/
.venv/
17 changes: 17 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM python:3.10-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY requirements.txt /code/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /code/

COPY config.py /code/config.py

EXPOSE 8000

CMD ["python", "manage.py"]
76 changes: 22 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,64 +1,32 @@
# Вакансия :: Программист Python
# Service API

Разработка бизнес-системы с использованием веб-технологий. Автоматизация сервисов с большим количеством пользователей
Этот проект предоставляет API для управления и мониторинга состояния различных сервисов. API позволяет:

## От вас
- Получать и сохранять данные о сервисах (имя, состояние, описание).
- Выводить список сервисов с их актуальным состоянием.
- Выдавать историю изменения состояния сервиса по его имени.
- Выдавать информацию о времени простоя сервиса и рассчитывать SLA (Service Level Agreement) в процентах за указанный
интервал времени.

### Обязательно
## Установка и запуск

- Знание синтаксиса языка Python
- Опыт разработки на Python не менее 1 года
- Базовые знания принципов работы Web
- Желание работать в команде и развиваться
1. Клонируйте репозиторий:

### Приветствуется
```bash
git clone https://github.com/AlexYrlv/task-python.git
cd serviceс-api
```

- Навыки работы с Flask, Sanic, FastAPI
- Опыт работы с БД: PostgreSQL, MS SQL, MongoDB, ClickHouse
- Опыт разработки под ОС семейства GNU Linux, знание основных команд
- Работа с системами управления исходным кодом Git
- Знания базовых принципов разработки (тестирование, рефакторинг, Code Review, CI/CD)
2. Запустите контейнеры

### Будет круто, но не обязательно
```bash
docker-compose up --build
```

- Знание английского языка на уровне чтения технической документации
- Участие в разработке Open Source проектов
- Наличие профиля на GitHub, Stack Overflow
- Наличие проектов которые можете показать нам
- Разработка с использованием TypeScript, знание современных frontend-библиотек и подходов к разработке
## Документация API

## У нас
3. После запуска можно проверить запросы по ссылке

- Полный рабочий день, гибкий обед и начало рабочего дня
- Полностью «белая» заработная плата с возможностью увеличения в процессе работы (зависит от отдачи сотрудника)
- Полис ДМС
- Дружелюбная команда с юмором, готовая поддержать и помочь
- Интересный проект и необычные задачи. Рутина тоже есть, но мы нацелены именно на продуктив
- Возможность одновременно участвовать в разных проектах и развивать другие компетенции (TS и все модное)
- Попробовать современные тренды и практики в разработке ПО
- Никаких опенспейсов и кубиклов, а комфортное пространство в центре Тюмени
- Готовы делиться опытом и знаниями, если вы готовы их получать

 

Если вакансия вас заинтересовала, но есть недопонимания и вопросы, свяжитесь с нами - обсудим, договоримся.
Большим плюсом будет выполнение тестового задания.
Если у вас есть опыт работы с 1С, то эта вакансия не для вас.

## Тестовое задание

Решение принимается в виде PR к текущему проекту.

Есть несколько рабочих сервисов, у каждого сервиса есть состояние работает/не работает/работает нестабильно.

Требуется написать API который:

1. Получает и сохраняет данные: имя, состояние, описание
2. Выводит список сервисов с актуальным состоянием
3. По имени сервиса выдает историю изменения состояния и все данные по каждому состоянию

Дополнительным плюсом будет

1. По указанному интервалу выдается информация о том сколько не работал сервис и считать SLA в процентах до 3-й запятой

Вывод всех данных должен быть в формате JSON
```bash
http://localhost:8000/docs/swagger
```
26 changes: 26 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from sanic import Sanic
from sanic_ext import Extend
import os
from app.routes import ServiceRoutes
from app.db import init_db


app = Sanic("ServiceAPI")

Extend(app, openapi_config={
"title": "Service API",
"version": "1.0.0",
"description": "API для управления сервисами",
})

# Абсолютный путь к файлу config.py
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../config.py')
app.config.update_config(config_path)

# Инициализация базы данных
init_db(app.config.MONGODB_URL, app.config.DATABASE_NAME)

# Регистрация маршрутов
ServiceRoutes.register_routes(app)


4 changes: 4 additions & 0 deletions app/db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from mongoengine import connect

def init_db(uri: str, db_name: str):
connect(db_name, host=uri)
11 changes: 11 additions & 0 deletions app/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from sanic.exceptions import SanicException
from sanic import response

class NotFound(SanicException):
status_code = 404

class ServerError(SanicException):
status_code = 500

def bad_request(request, exception):
return response.json({'error': str(exception)}, status=exception.status_code)
9 changes: 9 additions & 0 deletions app/loggers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import logging

logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.StreamHandler()
]
)
Loading