python-ntfy 0.6.1__tar.gz → 0.7.2__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.
@@ -1,20 +1,43 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: python-ntfy
3
- Version: 0.6.1
3
+ Version: 0.7.2
4
4
  Summary: An ntfy library aiming for feature completeness
5
- License: MIT
5
+ Keywords: ntfy,notifications,push,http,api
6
6
  Author: Matthew Cane
7
- Author-email: matthew.cane0@gmail.com
8
- Requires-Python: >=3.12,<3.14
7
+ Author-email: Matthew Cane <matthew.cane0@gmail.com>
8
+ License-Expression: MIT
9
9
  Classifier: Development Status :: 4 - Beta
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
12
13
  Classifier: Programming Language :: Python :: 3
13
14
  Classifier: Programming Language :: Python :: 3.12
14
15
  Classifier: Programming Language :: Python :: 3.13
15
- Requires-Dist: requests (>=2.31.0,<3.0.0)
16
- Project-URL: Documentation, https://matthewcane.github.io/python-ntfy/
17
- Project-URL: Repository, https://github.com/MatthewCane/python-ntfy
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Topic :: Communications
18
+ Classifier: Topic :: Internet :: WWW/HTTP
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Requires-Dist: requests>=2.31.0
21
+ Requires-Dist: mkdocstrings[python]>=0.26.2,<0.30.0 ; extra == 'dev'
22
+ Requires-Dist: mypy>=1.12.0,<2.0.0 ; extra == 'dev'
23
+ Requires-Dist: pytest>=7.4.1,<9.0.0 ; extra == 'dev'
24
+ Requires-Dist: python-dotenv>=1.0.0,<2.0.0 ; extra == 'dev'
25
+ Requires-Dist: pytest-asyncio>=0.21.1,<1.2.0 ; extra == 'dev'
26
+ Requires-Dist: pytest-codecov>=0.5.1,<0.8.0 ; extra == 'dev'
27
+ Requires-Dist: ruff>=0.7,<0.13 ; extra == 'dev'
28
+ Requires-Dist: mkdocs-material>=9.5.41,<10.0.0 ; extra == 'dev'
29
+ Requires-Dist: mkdocstrings-python>=1.12.1,<2.0.0 ; extra == 'dev'
30
+ Requires-Dist: types-pygments>=2.18.0.20240506 ; extra == 'dev'
31
+ Requires-Dist: types-colorama>=0.4.15.20240311 ; extra == 'dev'
32
+ Requires-Dist: types-requests>=2.32.0.20241016 ; extra == 'dev'
33
+ Requires-Dist: types-setuptools>=75.2.0.20241018,<81.0.0.0 ; extra == 'dev'
34
+ Requires-Python: >=3.12, <3.14
35
+ Project-URL: Changelog, https://github.com/matthewcane/python-ntfy/releases
36
+ Project-URL: Documentation, https://python-ntfy.readthedocs.io/
37
+ Project-URL: Homepage, https://github.com/matthewcane/python-ntfy
38
+ Project-URL: Issues, https://github.com/matthewcane/python-ntfy/issues
39
+ Project-URL: Repository, https://github.com/matthewcane/python-ntfy
40
+ Provides-Extra: dev
18
41
  Description-Content-Type: text/markdown
19
42
 
20
43
  # A Python Library For ntfy
