Python-клиент для Mellophone (sync + async) с unit- и интеграционными тестами.
- Runtime для пакета: Python
>= 3.13(см.pyproject.toml) - uv
- Docker + Docker Compose (для интеграционных тестов и
tox-прогонов)
Примечание: тесты в CI/tox гоняются на Python 3.7-3.14.
Из Git (рекомендуется фиксировать тег, например v3.0.0):
pip install "mellophone-valve[httpx] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"
pip install "mellophone-valve[requests] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"
pip install "mellophone-valve[httpx,requests] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"Для Pipenv надежнее указывать Git-зависимость с extras напрямую в Pipfile.
[packages]
mellophone-valve = {git = "https://github.com/CourseOrchestra/mellophone-valve.git", ref = "v3.0.0", extras = ["httpx"]}
# или
mellophone-valve = {git = "https://github.com/CourseOrchestra/mellophone-valve.git", ref = "v3.0.0", extras = ["requests"]}
# или
mellophone-valve = {git = "https://github.com/CourseOrchestra/mellophone-valve.git", ref = "v3.0.0", extras = ["httpx", "requests"]}Для Poetry надежнее фиксировать Git-зависимость с extras в pyproject.toml:
[tool.poetry.dependencies]
mellophone-valve = { git = "https://github.com/CourseOrchestra/mellophone-valve.git", rev = "v3.0.0", extras = ["httpx"] }
# или
mellophone-valve = { git = "https://github.com/CourseOrchestra/mellophone-valve.git", rev = "v3.0.0", extras = ["requests"] }
# или
mellophone-valve = { git = "https://github.com/CourseOrchestra/mellophone-valve.git", rev = "v3.0.0", extras = ["httpx", "requests"] }CLI-вариант для Poetry:
poetry add "git+https://github.com/CourseOrchestra/mellophone-valve.git#v3.0.0" --extras httpx
poetry add "git+https://github.com/CourseOrchestra/mellophone-valve.git#v3.0.0" --extras requests
poetry add "git+https://github.com/CourseOrchestra/mellophone-valve.git#v3.0.0" --extras "httpx requests"uv add "mellophone-valve[httpx] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"
uv add "mellophone-valve[requests] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"
uv add "mellophone-valve[httpx,requests] @ git+https://github.com/CourseOrchestra/mellophone-valve.git@v3.0.0"Примечания:
async-методы требуютhttpx(mellophone-valve[httpx]).- При установке только
requestsдоступны толькоsync-методы. - В качестве
refможно использоватьtag,branchилиcommit SHA.
from mellophone import Mellophone
client = Mellophone(base_url="http://localhost:8082/mellophone")
session_id = client.login("user", "password")
print(client.is_authenticated(session_id))
client.logout(session_id)Класс Mellophone поддерживает пары методов sync/async:
Авторизация и сессия:
login/login_async- выполняет логин, сохраняетsession_idв клиенте и возвращаетses_id(если не передан, генерируется автоматически).logout/logout_async- завершает сессию поses_id(или поself.session_id).is_authenticated/is_authenticated_async- проверяет сессию; возвращает словарьuserпри успехе илиFalseпри403.
Проверки:
check_credentials/check_credentials_async- проверяет логин/пароль без создания сессии, возвращает данныеuser.check_name/check_name_async- проверяет логин/имя пользователя в текущей/переданной сессии, возвращает данныеuser.
Пароли и идентификатор сессии:
change_pwd/change_pwd_async- меняет пароль пользователя, связанного с переданнымses_id(еслиses_idне передан, используетсяself.session_id).change_user_pwd/change_user_pwd_async- меняет пароль указанного пользователяusername.change_app_ses_id/change_app_ses_id_async- меняетses_idсессии (oldsesid->newsesid);self.session_idобновляется только еслиses_idне передан.
Провайдеры и списки пользователей:
import_gp/import_gp_async- импортирует groups/providers, возвращает список строк из ответа API.get_provider_list/get_provider_list_async- возвращает список/структуру провайдеров по учетным данным.get_user_list/get_user_list_async- возвращает список пользователей поgp(опциональноip,pid); токен берется изself.user_manage_token.
Настройки и user management:
set_settings/set_settings_async- обновляет настройки (lockout_time,login_attempts_allowed); токен берется изself.set_settings_token.create_user/create_user_async- создает пользователя (POST /user/create, XML payload); токен берется изself.user_manage_token.update_user/update_user_async- обновляет пользователя поsid(POST /user/{sid}, XML payload); токен берется изself.user_manage_token.delete_user/delete_user_async- удаляет пользователя поsid(DELETE /user/{sid}); токен берется изself.user_manage_token.
Состояние сессии:
set_state/set_state_async- сохраняет произвольное состояние дляses_id.get_state/get_state_async- возвращает ранее сохраненное состояние дляses_id.
Также доступны исключения:
HttpError- базовая HTTP-ошибка API (status_code,response_text).BadRequestError- ошибкаHTTP 400(некорректный запрос).UnauthorizedError- ошибкаHTTP 401(неавторизован).ForbiddenError- ошибкаHTTP 403(доступ запрещен).NotFoundError- ошибкаHTTP 404(ресурс не найден).ServerError- серверная ошибкаHTTP 5xx.TransportError- транспортная ошибка HTTP-клиента (сеть/соединение).RequestTimeoutError- превышен таймаут запроса.ResponseParseError- не удалось распарсить XML-ответ API.MissingTokenError- в клиенте не задан обязательный токен (set_settings_tokenилиuser_manage_token).AsyncClientUnavailableError- вызваныasync-методы без установленногоhttpx.
docker compose up -dСервисы:
- Mellophone:
http://localhost:8082/mellophone - PostgreSQL:
localhost:5430
Инициализация БД выполняется автоматически из docker-config/init-db.sql через mount в db:/docker-entrypoint-initdb.d/init-db.sql.
Важно: скрипты из /docker-entrypoint-initdb.d выполняются только при первичной инициализации Postgres volume.
uv run pre-commit run --all-filesВсе тесты:
uv run pytest -qТолько unit-тесты:
uv run pytest tests/test_mellophone.py -qИнтеграционные:
uv run pytest tests/test_integration_mellophone.py -qМатрица tox (Docker, Python 3.7-3.14):
tox -p autouv run --with coverage --with pytest-cov pytest --cov=. --cov-report=term-missing -qРелиз создается автоматически при push в master workflow'ом CI Push.
Условия для релиза:
Testsзавершился успешно.Version Checkзавершился успешно (версия вpyproject.tomlувеличена по правиламvuh).
Как формируется релиз:
- версия берется из
vuh lv -q; - создается тег формата
v<version>и GitHub Release; - если тег уже существует, релиз пропускается.
В .vscode/tasks.json добавлены задачи:
docker:stop- остановитьdocker composeи удалить volume (docker compose down -v).docker:start- поднять локальный стенд в фоне (docker compose up -d).docker:restart- последовательно выполнитьdocker:stopиdocker:start.uv:sync- синхронизировать окружение и зависимости (uv sync).uv:update- обновить lock-файл зависимостей (uv lock --upgrade).pytest:coverage- запустить тесты с coverage в терминал.pytest:coverage:html- запустить тесты с coverage в терминал и HTML-отчет (htmlcov/).tox:test- запустить матрицуtox(tox -p auto).lint:ruff- проверить код черезruff check ..lint:ruff:fix- исправить автоисправляемые проблемыruff.lint:pre-commit- прогнатьpre-commitпо всем файлам.