remoteRF-server-testing 0.0.6__tar.gz → 0.0.8__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 (50) hide show
  1. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/PKG-INFO +1 -1
  2. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/pyproject.toml +1 -1
  3. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/tools/gist_status.py +14 -22
  4. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/PKG-INFO +1 -1
  5. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/SOURCES.txt +1 -2
  6. remoterf_server_testing-0.0.6/tests/test_rpc_manager.py +0 -166
  7. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/README.md +0 -0
  8. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/setup.cfg +0 -0
  9. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/__init__.py +0 -0
  10. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/__init__.py +0 -0
  11. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/grpc/__init__.py +0 -0
  12. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
  13. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
  14. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
  15. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
  16. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/idl/__init__.py +0 -0
  17. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/idl/device_schema.py +0 -0
  18. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/idl/pluto_schema.py +0 -0
  19. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/idl/schema.py +0 -0
  20. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/__init__.py +0 -0
  21. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
  22. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/api_token.py +0 -0
  23. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/db_connection.py +0 -0
  24. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/db_location.py +0 -0
  25. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/list_string.py +0 -0
  26. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/common/utils/process_arg.py +0 -0
  27. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/drivers/__init__.py +0 -0
  28. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
  29. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
  30. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/host/__init__.py +0 -0
  31. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/host/host_auth_token.py +0 -0
  32. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/host/host_directory_store.py +0 -0
  33. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/host/host_tunnel_server.py +0 -0
  34. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/__init__.py +0 -0
  35. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/acc_perms.py +0 -0
  36. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/cert_provider.py +0 -0
  37. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/device_manager.py +0 -0
  38. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/grpc_server.py +0 -0
  39. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/reservation.py +0 -0
  40. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/rpc_manager.py +0 -0
  41. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/user_group_cli.py +0 -0
  42. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/server/user_group_handler.py +0 -0
  43. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/serverrf_cli.py +0 -0
  44. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/tools/__init__.py +0 -0
  45. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/tools/gen_certs.py +0 -0
  46. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server/tools/gist_status_testing.py +0 -0
  47. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/dependency_links.txt +0 -0
  48. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/entry_points.txt +0 -0
  49. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/requires.txt +0 -0
  50. {remoterf_server_testing-0.0.6 → remoterf_server_testing-0.0.8}/src/remoteRF_server_testing.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server-testing
3
- Version: 0.0.6
3
+ Version: 0.0.8
4
4
  Summary: RemoteRF server-side control package
5
5
  Requires-Python: >=3.8
6
6
  Description-Content-Type: text/markdown
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "remoteRF-server-testing"
7
- version = "0.0.6"
7
+ version = "0.0.8"
8
8
  description = "RemoteRF server-side control package"
9
9
  requires-python = ">=3.8"