@@ -65,7 +88,7 @@ See the full documentation at [https://matthewcane.github.io/python-ntfy/](https
65
88
 
66
89
  This project uses:
67
90
 
68
- - [Poetry](https://python-poetry.org/) as it's dependency manager
91
+ - [uv](https://github.com/astral-sh/uv) as its dependency manager
69
92
  - [Just](https://github.com/casey/just) as a task runner
70
93
  - [Pre-commit](https://pre-commit.com/) for running checks before each commit
71
94
  - [Docker](https://www.docker.com/) and [Docker Compose](https://docs.docker.com/compose/) for running tests
@@ -78,9 +101,10 @@ Some useful tasks are:
78
101
 
79
102
  - `just install` - Install dependencies (including dev dependencies)
80
103
  - `just test` - Run all tests and checks
104
+ - `just check` - Run code quality checks (ruff + mypy)
105
+ - `just format` - Format code with ruff
81
106
  - `just serve-docs` - Build and serve the docs locally
82
107
 
83
108
  ### Tests
84
109
 
85
110
  This project is aiming for 95% code coverage. Any added features must include comprehensive tests.
86
-
@@ -46,7 +46,7 @@ See the full documentation at [https://matthewcane.github.io/python-ntfy/](https
46
46
 
47
47
  This project uses:
48
48
 
49
- - [Poetry](https://python-poetry.org/) as it's dependency manager
49
+ - [uv](https://github.com/astral-sh/uv) as its dependency manager
50
50
  - [Just](https://github.com/casey/just) as a task runner
51
51
  - [Pre-commit](https://pre-commit.com/) for running checks before each commit
52
52
  - [Docker](https://www.docker.com/) and [Docker Compose](https://docs.docker.com/compose/) for running tests
@@ -59,6 +59,8 @@ Some useful tasks are:
59
59
 
60
60
  - `just install` - Install dependencies (including dev dependencies)
61
61
  - `just test` - Run all tests and checks
62
+ - `just check` - Run code quality checks (ruff + mypy)
63
+ - `just format` - Format code with ruff
62
64
  - `just serve-docs` - Build and serve the docs locally
63
65
 
64
66
  ### Tests
@@ -0,0 +1,129 @@
1
+ [project]
2
+ name = "python-ntfy"
3
+ version = "0.7.2"
4
+ description = "An ntfy library aiming for feature completeness"
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.12, <3.14"
8
+ dependencies = ["requests>=2.31.0"]
9
+ classifiers = [
10
+ "Development Status :: 4 - Beta",
11
+ "Intended Audience :: Developers",
12
+ "License :: OSI Approved :: MIT License",
13
+ "Operating System :: OS Independent",
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Programming Language :: Python :: 3.13",
17
+ "Programming Language :: Python :: 3 :: Only",
18
+ "Topic :: Communications",
19
+ "Topic :: Internet :: WWW/HTTP",
20
+ "Topic :: Software Development :: Libraries :: Python Modules",
21
+ ]
22
+ keywords = ["ntfy", "notifications", "push", "http", "api"]
23
+ authors = [
24
+ {name = "Matthew Cane", email = "matthew.cane0@gmail.com"}
25
+ ]
26
+
27
+ [project.urls]
28
+ Homepage = "https://github.com/matthewcane/python-ntfy"
29
+ Documentation = "https://python-ntfy.readthedocs.io/"
30
+ Repository = "https://github.com/matthewcane/python-ntfy"
31
+ Issues = "https://github.com/matthewcane/python-ntfy/issues"
32
+ Changelog = "https://github.com/matthewcane/python-ntfy/releases"
33
+
34
+ [build-system]
35
+ requires = ["uv_build"]
36
+ build-backend = "uv_build"
37
+
38
+ [tool.uv.build-backend]
39
+ module-name = "python_ntfy"
40
+ module-root = ""
41
+
42
+ [tool.uv]
43
+ dev-dependencies = [
44
+ "mkdocstrings[python]>=0.26.2,<0.30.0",
45
+ "mypy>=1.12.0,<2.0.0",
46
+ "pytest>=7.4.1,<9.0.0",
47
+ "python-dotenv>=1.0.0,<2.0.0",
48
+ "pytest-asyncio>=0.21.1,<1.2.0",
49
+ "pytest-codecov>=0.5.1,<0.8.0",
50
+ "ruff>=0.7,<0.13",
51
+ "mkdocs-material>=9.5.41,<10.0.0",
52
+ "mkdocstrings-python>=1.12.1,<2.0.0",
53
+ "types-pygments>=2.18.0.20240506",
54
+ "types-colorama>=0.4.15.20240311",
55
+ "types-requests>=2.32.0.20241016",
56
+ "types-setuptools>=75.2.0.20241018,<81.0.0.0"
57
+ ]
58
+
59
+ [project.optional-dependencies]
60
+ dev = [
61
+ "mkdocstrings[python]>=0.26.2,<0.30.0",
62
+ "mypy>=1.12.0,<2.0.0",
63
+ "pytest>=7.4.1,<9.0.0",
64
+ "python-dotenv>=1.0.0,<2.0.0",
65
+ "pytest-asyncio>=0.21.1,<1.2.0",
66
+ "pytest-codecov>=0.5.1,<0.8.0",
67
+ "ruff>=0.7,<0.13",
68
+ "mkdocs-material>=9.5.41,<10.0.0",
69
+ "mkdocstrings-python>=1.12.1,<2.0.0",
70
+ "types-pygments>=2.18.0.20240506",
71
+ "types-colorama>=0.4.15.20240311",
72
+ "types-requests>=2.32.0.20241016",
73
+ "types-setuptools>=75.2.0.20241018,<81.0.0.0"
74
+ ]
75
+
76
+ [tool.ruff]
77
+ target-version = "py312"
78
+
79
+ [tool.ruff.lint]
80
+ select = [
81
+ "E", # PycodeStyle errors
82
+ "W", # PycodeStyle warnings
83
+ "F", # PyFlakes
84
+ "I", # Isort
85
+ "N", # pep8-naming
86
+ "D", # Pydocstyle
87
+ "UP", # PyUpgrade
88
+ "ANN", # Flake8-annotations
89
+ "S", # Flake8-bandit
90
+ "BLE", # Flake8-blind-except
91
+ "B", # Flake8-bugbear
92
+ "A", # Flake8-builtins
93
+ "C4", # Flake8-comprehensions
94
+ "T10", # Flake8-debugger
95
+ "EM", # Flake8-errmessages
96
+ "Q", # Flake8-quotes
97
+ "RET", # Flake8-return
98
+ "TRY", # Triceratops
99
+ "FURB", # Refurb
100
+ "RUF", # Ruff
101
+ "PERF", # Perflint
102
+ ]
103
+ ignore = [
104
+ "E501", # Line too long
105
+ "D103", # Missing docstring in public function
106
+ "D417", # Undocumented parameters
107
+ "D104", # First line of docstring should be in imperative moof
108
+ "D100", # Missing docstring in public module
109
+ "ANN001", # Missing type annotation for function argument
110
+ "S101", # Use of assert detected
111
+ "TRY003", # Use of vanilla exception messages
112
+ ]
113
+
114
+ [tool.ruff.lint.pydocstyle]
115
+ convention = "google"
116
+
117
+ [tool.pytest.ini_options]
118
+ asyncio_default_fixture_loop_scope = "function"
119
+ testpaths = ["tests"]
120
+ python_files = ["test_*.py"]
121
+ python_classes = ["Test*"]
122
+ python_functions = ["test_*"]
123
+ addopts = [
124
+ "--strict-markers",
125
+ "--strict-config",
126
+ "--cov=python_ntfy",
127
+ "--cov-fail-under=95",
128
+ "--cov-report=term-missing",
129
+ ]
@@ -2,7 +2,6 @@ import json
2
2
  from datetime import datetime
3
3
  from enum import Enum
4
4
  from pathlib import Path
5
- from typing import Optional, Union
6
5
 
7
6
  import requests
8
7
 
@@ -88,7 +87,7 @@ class BroadcastAction(Action):
88
87
  self,
89
88
  label: str,
90
89
  intent: str = "io.heckel.ntfy.USER_ACTION",
91
- extras: Optional[dict[str, str]] = None,
90
+ extras: dict[str, str] | None = None,
92
91
  clear: bool = False,
93
92
  ) -> None:
94
93
  """Initialize a BroadcastAction.
@@ -135,8 +134,8 @@ class HttpAction(Action):
135
134
  label: str,
136
135
  url: str,
137
136
  method: str = "POST",
138
- headers: Optional[dict[str, str]] = None,
139
- body: Optional[str] = None,
137
+ headers: dict[str, str] | None = None,
138
+ body: str | None = None,
140
139
  clear: bool = False,
141
140
  ) -> None:
142
141
  """Initialize an HttpAction.
@@ -155,8 +154,8 @@ class HttpAction(Action):
155
154
  self.body = body
156
155
  super().__init__(label, url, clear)
157
156
 
158
- def to_dict(self) -> dict[str, Union[str, bool, dict[str, str]]]:
159
- action_dict: dict[str, Union[str, bool, dict[str, str]]] = {
157
+ def to_dict(self) -> dict[str, str | bool | dict[str, str]]:
158
+ action_dict: dict[str, str | bool | dict[str, str]] = {
160
159
  "action": self.action.value,
161
160
  "label": self.label,
162
161
  "url": self.url,
@@ -185,14 +184,14 @@ class HttpAction(Action):
185
184
  def send(
186
185
  self,
187
186
  message: str,
188
- title: Optional[str] = None,
187
+ title: str | None = None,
189
188
  priority: MessagePriority = MessagePriority.DEFAULT,
190
- tags: Optional[list] = None,
191
- actions: Optional[list[Union[ViewAction, BroadcastAction, HttpAction]]] = None,
192
- schedule: Optional[datetime] = None,
189
+ tags: list | None = None,
190
+ actions: list[ViewAction | BroadcastAction | HttpAction] | None = None,
191
+ schedule: datetime | None = None,
193
192
  format_as_markdown: bool = False,
194
193
  timeout_seconds: int = 5,
195
- email: Optional[str] = None,
194
+ email: str | None = None,
196
195
  ) -> dict:
197
196
  """Send a text-based message to the server.
198
197
 
@@ -258,13 +257,13 @@ def send(
258
257
  def send_file(
259
258
  self,
260
259
  file: str,
261
- title: Optional[str] = None,
260
+ title: str | None = None,
262
261
  priority: MessagePriority = MessagePriority.DEFAULT,
263
- tags: Optional[list] = None,
264
- actions: Optional[list[Union[ViewAction, BroadcastAction, HttpAction]]] = None,
265
- schedule: Optional[datetime] = None,
262
+ tags: list | None = None,
263
+ actions: list[ViewAction | BroadcastAction | HttpAction] | None = None,
264
+ schedule: datetime | None = None,
266
265
  timeout_seconds: int = 30,
267
- email: Optional[str] = None,
266
+ email: str | None = None,
268
267
  ) -> dict:
269
268
  """Sends a file to the server.
270
269
 
python_ntfy-0.6.1/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Matthew Cane
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,81 +0,0 @@
1
- [tool.poetry]
2
- name = "python-ntfy"
3
- version = "0.6.1"
4
- description = "An ntfy library aiming for feature completeness"
5
- authors = ["Matthew Cane <matthew.cane0@gmail.com>"]
6
- readme = "README.md"
7
- license = "MIT"
8
- repository = "https://github.com/MatthewCane/python-ntfy"
9
- documentation = "https://matthewcane.github.io/python-ntfy/"
10
- classifiers = [
11
- "Development Status :: 4 - Beta",
12
- "Intended Audience :: Developers",
13
- "Programming Language :: Python :: 3.12",
14
- "Programming Language :: Python :: 3.13",
15
- ]
16
-
17
- [tool.poetry.dependencies]
18
- python = ">=3.12, <3.14"
19
- requests = "^2.31.0"
20
-
21
-
22
- [tool.poetry.group.dev.dependencies]
23
- mkdocstrings = {extras = ["python"], version = ">=0.26.2,<0.30.0"}
24
- mypy = "^1.12.0"
25
- pytest = ">=7.4.1,<9.0.0"
26
- python-dotenv = "^1.0.0"
27
- pytest-asyncio = ">=0.21.1,<1.2.0"
28
- pytest-codecov = ">=0.5.1,<0.8.0"
29
- ruff = ">=0.7,<0.13"
30
- mkdocs-material = "^9.5.41"
31
- mkdocstrings-python = "^1.12.1"
32
- types-pygments = "^2.18.0.20240506"
33
- types-colorama = "^0.4.15.20240311"
34
- types-requests = "^2.32.0.20241016"
35
- types-setuptools = ">=75.2.0.20241018,<81.0.0.0"
36
-
37
- [build-system]
38
- requires = ["poetry-core"]
39
- build-backend = "poetry.core.masonry.api"
40
-
41
- [tool.ruff.lint]
42
- select = [
43
- "E", # PycodeStyle errors
44
- "W", # PycodeStyle warnings
45
- "F", # PyFlakes
46
- "I", # Isort
47
- "N", # pep8-naming
48
- "D", # Pydocstyle
49
- "UP", # PyUpgrade
50
- "ANN", # Flake8-annotations
51
- "S", # Flake8-bandit
52
- "BLE", # Flake8-blind-except
53
- "B", # Flake8-bugbear
54
- "A", # Flake8-builtins
55
- "C4", # Flake8-comprehensions
56
- "T10", # Flake8-debugger
57
- "EM", # Flake8-errmessages
58
- "Q", # Flake8-quotes
59
- "RET", # Flake8-return
60
- "TRY", # Triceratops
61
- "FURB", # Refurb
62
- "RUF", # Ruff
63
- "PERF", # Perflint
64
- ]
65
- ignore = [
66
- "E501", # Line too long
67
- "D103", # Missing docstring in public function
68
- "D417", # Undocumented parameters
69
- "D104", # First line of docstring should be in imperative moof
70
- "D100", # Missing docstring in public module
71
- "ANN001", # Missing type annotation for function argument
72
- "S101", # Use of assert detected
73
- "TRY003", # Use of vanilla exception messages
74
- ]
75
-
76
-
77
- [tool.ruff.lint.pydocstyle]
78
- convention = "google"
79
-
80
- [tool.pytest.ini_options]
81
- asyncio_default_fixture_loop_scope = "function"