clean up dependencies

This commit is contained in:
evilchili 2025-09-14 15:23:15 -07:00
parent 7a4cd1ba50
commit 0539ce321f
5 changed files with 18 additions and 65 deletions

View File

@ -9,28 +9,23 @@ packages = [
] ]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.10,<4.0" python = ">=3.11,<4.0"
prompt-toolkit = "^3.0.38" prompt-toolkit = "^3.0.38"
typer = "^0.9.0" python-dotenv = "^1.1.1"
python-dotenv = "^0.21.0"
rich = "^13.7.0"
pyyaml = "^6.0.1" pyyaml = "^6.0.1"
paste = "^3.7.1" paste = "^3.7.1"
python-daemon = "^3.0.1"
requests = "^2.31.0" requests = "^2.31.0"
psutil = "^5.9.8"
exscript = "^2.6.28"
python-shout = "^0.2.8"
ffmpeg-python = "^0.2.0"
python-vlc = "^3.0.21203" python-vlc = "^3.0.21203"
pygobject = "3.50.0" pygobject = "3.50.0"
pytest-cov = "^7.0.0"
rich = "^14.1.0"
typer = "^0.17.4"
[tool.poetry.scripts] [tool.poetry.scripts]
croaker = "croaker.cli:app" croaker = "croaker.cli:app"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pytest = "^8.1.1" pytest = "^8.1.1"
pytest-cov = "^5.0.0"
[build-system] [build-system]
requires = ["poetry-core"] requires = ["poetry-core"]

View File

@ -39,9 +39,9 @@ app_state = {}
logger = logging.getLogger("cli") logger = logging.getLogger("cli")
@app.callback() @app.callback(invoke_without_command=True)
def main( def main(
context: typer.Context, ctx: typer.Context,
root: Optional[Path] = typer.Option( root: Optional[Path] = typer.Option(
Path("~/.dnd/croaker"), Path("~/.dnd/croaker"),
help="Path to the Croaker environment", help="Path to the Croaker environment",
@ -60,14 +60,15 @@ def main(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.DEBUG if debug else logging.INFO, level=logging.DEBUG if debug else logging.INFO,
) )
if ctx.invoked_subcommand is None:
return start()
@app.command() @app.command()
def setup(context: typer.Context): def setup():
""" """
(Re)Initialize Croaker. (Re)Initialize Croaker.
""" """
sys.stderr.write( sys.stderr.write(
"Interactive setup is not available, but you can redirect " "Interactive setup is not available, but you can redirect "
"this command's output to a defaults file of your choice.\n" "this command's output to a defaults file of your choice.\n"
@ -76,13 +77,9 @@ def setup(context: typer.Context):
@app.command() @app.command()
def start( def start():
context: typer.Context,
daemonize: bool = typer.Option(True, help="Daemonize the server."),
shoutcast: bool = typer.Option(True, help="Stream to shoutcast."),
):
""" """
Start the Croaker command and control server. Start the Croaker audio player.
""" """
player = Player() player = Player()
player.run() player.run()
@ -114,4 +111,4 @@ def add(
if __name__ == "__main__": if __name__ == "__main__":
app.main() app()

View File

@ -9,11 +9,10 @@ from croaker.playlist import Playlist, load_playlist
gi.require_version("Gtk", "4.0") gi.require_version("Gtk", "4.0")
gi.require_version("Gdk", "4.0") gi.require_version("Gdk", "4.0")
from gi.repository import GLib, GObject, Gdk, Gtk, Pango # noqa E402 from gi.repository import Gdk, GLib, GObject, Gtk, Pango # noqa E402
class PlayerWindow(Gtk.ApplicationWindow): class PlayerWindow(Gtk.ApplicationWindow):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -23,11 +22,9 @@ class PlayerWindow(Gtk.ApplicationWindow):
self._artwork_height = 248 self._artwork_height = 248
css_provider = Gtk.CssProvider() css_provider = Gtk.CssProvider()
css_provider.load_from_path(str(path.assets() / 'style.css')) css_provider.load_from_path(str(path.assets() / "style.css"))
Gtk.StyleContext.add_provider_for_display( Gtk.StyleContext.add_provider_for_display(
Gdk.Display.get_default(), Gdk.Display.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
css_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
) )
self.set_title("Croaker Radio") self.set_title("Croaker Radio")
self._root = Gtk.Fixed() self._root = Gtk.Fixed()
@ -41,7 +38,6 @@ class PlayerWindow(Gtk.ApplicationWindow):
self._draw_window() self._draw_window()
def _draw_window(self): def _draw_window(self):
margin_size = 8 margin_size = 8
label_width = self._max_width - (2 * margin_size) label_width = self._max_width - (2 * margin_size)
@ -80,7 +76,7 @@ class PlayerWindow(Gtk.ApplicationWindow):
def draw_artwork(self): def draw_artwork(self):
image1 = Gtk.Image() image1 = Gtk.Image()
image1.set_from_file(str(path.assets() / 'froghat.png')) image1.set_from_file(str(path.assets() / "froghat.png"))
image1.set_size_request(self._artwork_width, self._artwork_height) image1.set_size_request(self._artwork_width, self._artwork_height)
image1.add_css_class("artwork") image1.add_css_class("artwork")
self._artwork.put(image1, 0, 0) self._artwork.put(image1, 0, 0)

View File

@ -10,7 +10,7 @@ def root():
def assets(): def assets():
return Path(__file__).parent / 'assets' return Path(__file__).parent / "assets"
def playlist_root(): def playlist_root():

View File

@ -1,35 +0,0 @@
from pathlib import Path
from unittest.mock import MagicMock
import pytest
from croaker import pidfile
@pytest.mark.parametrize(
"pid,terminate,kill_result,broken",
[
("pid", False, None, False), # running proc, no terminate
("pid", True, True, False), # running proc, terminate
("pid", True, ProcessLookupError, True), # stale pid
(None, None, None, False), # no running proc
],
)
def test_pidfile(monkeypatch, pid, terminate, kill_result, broken):
monkeypatch.setattr(
pidfile._pidfile,
"TimeoutPIDLockFile",
MagicMock(
**{
"return_value.read_pid.return_value": pid,
}
),
)
monkeypatch.setattr(
pidfile.os,
"kill",
MagicMock(**{"side_effect": kill_result if type(kill_result) is Exception else [kill_result]}),
)
ret = pidfile.pidfile(pidfile_path=Path("/dev/null"), terminate_if_running=terminate)
assert ret.break_lock.called == broken