mirror of
https://github.com/Xevion/linkpulse.git
synced 2025-12-06 15:15:34 -06:00
Add additional README badges, add /api/version route with TOML loading, toml + types-toml
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# linkpulse
|
# linkpulse
|
||||||
|
|
||||||
[](https://wakatime.com/badge/github/Xevion/linkpulse)
|
   [](https://wakatime.com/badge/github/Xevion/linkpulse)
|
||||||
|
|
||||||
A project for monitoring websites, built with FastAPI and React.
|
A project for monitoring websites, built with FastAPI and React.
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,42 @@
|
|||||||
"""Miscellaneous endpoints for the Linkpulse API."""
|
"""Miscellaneous endpoints for the Linkpulse API."""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
import structlog
|
||||||
|
import toml
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from fastapi_cache.decorator import cache
|
from fastapi_cache.decorator import cache
|
||||||
from linkpulse.utilities import get_db
|
from linkpulse.utilities import get_db
|
||||||
|
|
||||||
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
db = get_db()
|
db = get_db()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/api/version")
|
||||||
|
@cache(expire=None)
|
||||||
|
async def version() -> dict[str, str]:
|
||||||
|
"""Get the version of the API.
|
||||||
|
:return: The version of the API.
|
||||||
|
:rtype: dict[str, str]
|
||||||
|
"""
|
||||||
|
|
||||||
|
pyproject_path = Path(__file__).parent.parent.parent / "pyproject.toml"
|
||||||
|
|
||||||
|
version = "unknown"
|
||||||
|
if pyproject_path.exists() and pyproject_path.is_file():
|
||||||
|
data = toml.load(pyproject_path)
|
||||||
|
version = data["tool"]["poetry"]["version"]
|
||||||
|
logger.debug("Version loaded from pyproject.toml", version=version)
|
||||||
|
else:
|
||||||
|
version = "error"
|
||||||
|
|
||||||
|
return {"version": version}
|
||||||
|
|
||||||
|
|
||||||
@router.get("/health")
|
@router.get("/health")
|
||||||
async def health():
|
async def health():
|
||||||
"""An endpoint to check if the service is running.
|
"""An endpoint to check if the service is running.
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
|
import re
|
||||||
from linkpulse.utilities import utc_now
|
from linkpulse.utilities import utc_now
|
||||||
|
from fastapi.testclient import TestClient
|
||||||
|
|
||||||
|
from linkpulse.app import app
|
||||||
|
|
||||||
|
|
||||||
def test_utcnow_tz_aware():
|
def test_utcnow_tz_aware():
|
||||||
dt = utc_now()
|
dt = utc_now()
|
||||||
dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
|
dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def test_api_version():
|
||||||
|
with TestClient(app) as client:
|
||||||
|
response = client.get("/api/version")
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert "version" in response.json()
|
||||||
|
|
||||||
|
version = response.json()["version"]
|
||||||
|
assert isinstance(version, str)
|
||||||
|
assert re.match(r"^\d+\.\d+\.\d+$", version)
|
||||||
|
|||||||
24
backend/poetry.lock
generated
24
backend/poetry.lock
generated
@@ -1626,6 +1626,17 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi
|
|||||||
tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"]
|
tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"]
|
||||||
typing = ["mypy (>=1.4)", "rich", "twisted"]
|
typing = ["mypy (>=1.4)", "rich", "twisted"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.10.2"
|
||||||
|
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
files = [
|
||||||
|
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||||
|
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "types-peewee"
|
name = "types-peewee"
|
||||||
version = "3.17.7.20241017"
|
version = "3.17.7.20241017"
|
||||||
@@ -1659,6 +1670,17 @@ files = [
|
|||||||
{file = "types_pytz-2024.2.0.20241003-py3-none-any.whl", hash = "sha256:3e22df1336c0c6ad1d29163c8fda82736909eb977281cb823c57f8bae07118b7"},
|
{file = "types_pytz-2024.2.0.20241003-py3-none-any.whl", hash = "sha256:3e22df1336c0c6ad1d29163c8fda82736909eb977281cb823c57f8bae07118b7"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "types-toml"
|
||||||
|
version = "0.10.8.20240310"
|
||||||
|
description = "Typing stubs for toml"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "types-toml-0.10.8.20240310.tar.gz", hash = "sha256:3d41501302972436a6b8b239c850b26689657e25281b48ff0ec06345b8830331"},
|
||||||
|
{file = "types_toml-0.10.8.20240310-py3-none-any.whl", hash = "sha256:627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.12.2"
|
version = "4.12.2"
|
||||||
@@ -1840,4 +1862,4 @@ h11 = ">=0.9.0,<1"
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
content-hash = "9dff2a47bb95e65f15616bb82926eb81d418456c5ec60db46dfe06056c643e31"
|
content-hash = "4e094b6d46fab5f7886452b22c30fc520d396c6d77f9f92dfbd4ef36257c10df"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ description = ""
|
|||||||
authors = ["Xevion <xevion@xevion.dev>"]
|
authors = ["Xevion <xevion@xevion.dev>"]
|
||||||
license = "GNU GPL v3"
|
license = "GNU GPL v3"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
package-mode = false
|
package-mode = true
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
app = "linkpulse"
|
app = "linkpulse"
|
||||||
@@ -32,6 +32,8 @@ pwdlib = {extras = ["argon2"], version = "^0.2.1"}
|
|||||||
pytest-xdist = "^3.6.1"
|
pytest-xdist = "^3.6.1"
|
||||||
email-validator = "^2.2.0"
|
email-validator = "^2.2.0"
|
||||||
limits = "^3.13.0"
|
limits = "^3.13.0"
|
||||||
|
toml = "^0.10.2"
|
||||||
|
types-toml = "^0.10.8.20240310"
|
||||||
|
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
|
|||||||
Reference in New Issue
Block a user