setup.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from __future__ import annotations
  2. import platform
  3. import sys
  4. from dataclasses import dataclass
  5. from pathlib import Path
  6. from .deferred_init import DeferredInitResult, run_deferred_init
  7. from .prefetch import PrefetchResult, start_keychain_prefetch, start_mdm_raw_read, start_project_scan
  8. @dataclass(frozen=True)
  9. class WorkspaceSetup:
  10. python_version: str
  11. implementation: str
  12. platform_name: str
  13. test_command: str = 'python3 -m unittest discover -s tests -v'
  14. def startup_steps(self) -> tuple[str, ...]:
  15. return (
  16. 'start top-level prefetch side effects',
  17. 'build workspace context',
  18. 'load mirrored command snapshot',
  19. 'load mirrored tool snapshot',
  20. 'prepare parity audit hooks',
  21. 'apply trust-gated deferred init',
  22. )
  23. @dataclass(frozen=True)
  24. class SetupReport:
  25. setup: WorkspaceSetup
  26. prefetches: tuple[PrefetchResult, ...]
  27. deferred_init: DeferredInitResult
  28. trusted: bool
  29. cwd: Path
  30. def as_markdown(self) -> str:
  31. lines = [
  32. '# Setup Report',
  33. '',
  34. f'- Python: {self.setup.python_version} ({self.setup.implementation})',
  35. f'- Platform: {self.setup.platform_name}',
  36. f'- Trusted mode: {self.trusted}',
  37. f'- CWD: {self.cwd}',
  38. '',
  39. 'Prefetches:',
  40. *(f'- {prefetch.name}: {prefetch.detail}' for prefetch in self.prefetches),
  41. '',
  42. 'Deferred init:',
  43. *self.deferred_init.as_lines(),
  44. ]
  45. return '\n'.join(lines)
  46. def build_workspace_setup() -> WorkspaceSetup:
  47. return WorkspaceSetup(
  48. python_version='.'.join(str(part) for part in sys.version_info[:3]),
  49. implementation=platform.python_implementation(),
  50. platform_name=platform.platform(),
  51. )
  52. def run_setup(cwd: Path | None = None, trusted: bool = True) -> SetupReport:
  53. root = cwd or Path(__file__).resolve().parent.parent
  54. prefetches = [
  55. start_mdm_raw_read(),
  56. start_keychain_prefetch(),
  57. start_project_scan(root),
  58. ]
  59. return SetupReport(
  60. setup=build_workspace_setup(),
  61. prefetches=tuple(prefetches),
  62. deferred_init=run_deferred_init(trusted=trusted),
  63. trusted=trusted,
  64. cwd=root,
  65. )