From cbc4ee80035b342fa86481fdb24211f9577ffb29 Mon Sep 17 00:00:00 2001 From: Chris Caron Date: Wed, 9 Jul 2025 20:15:39 -0400 Subject: [PATCH] pyproject.toml and tox introduction (modernization) --- .coveragerc | 17 - .github/PULL_REQUEST_TEMPLATE.md | 50 +- .github/workflows/pkgbuild.yml | 105 +- .github/workflows/tests.yml | 223 +-- .gitignore | 6 + KEYWORDS | 130 -- MANIFEST.in | 7 +- all-plugin-requirements.txt | 6 +- apprise/i18n/apprise.pot | 978 ---------- apprise/i18n/en/LC_MESSAGES/apprise.po | 290 --- apprise/i18n/en/LC_MESSAGES/messages.po | 1664 +++++++++++++++++ babel.cfg | 2 + bin/build-rpm.sh | 111 +- dev-requirements.txt | 10 +- docker-compose.yml | 17 +- packaging/man/apprise.1 | 2 +- packaging/redhat/python-apprise.spec | 102 +- pyproject.toml | 334 ++++ requirements.txt | 6 + setup.cfg | 47 - setup.py | 95 +- {test => tests}/conftest.py | 0 {test => tests}/docker/Dockerfile.el9 | 6 +- {test => tests}/docker/Dockerfile.f37 | 2 +- {test => tests}/docker/Dockerfile.f39 | 2 +- {test => tests}/docker/Dockerfile.py310 | 4 +- {test => tests}/docker/Dockerfile.py311 | 4 +- {test => tests}/docker/Dockerfile.py312 | 4 +- {test => tests}/docker/Dockerfile.py39 | 4 +- {test => tests}/docker/Dockerfile.rawhide | 2 +- {test => tests}/helpers/__init__.py | 0 {test => tests}/helpers/asyncio.py | 0 {test => tests}/helpers/environment.py | 0 {test => tests}/helpers/module.py | 0 {test => tests}/helpers/rest.py | 0 {test => tests}/test_api.py | 0 {test => tests}/test_apprise_attachments.py | 0 {test => tests}/test_apprise_cli.py | 0 {test => tests}/test_apprise_config.py | 0 {test => tests}/test_apprise_emojis.py | 0 {test => tests}/test_apprise_helpers.py | 0 {test => tests}/test_apprise_pickle.py | 0 {test => tests}/test_apprise_translations.py | 0 {test => tests}/test_apprise_utils.py | 0 {test => tests}/test_asyncio.py | 0 {test => tests}/test_attach_base.py | 0 {test => tests}/test_attach_file.py | 0 {test => tests}/test_attach_http.py | 0 {test => tests}/test_attach_memory.py | 0 {test => tests}/test_config_base.py | 0 {test => tests}/test_config_file.py | 0 {test => tests}/test_config_http.py | 0 {test => tests}/test_config_memory.py | 0 {test => tests}/test_conversion.py | 0 {test => tests}/test_decorator_notify.py | 0 {test => tests}/test_escapes.py | 0 {test => tests}/test_logger.py | 0 {test => tests}/test_notification_manager.py | 0 {test => tests}/test_notify_base.py | 0 {test => tests}/test_persistent_store.py | 0 .../test_plugin_africas_talking.py | 0 {test => tests}/test_plugin_apprise_api.py | 0 {test => tests}/test_plugin_aprs.py | 0 {test => tests}/test_plugin_bark.py | 0 {test => tests}/test_plugin_bluesky.py | 0 {test => tests}/test_plugin_bulksms.py | 0 {test => tests}/test_plugin_bulkvs.py | 0 {test => tests}/test_plugin_burstsms.py | 0 {test => tests}/test_plugin_chanify.py | 0 {test => tests}/test_plugin_clickatell.py | 0 {test => tests}/test_plugin_clicksend.py | 0 {test => tests}/test_plugin_custom_form.py | 0 {test => tests}/test_plugin_custom_json.py | 0 {test => tests}/test_plugin_custom_xml.py | 0 {test => tests}/test_plugin_d7networks.py | 0 {test => tests}/test_plugin_dapnet.py | 0 {test => tests}/test_plugin_dbus.py | 0 {test => tests}/test_plugin_dingtalk.py | 0 {test => tests}/test_plugin_discord.py | 0 {test => tests}/test_plugin_email.py | 0 {test => tests}/test_plugin_emby.py | 0 {test => tests}/test_plugin_enigma2.py | 0 {test => tests}/test_plugin_fcm.py | 0 {test => tests}/test_plugin_feishu.py | 0 {test => tests}/test_plugin_flock.py | 0 {test => tests}/test_plugin_freemobile.py | 0 {test => tests}/test_plugin_gnome.py | 0 {test => tests}/test_plugin_google_chat.py | 0 {test => tests}/test_plugin_gotify.py | 0 {test => tests}/test_plugin_growl.py | 0 {test => tests}/test_plugin_guilded.py | 0 {test => tests}/test_plugin_homeassistant.py | 0 {test => tests}/test_plugin_httpsms.py | 0 {test => tests}/test_plugin_ifttt.py | 0 {test => tests}/test_plugin_join.py | 0 {test => tests}/test_plugin_kavenegar.py | 0 {test => tests}/test_plugin_kumulos.py | 0 {test => tests}/test_plugin_lametric.py | 0 {test => tests}/test_plugin_lark.py | 0 {test => tests}/test_plugin_line.py | 0 {test => tests}/test_plugin_macosx.py | 0 {test => tests}/test_plugin_mailgun.py | 0 {test => tests}/test_plugin_mastodon.py | 0 {test => tests}/test_plugin_matrix.py | 0 {test => tests}/test_plugin_mattermost.py | 0 {test => tests}/test_plugin_messagebird.py | 0 {test => tests}/test_plugin_misskey.py | 0 {test => tests}/test_plugin_mqtt.py | 0 {test => tests}/test_plugin_msg91.py | 0 {test => tests}/test_plugin_msteams.py | 0 {test => tests}/test_plugin_nextcloud.py | 0 {test => tests}/test_plugin_nextcloudtalk.py | 0 {test => tests}/test_plugin_notica.py | 0 {test => tests}/test_plugin_notifiarr.py | 0 {test => tests}/test_plugin_notifico.py | 0 {test => tests}/test_plugin_ntfy.py | 0 {test => tests}/test_plugin_office365.py | 0 {test => tests}/test_plugin_onesignal.py | 0 {test => tests}/test_plugin_opsgenie.py | 0 {test => tests}/test_plugin_pagerduty.py | 0 {test => tests}/test_plugin_pagertree.py | 0 {test => tests}/test_plugin_parse_platform.py | 0 {test => tests}/test_plugin_plivo.py | 0 {test => tests}/test_plugin_popcorn_notify.py | 0 {test => tests}/test_plugin_prowl.py | 0 {test => tests}/test_plugin_pushbullet.py | 0 {test => tests}/test_plugin_pushdeer.py | 0 {test => tests}/test_plugin_pushed.py | 0 {test => tests}/test_plugin_pushjet.py | 0 {test => tests}/test_plugin_pushme.py | 0 {test => tests}/test_plugin_pushover.py | 0 {test => tests}/test_plugin_pushplus.py | 0 {test => tests}/test_plugin_pushsafer.py | 0 {test => tests}/test_plugin_pushy.py | 0 {test => tests}/test_plugin_qq.py | 0 {test => tests}/test_plugin_reddit.py | 0 {test => tests}/test_plugin_resend.py | 0 {test => tests}/test_plugin_revolt.py | 0 {test => tests}/test_plugin_rocket_chat.py | 0 {test => tests}/test_plugin_rsyslog.py | 0 {test => tests}/test_plugin_ryver.py | 0 {test => tests}/test_plugin_sendgrid.py | 0 {test => tests}/test_plugin_serverchan.py | 0 {test => tests}/test_plugin_ses.py | 0 {test => tests}/test_plugin_seven.py | 0 {test => tests}/test_plugin_sfr.py | 0 {test => tests}/test_plugin_signal.py | 0 {test => tests}/test_plugin_simplepush.py | 0 {test => tests}/test_plugin_sinch.py | 0 {test => tests}/test_plugin_slack.py | 0 {test => tests}/test_plugin_smpp.py | 0 {test => tests}/test_plugin_sms_manager.py | 0 {test => tests}/test_plugin_smseagle.py | 0 {test => tests}/test_plugin_smtp2go.py | 0 {test => tests}/test_plugin_sns.py | 0 {test => tests}/test_plugin_sparkpost.py | 0 {test => tests}/test_plugin_spike.py | 0 {test => tests}/test_plugin_splunk.py | 0 {test => tests}/test_plugin_spugpush.py | 0 {test => tests}/test_plugin_streamlabs.py | 0 {test => tests}/test_plugin_synology.py | 0 {test => tests}/test_plugin_syslog.py | 0 {test => tests}/test_plugin_techululs_push.py | 0 {test => tests}/test_plugin_telegram.py | 0 {test => tests}/test_plugin_threema.py | 0 {test => tests}/test_plugin_title_maxlen.py | 0 {test => tests}/test_plugin_twilio.py | 0 {test => tests}/test_plugin_twist.py | 0 {test => tests}/test_plugin_twitter.py | 0 {test => tests}/test_plugin_vapid.py | 0 {test => tests}/test_plugin_voipms.py | 0 {test => tests}/test_plugin_vonage.py | 0 {test => tests}/test_plugin_webex_teams.py | 0 {test => tests}/test_plugin_wecombot.py | 0 {test => tests}/test_plugin_whatsapp.py | 0 {test => tests}/test_plugin_windows.py | 0 {test => tests}/test_plugin_workflows.py | 0 {test => tests}/test_plugin_wxpusher.py | 0 {test => tests}/test_plugin_xbmc_kodi.py | 0 {test => tests}/test_plugin_zulip.py | 0 {test => tests}/test_rest_plugins.py | 0 {test => tests}/test_utils_pem.py | 0 {test => tests}/var/01_test_example.html | 0 {test => tests}/var/apprise-archive.zip | Bin {test => tests}/var/apprise-test.gif | Bin {test => tests}/var/apprise-test.jpeg | Bin {test => tests}/var/apprise-test.mp4 | Bin {test => tests}/var/apprise-test.png | Bin .../var/fcm/service_account-bad-type.json | 0 {test => tests}/var/fcm/service_account.json | 0 {test => tests}/var/mime.types | 0 {test => tests}/var/pgp/corrupt-pub.asc | 0 {test => tests}/var/pgp/valid-pub.asc | 0 tox.ini | 172 ++ win-requirements.txt | 5 + 195 files changed, 2587 insertions(+), 1820 deletions(-) delete mode 100644 .coveragerc delete mode 100644 KEYWORDS delete mode 100644 apprise/i18n/apprise.pot delete mode 100644 apprise/i18n/en/LC_MESSAGES/apprise.po create mode 100644 apprise/i18n/en/LC_MESSAGES/messages.po create mode 100644 babel.cfg create mode 100644 pyproject.toml delete mode 100644 setup.cfg rename {test => tests}/conftest.py (100%) rename {test => tests}/docker/Dockerfile.el9 (97%) rename {test => tests}/docker/Dockerfile.f37 (99%) rename {test => tests}/docker/Dockerfile.f39 (99%) rename {test => tests}/docker/Dockerfile.py310 (96%) rename {test => tests}/docker/Dockerfile.py311 (96%) rename {test => tests}/docker/Dockerfile.py312 (96%) rename {test => tests}/docker/Dockerfile.py39 (96%) rename {test => tests}/docker/Dockerfile.rawhide (99%) rename {test => tests}/helpers/__init__.py (100%) rename {test => tests}/helpers/asyncio.py (100%) rename {test => tests}/helpers/environment.py (100%) rename {test => tests}/helpers/module.py (100%) rename {test => tests}/helpers/rest.py (100%) rename {test => tests}/test_api.py (100%) rename {test => tests}/test_apprise_attachments.py (100%) rename {test => tests}/test_apprise_cli.py (100%) rename {test => tests}/test_apprise_config.py (100%) rename {test => tests}/test_apprise_emojis.py (100%) rename {test => tests}/test_apprise_helpers.py (100%) rename {test => tests}/test_apprise_pickle.py (100%) rename {test => tests}/test_apprise_translations.py (100%) rename {test => tests}/test_apprise_utils.py (100%) rename {test => tests}/test_asyncio.py (100%) rename {test => tests}/test_attach_base.py (100%) rename {test => tests}/test_attach_file.py (100%) rename {test => tests}/test_attach_http.py (100%) rename {test => tests}/test_attach_memory.py (100%) rename {test => tests}/test_config_base.py (100%) rename {test => tests}/test_config_file.py (100%) rename {test => tests}/test_config_http.py (100%) rename {test => tests}/test_config_memory.py (100%) rename {test => tests}/test_conversion.py (100%) rename {test => tests}/test_decorator_notify.py (100%) rename {test => tests}/test_escapes.py (100%) rename {test => tests}/test_logger.py (100%) rename {test => tests}/test_notification_manager.py (100%) rename {test => tests}/test_notify_base.py (100%) rename {test => tests}/test_persistent_store.py (100%) rename {test => tests}/test_plugin_africas_talking.py (100%) rename {test => tests}/test_plugin_apprise_api.py (100%) rename {test => tests}/test_plugin_aprs.py (100%) rename {test => tests}/test_plugin_bark.py (100%) rename {test => tests}/test_plugin_bluesky.py (100%) rename {test => tests}/test_plugin_bulksms.py (100%) rename {test => tests}/test_plugin_bulkvs.py (100%) rename {test => tests}/test_plugin_burstsms.py (100%) rename {test => tests}/test_plugin_chanify.py (100%) rename {test => tests}/test_plugin_clickatell.py (100%) rename {test => tests}/test_plugin_clicksend.py (100%) rename {test => tests}/test_plugin_custom_form.py (100%) rename {test => tests}/test_plugin_custom_json.py (100%) rename {test => tests}/test_plugin_custom_xml.py (100%) rename {test => tests}/test_plugin_d7networks.py (100%) rename {test => tests}/test_plugin_dapnet.py (100%) rename {test => tests}/test_plugin_dbus.py (100%) rename {test => tests}/test_plugin_dingtalk.py (100%) rename {test => tests}/test_plugin_discord.py (100%) rename {test => tests}/test_plugin_email.py (100%) rename {test => tests}/test_plugin_emby.py (100%) rename {test => tests}/test_plugin_enigma2.py (100%) rename {test => tests}/test_plugin_fcm.py (100%) rename {test => tests}/test_plugin_feishu.py (100%) rename {test => tests}/test_plugin_flock.py (100%) rename {test => tests}/test_plugin_freemobile.py (100%) rename {test => tests}/test_plugin_gnome.py (100%) rename {test => tests}/test_plugin_google_chat.py (100%) rename {test => tests}/test_plugin_gotify.py (100%) rename {test => tests}/test_plugin_growl.py (100%) rename {test => tests}/test_plugin_guilded.py (100%) rename {test => tests}/test_plugin_homeassistant.py (100%) rename {test => tests}/test_plugin_httpsms.py (100%) rename {test => tests}/test_plugin_ifttt.py (100%) rename {test => tests}/test_plugin_join.py (100%) rename {test => tests}/test_plugin_kavenegar.py (100%) rename {test => tests}/test_plugin_kumulos.py (100%) rename {test => tests}/test_plugin_lametric.py (100%) rename {test => tests}/test_plugin_lark.py (100%) rename {test => tests}/test_plugin_line.py (100%) rename {test => tests}/test_plugin_macosx.py (100%) rename {test => tests}/test_plugin_mailgun.py (100%) rename {test => tests}/test_plugin_mastodon.py (100%) rename {test => tests}/test_plugin_matrix.py (100%) rename {test => tests}/test_plugin_mattermost.py (100%) rename {test => tests}/test_plugin_messagebird.py (100%) rename {test => tests}/test_plugin_misskey.py (100%) rename {test => tests}/test_plugin_mqtt.py (100%) rename {test => tests}/test_plugin_msg91.py (100%) rename {test => tests}/test_plugin_msteams.py (100%) rename {test => tests}/test_plugin_nextcloud.py (100%) rename {test => tests}/test_plugin_nextcloudtalk.py (100%) rename {test => tests}/test_plugin_notica.py (100%) rename {test => tests}/test_plugin_notifiarr.py (100%) rename {test => tests}/test_plugin_notifico.py (100%) rename {test => tests}/test_plugin_ntfy.py (100%) rename {test => tests}/test_plugin_office365.py (100%) rename {test => tests}/test_plugin_onesignal.py (100%) rename {test => tests}/test_plugin_opsgenie.py (100%) rename {test => tests}/test_plugin_pagerduty.py (100%) rename {test => tests}/test_plugin_pagertree.py (100%) rename {test => tests}/test_plugin_parse_platform.py (100%) rename {test => tests}/test_plugin_plivo.py (100%) rename {test => tests}/test_plugin_popcorn_notify.py (100%) rename {test => tests}/test_plugin_prowl.py (100%) rename {test => tests}/test_plugin_pushbullet.py (100%) rename {test => tests}/test_plugin_pushdeer.py (100%) rename {test => tests}/test_plugin_pushed.py (100%) rename {test => tests}/test_plugin_pushjet.py (100%) rename {test => tests}/test_plugin_pushme.py (100%) rename {test => tests}/test_plugin_pushover.py (100%) rename {test => tests}/test_plugin_pushplus.py (100%) rename {test => tests}/test_plugin_pushsafer.py (100%) rename {test => tests}/test_plugin_pushy.py (100%) rename {test => tests}/test_plugin_qq.py (100%) rename {test => tests}/test_plugin_reddit.py (100%) rename {test => tests}/test_plugin_resend.py (100%) rename {test => tests}/test_plugin_revolt.py (100%) rename {test => tests}/test_plugin_rocket_chat.py (100%) rename {test => tests}/test_plugin_rsyslog.py (100%) rename {test => tests}/test_plugin_ryver.py (100%) rename {test => tests}/test_plugin_sendgrid.py (100%) rename {test => tests}/test_plugin_serverchan.py (100%) rename {test => tests}/test_plugin_ses.py (100%) rename {test => tests}/test_plugin_seven.py (100%) rename {test => tests}/test_plugin_sfr.py (100%) rename {test => tests}/test_plugin_signal.py (100%) rename {test => tests}/test_plugin_simplepush.py (100%) rename {test => tests}/test_plugin_sinch.py (100%) rename {test => tests}/test_plugin_slack.py (100%) rename {test => tests}/test_plugin_smpp.py (100%) rename {test => tests}/test_plugin_sms_manager.py (100%) rename {test => tests}/test_plugin_smseagle.py (100%) rename {test => tests}/test_plugin_smtp2go.py (100%) rename {test => tests}/test_plugin_sns.py (100%) rename {test => tests}/test_plugin_sparkpost.py (100%) rename {test => tests}/test_plugin_spike.py (100%) rename {test => tests}/test_plugin_splunk.py (100%) rename {test => tests}/test_plugin_spugpush.py (100%) rename {test => tests}/test_plugin_streamlabs.py (100%) rename {test => tests}/test_plugin_synology.py (100%) rename {test => tests}/test_plugin_syslog.py (100%) rename {test => tests}/test_plugin_techululs_push.py (100%) rename {test => tests}/test_plugin_telegram.py (100%) rename {test => tests}/test_plugin_threema.py (100%) rename {test => tests}/test_plugin_title_maxlen.py (100%) rename {test => tests}/test_plugin_twilio.py (100%) rename {test => tests}/test_plugin_twist.py (100%) rename {test => tests}/test_plugin_twitter.py (100%) rename {test => tests}/test_plugin_vapid.py (100%) rename {test => tests}/test_plugin_voipms.py (100%) rename {test => tests}/test_plugin_vonage.py (100%) rename {test => tests}/test_plugin_webex_teams.py (100%) rename {test => tests}/test_plugin_wecombot.py (100%) rename {test => tests}/test_plugin_whatsapp.py (100%) rename {test => tests}/test_plugin_windows.py (100%) rename {test => tests}/test_plugin_workflows.py (100%) rename {test => tests}/test_plugin_wxpusher.py (100%) rename {test => tests}/test_plugin_xbmc_kodi.py (100%) rename {test => tests}/test_plugin_zulip.py (100%) rename {test => tests}/test_rest_plugins.py (100%) rename {test => tests}/test_utils_pem.py (100%) rename {test => tests}/var/01_test_example.html (100%) rename {test => tests}/var/apprise-archive.zip (100%) rename {test => tests}/var/apprise-test.gif (100%) rename {test => tests}/var/apprise-test.jpeg (100%) rename {test => tests}/var/apprise-test.mp4 (100%) rename {test => tests}/var/apprise-test.png (100%) rename {test => tests}/var/fcm/service_account-bad-type.json (100%) rename {test => tests}/var/fcm/service_account.json (100%) rename {test => tests}/var/mime.types (100%) rename {test => tests}/var/pgp/corrupt-pub.asc (100%) rename {test => tests}/var/pgp/valid-pub.asc (100%) create mode 100644 tox.ini diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index ed09dda5..00000000 --- a/.coveragerc +++ /dev/null @@ -1,17 +0,0 @@ -[run] -data_file = .coverage-reports/.coverage -branch = True -parallel = True -source = - apprise - -[paths] -source = - apprise - .tox/*/lib/python*/site-packages/apprise - .tox/pypy/site-packages/apprise - -[report] -show_missing = True -skip_covered = True -skip_empty = True diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c8b52eb2..6172f812 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,54 @@ ## Description: **Related issue (if applicable):** # - + ## New Service Completion Status * [ ] apprise/plugins/.py -* [ ] KEYWORDS +* [ ] pypackage.toml update `keywords` section to identify our new service - add new service into this file (alphabetically). * [ ] README.md - add entry for new service to table (as a quick reference) @@ -17,8 +59,8 @@ * [ ] The code change is tested and works locally. * [ ] There is no commented out code in this PR. -* [ ] No lint errors (use `flake8`) -* [ ] 100% test coverage +* [ ] No lint errors (use `tox -e lint`) +* [ ] 100% test coverage (use `tox -e minimal`) ## Testing