fixtureqa 0.1.4__tar.gz → 0.1.6__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 (62) hide show
  1. {fixtureqa-0.1.4/fixtureqa.egg-info → fixtureqa-0.1.6}/PKG-INFO +4 -3
  2. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/README.md +5 -6
  3. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/app.py +6 -0
  4. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/schemas.py +1 -1
  5. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/models.py +1 -1
  6. fixtureqa-0.1.4/fixture/static/assets/index-B31-1dt-.css → fixtureqa-0.1.6/fixture/static/assets/index-Dv0_KeqF.css +1 -1
  7. fixtureqa-0.1.4/fixture/static/assets/index-Cb1uGbWD.js → fixtureqa-0.1.6/fixture/static/assets/index-nUPn4WaU.js +14 -14
  8. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/static/index.html +2 -2
  9. {fixtureqa-0.1.4 → fixtureqa-0.1.6/fixtureqa.egg-info}/PKG-INFO +4 -3
  10. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixtureqa.egg-info/SOURCES.txt +6 -3
  11. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixtureqa.egg-info/requires.txt +3 -2
  12. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/pyproject.toml +8 -3
  13. fixtureqa-0.1.6/tests/test_auth.py +36 -0
  14. fixtureqa-0.1.6/tests/test_sessions.py +152 -0
  15. fixtureqa-0.1.6/tests/test_templates.py +81 -0
  16. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/LICENSE +0 -0
  17. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/__init__.py +0 -0
  18. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/__main__.py +0 -0
  19. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/__init__.py +0 -0
  20. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/connection_manager.py +0 -0
  21. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/deps.py +0 -0
  22. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/__init__.py +0 -0
  23. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/admin.py +0 -0
  24. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/auth.py +0 -0
  25. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/branding.py +0 -0
  26. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/fix_spec.py +0 -0
  27. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/messages.py +0 -0
  28. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/scenarios.py +0 -0
  29. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/sessions.py +0 -0
  30. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/setup.py +0 -0
  31. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/templates.py +0 -0
  32. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/api/routers/ws.py +0 -0
  33. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/config/__init__.py +0 -0
  34. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/__init__.py +0 -0
  35. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/auth.py +0 -0
  36. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/config_store.py +0 -0
  37. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/events.py +0 -0
  38. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/fix_application.py +0 -0
  39. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/fix_parser.py +0 -0
  40. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/fix_spec_parser.py +0 -0
  41. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/fix_tags.py +0 -0
  42. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/housekeeping.py +0 -0
  43. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/message_log.py +0 -0
  44. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/message_store.py +0 -0
  45. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/scenario_runner.py +0 -0
  46. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/scenario_store.py +0 -0
  47. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/session.py +0 -0
  48. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/session_manager.py +0 -0
  49. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/template_store.py +0 -0
  50. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/user_store.py +0 -0
  51. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/core/venue_responses.py +0 -0
  52. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/fix_specs/FIX42.xml +0 -0
  53. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/fix_specs/FIX44.xml +0 -0
  54. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/server.py +0 -0
  55. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/static/assets/ag-grid-_QKprVdm.js +0 -0
  56. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/static/assets/react-vendor-2eF0YfZT.js +0 -0
  57. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/static/favicon.svg +0 -0
  58. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixture/ui/__init__.py +0 -0
  59. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixtureqa.egg-info/dependency_links.txt +0 -0
  60. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixtureqa.egg-info/entry_points.txt +0 -0
  61. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/fixtureqa.egg-info/top_level.txt +0 -0
  62. {fixtureqa-0.1.4 → fixtureqa-0.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixtureqa
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: FIXture — FIX Protocol Testing Tool
5
5
  Requires-Python: >=3.10
6
6
  License-File: LICENSE
@@ -11,6 +11,7 @@ Requires-Dist: websockets>=12.0
11
11
  Requires-Dist: python-jose[cryptography]>=3.3.0
12
12
  Requires-Dist: passlib[bcrypt]>=1.7.4
13
13
  Provides-Extra: dev
14
- Requires-Dist: pytest; extra == "dev"
15
- Requires-Dist: httpx; extra == "dev"
14
+ Requires-Dist: pytest>=8.0; extra == "dev"
15
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
16
+ Requires-Dist: httpx>=0.27; extra == "dev"
16
17
  Dynamic: license-file
@@ -26,8 +26,8 @@ A Python FIX protocol testing tool. Supports FIX 4.2 and 4.4, dynamic session cr
26
26
  ## Requirements
27
27
 
28
28
  - Python 3.10+
29
- - [quickfix](https://pypi.org/project/quickfix/) 1.15.1
30
- - Node.js 20+ (frontend dev/build only)
29
+ - [fixcore-engine](https://pypi.org/project/fixcore-engine/) — pure Python FIX engine (no C extension, no compiler needed)
30
+ - Node.js 20+ (frontend dev/build only — not needed at runtime; Docker builds the frontend automatically)
31
31
 
32
32
  ## Quick start — Docker (recommended)
33
33
 
@@ -77,14 +77,13 @@ python -m fixture [--host HOST] [--port PORT] [--log-level LEVEL] [--log-file PA
77
77
 
78
78
  ## Architecture
79
79
 
80
- One QuickFIX engine per session, each running in its own daemon thread. This enables dynamic session creation without restarting.
80
+ One fixcore-engine transport per session, running as asyncio tasks on the same event loop as FastAPI. This enables dynamic session creation without restarting.
81
81
 
82
82
  ```
83
83
  SessionManager
84
84
  └── Session (one per FIX session)
85
- ├── FixApplication ← QuickFIX callbacks
86
- ├── SocketInitiator or SocketAcceptor
87
- └── daemon thread
85
+ ├── FixApplication ← fixcore-engine callbacks
86
+ └── SocketInitiator or SocketAcceptor (asyncio tasks)
88
87
  ```
89
88
 
90
89
  Events flow upward via an observer pattern to the FastAPI WebSocket layer and into the React UI.
@@ -25,6 +25,12 @@ async def lifespan(app: FastAPI):
25
25
  app.state.housekeeping.start()
26
26
  yield
27
27
  sm.unsubscribe(cm.sync_event_handler)
28
+ # Force-stop all running sessions so their asyncio tasks can be cancelled cleanly
29
+ for sid in list(sm._sessions.keys()):
30
+ try:
31
+ await sm.stop_session(sid, force=True)
32
+ except Exception:
33
+ pass
28
34
  sm.close() # flush SQLite writer
29
35
 
30
36
 
@@ -16,7 +16,7 @@ class SessionConfigRequest(BaseModel):
16
16
  use_file_log: bool = True
17
17
  start_time: str = "00:00:00"
18
18
  end_time: str = "00:00:00"
19
- reset_on_logon: bool = True
19
+ reset_on_logon: bool = False
20
20
  reset_on_logout: bool = False
21
21
  session_role: str = "generic" # "client", "venue", or "generic"
22
22
  auto_ack: bool = False
@@ -59,7 +59,7 @@ class SessionConfig:
59
59
  end_time: str = "00:00:00"
60
60
 
61
61
  # Sequence number reset behaviour
62
- reset_on_logon: bool = True
62
+ reset_on_logon: bool = False
63
63
  reset_on_logout: bool = False
64
64
 
65
65
  # Role / intent