mercury-proxy 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. mercury_proxy-2.0.0/CHANGELOG.md +75 -0
  2. mercury_proxy-2.0.0/LICENSE.md +13 -0
  3. mercury_proxy-2.0.0/MANIFEST.in +3 -0
  4. mercury_proxy-2.0.0/PKG-INFO +650 -0
  5. mercury_proxy-2.0.0/README.md +609 -0
  6. mercury_proxy-2.0.0/config.yaml +50 -0
  7. mercury_proxy-2.0.0/mercury_proxy/__init__.py +51 -0
  8. mercury_proxy-2.0.0/mercury_proxy/__main__.py +91 -0
  9. mercury_proxy-2.0.0/mercury_proxy/api.py +337 -0
  10. mercury_proxy-2.0.0/mercury_proxy/config.py +339 -0
  11. mercury_proxy-2.0.0/mercury_proxy/exceptions.py +23 -0
  12. mercury_proxy-2.0.0/mercury_proxy/log.py +72 -0
  13. mercury_proxy-2.0.0/mercury_proxy/mercury-proxy.service +48 -0
  14. mercury_proxy-2.0.0/mercury_proxy/meters.py +127 -0
  15. mercury_proxy-2.0.0/mercury_proxy/proxy.py +198 -0
  16. mercury_proxy-2.0.0/mercury_proxy/py.typed +1 -0
  17. mercury_proxy-2.0.0/mercury_proxy/service.py +215 -0
  18. mercury_proxy-2.0.0/mercury_proxy/systemd.py +53 -0
  19. mercury_proxy-2.0.0/mercury_proxy.egg-info/PKG-INFO +650 -0
  20. mercury_proxy-2.0.0/mercury_proxy.egg-info/SOURCES.txt +33 -0
  21. mercury_proxy-2.0.0/mercury_proxy.egg-info/dependency_links.txt +1 -0
  22. mercury_proxy-2.0.0/mercury_proxy.egg-info/entry_points.txt +2 -0
  23. mercury_proxy-2.0.0/mercury_proxy.egg-info/requires.txt +7 -0
  24. mercury_proxy-2.0.0/mercury_proxy.egg-info/top_level.txt +1 -0
  25. mercury_proxy-2.0.0/pyproject.toml +68 -0
  26. mercury_proxy-2.0.0/setup.cfg +4 -0
  27. mercury_proxy-2.0.0/tests/test_api.py +326 -0
  28. mercury_proxy-2.0.0/tests/test_cli.py +85 -0
  29. mercury_proxy-2.0.0/tests/test_config.py +273 -0
  30. mercury_proxy-2.0.0/tests/test_log.py +125 -0
  31. mercury_proxy-2.0.0/tests/test_meters.py +160 -0
  32. mercury_proxy-2.0.0/tests/test_proxy.py +154 -0
  33. mercury_proxy-2.0.0/tests/test_public.py +34 -0
  34. mercury_proxy-2.0.0/tests/test_service.py +141 -0
  35. mercury_proxy-2.0.0/tests/test_systemd.py +60 -0
