pymidi-controller 0.4.0__tar.gz → 0.4.1__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.
Files changed (34) hide show
  1. {pymidi_controller-0.4.0/pymidi_controller.egg-info → pymidi_controller-0.4.1}/PKG-INFO +1 -1
  2. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/config.py +5 -2
  3. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/core.py +4 -1
  4. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1/pymidi_controller.egg-info}/PKG-INFO +1 -1
  5. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/SOURCES.txt +1 -0
  6. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pyproject.toml +1 -1
  7. pymidi_controller-0.4.1/tests/test_core.py +38 -0
  8. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/LICENSE +0 -0
  9. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/MANIFEST.in +0 -0
  10. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/README.md +0 -0
  11. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/__init__.py +0 -0
  12. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/__main__.py +0 -0
  13. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/__init__.py +0 -0
  14. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/elgato.py +0 -0
  15. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/elgato_discovery.py +0 -0
  16. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/hue.py +0 -0
  17. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/hue_discovery.py +0 -0
  18. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/cli.py +0 -0
  19. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/default_config.yaml +0 -0
  20. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/systemd/pymidi-controller.service +0 -0
  21. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/systemd/pymidi-controller.system.service +0 -0
  22. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/__init__.py +0 -0
  23. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/color_cycle.py +0 -0
  24. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/config_manager.py +0 -0
  25. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/function_manager.py +0 -0
  26. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/midi_utils.py +0 -0
  27. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/service_manager.py +0 -0
  28. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/state_manager.py +0 -0
  29. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/dependency_links.txt +0 -0
  30. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/entry_points.txt +0 -0
  31. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/requires.txt +0 -0
  32. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/top_level.txt +0 -0
  33. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/setup.cfg +0 -0
  34. {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/tests/test_service_unit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymidi-controller
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Daemon that maps MIDI events to system actions (Elgato, Hue, or custom functions).
5
5
  Author-email: Alex Sandilands <sandilands.alex@gmail.com>
6
6
  License-Expression: MIT
@@ -1,3 +1,5 @@
1
+ import sys
2
+
1
3
  from pymidi_controller.utils.config_manager import load_config
2
4
 
3
5
  _cfg = load_config()
@@ -13,5 +15,6 @@ MIDI_DEVICES = _m.get("devices", [])
13
15
  MIDI_BINDINGS = _m.get("bindings", {})
14
16
  COLOR_CYCLES = _m.get("color_cycles", {})
15
17
 
16
- # CLI entrypoint
17
- CLI_COMMAND = "pymidi-controller"
18
+ # CLI entrypoint: the running interpreter, so bindings work without the
19
+ # console script on PATH (the system service has no ~/.local/bin)
20
+ CLI_COMMAND = [sys.executable, "-m", "pymidi_controller"]
@@ -18,7 +18,7 @@ def handle_midi_message(msg, bindings):
18
18
 
19
19
  key = format_midi_key(msg)
20
20
  if key and key in bindings:
21
- command = [CLI_COMMAND] + bindings[key]
21
+ command = CLI_COMMAND + bindings[key]
22
22
  print(f"🎯 Matched {key} → Running: {' '.join(command)}")
23
23
  try:
24
24
  subprocess.Popen(command)
@@ -60,6 +60,9 @@ def run(mode: str = "blocking"):
60
60
  Entry point for the long-running MIDI listener.
61
61
  mode: 'interactive' or 'blocking'
62
62
  """
63
+ # Under systemd stdout is a pipe, so flush per line to reach the journal
64
+ sys.stdout.reconfigure(line_buffering=True)
65
+
63
66
  bindings = MIDI_BINDINGS
64
67
  if not bindings:
65
68
  print("❌ No MIDI bindings defined in config.yaml.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymidi-controller
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Daemon that maps MIDI events to system actions (Elgato, Hue, or custom functions).
5
5
  Author-email: Alex Sandilands <sandilands.alex@gmail.com>
6
6
  License-Expression: MIT
@@ -28,4 +28,5 @@ pymidi_controller/utils/function_manager.py
28
28
  pymidi_controller/utils/midi_utils.py
29
29
  pymidi_controller/utils/service_manager.py
30
30
  pymidi_controller/utils/state_manager.py
31
+ tests/test_core.py
31
32
  tests/test_service_unit.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pymidi-controller"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  description = "Daemon that maps MIDI events to system actions (Elgato, Hue, or custom functions)."
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  license = "MIT"
@@ -0,0 +1,38 @@
1
+ import subprocess
2
+ import sys
3
+
4
+ import mido
5
+
6
+ from pymidi_controller import core
7
+
8
+
9
+ def _press(bindings, monkeypatch):
10
+ procs = []
11
+ real_popen = subprocess.Popen
12
+
13
+ def popen(cmd, **kwargs):
14
+ proc = real_popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
15
+ procs.append((cmd, proc))
16
+ return proc
17
+
18
+ monkeypatch.setattr(core.subprocess, "Popen", popen)
19
+ msg = mido.Message("control_change", channel=0, control=99, value=1)
20
+ core.handle_midi_message(msg, bindings)
21
+ return procs
22
+
23
+
24
+ def test_binding_runs_cli_through_current_interpreter(monkeypatch):
25
+ procs = _press({"control_change:0:99:1": ["hue", "--help"]}, monkeypatch)
26
+ [(cmd, _)] = procs
27
+ assert cmd == [sys.executable, "-m", "pymidi_controller", "hue", "--help"]
28
+
29
+
30
+ def test_binding_runs_without_console_script_on_path(monkeypatch):
31
+ # The system service's PATH has no ~/.local/bin, so the action must not
32
+ # depend on finding the pymidi-controller script there
33
+ monkeypatch.setenv("PATH", "/nonexistent")
34
+ procs = _press({"control_change:0:99:1": ["--help"]}, monkeypatch)
35
+ [(_, proc)] = procs
36
+ out, _ = proc.communicate(timeout=30)
37
+ assert proc.returncode == 0, out
38
+ assert "usage:" in out