RemoteRF 2.13.0__tar.gz → 2.13.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 (125) hide show
  1. {remoterf-2.13.0/src/remoterf.egg-info → remoterf-2.13.1}/PKG-INFO +1 -1
  2. {remoterf-2.13.0 → remoterf-2.13.1}/pyproject.toml +1 -1
  3. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/backend.py +3 -0
  4. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/http.py +2 -1
  5. {remoterf-2.13.0 → remoterf-2.13.1/src/remoterf.egg-info}/PKG-INFO +1 -1
  6. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_federated_devices.py +31 -0
  7. {remoterf-2.13.0 → remoterf-2.13.1}/LICENSE +0 -0
  8. {remoterf-2.13.0 → remoterf-2.13.1}/README.md +0 -0
  9. {remoterf-2.13.0 → remoterf-2.13.1}/setup.cfg +0 -0
  10. {remoterf-2.13.0 → remoterf-2.13.1}/setup.py +0 -0
  11. {remoterf-2.13.0 → remoterf-2.13.1}/src/_remoterf_alias.py +0 -0
  12. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/__init__.py +0 -0
  13. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/admin.py +0 -0
  14. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/agent_cli.py +0 -0
  15. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/agent_docs.py +0 -0
  16. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/__init__.py +0 -0
  17. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/__init__.py +0 -0
  18. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/deployment_capabilities.proto +0 -0
  19. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/deployment_capabilities_pb2.py +0 -0
  20. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/deployment_capabilities_pb2_grpc.py +0 -0
  21. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/grpc.proto +0 -0
  22. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/grpc_pb2.py +0 -0
  23. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/grpc_pb2_grpc.py +0 -0
  24. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/grpc/v2_codec.py +0 -0
  25. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/tos_notice.txt +0 -0
  26. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/__init__.py +0 -0
  27. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/ansi_codes.py +0 -0
  28. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/api_token.py +0 -0
  29. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/banner.py +0 -0
  30. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/list_string.py +0 -0
  31. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/common/utils/process_arg.py +0 -0
  32. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/config/__init__.py +0 -0
  33. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/config/cert_fetcher.py +0 -0
  34. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/config/config.py +0 -0
  35. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/__init__.py +0 -0
  36. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/acc_login.py +0 -0
  37. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/app.py +0 -0
  38. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/availability.py +0 -0
  39. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/banner_note.txt +0 -0
  40. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/direct_path.py +0 -0
  41. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/dynamic_v2_transport.py +0 -0
  42. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/grpc_acc.py +0 -0
  43. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/grpc_client.py +0 -0
  44. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/messages.py +0 -0
  45. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/secure_channel.py +0 -0
  46. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/core/v2_errors.py +0 -0
  47. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/data/agent_guide.md +0 -0
  48. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/data/mcp_tools.json +0 -0
  49. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/__init__.py +0 -0
  50. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/direct.py +0 -0
  51. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/homes.py +0 -0
  52. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/lanpass.py +0 -0
  53. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/deployment/state.py +0 -0
  54. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/__init__.py +0 -0
  55. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/_virtual.py +0 -0
  56. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/adalm_pluto/__init__.py +0 -0
  57. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/adalm_pluto/adalm_pluto_remote.py +0 -0
  58. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/dynamic_device.py +0 -0
  59. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/dynamic_v2.py +0 -0
  60. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/hackrf/__init__.py +0 -0
  61. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/hackrf/hackrf_remote.py +0 -0
  62. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/rtl_sdr/__init__.py +0 -0
  63. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/rtl_sdr/rtl_sdr_remote.py +0 -0
  64. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/schema_review.py +0 -0
  65. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/sim_sdr/__init__.py +0 -0
  66. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/sim_sdr/sim_sdr_remote.py +0 -0
  67. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/support/__init__.py +0 -0
  68. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/support/ti_mmwave.py +0 -0
  69. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/support/uhd.py +0 -0
  70. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/support/uhd_dsp.py +0 -0
  71. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/support/uhd_v2.py +0 -0
  72. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/ti_mmwave/__init__.py +0 -0
  73. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/ti_mmwave/ti_mmwave_remote.py +0 -0
  74. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/usrp/__init__.py +0 -0
  75. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/usrp/usrp_remote.py +0 -0
  76. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/drivers/usrp/usrp_remote.pyi +0 -0
  77. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/mcp_server.py +0 -0
  78. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/ops.py +0 -0
  79. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/remoterf_cli.py +0 -0
  80. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf/version.py +0 -0
  81. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.egg-info/SOURCES.txt +0 -0
  82. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.egg-info/dependency_links.txt +0 -0
  83. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.egg-info/entry_points.txt +0 -0
  84. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.egg-info/requires.txt +0 -0
  85. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.egg-info/top_level.txt +0 -0
  86. {remoterf-2.13.0 → remoterf-2.13.1}/src/remoterf.py +0 -0
  87. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_agent_cli.py +0 -0
  88. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_agent_docs.py +0 -0
  89. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_banner.py +0 -0
  90. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_batch.py +0 -0
  91. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_bundled_drivers.py +0 -0
  92. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_cli_login_fresh.py +0 -0
  93. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_config_address.py +0 -0
  94. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_deployment_accounts.py +0 -0
  95. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_device_routes.py +0 -0
  96. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_devices_api.py +0 -0
  97. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_direct_path_fixed.py +0 -0
  98. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_direct_path_global.py +0 -0
  99. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_direct_path_partner.py +0 -0
  100. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_direct_path_race.py +0 -0
  101. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_direct_path_relay.py +0 -0
  102. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_dynamic_device_codegen.py +0 -0
  103. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_dynamic_v2.py +0 -0
  104. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_fetch_idl_fallback.py +0 -0
  105. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_finish_prompt.py +0 -0
  106. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_gate_i_direct_path.py +0 -0
  107. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_grpc_client_target.py +0 -0
  108. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_homes.py +0 -0
  109. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_lan_fallback.py +0 -0
  110. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_mcp_server.py +0 -0
  111. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_messages.py +0 -0
  112. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_native_account_credentials.py +0 -0
  113. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_native_devices.py +0 -0
  114. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_old_import_name.py +0 -0
  115. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_ops.py +0 -0
  116. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_partner_dynamic_v2.py +0 -0
  117. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_pluto_virtual.py +0 -0
  118. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_process_arg.py +0 -0
  119. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_relay_paging.py +0 -0
  120. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_remote_admin.py +0 -0
  121. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_remoterf_cli.py +0 -0
  122. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_rx_readahead.py +0 -0
  123. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_schema_review.py +0 -0
  124. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_ti_mmwave.py +0 -0
  125. {remoterf-2.13.0 → remoterf-2.13.1}/tests/test_upgrade_rescue.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 2.13.0
