style: apply ruff-format to entire codebase

First-time run of ruff-format via pre-commit hook normalises quote
style, trailing commas, and whitespace across 188 Python files.
No logic changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
James Smith
2026-07-05 14:48:11 +01:00
parent 82e64104fe
commit 96172ca593
189 changed files with 19883 additions and 19552 deletions
+36 -36
View File
@@ -38,23 +38,22 @@ DEFAULT_PORT = 5000
# SCHEMA VALIDATORS
# =============================================================================
def validate_device_schema(device: dict, context: str = "") -> list[str]:
"""Validate that a device dict has expected fields (backwards compatible)."""
errors = []
required_fields = [
'device_id', 'address', 'rssi_current', 'last_seen', 'seen_count'
]
required_fields = ["device_id", "address", "rssi_current", "last_seen", "seen_count"]
for field in required_fields:
if field not in device:
errors.append(f"{context}Missing required field: {field}")
# New tracker fields should be present (v2) but are optional
tracker_fields = ['is_tracker', 'tracker_type', 'tracker_confidence']
tracker_fields = ["is_tracker", "tracker_type", "tracker_confidence"]
for field in tracker_fields:
if field in device:
# Field exists, check type
if field == 'is_tracker' and not isinstance(device[field], bool):
if field == "is_tracker" and not isinstance(device[field], bool):
errors.append(f"{context}is_tracker should be bool, got {type(device[field])}")
return errors
@@ -64,17 +63,15 @@ def validate_tracker_schema(tracker: dict, context: str = "") -> list[str]:
"""Validate tracker endpoint response schema."""
errors = []
required_fields = [
'device_id', 'address', 'tracker'
]
required_fields = ["device_id", "address", "tracker"]
for field in required_fields:
if field not in tracker:
errors.append(f"{context}Missing required field: {field}")
# Tracker sub-object
if 'tracker' in tracker:
tracker_obj = tracker['tracker']
tracker_required = ['type', 'confidence', 'evidence']
if "tracker" in tracker:
tracker_obj = tracker["tracker"]
tracker_required = ["type", "confidence", "evidence"]
for field in tracker_required:
if field not in tracker_obj:
errors.append(f"{context}tracker.{field} missing")
@@ -86,12 +83,12 @@ def validate_diagnostics_schema(diagnostics: dict) -> list[str]:
"""Validate diagnostics endpoint response schema."""
errors = []
required_sections = ['system', 'bluez', 'adapters', 'permissions', 'backends']
required_sections = ["system", "bluez", "adapters", "permissions", "backends"]
for section in required_sections:
if section not in diagnostics:
errors.append(f"Missing diagnostics section: {section}")
if 'can_scan' not in diagnostics:
if "can_scan" not in diagnostics:
errors.append("Missing can_scan field")
return errors
@@ -101,6 +98,7 @@ def validate_diagnostics_schema(diagnostics: dict) -> list[str]:
# TEST CASES
# =============================================================================
class SmokeTests:
"""Smoke test runner."""
@@ -128,9 +126,9 @@ class SmokeTests:
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
data = resp.json()
self._check("Has 'available' field", 'available' in data or 'can_scan' in data)
self._check("Has 'adapters' field", 'adapters' in data)
self._check("Has 'recommended_backend' field", 'recommended_backend' in data or 'preferred_backend' in data)
self._check("Has 'available' field", "available" in data or "can_scan" in data)
self._check("Has 'adapters' field", "adapters" in data)
self._check("Has 'recommended_backend' field", "recommended_backend" in data or "preferred_backend" in data)
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
@@ -143,18 +141,19 @@ class SmokeTests:
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
data = resp.json()
self._check("Has 'count' field", 'count' in data)
self._check("Has 'devices' array", 'devices' in data and isinstance(data['devices'], list))
self._check("Has 'count' field", "count" in data)
self._check("Has 'devices' array", "devices" in data and isinstance(data["devices"], list))
# If devices exist, validate schema
if data.get('devices'):
device = data['devices'][0]
if data.get("devices"):
device = data["devices"][0]
errors = validate_device_schema(device, "First device: ")
self._check("Device schema valid", len(errors) == 0, "; ".join(errors))
# Check for new tracker fields (should exist even if empty)
self._check("Has tracker fields", 'is_tracker' in device,
"New tracker field missing (backwards compat issue)")
self._check(
"Has tracker fields", "is_tracker" in device, "New tracker field missing (backwards compat issue)"
)
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
@@ -167,13 +166,13 @@ class SmokeTests:
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
data = resp.json()
self._check("Has 'count' field", 'count' in data)
self._check("Has 'trackers' array", 'trackers' in data and isinstance(data['trackers'], list))
self._check("Has 'summary' field", 'summary' in data)
self._check("Has 'count' field", "count" in data)
self._check("Has 'trackers' array", "trackers" in data and isinstance(data["trackers"], list))
self._check("Has 'summary' field", "summary" in data)
# If trackers exist, validate schema
if data.get('trackers'):
tracker = data['trackers'][0]
if data.get("trackers"):
tracker = data["trackers"][0]
errors = validate_tracker_schema(tracker, "First tracker: ")
self._check("Tracker schema valid", len(errors) == 0, "; ".join(errors))
@@ -191,7 +190,7 @@ class SmokeTests:
errors = validate_diagnostics_schema(data)
self._check("Diagnostics schema valid", len(errors) == 0, "; ".join(errors))
self._check("Has recommendations", 'recommendations' in data)
self._check("Has recommendations", "recommendations" in data)
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
@@ -204,7 +203,7 @@ class SmokeTests:
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
data = resp.json()
self._check("Has 'is_scanning' field", 'is_scanning' in data)
self._check("Has 'is_scanning' field", "is_scanning" in data)
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
@@ -218,7 +217,7 @@ class SmokeTests:
self._check("List baselines: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
data = resp.json()
self._check("Has 'baselines' array", 'baselines' in data)
self._check("Has 'baselines' array", "baselines" in data)
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
@@ -242,22 +241,22 @@ class SmokeTests:
# JSON export
resp = requests.get(f"{self.base_url}/api/bluetooth/export?format=json", timeout=5)
self._check("JSON export: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
self._check("JSON export: Content-Type", 'application/json' in resp.headers.get('Content-Type', ''))
self._check("JSON export: Content-Type", "application/json" in resp.headers.get("Content-Type", ""))
# CSV export
resp = requests.get(f"{self.base_url}/api/bluetooth/export?format=csv", timeout=5)
self._check("CSV export: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
self._check("CSV export: Content-Type", 'text/csv' in resp.headers.get('Content-Type', ''))
self._check("CSV export: Content-Type", "text/csv" in resp.headers.get("Content-Type", ""))
except requests.RequestException as e:
self._check("Request succeeded", False, str(e))
def run_all(self):
"""Run all smoke tests."""
print(f"\n{'='*60}")
print(f"\n{'=' * 60}")
print("BLUETOOTH API SMOKE TESTS")
print(f"Target: {self.base_url}")
print(f"{'='*60}")
print(f"{'=' * 60}")
self.test_capabilities_endpoint()
self.test_devices_endpoint()
@@ -268,9 +267,9 @@ class SmokeTests:
self.test_export_endpoint()
self.test_tscm_integration()
print(f"\n{'='*60}")
print(f"\n{'=' * 60}")
print(f"RESULTS: {self.passed} passed, {self.failed} failed")
print(f"{'='*60}")
print(f"{'=' * 60}")
if self.errors:
print("\nFailed tests:")
@@ -284,6 +283,7 @@ class SmokeTests:
# MAIN
# =============================================================================
def main():
parser = argparse.ArgumentParser(description="Bluetooth API smoke tests")
parser.add_argument("--host", default=DEFAULT_HOST, help="Server host")