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.
- {pymidi_controller-0.4.0/pymidi_controller.egg-info → pymidi_controller-0.4.1}/PKG-INFO +1 -1
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/config.py +5 -2
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/core.py +4 -1
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1/pymidi_controller.egg-info}/PKG-INFO +1 -1
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/SOURCES.txt +1 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pyproject.toml +1 -1
- pymidi_controller-0.4.1/tests/test_core.py +38 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/LICENSE +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/MANIFEST.in +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/README.md +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/__init__.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/__main__.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/__init__.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/elgato.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/elgato_discovery.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/hue.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/hue_discovery.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/cli.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/default_config.yaml +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/systemd/pymidi-controller.service +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/systemd/pymidi-controller.system.service +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/__init__.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/color_cycle.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/config_manager.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/function_manager.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/midi_utils.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/service_manager.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/state_manager.py +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/dependency_links.txt +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/entry_points.txt +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/requires.txt +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/top_level.txt +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/setup.cfg +0 -0
- {pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/tests/test_service_unit.py +0 -0
|
@@ -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
|
-
|
|
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 =
|
|
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.")
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/elgato_discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/actions/hue_discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/data/default_config.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/config_manager.py
RENAMED
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/function_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/service_manager.py
RENAMED
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller/utils/state_manager.py
RENAMED
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{pymidi_controller-0.4.0 → pymidi_controller-0.4.1}/pymidi_controller.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|