irregular6612 commited on
Commit
642444a
·
1 Parent(s): f8f1ce8

feat(web): python -m proteus.web launcher

Browse files
Files changed (2) hide show
  1. proteus/web/__main__.py +29 -0
  2. tests/web/test_server.py +10 -0
proteus/web/__main__.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """`python -m proteus.web` — launch the interactive color-grid play server."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+
6
+ import proteus.grid # noqa: F401 (registers scenarios before any request)
7
+ from proteus.web.server import make_server
8
+
9
+
10
+ def main(argv: list[str] | None = None) -> int:
11
+ parser = argparse.ArgumentParser(prog="proteus.web")
12
+ parser.add_argument("--host", default="127.0.0.1")
13
+ parser.add_argument("--port", type=int, default=8000)
14
+ args = parser.parse_args(argv)
15
+
16
+ server = make_server(args.host, args.port)
17
+ host, port = server.server_address[0], server.server_address[1]
18
+ print(f"PROTEUS arena — open http://{host}:{port}/ (Ctrl-C to stop)")
19
+ try:
20
+ server.serve_forever()
21
+ except KeyboardInterrupt:
22
+ print("\nstopping.")
23
+ finally:
24
+ server.server_close()
25
+ return 0
26
+
27
+
28
+ if __name__ == "__main__":
29
+ raise SystemExit(main())
tests/web/test_server.py CHANGED
@@ -112,3 +112,13 @@ def test_finish_appends_trace_and_returns_metrics(tmp_path):
112
  assert payload["trace_path"] == str(out)
113
  assert "survival_fraction" in payload["metrics"]
114
  assert out.exists() and out.read_text().strip() # one JSONL line written
 
 
 
 
 
 
 
 
 
 
 
112
  assert payload["trace_path"] == str(out)
113
  assert "survival_fraction" in payload["metrics"]
114
  assert out.exists() and out.read_text().strip() # one JSONL line written
115
+
116
+
117
+ def test_make_server_binds_and_has_router(tmp_path):
118
+ srv = server.make_server("127.0.0.1", 0) # port 0 = ephemeral, no serve_forever
119
+ try:
120
+ assert srv.server_address[0] == "127.0.0.1"
121
+ # the bound handler carries its own fresh registry
122
+ assert isinstance(srv.RequestHandlerClass.registry, dict)
123
+ finally:
124
+ srv.server_close()