10
10
  dependencies = [
@@ -8,7 +8,7 @@ import sys
8
8
  import time
9
9
  import threading
10
10
  from pathlib import Path
11
- from typing import Dict, Optional
11
+ from typing import Dict, Optional, Tuple
12
12
 
13
13
  import requests
14
14
 
@@ -34,7 +34,7 @@ def _read_env_kv(path: Path) -> Dict[str, str]:
34
34
  return out
35
35
 
36
36
 
37
- def _load_gist_env() -> tuple[str, str, str]:
37
+ def _load_gist_env() -> Optional[Tuple[str, str, str]]:
38
38
  p = _cfg_dir() / "gist.env"
39
39
  kv = _read_env_kv(p)
40
40
 
@@ -42,25 +42,10 @@ def _load_gist_env() -> tuple[str, str, str]:
42
42
  token = kv.get("GITHUB_TOKEN", "").strip()
43
43
  filename = kv.get("STATUS_GIST_FILENAME", "").strip()
44
44
 
45
- missing = []
46
- if not gist_id:
47
- missing.append("STATUS_GIST_ID")
48
- if not token:
49
- missing.append("GITHUB_TOKEN")
50
- if not filename:
51
- missing.append("STATUS_GIST_FILENAME")
52
-
53
- if missing:
54
- print(f"[gist_status] Missing {', '.join(missing)} in {p}", file=sys.stderr)
55
- print(
56
- "[gist_status] Fix: run:\n"
57
- " serverrf --gist --set --id <gist_id> --file <filename>\n"
58
- "Or manually create gist.env with those keys.",
59
- file=sys.stderr,
60
- )
61
- raise SystemExit(2)
45
+ if not gist_id or not token or not filename:
46
+ return None
62
47
 
63
- return gist_id, token, filename
48
+ return (gist_id, token, filename)
64
49
 
65
50
 
66
51
  def build_status() -> dict:
@@ -96,7 +81,10 @@ def push_gist(*, gist_id: str, gh_token: str, filename: str, payload: dict) -> N
96
81
 
97
82
 
98
83
  def _publisher_loop(period_sec: int) -> None:
99
- gist_id, gh_token, filename = _load_gist_env()
84
+ cfg = _load_gist_env()
85
+ if cfg is None:
86
+ return
87
+ gist_id, gh_token, filename = cfg
100
88
 
101
89
  try:
102
90
  push_gist(gist_id=gist_id, gh_token=gh_token, filename=filename, payload=build_status())
@@ -122,6 +110,10 @@ def start_status_publisher() -> None:
122
110
  if _publisher_thread is not None and _publisher_thread.is_alive():
123
111
  return
124
112
 
113
+ if _load_gist_env() is None:
114
+ print("[gist_status] off (not configured; see README gist docs)", file=sys.stderr)
115
+ return
116
+
125
117
  t = threading.Thread(
126
118
  target=_publisher_loop,
127
119
  args=(int(120),),
@@ -136,4 +128,4 @@ def start_status_publisher() -> None:
136
128
  # if __name__ == "__main__":
137
129
  # start_status_publisher(period_sec=120)
138
130
  # while True:
139
- # time.sleep(3600)
131
+ # time.sleep(3600)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server-testing
3
- Version: 0.0.6
3
+ Version: 0.0.8
4
4
  Summary: RemoteRF server-side control package
5
5
  Requires-Python: >=3.8
6
6
  Description-Content-Type: text/markdown
@@ -44,5 +44,4 @@ src/remoteRF_server_testing.egg-info/SOURCES.txt
44
44
  src/remoteRF_server_testing.egg-info/dependency_links.txt
45
45
  src/remoteRF_server_testing.egg-info/entry_points.txt
46
46
  src/remoteRF_server_testing.egg-info/requires.txt
47
- src/remoteRF_server_testing.egg-info/top_level.txt
48
- tests/test_rpc_manager.py
47
+ src/remoteRF_server_testing.egg-info/top_level.txt
@@ -1,166 +0,0 @@
1
- from contextlib import contextmanager
2
- import importlib
3
- import sys
4
- import types
5
- import unittest
6
- from unittest.mock import patch
7
-
8
-
9
- def _install_rpc_manager_stubs():
10
- reservation_mod = types.ModuleType("remoteRF_server.server.reservation")
11
-
12
- class _ReservationHandler:
13
- def handle_call(self, *, function_name, args):
14
- return {"handled": (function_name, args)}
15
-
16
- reservation_mod.reservation_handler = _ReservationHandler()
17
- sys.modules["remoteRF_server.server.reservation"] = reservation_mod
18
-
19
- utils_mod = types.ModuleType("remoteRF_server.common.utils")
20
- utils_mod.map_arg = lambda value: value
21
- utils_mod.unmap_arg = lambda value: value
22
- sys.modules["remoteRF_server.common.utils"] = utils_mod
23
-
24
- device_manager_mod = types.ModuleType("remoteRF_server.server.device_manager")
25
-
26
- class VirtualDevice:
27
- def __init__(self, *, gid, host_id, device_id, label="", serial="", kind=""):
28
- self.gid = gid
29
- self.host_id = host_id
30
- self.device_id = device_id
31
- self.label = label
32
- self.serial = serial
33
- self.kind = kind
34
-
35
- @contextmanager
36
- def acquire_device(_api_token):
37
- raise NotImplementedError("patched per test")
38
- yield
39
-
40
- device_manager_mod.VirtualDevice = VirtualDevice
41
- device_manager_mod.acquire_device = acquire_device
42
- device_manager_mod.get_device_schema = lambda _gid: None
43
- device_manager_mod.find_device_id_by_name = lambda _name: None
44
- device_manager_mod.get_schema_by_token = lambda _token: None
45
- device_manager_mod.resolve_gid_for_token = lambda _token: None
46
- sys.modules["remoteRF_server.server.device_manager"] = device_manager_mod
47
-
48
- host_tunnel_mod = types.ModuleType("remoteRF_server.host.host_tunnel_server")
49
- host_tunnel_mod.get_tunnel_registry = lambda create=False: None
50
- host_tunnel_mod.handle_host_device = lambda *args, **kwargs: {}
51
- sys.modules["remoteRF_server.host.host_tunnel_server"] = host_tunnel_mod
52
-
53
-
54
- _install_rpc_manager_stubs()
55
- sys.modules.pop("remoteRF_server.server.rpc_manager", None)
56
- rpc_manager_module = importlib.import_module("remoteRF_server.server.rpc_manager")
57
-
58
-
59
- class _FakeSchemaDevice:
60
- device_type = "hackrf"
61
-
62
- def __init__(self):
63
- self.calls = []
64
-
65
- def dispatch(self, method_name, args):
66
- self.calls.append((method_name, args))
67
-
68
- if method_name == "call_get_serial_no":
69
- return "SERIAL-123"
70
-
71
- if method_name == "set_center_freq":
72
- return None
73
-
74
- raise AssertionError(f"Unexpected dispatch: {method_name} {args}")
75
-
76
-
77
- @contextmanager
78
- def _acquired_device(gid, dev):
79
- yield gid, dev
80
-
81
-
82
- class RpcManagerDeviceDispatchTests(unittest.TestCase):
83
- def setUp(self):
84
- self.rpc = rpc_manager_module.RpcManager()
85
-
86
- def test_routes_non_pluto_schema_call(self):
87
- dev = _FakeSchemaDevice()
88
-
89
- with patch.object(
90
- rpc_manager_module,
91
- "acquire_device",
92
- return_value=_acquired_device(7, dev),
93
- ):
94
- result = self.rpc.run_rpc(
95
- function_name="Hackrf:get_serial_no:CALL0",
96
- args={"a": "token"},
97
- )
98
-
99
- self.assertEqual(result["get_serial_no"], "SERIAL-123")
100
- self.assertEqual(dev.calls, [("call_get_serial_no", {})])
101
-
102
- def test_rejects_mismatched_schema_namespace(self):
103
- dev = _FakeSchemaDevice()
104
-
105
- with patch.object(
106
- rpc_manager_module,
107
- "acquire_device",
108
- return_value=_acquired_device(7, dev),
109
- ):
110
- result = self.rpc.run_rpc(
111
- function_name="Pluto:get_serial_no:CALL0",
112
- args={"a": "token"},
113
- )
114
-
115
- self.assertIn("does not match", result["a"])
116
-
117
- def test_uses_builtin_ip_ping_for_schemas_without_call_ip(self):
118
- dev = _FakeSchemaDevice()
119
-
120
- with patch.object(
121
- rpc_manager_module,
122
- "acquire_device",
123
- return_value=_acquired_device(7, dev),
124
- ):
125
- result = self.rpc.run_rpc(
126
- function_name="Hackrf:ip:CALL0",
127
- args={"a": "token"},
128
- )
129
-
130
- self.assertEqual(result["ip"], "hackrf:7")
131
- self.assertEqual(dev.calls, [])
132
-
133
- def test_forwards_host_devices_for_non_pluto_schema_calls(self):
134
- dev = rpc_manager_module.VirtualDevice(
135
- gid=9,
136
- host_id="host-1",
137
- device_id="9",
138
- kind="hackrf",
139
- )
140
-
141
- with patch.object(
142
- rpc_manager_module,
143
- "acquire_device",
144
- return_value=_acquired_device(9, dev),
145
- ), patch.object(
146
- rpc_manager_module.hts,
147
- "get_tunnel_registry",
148
- return_value=object(),
149
- ), patch.object(
150
- rpc_manager_module.hts,
151
- "handle_host_device",
152
- return_value={"get_serial_no": "HOST-SERIAL"},
153
- ) as handle_host_device:
154
- result = self.rpc.run_rpc(
155
- function_name="Hackrf:get_serial_no:CALL0",
156
- args={"a": "token"},
157
- )
158
-
159
- self.assertEqual(result["get_serial_no"], "HOST-SERIAL")
160
- forwarded_args = handle_host_device.call_args.kwargs["args"]
161
- self.assertNotIn("a", forwarded_args)
162
- self.assertEqual(forwarded_args["g"], 9)
163
-
164
-
165
- if __name__ == "__main__":
166
- unittest.main()