@@ -0,0 +1,75 @@
1
+ # История изменений
2
+
3
+ Все заметные изменения этого проекта собраны в этом файле.
4
+
5
+ Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
6
+ проект следует [семантическому версионированию](https://semver.org/lang/ru/).
7
+
8
+ ## [2.0.0] - 2026-11-16
9
+
10
+ Полная переработка под `mercury-base` 2.0 и `simple-socket-server` 2.2: приложение стало
11
+ сервисом с конфигурацией, прокси переехал на новую версию сервера, а вместо веб-сокетов появился
12
+ REST API над командами драйвера.
13
+
14
+ ### Добавлено
15
+
16
+ - `Service` — жизненный цикл приложения: подключает счётчики, поднимает прокси и API, закрывает
17
+ всё в обратном порядке. Счётчик, которого не было при старте, не мешает запуску: его подключение
18
+ повторяется каждые `service.reconnect_interval` секунд, поэтому поздно подключённый USB-переходник
19
+ не требует перезапуска.
20
+ - Конфигурация в YAML (`mercury_proxy/config.py`): счётчики с адресами, портами и параметрами
21
+ транспорта, включение прокси и API, адреса и порты, уровень и файл лога, интервал
22
+ переподключения. Значения проверяются при загрузке, неизвестные и повторяющиеся ключи — ошибка с
23
+ именем параметра, а не молчаливое игнорирование.
24
+ - `mercury_proxy/log.py`: лог в `var/log/mercury-proxy.log` с прокруткой по размеру, необязательная
25
+ копия в stderr, уровень из конфигурации. Каталог создаётся при старте; если файл открыть не
26
+ удалось, сервис не запускается.
27
+ - `MeterHub` (`mercury_proxy/meters.py`): набор счётчиков с блокировкой на каждый счётчик, потому
28
+ что шина передаёт один кадр за раз, а прокси и API работают в разных потоках. Маршрутизация
29
+ кадров: кадр на адрес счётчика уходит ему, широковещательный или незнакомый адрес — единственному
30
+ счётчику.
31
+ - REST API (`mercury_proxy/api.py`) на стандартном `http.server`: `/v1.0`, `/v1.0/health`,
32
+ `/v1.0/meters`, `/v1.0/meters/{serial}` и `/v1.0/meters/{serial}/{command}` с параметрами в
33
+ строке запроса или в теле JSON. Ответы — `{"result": ...}`, ошибки — `{"error": "..."}` с кодами
34
+ 400, 404, 502, 504 и 500.
35
+ - Необязательный `api.token`: с ним API принимает только запросы с заголовком
36
+ `Authorization: Bearer ...` и отвечает `401` на остальные; без токена API открыт и при старте
37
+ пишет об этом предупреждение, если слушает не петлевой адрес. Ключ короче восьми символов
38
+ конфигурация не принимает.
39
+ - `SocketProxy` (`mercury_proxy/proxy.py`) на `simple-socket-server` 2.2: кадр проверяется по CRC,
40
+ пересылается счётчику как есть и возвращается клиенту; HTTP-пробы закрываются; занятый адрес
41
+ сообщается вызывающему, а не теряется в потоке сервера.
42
+ - Консольный скрипт `mercury-proxy` и `python -m mercury_proxy`: `-c/--config`, сигналы `SIGINT` и
43
+ `SIGTERM` останавливают сервис, код возврата `2` — конфигурация не прочитана, `1` — сервис не
44
+ смог работать.
45
+ - `mercury-proxy --print-unit`: печатает готовый юнит systemd для этой установки (шаблон лежит
46
+ в пакете), поэтому `sudo tee` в `/etc/systemd/system` — единственный шаг, который остаётся
47
+ установщику.
48
+ - `tests/`: набор pytest с настоящим TCP-сервером, который отвечает кадрами протокола Меркурий как
49
+ счётчик 206, поэтому `mercury-base` проверяется через сокет, а не через заглушку транспорта.
50
+ - `CHANGELOG.md`, `.gitattributes` с `* text=auto eol=lf` и GitHub Actions: тесты на Python
51
+ 3.9–3.15 и релиз по тегу с публикацией в PyPI.
52
+
53
+ ### Изменено
54
+
55
+ - Упаковка переехала с `setup.py` на `pyproject.toml` (PEP 621, PEP 639): метаданные, сборка и
56
+ настройки pytest — в одном файле, `requirements.txt` больше нет. Версия берётся из
57
+ `mercury_proxy.__version__`.
58
+ - Подсказки типов у каждого публичного имени, явный `__all__`, маркер `py.typed` (PEP 561).
59
+ - Зависимости обновлены до `mercury-base~=2.0` и `simple-socket-server~=2.2`; `gevent`,
60
+ `Flask`, `Flask-SocketIO` и `waitress` больше не нужны.
61
+ - Документация переписана: конфигурация, прокси, API, логирование, разработка и администрирование —
62
+ установка как сервис systemd, обновление пакета и юнита, логи и удаление.
63
+ - Комментарии и докстринги, пример `config.yaml` и CI переведены на русский; примеры README
64
+ сверены с реализацией, в том числе на живом счётчике через старый прокси.
65
+
66
+ ### Удалено
67
+
68
+ - `app.py` — его роль выполняет `Service` с консольным скриптом.
69
+ - Веб-сокеты и Flask: API стал REST, а фильтрацию кадров по адресу делает прокси.
70
+
71
+ ### Ломающие изменения
72
+
73
+ - Приложение запускается как сервис с файлом конфигурации; адрес и порт больше не задаются в коде.
74
+ - REST API отвечает под `/v1.0` в формате `{"result": ...}` вместо веб-сокетов.
75
+ - Python 3.9 или новее.
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2023, webtoucher
2
+
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
8
+
9
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
10
+
11
+ * Neither the names of Alexey Kuznetsov or webtoucher nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,3 @@
1
+ include CHANGELOG.md
2
+ include config.yaml
3
+ include mercury_proxy/mercury-proxy.service