3
+ Version: 2.13.1
4
4
  Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author-email: Ethan Ge <84103791+ethange1@users.noreply.github.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "remoterf"
7
- version = "2.13.0"
7
+ version = "2.13.1"
8
8
  description = "A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts."
9
9
  readme = "README.md"
10
10
  license = "GPL-3.0-or-later"
@@ -211,6 +211,9 @@ class HttpsJsonAccountBackend(DeploymentAccountBackend):
211
211
  "POST",
212
212
  self.base + "/refresh",
213
213
  data={"refresh_token": old["refresh_token"]},
214
+ # Past Caddy's 45 s hold, so a restart answers or 502s (never sent)
215
+ # instead of timing out ambiguously, which clears the saved login.
216
+ overall_timeout=50.0,
214
217
  ),
215
218
  old["subject_id"],
216
219
  )
@@ -74,8 +74,9 @@ class JsonTransport:
74
74
  headers["Content-Type"] = FRAMED_CONTENT_TYPE
75
75
  if access:
76
76
  headers["Authorization"] = "Bearer " + access
77
+ # Longer than a Global restart: Caddy holds a request until the new container answers.
77
78
  overall_timeout = (
78
- 5.0 if overall_timeout is None else float(overall_timeout)
79
+ 20.0 if overall_timeout is None else float(overall_timeout)
79
80
  )
80
81
  if overall_timeout <= 0 or max_response_bytes <= 0:
81
82
  raise ValueError("invalid account operation budget")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 2.13.0
3
+ Version: 2.13.1
4
4
  Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author-email: Ethan Ge <84103791+ethange1@users.noreply.github.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -183,6 +183,37 @@ def test_refresh_never_posts_a_token_another_process_spent():
183
183
  assert not transport.request.called and backend.credentials is None
184
184
 
185
185
 
186
+ def test_account_calls_outwait_a_global_restart(monkeypatch):
187
+ # Caddy holds a request for up to 45 s while Global restarts: a refresh waits past
188
+ # that (an ambiguous timeout would clear the login), other account calls 20 s.
189
+ from remoterf.deployment import http
190
+
191
+ backend, transport = _backend("ACC:refresh_session")
192
+ backend.credentials = {"access_token": "old", "refresh_token": "r1", "access_expires_at": 0, "subject_id": HOME}
193
+ backend.store.load.return_value = backend.credentials
194
+ transport.request.return_value = {
195
+ "deployment_id": HOME, "subject_id": HOME, "username": "jdoe", "access_token": "new", "refresh_token": "r2",
196
+ "token_type": "Bearer", "access_expires_at": 10**12, "refresh_expires_at": 10**12}
197
+ assert backend._access() == "new"
198
+ assert transport.request.call_args.kwargs["overall_timeout"] == 50.0
199
+
200
+ seen = {}
201
+
202
+ class Stop(Exception):
203
+ pass
204
+
205
+ def stream(*args, **kwargs):
206
+ seen["timeout"] = kwargs["timeout"]
207
+ raise Stop
208
+
209
+ client = Mock()
210
+ client.stream.side_effect = stream
211
+ monkeypatch.setattr(http.httpx, "Client", lambda **kwargs: client)
212
+ with pytest.raises(Stop):
213
+ http.JsonTransport("https://home.example").request("GET", "/me")
214
+ assert seen["timeout"].read == 20.0
215
+
216
+
186
217
  def test_https_keeps_an_idle_connection_for_a_minute(monkeypatch):
187
218
  from remoterf.deployment import http
188
219
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes