Skip to content

Commit eb50c4d

Browse files
committed
refactor: clean up bridge and connection modules
- Removed unused DiscoverRequest and DiscoverResponse from `bridge.py`. - Simplified exception handling in `bridge.py` and `connection.py`. - Updated type hints in `suite_leasing.py` for better clarity. - Refactored `find_revit_path` to use `Path` for file existence checks in `discovery.py`. - Cleaned up commented-out code and improved overall readability.
1 parent cf21f46 commit eb50c4d

5 files changed

Lines changed: 3 additions & 106 deletions

File tree

src/revitdevtool_pytest/bridge.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from typing import Any, Callable
1414

1515
from .constants import (
16-
BRIDGE_METHOD_TESTS_DISCOVER,
1716
BRIDGE_METHOD_TESTS_RUN,
1817
BRIDGE_MSG_TYPE_NOTIFICATION,
1918
DEFAULT_CONNECT_TIMEOUT_MS,
@@ -24,8 +23,6 @@
2423
BridgeRequest,
2524
BridgeResponse,
2625
CollectionError,
27-
DiscoverRequest,
28-
DiscoverResponse,
2926
RunRequest,
3027
RunResponse,
3128
)
@@ -107,25 +104,6 @@ def connected(self) -> bool:
107104

108105
# -- Public RPC methods -------------------------------------------------
109106

110-
def discover_tests(
111-
self,
112-
workspace_root: str,
113-
test_root: str,
114-
*,
115-
pytest_args: list[str] | None = None,
116-
timeout_s: float = DEFAULT_TEST_TIMEOUT_S,
117-
) -> DiscoverResponse:
118-
request = DiscoverRequest(
119-
workspace_root=workspace_root,
120-
test_root=test_root,
121-
pytest_args=pytest_args or [],
122-
)
123-
response = self._request(
124-
BridgeRequest(method=BRIDGE_METHOD_TESTS_DISCOVER, params=request.to_params()),
125-
timeout_s,
126-
)
127-
return _parse_discover_response(response)
128-
129107
def run_tests(
130108
self,
131109
workspace_root: str,
@@ -207,20 +185,6 @@ def _read_exact(self, count: int, timeout_s: float) -> bytes:
207185
# ---------------------------------------------------------------------------
208186

209187

210-
def _parse_discover_response(response: BridgeResponse) -> DiscoverResponse:
211-
if response.is_error:
212-
return DiscoverResponse(
213-
collection_errors=(CollectionError(message=response.error_message),),
214-
)
215-
if isinstance(response.result, dict):
216-
return DiscoverResponse.from_dict(response.result)
217-
return DiscoverResponse(
218-
collection_errors=(
219-
CollectionError(message=f"Unexpected response: {response.result}"),
220-
),
221-
)
222-
223-
224188
def _parse_run_response(response: BridgeResponse) -> RunResponse:
225189
if response.is_error:
226190
return RunResponse(

src/revitdevtool_pytest/connection.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def _try_reconnect_leased(
218218
store.clear_suite(suite_key)
219219
return None, False
220220

221-
bridge, _ = _connect_first_available([leased_instance])
221+
bridge, _, _ = _connect_first_available([leased_instance])
222222
if bridge is not None:
223223
store.assign(suite_key, suite_path, leased_instance)
224224
log.info(
@@ -238,7 +238,7 @@ def _connect_and_lease(
238238
store: SuiteLeaseStore | None,
239239
label: str,
240240
) -> tuple[RevitBridge | None, ConnectionError | None]:
241-
bridge, selected, connect_error = _connect_first_available_with_instance(instances)
241+
bridge, selected, connect_error = _connect_first_available(instances)
242242
if bridge is None or selected is None:
243243
return None, connect_error
244244
if store:
@@ -252,18 +252,6 @@ def _connect_and_lease(
252252

253253
def _connect_first_available(
254254
instances: list[RevitInstance],
255-
) -> tuple[RevitBridge | None, ConnectionError | None]:
256-
last_error: ConnectionError | None = None
257-
for instance in instances:
258-
try:
259-
return connect_pipe(instance.pipe_name), None
260-
except ConnectionError as exc:
261-
last_error = exc
262-
return None, last_error
263-
264-
265-
def _connect_first_available_with_instance(
266-
instances: list[RevitInstance],
267255
) -> tuple[RevitBridge | None, RevitInstance | None, ConnectionError | None]:
268256
last_error: ConnectionError | None = None
269257
for instance in instances:

src/revitdevtool_pytest/discovery.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,27 +73,6 @@ def find_revit_path(version: int) -> str | None:
7373
return default if os.path.isfile(default) else None
7474

7575

76-
def launch_revit(
77-
version: int,
78-
wait_timeout_s: float = DEFAULT_LAUNCH_TIMEOUT_S,
79-
) -> RevitInstance | None:
80-
"""Start Revit with ``/nosplash`` and wait for its Named Pipe to appear.
81-
82-
Returns the discovered ``RevitInstance``, or ``None`` on timeout.
83-
Raises ``FileNotFoundError`` if the requested version is not installed.
84-
"""
85-
exe_path = find_revit_path(version)
86-
if exe_path is None:
87-
raise FileNotFoundError(f"Revit {version} installation not found.")
88-
89-
subprocess.Popen( # noqa: S603
90-
[exe_path, REVIT_NOSPLASH],
91-
creationflags=subprocess.DETACHED_PROCESS,
92-
)
93-
94-
return wait_for_revit_pipe(version, timeout_s=wait_timeout_s)
95-
96-
9776
def start_revit(version: int) -> int:
9877
"""Start Revit with ``/nosplash`` and return the spawned process id."""
9978
exe_path = find_revit_path(version)

src/revitdevtool_pytest/reporting.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def _build_longrepr(
266266
if outcome == OUTCOME_FAILED and (result.message or result.traceback):
267267
return result.traceback if result.traceback else result.message
268268
if outcome == OUTCOME_SKIPPED:
269-
return ("", -1, f"Skipped: {result.message}" if result.message else "Skipped")
269+
return "", -1, f"Skipped: {result.message}" if result.message else "Skipped"
270270
return None
271271

272272

src/revitdevtool_pytest/suite_leasing.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -57,36 +57,6 @@ def __init__(self, state_file: Path | None = None) -> None:
5757
self._state_file = state_file or _STATE_FILE
5858
self._leases = self._load_leases()
5959

60-
def resolve_existing(
61-
self,
62-
suite_key: str,
63-
suite_path: str,
64-
instances: list[RevitInstance],
65-
) -> RevitInstance | None:
66-
active_by_pid = {instance.process_id: instance for instance in instances}
67-
self._prune_stale(active_by_pid)
68-
69-
lease = self._leases.get(suite_key)
70-
if lease is None:
71-
return None
72-
73-
active = active_by_pid.get(lease.process_id)
74-
if active is None:
75-
self._leases.pop(suite_key, None)
76-
self._save_leases()
77-
return None
78-
79-
self._leases[suite_key] = SuiteLease(
80-
suite_key=suite_key,
81-
suite_path=suite_path,
82-
pipe_name=active.pipe_name,
83-
process_id=active.process_id,
84-
assigned_at=lease.assigned_at,
85-
last_seen_at=time.time(),
86-
)
87-
self._save_leases()
88-
return active
89-
9060
def find_free(
9161
self,
9262
suite_key: str,
@@ -119,10 +89,6 @@ def assign(
11989
)
12090
self._save_leases()
12191

122-
def get_suite_process_id(self, suite_key: str) -> int | None:
123-
lease = self._leases.get(suite_key)
124-
return None if lease is None else lease.process_id
125-
12692
def get_suite_lease(self, suite_key: str) -> SuiteLease | None:
12793
return self._leases.get(suite_key)
12894

0 commit comments

Comments
 (0)