aprsd 4.1.0__tar.gz → 4.1.1__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 (163) hide show
  1. {aprsd-4.1.0 → aprsd-4.1.1}/ChangeLog.md +10 -0
  2. {aprsd-4.1.0 → aprsd-4.1.1}/PKG-INFO +22 -20
  3. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cli_helper.py +36 -35
  4. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/base.py +14 -11
  5. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/send_message.py +30 -28
  6. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/server.py +28 -63
  7. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/log.py +5 -0
  8. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/log/log.py +12 -9
  9. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/main.py +22 -22
  10. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugin.py +52 -52
  11. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugin_utils.py +20 -21
  12. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/weather.py +110 -109
  13. aprsd-4.1.1/aprsd/threads/service.py +42 -0
  14. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/PKG-INFO +22 -20
  15. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/SOURCES.txt +1 -0
  16. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/requires.txt +21 -19
  17. {aprsd-4.1.0 → aprsd-4.1.1}/requirements-dev.txt +7 -7
  18. {aprsd-4.1.0 → aprsd-4.1.1}/requirements.in +1 -2
  19. {aprsd-4.1.0 → aprsd-4.1.1}/requirements.txt +15 -13
  20. {aprsd-4.1.0 → aprsd-4.1.1}/.coveragerc +0 -0
  21. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/authors.yml +0 -0
  22. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/codeql.yml +0 -0
  23. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/manual_build.yml +0 -0
  24. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/master-build.yml +0 -0
  25. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/python.yml +0 -0
  26. {aprsd-4.1.0 → aprsd-4.1.1}/.github/workflows/release_build.yml +0 -0
  27. {aprsd-4.1.0 → aprsd-4.1.1}/.mailmap +0 -0
  28. {aprsd-4.1.0 → aprsd-4.1.1}/.pre-commit-config.yaml +0 -0
  29. {aprsd-4.1.0 → aprsd-4.1.1}/.readthedocs.yaml +0 -0
  30. {aprsd-4.1.0 → aprsd-4.1.1}/AUTHORS +0 -0
  31. {aprsd-4.1.0 → aprsd-4.1.1}/CONTRIBUTING.md +0 -0
  32. {aprsd-4.1.0 → aprsd-4.1.1}/INSTALL.txt +0 -0
  33. {aprsd-4.1.0 → aprsd-4.1.1}/LICENSE +0 -0
  34. {aprsd-4.1.0 → aprsd-4.1.1}/MANIFEST.in +0 -0
  35. {aprsd-4.1.0 → aprsd-4.1.1}/Makefile +0 -0
  36. {aprsd-4.1.0 → aprsd-4.1.1}/README.md +0 -0
  37. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/__init__.py +0 -0
  38. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/__init__.py +0 -0
  39. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/aprsis.py +0 -0
  40. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/drivers/__init__.py +0 -0
  41. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/drivers/aprsis.py +0 -0
  42. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/drivers/fake.py +0 -0
  43. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/drivers/kiss.py +0 -0
  44. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/factory.py +0 -0
  45. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/fake.py +0 -0
  46. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/kiss.py +0 -0
  47. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/client/stats.py +0 -0
  48. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/__init__.py +0 -0
  49. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/completion.py +0 -0
  50. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/dev.py +0 -0
  51. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/fetch_stats.py +0 -0
  52. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/healthcheck.py +0 -0
  53. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/list_plugins.py +0 -0
  54. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/cmds/listen.py +0 -0
  55. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/__init__.py +0 -0
  56. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/client.py +0 -0
  57. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/common.py +0 -0
  58. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/opts.py +0 -0
  59. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/conf/plugin_common.py +0 -0
  60. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/exception.py +0 -0
  61. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/log/__init__.py +0 -0
  62. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/__init__.py +0 -0
  63. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/collector.py +0 -0
  64. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/core.py +0 -0
  65. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/filter.py +0 -0
  66. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/filters/__init__.py +0 -0
  67. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/filters/dupe_filter.py +0 -0
  68. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/filters/packet_type.py +0 -0
  69. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/log.py +0 -0
  70. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/packet_list.py +0 -0
  71. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/seen_list.py +0 -0
  72. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/tracker.py +0 -0
  73. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/packets/watch_list.py +0 -0
  74. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/__init__.py +0 -0
  75. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/fortune.py +0 -0
  76. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/notify.py +0 -0
  77. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/ping.py +0 -0
  78. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/time.py +0 -0
  79. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/plugins/version.py +0 -0
  80. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/stats/__init__.py +0 -0
  81. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/stats/app.py +0 -0
  82. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/stats/collector.py +0 -0
  83. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/__init__.py +0 -0
  84. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/aprsd.py +0 -0
  85. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/keepalive.py +0 -0
  86. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/registry.py +0 -0
  87. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/rx.py +0 -0
  88. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/stats.py +0 -0
  89. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/threads/tx.py +0 -0
  90. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/__init__.py +0 -0
  91. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/counter.py +0 -0
  92. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/fuzzyclock.py +0 -0
  93. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/json.py +0 -0
  94. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/keepalive_collector.py +0 -0
  95. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/objectstore.py +0 -0
  96. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/ring_buffer.py +0 -0
  97. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd/utils/trace.py +0 -0
  98. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd-lnav.json +0 -0
  99. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/dependency_links.txt +0 -0
  100. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/entry_points.txt +0 -0
  101. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd.egg-info/top_level.txt +0 -0
  102. {aprsd-4.1.0 → aprsd-4.1.1}/aprsd_logo.png +0 -0
  103. {aprsd-4.1.0 → aprsd-4.1.1}/docker/Dockerfile +0 -0
  104. {aprsd-4.1.0 → aprsd-4.1.1}/docker/bin/admin.sh +0 -0
  105. {aprsd-4.1.0 → aprsd-4.1.1}/docker/bin/healthcheck.sh +0 -0
  106. {aprsd-4.1.0 → aprsd-4.1.1}/docker/bin/listen.sh +0 -0
  107. {aprsd-4.1.0 → aprsd-4.1.1}/docker/bin/run.sh +0 -0
  108. {aprsd-4.1.0 → aprsd-4.1.1}/docker/bin/setup.sh +0 -0
  109. {aprsd-4.1.0 → aprsd-4.1.1}/docker/build.sh +0 -0
  110. {aprsd-4.1.0 → aprsd-4.1.1}/docker/docker-compose.yml +0 -0
  111. {aprsd-4.1.0 → aprsd-4.1.1}/docs/_static/.keep +0 -0
  112. {aprsd-4.1.0 → aprsd-4.1.1}/docs/_static/aprsd_overview.png +0 -0
  113. {aprsd-4.1.0 → aprsd-4.1.1}/docs/_static/aprsd_overview.svg +0 -0
  114. {aprsd-4.1.0 → aprsd-4.1.1}/docs/_templates/.keep +0 -0
  115. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.client.drivers.rst +0 -0
  116. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.client.rst +0 -0
  117. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.cmds.rst +0 -0
  118. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.conf.rst +0 -0
  119. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.log.rst +0 -0
  120. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.packets.rst +0 -0
  121. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.plugins.rst +0 -0
  122. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.rst +0 -0
  123. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.stats.rst +0 -0
  124. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.threads.rst +0 -0
  125. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/aprsd.utils.rst +0 -0
  126. {aprsd-4.1.0 → aprsd-4.1.1}/docs/apidoc/modules.rst +0 -0
  127. {aprsd-4.1.0 → aprsd-4.1.1}/docs/aprsd.drawio +0 -0
  128. {aprsd-4.1.0 → aprsd-4.1.1}/docs/changelog.rst +0 -0
  129. {aprsd-4.1.0 → aprsd-4.1.1}/docs/clean_docs.py +0 -0
  130. {aprsd-4.1.0 → aprsd-4.1.1}/docs/conf.py +0 -0
  131. {aprsd-4.1.0 → aprsd-4.1.1}/docs/configure.rst +0 -0
  132. {aprsd-4.1.0 → aprsd-4.1.1}/docs/index.rst +0 -0
  133. {aprsd-4.1.0 → aprsd-4.1.1}/docs/install.rst +0 -0
  134. {aprsd-4.1.0 → aprsd-4.1.1}/docs/links.rst +0 -0
  135. {aprsd-4.1.0 → aprsd-4.1.1}/docs/plugin.rst +0 -0
  136. {aprsd-4.1.0 → aprsd-4.1.1}/docs/readme.rst +0 -0
  137. {aprsd-4.1.0 → aprsd-4.1.1}/docs/server.rst +0 -0
  138. {aprsd-4.1.0 → aprsd-4.1.1}/examples/plugins/__init__.py +0 -0
  139. {aprsd-4.1.0 → aprsd-4.1.1}/examples/plugins/example_plugin.py +0 -0
  140. {aprsd-4.1.0 → aprsd-4.1.1}/gray.conf +0 -0
  141. {aprsd-4.1.0 → aprsd-4.1.1}/pyproject.toml +0 -0
  142. {aprsd-4.1.0 → aprsd-4.1.1}/requirements-dev.in +0 -0
  143. {aprsd-4.1.0 → aprsd-4.1.1}/setup.cfg +0 -0
  144. {aprsd-4.1.0 → aprsd-4.1.1}/setup.py +0 -0
  145. {aprsd-4.1.0 → aprsd-4.1.1}/tests/__init__.py +0 -0
  146. {aprsd-4.1.0 → aprsd-4.1.1}/tests/client/test_aprsis.py +0 -0
  147. {aprsd-4.1.0 → aprsd-4.1.1}/tests/client/test_client_base.py +0 -0
  148. {aprsd-4.1.0 → aprsd-4.1.1}/tests/client/test_factory.py +0 -0
  149. {aprsd-4.1.0 → aprsd-4.1.1}/tests/cmds/__init__.py +0 -0
  150. {aprsd-4.1.0 → aprsd-4.1.1}/tests/cmds/test_send_message.py +0 -0
  151. {aprsd-4.1.0 → aprsd-4.1.1}/tests/fake.py +0 -0
  152. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/__init__.py +0 -0
  153. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_fortune.py +0 -0
  154. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_notify.py +0 -0
  155. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_ping.py +0 -0
  156. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_time.py +0 -0
  157. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_version.py +0 -0
  158. {aprsd-4.1.0 → aprsd-4.1.1}/tests/plugins/test_weather.py +0 -0
  159. {aprsd-4.1.0 → aprsd-4.1.1}/tests/test_packets.py +0 -0
  160. {aprsd-4.1.0 → aprsd-4.1.1}/tests/test_plugin.py +0 -0
  161. {aprsd-4.1.0 → aprsd-4.1.1}/tools/fast8.sh +0 -0
  162. {aprsd-4.1.0 → aprsd-4.1.1}/tox.ini +0 -0
  163. {aprsd-4.1.0 → aprsd-4.1.1}/uv.lock +0 -0
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [4.1.1](https://github.com/craigerl/aprsd/compare/4.1.0...4.1.1)
8
+
9
+ > 5 March 2025
10
+
11
+ - Added new config to disable logging to console [`0fa5b07`](https://github.com/craigerl/aprsd/commit/0fa5b07d4bf4bc5d5aaad1de52b78058e472fe24)
12
+ - Added threads.service [`c1c89fd`](https://github.com/craigerl/aprsd/commit/c1c89fd2c2c69c5e6c5d29a736a7b89e3d45cfe2)
13
+ - Update requirements [`2b185ee`](https://github.com/craigerl/aprsd/commit/2b185ee1b84598c832d8a5d73753cb428854b932)
14
+ - Fixed some more ruff checks [`94ba915`](https://github.com/craigerl/aprsd/commit/94ba915ed44b11eaabc885e033669d67d8c341a5)
15
+
7
16
  #### [4.1.0](https://github.com/craigerl/aprsd/compare/4.0.2...4.1.0)
8
17
 
9
18
  > 20 February 2025
@@ -21,6 +30,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
21
30
  - fix for None packet in rx thread [`d82a81a`](https://github.com/craigerl/aprsd/commit/d82a81a2c3c1a7f50177a0a6435a555daeb858aa)
22
31
  - Fix runaway KISS driver on failed connnection [`b6da0eb`](https://github.com/craigerl/aprsd/commit/b6da0ebb0d2f4d7078dbbf91d8c03715412d89ea)
23
32
  - CONF.logging.enable_color option added [`06bdb34`](https://github.com/craigerl/aprsd/commit/06bdb34642640d91ea96e3c6e8d8b5a4b8230611)
33
+ - Update Changelog for 4.1.0 release [`a3cda9f`](https://github.com/craigerl/aprsd/commit/a3cda9f37d4c9b955b523f46b2eb8cf412a84407)
24
34
 
25
35
  #### [4.0.2](https://github.com/craigerl/aprsd/compare/4.0.1...4.0.2)
26
36
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: aprsd
3
- Version: 4.1.0
3
+ Version: 4.1.1
4
4
  Summary: APRSd is a APRS-IS server that can be used to connect to APRS-IS and send and receive APRS packets.
5
5
  Author-email: Craig Lamparter <craig@craiger.org>, "Walter A. Boring IV" <waboring@hemna.com>, Emre Saglam <emresaglam@gmail.com>, Jason Martin <jhmartin@toger.us>, John <johng42@users.noreply.github.com>, Martiros Shakhzadyan <vrzh@vrzh.net>, Zoe Moore <zoenb@mailbox.org>, ranguli <hello@joshmurphy.ca>
6
6
  Maintainer-email: Craig Lamparter <craig@craiger.org>, "Walter A. Boring IV" <waboring@hemna.com>
@@ -202,13 +202,12 @@ Description-Content-Type: text/markdown
202
202
  License-File: LICENSE
203
203
  License-File: AUTHORS
204
204
  Requires-Dist: aprslib==0.7.2
205
- Requires-Dist: attrs==24.3.0
205
+ Requires-Dist: attrs==25.1.0
206
206
  Requires-Dist: ax253==0.1.5.post1
207
- Requires-Dist: bitarray==3.0.0
208
- Requires-Dist: certifi==2024.12.14
207
+ Requires-Dist: bitarray==3.1.0
208
+ Requires-Dist: certifi==2025.1.31
209
209
  Requires-Dist: charset-normalizer==3.4.1
210
210
  Requires-Dist: click==8.1.8
211
- Requires-Dist: commonmark==0.9.1
212
211
  Requires-Dist: dataclasses-json==0.6.7
213
212
  Requires-Dist: debtcollector==3.0.0
214
213
  Requires-Dist: haversine==2.9.0
@@ -216,39 +215,42 @@ Requires-Dist: idna==3.10
216
215
  Requires-Dist: importlib-metadata==8.6.1
217
216
  Requires-Dist: kiss3==8.0.0
218
217
  Requires-Dist: loguru==0.7.3
219
- Requires-Dist: marshmallow==3.26.0
218
+ Requires-Dist: markdown-it-py==3.0.0
219
+ Requires-Dist: marshmallow==3.26.1
220
+ Requires-Dist: mdurl==0.1.2
220
221
  Requires-Dist: mypy-extensions==1.0.0
221
222
  Requires-Dist: netaddr==1.3.0
222
- Requires-Dist: oslo-config==9.7.0
223
- Requires-Dist: oslo-i18n==6.5.0
223
+ Requires-Dist: oslo-config==9.7.1
224
+ Requires-Dist: oslo-i18n==6.5.1
224
225
  Requires-Dist: packaging==24.2
225
- Requires-Dist: pbr==6.1.0
226
+ Requires-Dist: pbr==6.1.1
226
227
  Requires-Dist: pluggy==1.5.0
227
228
  Requires-Dist: pygments==2.19.1
228
229
  Requires-Dist: pyserial==3.5
229
230
  Requires-Dist: pyserial-asyncio==0.6
230
- Requires-Dist: pytz==2024.2
231
+ Requires-Dist: pytz==2025.1
231
232
  Requires-Dist: pyyaml==6.0.2
232
233
  Requires-Dist: requests==2.32.3
233
234
  Requires-Dist: rfc3986==2.0.0
234
- Requires-Dist: rich==12.6.0
235
+ Requires-Dist: rich==13.9.4
235
236
  Requires-Dist: rush==2021.4.0
236
- Requires-Dist: stevedore==5.4.0
237
+ Requires-Dist: setuptools==75.8.2
238
+ Requires-Dist: stevedore==5.4.1
237
239
  Requires-Dist: thesmuggler==1.0.1
238
240
  Requires-Dist: timeago==1.0.16
239
241
  Requires-Dist: typing-extensions==4.12.2
240
242
  Requires-Dist: typing-inspect==0.9.0
241
- Requires-Dist: tzlocal==5.2
243
+ Requires-Dist: tzlocal==5.3
242
244
  Requires-Dist: update-checker==0.18.0
243
245
  Requires-Dist: urllib3==2.3.0
244
246
  Requires-Dist: wrapt==1.17.2
245
247
  Requires-Dist: zipp==3.21.0
246
248
  Provides-Extra: dev
247
249
  Requires-Dist: alabaster==1.0.0; extra == "dev"
248
- Requires-Dist: babel==2.16.0; extra == "dev"
250
+ Requires-Dist: babel==2.17.0; extra == "dev"
249
251
  Requires-Dist: build==1.2.2.post1; extra == "dev"
250
- Requires-Dist: cachetools==5.5.1; extra == "dev"
251
- Requires-Dist: certifi==2024.12.14; extra == "dev"
252
+ Requires-Dist: cachetools==5.5.2; extra == "dev"
253
+ Requires-Dist: certifi==2025.1.31; extra == "dev"
252
254
  Requires-Dist: cfgv==3.4.0; extra == "dev"
253
255
  Requires-Dist: chardet==5.2.0; extra == "dev"
254
256
  Requires-Dist: charset-normalizer==3.4.1; extra == "dev"
@@ -257,7 +259,7 @@ Requires-Dist: colorama==0.4.6; extra == "dev"
257
259
  Requires-Dist: distlib==0.3.9; extra == "dev"
258
260
  Requires-Dist: docutils==0.21.2; extra == "dev"
259
261
  Requires-Dist: filelock==3.17.0; extra == "dev"
260
- Requires-Dist: identify==2.6.6; extra == "dev"
262
+ Requires-Dist: identify==2.6.8; extra == "dev"
261
263
  Requires-Dist: idna==3.10; extra == "dev"
262
264
  Requires-Dist: imagesize==1.4.1; extra == "dev"
263
265
  Requires-Dist: jinja2==3.1.5; extra == "dev"
@@ -266,7 +268,7 @@ Requires-Dist: markupsafe==3.0.2; extra == "dev"
266
268
  Requires-Dist: mistune==0.8.4; extra == "dev"
267
269
  Requires-Dist: nodeenv==1.9.1; extra == "dev"
268
270
  Requires-Dist: packaging==24.2; extra == "dev"
269
- Requires-Dist: pip==24.3.1; extra == "dev"
271
+ Requires-Dist: pip==25.0.1; extra == "dev"
270
272
  Requires-Dist: pip-tools==7.4.1; extra == "dev"
271
273
  Requires-Dist: platformdirs==4.3.6; extra == "dev"
272
274
  Requires-Dist: pluggy==1.5.0; extra == "dev"
@@ -276,7 +278,7 @@ Requires-Dist: pyproject-api==1.9.0; extra == "dev"
276
278
  Requires-Dist: pyproject-hooks==1.2.0; extra == "dev"
277
279
  Requires-Dist: pyyaml==6.0.2; extra == "dev"
278
280
  Requires-Dist: requests==2.32.3; extra == "dev"
279
- Requires-Dist: setuptools==75.8.0; extra == "dev"
281
+ Requires-Dist: setuptools==75.8.2; extra == "dev"
280
282
  Requires-Dist: snowballstemmer==2.2.0; extra == "dev"
281
283
  Requires-Dist: sphinx==8.1.3; extra == "dev"
282
284
  Requires-Dist: sphinxcontrib-applehelp==2.0.0; extra == "dev"
@@ -289,7 +291,7 @@ Requires-Dist: tomli==2.2.1; extra == "dev"
289
291
  Requires-Dist: tox==4.24.1; extra == "dev"
290
292
  Requires-Dist: typing-extensions==4.12.2; extra == "dev"
291
293
  Requires-Dist: urllib3==2.3.0; extra == "dev"
292
- Requires-Dist: virtualenv==20.29.1; extra == "dev"
294
+ Requires-Dist: virtualenv==20.29.2; extra == "dev"
293
295
  Requires-Dist: wheel==0.45.1; extra == "dev"
294
296
 
295
297
  # APRSD - Ham radio APRS-IS Message platform software
@@ -13,35 +13,35 @@ from aprsd.utils import trace
13
13
 
14
14
  CONF = cfg.CONF
15
15
  home = str(Path.home())
16
- DEFAULT_CONFIG_DIR = f"{home}/.config/aprsd/"
17
- DEFAULT_SAVE_FILE = f"{home}/.config/aprsd/aprsd.p"
18
- DEFAULT_CONFIG_FILE = f"{home}/.config/aprsd/aprsd.conf"
16
+ DEFAULT_CONFIG_DIR = f'{home}/.config/aprsd/'
17
+ DEFAULT_SAVE_FILE = f'{home}/.config/aprsd/aprsd.p'
18
+ DEFAULT_CONFIG_FILE = f'{home}/.config/aprsd/aprsd.conf'
19
19
 
20
20
 
21
- F = t.TypeVar("F", bound=t.Callable[..., t.Any])
21
+ F = t.TypeVar('F', bound=t.Callable[..., t.Any])
22
22
 
23
23
  common_options = [
24
24
  click.option(
25
- "--loglevel",
26
- default="INFO",
25
+ '--loglevel',
26
+ default='INFO',
27
27
  show_default=True,
28
28
  type=click.Choice(
29
- ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"],
29
+ ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG'],
30
30
  case_sensitive=False,
31
31
  ),
32
32
  show_choices=True,
33
- help="The log level to use for aprsd.log",
33
+ help='The log level to use for aprsd.log',
34
34
  ),
35
35
  click.option(
36
- "-c",
37
- "--config",
38
- "config_file",
36
+ '-c',
37
+ '--config',
38
+ 'config_file',
39
39
  show_default=True,
40
40
  default=DEFAULT_CONFIG_FILE,
41
- help="The aprsd config file to use for options.",
41
+ help='The aprsd config file to use for options.',
42
42
  ),
43
43
  click.option(
44
- "--quiet",
44
+ '--quiet',
45
45
  is_flag=True,
46
46
  default=False,
47
47
  help="Don't log to stdout",
@@ -59,7 +59,7 @@ class AliasedGroup(click.Group):
59
59
  """
60
60
 
61
61
  def decorator(f):
62
- aliases = kwargs.pop("aliases", [])
62
+ aliases = kwargs.pop('aliases', [])
63
63
  cmd = click.decorators.command(*args, **kwargs)(f)
64
64
  self.add_command(cmd)
65
65
  for alias in aliases:
@@ -77,7 +77,7 @@ class AliasedGroup(click.Group):
77
77
  """
78
78
 
79
79
  def decorator(f):
80
- aliases = kwargs.pop("aliases", [])
80
+ aliases = kwargs.pop('aliases', [])
81
81
  cmd = click.decorators.group(*args, **kwargs)(f)
82
82
  self.add_command(cmd)
83
83
  for alias in aliases:
@@ -101,36 +101,37 @@ def process_standard_options(f: F) -> F:
101
101
  ctx = args[0]
102
102
  ctx.ensure_object(dict)
103
103
  config_file_found = True
104
- if kwargs["config_file"]:
105
- default_config_files = [kwargs["config_file"]]
104
+ if kwargs['config_file']:
105
+ default_config_files = [kwargs['config_file']]
106
106
  else:
107
107
  default_config_files = None
108
+
108
109
  try:
109
110
  CONF(
110
111
  [],
111
- project="aprsd",
112
+ project='aprsd',
112
113
  version=aprsd.__version__,
113
114
  default_config_files=default_config_files,
114
115
  )
115
116
  except cfg.ConfigFilesNotFoundError:
116
117
  config_file_found = False
117
- ctx.obj["loglevel"] = kwargs["loglevel"]
118
+ ctx.obj['loglevel'] = kwargs['loglevel']
118
119
  # ctx.obj["config_file"] = kwargs["config_file"]
119
- ctx.obj["quiet"] = kwargs["quiet"]
120
+ ctx.obj['quiet'] = kwargs['quiet']
120
121
  log.setup_logging(
121
- ctx.obj["loglevel"],
122
- ctx.obj["quiet"],
122
+ ctx.obj['loglevel'],
123
+ ctx.obj['quiet'],
123
124
  )
124
125
  if CONF.trace_enabled:
125
- trace.setup_tracing(["method", "api"])
126
+ trace.setup_tracing(['method', 'api'])
126
127
 
127
128
  if not config_file_found:
128
- LOG = logging.getLogger("APRSD") # noqa: N806
129
+ LOG = logging.getLogger('APRSD') # noqa: N806
129
130
  LOG.error("No config file found!! run 'aprsd sample-config'")
130
131
 
131
- del kwargs["loglevel"]
132
- del kwargs["config_file"]
133
- del kwargs["quiet"]
132
+ del kwargs['loglevel']
133
+ del kwargs['config_file']
134
+ del kwargs['quiet']
134
135
  return f(*args, **kwargs)
135
136
 
136
137
  return update_wrapper(t.cast(F, new_func), f)
@@ -142,17 +143,17 @@ def process_standard_options_no_config(f: F) -> F:
142
143
  def new_func(*args, **kwargs):
143
144
  ctx = args[0]
144
145
  ctx.ensure_object(dict)
145
- ctx.obj["loglevel"] = kwargs["loglevel"]
146
- ctx.obj["config_file"] = kwargs["config_file"]
147
- ctx.obj["quiet"] = kwargs["quiet"]
146
+ ctx.obj['loglevel'] = kwargs['loglevel']
147
+ ctx.obj['config_file'] = kwargs['config_file']
148
+ ctx.obj['quiet'] = kwargs['quiet']
148
149
  log.setup_logging(
149
- ctx.obj["loglevel"],
150
- ctx.obj["quiet"],
150
+ ctx.obj['loglevel'],
151
+ ctx.obj['quiet'],
151
152
  )
152
153
 
153
- del kwargs["loglevel"]
154
- del kwargs["config_file"]
155
- del kwargs["quiet"]
154
+ del kwargs['loglevel']
155
+ del kwargs['config_file']
156
+ del kwargs['quiet']
156
157
  return f(*args, **kwargs)
157
158
 
158
159
  return update_wrapper(t.cast(F, new_func), f)
@@ -9,7 +9,7 @@ from aprsd.packets import core
9
9
  from aprsd.utils import keepalive_collector
10
10
 
11
11
  CONF = cfg.CONF
12
- LOG = logging.getLogger("APRSD")
12
+ LOG = logging.getLogger('APRSD')
13
13
 
14
14
 
15
15
  class APRSClient:
@@ -20,8 +20,8 @@ class APRSClient:
20
20
 
21
21
  connected = False
22
22
  login_status = {
23
- "success": False,
24
- "message": None,
23
+ 'success': False,
24
+ 'message': None,
25
25
  }
26
26
  filter = None
27
27
  lock = threading.Lock()
@@ -59,17 +59,20 @@ class APRSClient:
59
59
 
60
60
  @property
61
61
  def login_success(self):
62
- return self.login_status.get("success", False)
62
+ return self.login_status.get('success', False)
63
63
 
64
64
  @property
65
65
  def login_failure(self):
66
- return self.login_status["message"]
66
+ return self.login_status['message']
67
67
 
68
68
  def set_filter(self, filter):
69
69
  self.filter = filter
70
70
  if self._client:
71
71
  self._client.set_filter(filter)
72
72
 
73
+ def get_filter(self):
74
+ return self.filter
75
+
73
76
  @property
74
77
  def client(self):
75
78
  if not self._client:
@@ -80,16 +83,16 @@ class APRSClient:
80
83
  try:
81
84
  self._client = self.setup_connection()
82
85
  if self.filter:
83
- LOG.info("Creating APRS client filter")
86
+ LOG.info('Creating APRS client filter')
84
87
  self._client.set_filter(self.filter)
85
88
  except Exception as e:
86
- LOG.error(f"Failed to create APRS client: {e}")
89
+ LOG.error(f'Failed to create APRS client: {e}')
87
90
  self._client = None
88
91
  raise
89
92
 
90
93
  def stop(self):
91
94
  if self._client:
92
- LOG.info("Stopping client connection.")
95
+ LOG.info('Stopping client connection.')
93
96
  self._client.stop()
94
97
 
95
98
  def send(self, packet: core.Packet) -> None:
@@ -103,16 +106,16 @@ class APRSClient:
103
106
  @wrapt.synchronized(lock)
104
107
  def reset(self) -> None:
105
108
  """Call this to force a rebuild/reconnect."""
106
- LOG.info("Resetting client connection.")
109
+ LOG.info('Resetting client connection.')
107
110
  if self._client:
108
111
  self._client.close()
109
112
  del self._client
110
113
  self._create_client()
111
114
  else:
112
- LOG.warning("Client not initialized, nothing to reset.")
115
+ LOG.warning('Client not initialized, nothing to reset.')
113
116
 
114
117
  # Recreate the client
115
- LOG.info(f"Creating new client {self.client}")
118
+ LOG.info(f'Creating new client {self.client}')
116
119
 
117
120
  @abc.abstractmethod
118
121
  def setup_connection(self):
@@ -3,58 +3,60 @@ import sys
3
3
  import time
4
4
 
5
5
  import aprslib
6
- from aprslib.exceptions import LoginError
7
6
  import click
7
+ from aprslib.exceptions import LoginError
8
8
  from oslo_config import cfg
9
9
 
10
10
  import aprsd
11
- from aprsd import cli_helper, packets
12
- from aprsd import conf # noqa : F401
11
+ import aprsd.packets # noqa : F401
12
+ from aprsd import (
13
+ cli_helper,
14
+ conf, # noqa : F401
15
+ packets,
16
+ )
13
17
  from aprsd.client import client_factory
14
18
  from aprsd.main import cli
15
- import aprsd.packets # noqa : F401
16
19
  from aprsd.packets import collector
17
20
  from aprsd.packets import log as packet_log
18
21
  from aprsd.threads import tx
19
22
 
20
-
21
23
  CONF = cfg.CONF
22
- LOG = logging.getLogger("APRSD")
24
+ LOG = logging.getLogger('APRSD')
23
25
 
24
26
 
25
27
  @cli.command()
26
28
  @cli_helper.add_options(cli_helper.common_options)
27
29
  @click.option(
28
- "--aprs-login",
29
- envvar="APRS_LOGIN",
30
+ '--aprs-login',
31
+ envvar='APRS_LOGIN',
30
32
  show_envvar=True,
31
- help="What callsign to send the message from. Defaults to config entry.",
33
+ help='What callsign to send the message from. Defaults to config entry.',
32
34
  )
33
35
  @click.option(
34
- "--aprs-password",
35
- envvar="APRS_PASSWORD",
36
+ '--aprs-password',
37
+ envvar='APRS_PASSWORD',
36
38
  show_envvar=True,
37
- help="the APRS-IS password for APRS_LOGIN. Defaults to config entry.",
39
+ help='the APRS-IS password for APRS_LOGIN. Defaults to config entry.',
38
40
  )
39
41
  @click.option(
40
- "--no-ack",
41
- "-n",
42
+ '--no-ack',
43
+ '-n',
42
44
  is_flag=True,
43
45
  show_default=True,
44
46
  default=False,
45
47
  help="Don't wait for an ack, just sent it to APRS-IS and bail.",
46
48
  )
47
49
  @click.option(
48
- "--wait-response",
49
- "-w",
50
+ '--wait-response',
51
+ '-w',
50
52
  is_flag=True,
51
53
  show_default=True,
52
54
  default=False,
53
- help="Wait for a response to the message?",
55
+ help='Wait for a response to the message?',
54
56
  )
55
- @click.option("--raw", default=None, help="Send a raw message. Implies --no-ack")
56
- @click.argument("tocallsign", required=True)
57
- @click.argument("command", nargs=-1, required=True)
57
+ @click.option('--raw', default=None, help='Send a raw message. Implies --no-ack')
58
+ @click.argument('tocallsign', required=True)
59
+ @click.argument('command', nargs=-1, required=True)
58
60
  @click.pass_context
59
61
  @cli_helper.process_standard_options
60
62
  def send_message(
@@ -69,11 +71,11 @@ def send_message(
69
71
  ):
70
72
  """Send a message to a callsign via APRS_IS."""
71
73
  global got_ack, got_response
72
- quiet = ctx.obj["quiet"]
74
+ quiet = ctx.obj['quiet']
73
75
 
74
76
  if not aprs_login:
75
77
  if CONF.aprs_network.login == conf.client.DEFAULT_LOGIN:
76
- click.echo("Must set --aprs_login or APRS_LOGIN")
78
+ click.echo('Must set --aprs_login or APRS_LOGIN')
77
79
  ctx.exit(-1)
78
80
  return
79
81
  else:
@@ -81,15 +83,15 @@ def send_message(
81
83
 
82
84
  if not aprs_password:
83
85
  if not CONF.aprs_network.password:
84
- click.echo("Must set --aprs-password or APRS_PASSWORD")
86
+ click.echo('Must set --aprs-password or APRS_PASSWORD')
85
87
  ctx.exit(-1)
86
88
  return
87
89
  else:
88
90
  aprs_password = CONF.aprs_network.password
89
91
 
90
- LOG.info(f"APRSD LISTEN Started version: {aprsd.__version__}")
92
+ LOG.info(f'APRSD LISTEN Started version: {aprsd.__version__}')
91
93
  if type(command) is tuple:
92
- command = " ".join(command)
94
+ command = ' '.join(command)
93
95
  if not quiet:
94
96
  if raw:
95
97
  LOG.info(f"L'{aprs_login}' R'{raw}'")
@@ -129,7 +131,7 @@ def send_message(
129
131
  sys.exit(0)
130
132
 
131
133
  try:
132
- client_factory.create().client
134
+ client_factory.create().client # noqa: B018
133
135
  except LoginError:
134
136
  sys.exit(-1)
135
137
 
@@ -140,7 +142,7 @@ def send_message(
140
142
  # message
141
143
  if raw:
142
144
  tx.send(
143
- packets.Packet(from_call="", to_call="", raw=raw),
145
+ packets.Packet(from_call='', to_call='', raw=raw),
144
146
  direct=True,
145
147
  )
146
148
  sys.exit(0)
@@ -164,7 +166,7 @@ def send_message(
164
166
  aprs_client = client_factory.create().client
165
167
  aprs_client.consumer(rx_packet, raw=False)
166
168
  except aprslib.exceptions.ConnectionDrop:
167
- LOG.error("Connection dropped, reconnecting")
169
+ LOG.error('Connection dropped, reconnecting')
168
170
  time.sleep(5)
169
171
  # Force the deletion of the client object connected to aprs
170
172
  # This will cause a reconnect, next time client.get_client()