Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion block_explorer.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ async def get_block_explorer_data():
),
timeout=30,
)
return prepare_data(tip.dict(), fees.dict(), [block.dict() for block in blocks])
return prepare_data(
tip.model_dump(), fees.model_dump(), [block.model_dump() for block in blocks]
)


def prepare_data(tip, fees, blocks):
Expand Down
3 changes: 2 additions & 1 deletion config.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{
"name": "Gerty",
"version": "1.2.0",
"short_description": "Desktop bitcoin Assistant",
"tile": "/gerty/static/gerty.png",
"min_lnbits_version": "1.0.0",
"min_lnbits_version": "1.7.0-rc1",
"contributors": [
{
"name": "blackcoffeexbt",
Expand Down
9 changes: 4 additions & 5 deletions crud.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import json
import time
from datetime import datetime, timezone
from typing import Optional, Union

from lnbits.db import Database
from lnbits.helpers import urlsafe_short_hash
Expand All @@ -20,7 +19,7 @@ async def create_gerty(data: CreateGerty) -> Gerty:
gerty_id = urlsafe_short_hash()
gerty = Gerty(
id=gerty_id,
**data.dict(),
**data.model_dump(),
)
await db.insert("gerty.gertys", gerty)
return gerty
Expand All @@ -31,15 +30,15 @@ async def update_gerty(gerty: Gerty) -> Gerty:
return gerty


async def get_gerty(gerty_id: str) -> Optional[Gerty]:
async def get_gerty(gerty_id: str) -> Gerty | None:
return await db.fetchone(
"SELECT * FROM gerty.gertys WHERE id = :id",
{"id": gerty_id},
Gerty,
)


async def get_gertys(wallet_ids: Union[str, list[str]]) -> list[Gerty]:
async def get_gertys(wallet_ids: str | list[str]) -> list[Gerty]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]
if not wallet_ids:
Expand Down Expand Up @@ -86,7 +85,7 @@ async def get_mempool_info(end_point: str, gerty) -> dict:
await db.insert("gerty.mempool", mempool)
return data

if float(time.time()) - gerty.time.timestamp() > 20:
if mempool.data is None or float(time.time()) - gerty.time.timestamp() > 20:
data = await fetch_mempool_json(endpoint_url, url, address)
mempool.data = json.dumps(data)
mempool.time = datetime.now(timezone.utc)
Expand Down
37 changes: 18 additions & 19 deletions models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from datetime import datetime, timezone
from typing import Optional

from fastapi import Query
from pydantic import BaseModel
Expand All @@ -8,16 +7,16 @@
class CreateGerty(BaseModel):
name: str
type: str
refresh_time: int = Query(None)
utc_offset: int = Query(None)
wallet: str = Query(None)
refresh_time: int | None = Query(None)
utc_offset: int | None = Query(None)
wallet: str | None = Query(None)
# Wallets to keep an eye on, {"wallet-id": "wallet-read-key, etc"}
lnbits_wallets: str = Query(None)
mempool_endpoint: str = Query(None) # Mempool endpoint to use
lnbits_wallets: str | None = Query(None)
mempool_endpoint: str | None = Query(None) # Mempool endpoint to use
# BTC <-> Fiat exchange rate to pull ie "USD", in 0.0001 and sats
exchange: str = Query(None)
display_preferences: str = Query(None)
urls: str = Query(None)
exchange: str | None = Query(None)
display_preferences: str | None = Query(None)
urls: str | None = Query(None)


class Gerty(BaseModel):
Expand All @@ -26,12 +25,12 @@ class Gerty(BaseModel):
type: str
utc_offset: int
display_preferences: str
refresh_time: Optional[int] = None
wallet: Optional[str] = None
lnbits_wallets: Optional[str] = None
mempool_endpoint: Optional[str] = None
exchange: Optional[str] = None
urls: Optional[str] = None
refresh_time: int | None = None
wallet: str | None = None
lnbits_wallets: str | None = None
mempool_endpoint: str | None = None
exchange: str | None = None
urls: str | None = None
time: datetime = datetime.now(timezone.utc)


Expand All @@ -46,8 +45,8 @@ class MempoolEndpoint(BaseModel):


class Mempool(BaseModel):
id: str = Query(None)
mempool_endpoint: str = Query(None)
endpoint: str = Query(None)
data: str = Query(None)
id: str | None = Query(None)
mempool_endpoint: str | None = Query(None)
endpoint: str | None = Query(None)
data: str | None = Query(None)
time: datetime = datetime.now(timezone.utc)
15 changes: 11 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
[project]
name = "lnbits-gerty"
version = "0.0.0"
version = "1.2.0"
description = "LNbits, free and open-source Lightning wallet and accounts system."
authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }]
requires-python = ">=3.9,<4.0"
requires-python = ">=3.10,<3.14"
dependencies = [
"Pillow>=10.4",
"lnbits>=1.0.0rc5",
"lnbits>=1.7.0rc1",
]

[dependency-groups]
dev = [
"black>=24.3.0,<25.0.0",
"pytest-asyncio>=0.21.0,<0.22.0",
"pytest>=7.3.2,<8.0.0",
"mypy>=1.5.1,<2.0.0",
"mypy==1.17.1",
"pre-commit>=3.2.2,<4.0.0",
"ruff>=0.3.2,<0.4.0",
]

[tool.uv]
build-constraint-dependencies = ["scikit-build-core<0.10"]
package = false

[tool.poetry]
package-mode = false

[tool.poetry.dependencies]
python = ">=3.10,<3.13"

[tool.mypy]
exclude = "(nostr/*)"
[[tool.mypy.overrides]]
Expand Down
9 changes: 3 additions & 6 deletions tests/asgi.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
"""Bridge Starlette's mapping messages to HTTPX's dictionary message types."""

from collections.abc import Awaitable, Callable
from typing import Any

import httpx
from starlette.types import ASGIApp, Message, Receive
from starlette.types import ASGIApp, Message, Receive, Scope, Send


def asgi_transport(app: ASGIApp) -> httpx.ASGITransport:
async def wrapped_app(
scope: dict[str, Any],
scope: Scope,
receive: Receive,
send: Callable[[dict[str, Any]], Awaitable[None]],
send: Send,
) -> None:
async def send_message(message: Message) -> None:
await send(dict(message))
Expand Down
2 changes: 1 addition & 1 deletion tests/test_bitcoin_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ async def get_gerty(_):
),
utc_offset=2,
refresh_time=30,
json=lambda: "history-test",
model_dump_json=lambda: "history-test",
)

seen = []
Expand Down
2 changes: 1 addition & 1 deletion tests/test_colour_display.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ async def gerty(_):
display_preferences=json.dumps(preferences),
utc_offset=0,
refresh_time=5,
json=lambda: json.dumps(preferences),
model_dump_json=lambda: json.dumps(preferences),
)

async def data(*_):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_gallery.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ async def get_gerty(_):
wallet="wallet",
utc_offset=0,
refresh_time=60,
json=lambda: "gallery-test",
model_dump_json=lambda: "gallery-test",
)

async def get_wallet(wallet):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ async def get_gerty(_):
display_preferences='{"dashboard": true, "quote": true}',
utc_offset=0,
refresh_time=refresh,
json=lambda: '{"id":"test"}',
model_dump_json=lambda: '{"id":"test"}',
)

async def get_data(*_):
Expand Down Expand Up @@ -193,7 +193,7 @@ async def get_gerty(gerty_id):
display_preferences='{"dashboard":true}',
utc_offset=0,
refresh_time=300,
json=lambda: gerty_id,
model_dump_json=lambda: gerty_id,
)

async def get_data(_page, _screens, gerty):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_national_debt.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ async def get_gerty(_):
),
utc_offset=0,
refresh_time=300,
json=lambda: "debt-test",
model_dump_json=lambda: "debt-test",
)

async def get_data():
Expand Down
2 changes: 1 addition & 1 deletion tests/test_sleep_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ async def preview_data(*args):
return {"title": "Preview", "areas": []}

gerty.refresh_time = 300
gerty.json = lambda: "sleep-preview-test"
gerty.model_dump_json = lambda: "sleep-preview-test"
monkeypatch.setattr(views_api, "get_screen_data", preview_data)
response = await client.get("/api/v1/gerty/pages/test/0?preview=true")
assert response.status_code == 200
Expand Down
2 changes: 1 addition & 1 deletion tests/test_wallet_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ async def get_gerty(_):
utc_offset=0,
lnbits_wallets=json.dumps(keys),
refresh_time=300,
json=lambda: "history-test",
model_dump_json=lambda: "history-test",
)

calls = []
Expand Down
Loading
Loading