Compare commits
No commits in common. "f41f8e28e504d4976b5b5255f7bb3dcd191c33e2" and "9728e764e9416b1c1907381d403fb0c27b6b2655" have entirely different histories.
f41f8e28e5
...
9728e764e9
7 changed files with 11 additions and 69 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
[project]
|
[project]
|
||||||
name = "teilchensammler-cli"
|
name = "teilchensammler-cli"
|
||||||
version = "0.3.3"
|
version = "0.3.2"
|
||||||
description = "Build up and maintain an inventory of electronics parts and tools."
|
description = "Build up and maintain an inventory of electronics parts and tools."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12,<4.0"
|
requires-python = ">=3.12,<4.0"
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from sqlmodel import SQLModel, create_engine
|
||||||
|
|
||||||
|
|
||||||
sqlite_url = os.environ.get("DATABASE_URL", "sqlite:///database.db")
|
sqlite_url = os.environ.get("DATABASE_URL", "sqlite:///database.db")
|
||||||
engine = create_engine(sqlite_url, echo=False)
|
engine = create_engine(sqlite_url, echo=True)
|
||||||
|
|
||||||
|
|
||||||
def create_db_and_tables():
|
def create_db_and_tables():
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ logging.basicConfig(
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SammlerApp(App):
|
class SammlerApp(App[None]):
|
||||||
async def on_mount(self) -> None:
|
async def on_mount(self) -> None:
|
||||||
create_db_and_tables()
|
create_db_and_tables()
|
||||||
_ = self.push_screen(AddInventoryScreen())
|
_ = self.push_screen(AddInventoryScreen())
|
||||||
|
|
|
||||||
|
|
@ -37,22 +37,14 @@ async def make_teilchen_input(text: str) -> TeilchenCreate | None:
|
||||||
import re
|
import re
|
||||||
from natsort import natsorted
|
from natsort import natsorted
|
||||||
|
|
||||||
text = text.strip()
|
|
||||||
|
|
||||||
if not text:
|
if not text:
|
||||||
logger.error("Empty text.")
|
logger.error("Empty text.")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
name_end = text.find(".")
|
name_end = text.find(".")
|
||||||
if name_end == -1: # "." not in text
|
name = text[0:name_end]
|
||||||
logger.warning("Missing period '.' from text.")
|
|
||||||
logger.debug("Could not find period symbol in input: %s", text)
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
name = text[0:name_end]
|
|
||||||
|
|
||||||
if not name:
|
if not name:
|
||||||
logger.warning("Could not extract name.")
|
logger.error("Could not extract name.")
|
||||||
logger.debug("Could not extract name from input: %s", text)
|
logger.debug("Could not extract name from input: %s", text)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ from textual.widgets import Button, DataTable, Footer, Header, Input, Static
|
||||||
from .models import load_initial_data
|
from .models import load_initial_data
|
||||||
|
|
||||||
|
|
||||||
TEILCHEN_DATA_HEADER = "pk Name Description Number Tags".split()
|
FAKE_DATA_HEADER = "pk Name Description Number Tags".split()
|
||||||
|
|
||||||
|
|
||||||
class SearchBar(Static):
|
class SearchBar(Static):
|
||||||
|
|
@ -46,12 +46,12 @@ class SearchResults(Widget):
|
||||||
yield DataTable(id="table-search-result", cursor_type="row", zebra_stripes=True)
|
yield DataTable(id="table-search-result", cursor_type="row", zebra_stripes=True)
|
||||||
|
|
||||||
async def on_mount(self) -> None:
|
async def on_mount(self) -> None:
|
||||||
table: DataTable = self.query_one(DataTable)
|
table: DataTable[None] = self.query_one(DataTable[None])
|
||||||
table.add_columns(*TEILCHEN_DATA_HEADER)
|
_ = table.add_columns(*FAKE_DATA_HEADER)
|
||||||
table.add_rows(await load_initial_data())
|
_ = table.add_rows(await load_initial_data())
|
||||||
|
|
||||||
|
|
||||||
class AddInventoryScreen(Screen):
|
class AddInventoryScreen(Screen[None]):
|
||||||
def compose(self) -> ComposeResult:
|
def compose(self) -> ComposeResult:
|
||||||
yield Header()
|
yield Header()
|
||||||
yield SearchBar()
|
yield SearchBar()
|
||||||
|
|
|
||||||
50
tests.py
50
tests.py
|
|
@ -1,54 +1,4 @@
|
||||||
from typing import TypedDict
|
|
||||||
import pytest
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from teilchensammler_cli.models import TeilchenCreate, make_teilchen_input
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
def test_initial_layout(snap_compare):
|
def test_initial_layout(snap_compare):
|
||||||
from teilchensammler_cli.main import app
|
from teilchensammler_cli.main import app
|
||||||
|
|
||||||
assert snap_compare(app, terminal_size=(130, 40))
|
assert snap_compare(app, terminal_size=(130, 40))
|
||||||
|
|
||||||
|
|
||||||
class Teilchen(TypedDict):
|
|
||||||
"""The things I do for my LSP..."""
|
|
||||||
|
|
||||||
name: str
|
|
||||||
description: str
|
|
||||||
tags: str
|
|
||||||
text: str
|
|
||||||
number: int
|
|
||||||
|
|
||||||
|
|
||||||
empty_teilchen: Teilchen = {
|
|
||||||
"name": "",
|
|
||||||
"description": "",
|
|
||||||
"tags": "",
|
|
||||||
"text": "",
|
|
||||||
"number": 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"example_input,expected",
|
|
||||||
[
|
|
||||||
("", None),
|
|
||||||
("a", None),
|
|
||||||
("a.", {"name": "a", "text": "a."}),
|
|
||||||
("aa", None),
|
|
||||||
("aa.", {"name": "aa", "text": "aa."}),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
async def test_teilchendata_must_include_period(
|
|
||||||
example_input: str, expected: dict[str, str | int] | None
|
|
||||||
) -> None:
|
|
||||||
|
|
||||||
thing = expected
|
|
||||||
if expected:
|
|
||||||
arguments = empty_teilchen | expected
|
|
||||||
thing = TeilchenCreate(**arguments) # ty:ignore[invalid-argument-type]
|
|
||||||
|
|
||||||
assert await make_teilchen_input(example_input) == thing
|
|
||||||
|
|
|
||||||
2
uv.lock
generated
2
uv.lock
generated
|
|
@ -1249,7 +1249,7 @@ wheels = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "teilchensammler-cli"
|
name = "teilchensammler-cli"
|
||||||
version = "0.3.3"
|
version = "0.3.2"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "ciso8601" },
|
{ name = "ciso8601" },
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue