edumatcher 0.1.5__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.
- edumatcher-0.1.5/PKG-INFO +146 -0
- edumatcher-0.1.5/README.md +124 -0
- edumatcher-0.1.5/pyproject.toml +159 -0
- edumatcher-0.1.5/src/edumatcher/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/ai_trader/__init__.py +5 -0
- edumatcher-0.1.5/src/edumatcher/ai_trader/main.py +475 -0
- edumatcher-0.1.5/src/edumatcher/ai_trader/personality.py +91 -0
- edumatcher-0.1.5/src/edumatcher/ai_trader/swarm.py +202 -0
- edumatcher-0.1.5/src/edumatcher/audit/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/audit/main.py +126 -0
- edumatcher-0.1.5/src/edumatcher/board/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/board/main.py +261 -0
- edumatcher-0.1.5/src/edumatcher/clearing/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/clearing/main.py +262 -0
- edumatcher-0.1.5/src/edumatcher/commands/__init__.py +16 -0
- edumatcher-0.1.5/src/edumatcher/commands/cli.py +261 -0
- edumatcher-0.1.5/src/edumatcher/commands/client.py +450 -0
- edumatcher-0.1.5/src/edumatcher/commands/console.py +757 -0
- edumatcher-0.1.5/src/edumatcher/config.py +37 -0
- edumatcher-0.1.5/src/edumatcher/engine/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/engine/auction.py +185 -0
- edumatcher-0.1.5/src/edumatcher/engine/circuit_breaker.py +119 -0
- edumatcher-0.1.5/src/edumatcher/engine/collar.py +139 -0
- edumatcher-0.1.5/src/edumatcher/engine/config_loader.py +896 -0
- edumatcher-0.1.5/src/edumatcher/engine/drop_copy.py +194 -0
- edumatcher-0.1.5/src/edumatcher/engine/main.py +2898 -0
- edumatcher-0.1.5/src/edumatcher/engine/order_book.py +1134 -0
- edumatcher-0.1.5/src/edumatcher/engine/persistence.py +113 -0
- edumatcher-0.1.5/src/edumatcher/gateway/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/gateway/main.py +1221 -0
- edumatcher-0.1.5/src/edumatcher/messaging/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/messaging/bus.py +67 -0
- edumatcher-0.1.5/src/edumatcher/models/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/models/clock.py +35 -0
- edumatcher-0.1.5/src/edumatcher/models/combo.py +172 -0
- edumatcher-0.1.5/src/edumatcher/models/instrument.py +25 -0
- edumatcher-0.1.5/src/edumatcher/models/message.py +726 -0
- edumatcher-0.1.5/src/edumatcher/models/mm_obligation.py +47 -0
- edumatcher-0.1.5/src/edumatcher/models/order.py +240 -0
- edumatcher-0.1.5/src/edumatcher/models/participant.py +26 -0
- edumatcher-0.1.5/src/edumatcher/models/price.py +98 -0
- edumatcher-0.1.5/src/edumatcher/models/quote.py +110 -0
- edumatcher-0.1.5/src/edumatcher/models/session.py +51 -0
- edumatcher-0.1.5/src/edumatcher/models/trade.py +111 -0
- edumatcher-0.1.5/src/edumatcher/orders/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/orders/main.py +200 -0
- edumatcher-0.1.5/src/edumatcher/py.typed +0 -0
- edumatcher-0.1.5/src/edumatcher/scheduler/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/scheduler/main.py +194 -0
- edumatcher-0.1.5/src/edumatcher/stats/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/stats/main.py +473 -0
- edumatcher-0.1.5/src/edumatcher/ticker/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/ticker/main.py +335 -0
- edumatcher-0.1.5/src/edumatcher/viewer/__init__.py +0 -0
- edumatcher-0.1.5/src/edumatcher/viewer/main.py +160 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: edumatcher
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: Educational multi-process trading system with order matching
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: finance,exchange,matching-engine,trading,education,learning,order-matching,market-microstructure
|
|
7
|
+
Author: Johan Persson
|
|
8
|
+
Author-email: johan162@gmail.com
|
|
9
|
+
Requires-Python: >=3.13,<4.0
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Requires-Dist: orjson (>=3.11.9,<4.0.0)
|
|
15
|
+
Requires-Dist: prompt_toolkit (>=3.0,<4.0)
|
|
16
|
+
Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
|
|
17
|
+
Requires-Dist: pyzmq (>=27.1.0,<28.0.0)
|
|
18
|
+
Requires-Dist: rich (>=15.0.0,<16.0.0)
|
|
19
|
+
Project-URL: Repository, https://github.com/johan162/EduMatcher
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# EduMatcher
|
|
23
|
+
|
|
24
|
+
**Learn how real trading systems work. Build it from first principles.**
|
|
25
|
+
|
|
26
|
+
| Category | Link |
|
|
27
|
+
| ----------------- | ------------ |
|
|
28
|
+
| **Package** | [](https://pypi.org/project/edumatcher/) [](https://www.python.org/downloads/) |
|
|
29
|
+
| **Documentation** | [](https://johan162.github.io/EduMatcher/) |
|
|
30
|
+
| **License** | [](https://opensource.org/licenses/MIT) |
|
|
31
|
+
| **Release** | [](https://github.com/johan162/edumatcher/releases) |
|
|
32
|
+
| **CI/CD** | [](coverage.svg) |
|
|
33
|
+
| **Code Quality** | [](https://github.com/psf/black) [](https://mypy-lang.org/) [](https://flake8.pycqa.org/) |
|
|
34
|
+
| Repo URL | [](https://github.com/johan162/edumatcher) |
|
|
35
|
+
|
|
36
|
+
EduMatcher is an educational trading system that teaches market microstructure,
|
|
37
|
+
matching logic, and exchange architecture through runnable code.
|
|
38
|
+
|
|
39
|
+
Unlike toy examples, it is designed to be both understandable and fast.
|
|
40
|
+
|
|
41
|
+
## Why EduMatcher?
|
|
42
|
+
|
|
43
|
+
- Real exchange mechanics: order books, auctions, clearing, and risk controls
|
|
44
|
+
- Multi-process architecture: gateway, engine, audit, clearing, stats, and tooling
|
|
45
|
+
- Performance-aware implementation: ~60,000 orders/second with microsecond latency
|
|
46
|
+
- Practical protocol design: ALF (ALmost Fix) command language for gateway order entry
|
|
47
|
+
- Strong engineering discipline: type hints, linting, and high test coverage
|
|
48
|
+
|
|
49
|
+
## Key Features
|
|
50
|
+
|
|
51
|
+
- Complete lifecycle: order entry, matching, clearing, and audit trail
|
|
52
|
+
- Rich order support: MARKET, LIMIT, STOP, STOP_LIMIT, IOC/FOK, ICEBERG, combo, OCO
|
|
53
|
+
- Market mechanisms: opening/closing auctions and circuit breakers
|
|
54
|
+
- Config-driven behavior via `engine_config.yaml` which acts as reference data for EduMatcher
|
|
55
|
+
- Message-based process boundaries with strong observability
|
|
56
|
+
- Implement real risk controls such as prioce-collar, kill-switch, circuit-breaker, and mass-cancel
|
|
57
|
+
|
|
58
|
+
## Key Limitations
|
|
59
|
+
|
|
60
|
+
- No spread-order books
|
|
61
|
+
- No implied (synthetic) orders
|
|
62
|
+
- No primary-secondary site failover
|
|
63
|
+
- No load balancing
|
|
64
|
+
- Limited replay for participants that lose the connection
|
|
65
|
+
- No index calculations
|
|
66
|
+
|
|
67
|
+
## Performance
|
|
68
|
+
|
|
69
|
+
EduMatcher does not aim to match venues like NYSE or LSE, but it is still
|
|
70
|
+
fast for a pure Python educational project.
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### Latency (engine-only, n=1,000 each)
|
|
74
|
+
|
|
75
|
+
| Order type | min (µs) | median (µs) | P80 (µs) | P90 (µs) | max (µs) |
|
|
76
|
+
| ---------- | -------: | ----------: | -------: | -------: | -------: |
|
|
77
|
+
| Limit | 8.1 | 8.5 | 9.6 | 10.0 | 18 |
|
|
78
|
+
| Market | 8.1 | 8.5 | 8.8 | 9.3 | 45 |
|
|
79
|
+
|
|
80
|
+
### Throughput
|
|
81
|
+
|
|
82
|
+
| Metric | Value |
|
|
83
|
+
| ------------- | --------------------------------------------------- |
|
|
84
|
+
| **Max TPS** | ~60,000 orders/second |
|
|
85
|
+
| **Order mix** | 20% Market, 30% aggressive Limit, 50% passive Limit |
|
|
86
|
+
|
|
87
|
+
*Performance note:* price-collar and circuit-breaker checks run in the hot path
|
|
88
|
+
for every match. They are required for realistic risk control and add measurable cost.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
## Explore the Code
|
|
93
|
+
|
|
94
|
+
Start with these key areas:
|
|
95
|
+
|
|
96
|
+
- **[src/edumatcher/engine/](src/edumatcher/engine/)** — Core matching logic and order book
|
|
97
|
+
- **[src/edumatcher/gateway/](src/edumatcher/gateway/)** — Message handling and order validation
|
|
98
|
+
- **[src/edumatcher/clearing/](src/edumatcher/clearing/)** — Trade settlement and P&L calculation
|
|
99
|
+
|
|
100
|
+
## Documentation
|
|
101
|
+
|
|
102
|
+
Full docs: [EduMatcher Documentation](https://johan162.github.io/edumatcher/)
|
|
103
|
+
|
|
104
|
+
Additional references:
|
|
105
|
+
|
|
106
|
+
- [How an Exchange Works](https://johan162.github.io/how-exchange-works/). This is a generic
|
|
107
|
+
document meant for SW developers with no previous financial experience. Reading this document
|
|
108
|
+
will give the necessary background both in finance and the core workings of an exchange.
|
|
109
|
+
- [ALF Protocol Appendix](https://johan162.github.io/user-guide/20-app-alf-protocol.md). `ALF`
|
|
110
|
+
is the Gatewauy human protocol used to send in orders vi the `ALF` gateway. It is a drastically
|
|
111
|
+
simplified `FIX` inspired protocol (`ALF` = `ALmost Fix`)
|
|
112
|
+
- [Glossary](https://johan162.github.io/glossary/). An extensiv glossary with all commonly used
|
|
113
|
+
financial terms used in these documents.
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
## Who It's For
|
|
117
|
+
|
|
118
|
+
- Computer science students learning systems design and concurrency
|
|
119
|
+
- Finance students learning market microstructure and trading mechanics
|
|
120
|
+
- Developers building exchange technology or trading systems
|
|
121
|
+
- Anyone curious about how modern markets actually work
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
## Contributing
|
|
125
|
+
|
|
126
|
+
This is an educational project. If you find bugs, improve the documentation, or make other enhancements PRs are welcome!
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
## Citation
|
|
130
|
+
|
|
131
|
+
If you use this tool in teaching or courses, please cite:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
@software{edumatcher,
|
|
135
|
+
title = {EduMatcher},
|
|
136
|
+
author = {Johan Persson},
|
|
137
|
+
year = {2026},
|
|
138
|
+
url = {https://github.com/johan162/edumatcher},
|
|
139
|
+
version = {0.1.5}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
MIT License - see [LICENSE](LICENSE).
|
|
146
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# EduMatcher
|
|
2
|
+
|
|
3
|
+
**Learn how real trading systems work. Build it from first principles.**
|
|
4
|
+
|
|
5
|
+
| Category | Link |
|
|
6
|
+
| ----------------- | ------------ |
|
|
7
|
+
| **Package** | [](https://pypi.org/project/edumatcher/) [](https://www.python.org/downloads/) |
|
|
8
|
+
| **Documentation** | [](https://johan162.github.io/EduMatcher/) |
|
|
9
|
+
| **License** | [](https://opensource.org/licenses/MIT) |
|
|
10
|
+
| **Release** | [](https://github.com/johan162/edumatcher/releases) |
|
|
11
|
+
| **CI/CD** | [](coverage.svg) |
|
|
12
|
+
| **Code Quality** | [](https://github.com/psf/black) [](https://mypy-lang.org/) [](https://flake8.pycqa.org/) |
|
|
13
|
+
| Repo URL | [](https://github.com/johan162/edumatcher) |
|
|
14
|
+
|
|
15
|
+
EduMatcher is an educational trading system that teaches market microstructure,
|
|
16
|
+
matching logic, and exchange architecture through runnable code.
|
|
17
|
+
|
|
18
|
+
Unlike toy examples, it is designed to be both understandable and fast.
|
|
19
|
+
|
|
20
|
+
## Why EduMatcher?
|
|
21
|
+
|
|
22
|
+
- Real exchange mechanics: order books, auctions, clearing, and risk controls
|
|
23
|
+
- Multi-process architecture: gateway, engine, audit, clearing, stats, and tooling
|
|
24
|
+
- Performance-aware implementation: ~60,000 orders/second with microsecond latency
|
|
25
|
+
- Practical protocol design: ALF (ALmost Fix) command language for gateway order entry
|
|
26
|
+
- Strong engineering discipline: type hints, linting, and high test coverage
|
|
27
|
+
|
|
28
|
+
## Key Features
|
|
29
|
+
|
|
30
|
+
- Complete lifecycle: order entry, matching, clearing, and audit trail
|
|
31
|
+
- Rich order support: MARKET, LIMIT, STOP, STOP_LIMIT, IOC/FOK, ICEBERG, combo, OCO
|
|
32
|
+
- Market mechanisms: opening/closing auctions and circuit breakers
|
|
33
|
+
- Config-driven behavior via `engine_config.yaml` which acts as reference data for EduMatcher
|
|
34
|
+
- Message-based process boundaries with strong observability
|
|
35
|
+
- Implement real risk controls such as prioce-collar, kill-switch, circuit-breaker, and mass-cancel
|
|
36
|
+
|
|
37
|
+
## Key Limitations
|
|
38
|
+
|
|
39
|
+
- No spread-order books
|
|
40
|
+
- No implied (synthetic) orders
|
|
41
|
+
- No primary-secondary site failover
|
|
42
|
+
- No load balancing
|
|
43
|
+
- Limited replay for participants that lose the connection
|
|
44
|
+
- No index calculations
|
|
45
|
+
|
|
46
|
+
## Performance
|
|
47
|
+
|
|
48
|
+
EduMatcher does not aim to match venues like NYSE or LSE, but it is still
|
|
49
|
+
fast for a pure Python educational project.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
### Latency (engine-only, n=1,000 each)
|
|
53
|
+
|
|
54
|
+
| Order type | min (µs) | median (µs) | P80 (µs) | P90 (µs) | max (µs) |
|
|
55
|
+
| ---------- | -------: | ----------: | -------: | -------: | -------: |
|
|
56
|
+
| Limit | 8.1 | 8.5 | 9.6 | 10.0 | 18 |
|
|
57
|
+
| Market | 8.1 | 8.5 | 8.8 | 9.3 | 45 |
|
|
58
|
+
|
|
59
|
+
### Throughput
|
|
60
|
+
|
|
61
|
+
| Metric | Value |
|
|
62
|
+
| ------------- | --------------------------------------------------- |
|
|
63
|
+
| **Max TPS** | ~60,000 orders/second |
|
|
64
|
+
| **Order mix** | 20% Market, 30% aggressive Limit, 50% passive Limit |
|
|
65
|
+
|
|
66
|
+
*Performance note:* price-collar and circuit-breaker checks run in the hot path
|
|
67
|
+
for every match. They are required for realistic risk control and add measurable cost.
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## Explore the Code
|
|
72
|
+
|
|
73
|
+
Start with these key areas:
|
|
74
|
+
|
|
75
|
+
- **[src/edumatcher/engine/](src/edumatcher/engine/)** — Core matching logic and order book
|
|
76
|
+
- **[src/edumatcher/gateway/](src/edumatcher/gateway/)** — Message handling and order validation
|
|
77
|
+
- **[src/edumatcher/clearing/](src/edumatcher/clearing/)** — Trade settlement and P&L calculation
|
|
78
|
+
|
|
79
|
+
## Documentation
|
|
80
|
+
|
|
81
|
+
Full docs: [EduMatcher Documentation](https://johan162.github.io/edumatcher/)
|
|
82
|
+
|
|
83
|
+
Additional references:
|
|
84
|
+
|
|
85
|
+
- [How an Exchange Works](https://johan162.github.io/how-exchange-works/). This is a generic
|
|
86
|
+
document meant for SW developers with no previous financial experience. Reading this document
|
|
87
|
+
will give the necessary background both in finance and the core workings of an exchange.
|
|
88
|
+
- [ALF Protocol Appendix](https://johan162.github.io/user-guide/20-app-alf-protocol.md). `ALF`
|
|
89
|
+
is the Gatewauy human protocol used to send in orders vi the `ALF` gateway. It is a drastically
|
|
90
|
+
simplified `FIX` inspired protocol (`ALF` = `ALmost Fix`)
|
|
91
|
+
- [Glossary](https://johan162.github.io/glossary/). An extensiv glossary with all commonly used
|
|
92
|
+
financial terms used in these documents.
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
## Who It's For
|
|
96
|
+
|
|
97
|
+
- Computer science students learning systems design and concurrency
|
|
98
|
+
- Finance students learning market microstructure and trading mechanics
|
|
99
|
+
- Developers building exchange technology or trading systems
|
|
100
|
+
- Anyone curious about how modern markets actually work
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## Contributing
|
|
104
|
+
|
|
105
|
+
This is an educational project. If you find bugs, improve the documentation, or make other enhancements PRs are welcome!
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
## Citation
|
|
109
|
+
|
|
110
|
+
If you use this tool in teaching or courses, please cite:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
@software{edumatcher,
|
|
114
|
+
title = {EduMatcher},
|
|
115
|
+
author = {Johan Persson},
|
|
116
|
+
year = {2026},
|
|
117
|
+
url = {https://github.com/johan162/edumatcher},
|
|
118
|
+
version = {0.1.5}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## License
|
|
123
|
+
|
|
124
|
+
MIT License - see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Setup poetry configuration
|
|
2
|
+
# poetry config virtualenvs.in-project true
|
|
3
|
+
# poetry install --with dev,docs
|
|
4
|
+
|
|
5
|
+
[build-system]
|
|
6
|
+
requires = ["poetry-core"]
|
|
7
|
+
build-backend = "poetry.core.masonry.api"
|
|
8
|
+
|
|
9
|
+
[tool.poetry]
|
|
10
|
+
name = "edumatcher"
|
|
11
|
+
version = "0.1.5"
|
|
12
|
+
description = "Educational multi-process trading system with order matching"
|
|
13
|
+
authors = ["Johan Persson <johan162@gmail.com>"]
|
|
14
|
+
readme = "README.md"
|
|
15
|
+
packages = [{include = "edumatcher", from = "src"}]
|
|
16
|
+
keywords = ["finance", "exchange", "matching-engine", "trading", "education", "learning", "order-matching", "market-microstructure"]
|
|
17
|
+
license = "MIT"
|
|
18
|
+
repository = "https://github.com/johan162/EduMatcher"
|
|
19
|
+
|
|
20
|
+
[tool.poetry.dependencies]
|
|
21
|
+
python = "^3.13"
|
|
22
|
+
pyzmq = "^27.1.0"
|
|
23
|
+
rich = "^15.0.0"
|
|
24
|
+
prompt_toolkit = "^3.0"
|
|
25
|
+
pyyaml = "^6.0.3"
|
|
26
|
+
orjson = "^3.11.9"
|
|
27
|
+
|
|
28
|
+
[tool.poetry.group.dev.dependencies]
|
|
29
|
+
mkdocs = "^1.6"
|
|
30
|
+
mkdocs-material = "^9.0"
|
|
31
|
+
pytest = "^9.0.3"
|
|
32
|
+
types-PyYAML = "^6.0"
|
|
33
|
+
pytest-cov = "^7.1.0"
|
|
34
|
+
pytest-xdist = ">=3.8.0"
|
|
35
|
+
twine = ">=6.2.0"
|
|
36
|
+
types-tabulate = "^0.10.0.20260308"
|
|
37
|
+
pyright = "^1.1.409"
|
|
38
|
+
flake8 = "^7.3.0"
|
|
39
|
+
black = "^26.3.1"
|
|
40
|
+
mypy = "^1.20.2"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
[tool.poetry.group.docs.dependencies]
|
|
45
|
+
mkdocs = ">=1.5.0"
|
|
46
|
+
mkdocs-material = ">=9.7.6"
|
|
47
|
+
mkdocstrings = {extras = ["python"], version = ">=0.22.0"}
|
|
48
|
+
|
|
49
|
+
[tool.poetry.scripts]
|
|
50
|
+
pm-engine = "edumatcher.engine.main:main"
|
|
51
|
+
pm-gateway = "edumatcher.gateway.main:main"
|
|
52
|
+
pm-viewer = "edumatcher.viewer.main:main"
|
|
53
|
+
pm-board = "edumatcher.board.main:main"
|
|
54
|
+
pm-orders = "edumatcher.orders.main:main"
|
|
55
|
+
pm-audit = "edumatcher.audit.main:main"
|
|
56
|
+
pm-clearing = "edumatcher.clearing.main:main"
|
|
57
|
+
pm-stats = "edumatcher.stats.main:main"
|
|
58
|
+
pm-ticker = "edumatcher.ticker.main:main"
|
|
59
|
+
pm-scheduler = "edumatcher.scheduler.main:main"
|
|
60
|
+
pm-ai-trader = "edumatcher.ai_trader.main:main"
|
|
61
|
+
pm-admin = "edumatcher.commands.console:main"
|
|
62
|
+
pm-admin-cli = "edumatcher.commands.cli:main"
|
|
63
|
+
pm-ai-swarm = "edumatcher.ai_trader.swarm:main"
|
|
64
|
+
|
|
65
|
+
[tool.pytest.ini_options]
|
|
66
|
+
testpaths = ["tests"]
|
|
67
|
+
python_files = ["test_*.py"]
|
|
68
|
+
python_classes = ["Test*"]
|
|
69
|
+
python_functions = ["test_*"]
|
|
70
|
+
markers = [
|
|
71
|
+
"perf: performance / benchmarking tests (deselect with '-m not perf')",
|
|
72
|
+
]
|
|
73
|
+
addopts = [
|
|
74
|
+
"--strict-markers",
|
|
75
|
+
"-m",
|
|
76
|
+
"not heavy and not probabilistic and not probabilistic_full",
|
|
77
|
+
"--cov=edumatcher",
|
|
78
|
+
"--cov-report=term-missing",
|
|
79
|
+
"--cov-report=html",
|
|
80
|
+
"--cov-report=xml",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[tool.coverage.run]
|
|
84
|
+
source = ["src"]
|
|
85
|
+
omit = ["*/tests/*", "*/test_*.py"]
|
|
86
|
+
|
|
87
|
+
[tool.coverage.report]
|
|
88
|
+
exclude_lines = [
|
|
89
|
+
"pragma: no cover",
|
|
90
|
+
"def __repr__",
|
|
91
|
+
"raise AssertionError",
|
|
92
|
+
"raise NotImplementedError",
|
|
93
|
+
"if __name__ == .__main__.:",
|
|
94
|
+
"if TYPE_CHECKING:",
|
|
95
|
+
"class .*\\bProtocol\\):",
|
|
96
|
+
"@(abc\\.)?abstractmethod",
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
[tool.black]
|
|
100
|
+
line-length = 88
|
|
101
|
+
target-version = ["py313"]
|
|
102
|
+
|
|
103
|
+
[tool.mypy]
|
|
104
|
+
python_version = "3.13"
|
|
105
|
+
strict = true
|
|
106
|
+
warn_return_any = true
|
|
107
|
+
warn_unused_configs = true
|
|
108
|
+
disallow_untyped_defs = true
|
|
109
|
+
disallow_untyped_calls = true
|
|
110
|
+
disallow_any_generics = true
|
|
111
|
+
disallow_incomplete_defs = true
|
|
112
|
+
check_untyped_defs = true
|
|
113
|
+
no_implicit_optional = true
|
|
114
|
+
warn_redundant_casts = true
|
|
115
|
+
warn_unused_ignores = true
|
|
116
|
+
warn_no_return = true
|
|
117
|
+
show_error_codes = true
|
|
118
|
+
|
|
119
|
+
[[tool.mypy.overrides]]
|
|
120
|
+
module = "yaml"
|
|
121
|
+
ignore_missing_imports = true
|
|
122
|
+
|
|
123
|
+
[[tool.mypy.overrides]]
|
|
124
|
+
module = "scipy.*"
|
|
125
|
+
ignore_missing_imports = true
|
|
126
|
+
|
|
127
|
+
[[tool.mypy.overrides]]
|
|
128
|
+
module = "tests.*"
|
|
129
|
+
disallow_untyped_defs = false
|
|
130
|
+
disallow_untyped_calls = false
|
|
131
|
+
disallow_incomplete_defs = false
|
|
132
|
+
disallow_untyped_decorators = false
|
|
133
|
+
warn_return_any = false
|
|
134
|
+
check_untyped_defs = false
|
|
135
|
+
disable_error_code = ["arg-type", "assignment", "call-overload", "type-arg"]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
[tool.pyright]
|
|
139
|
+
pythonVersion = "3.13"
|
|
140
|
+
venvPath = "."
|
|
141
|
+
venv = ".venv"
|
|
142
|
+
typeCheckingMode = "strict"
|
|
143
|
+
reportMissingTypeStubs = false
|
|
144
|
+
reportUnknownMemberType = false
|
|
145
|
+
reportUnknownArgumentType = false
|
|
146
|
+
reportUnknownVariableType = false
|
|
147
|
+
reportUnknownParameterType = false
|
|
148
|
+
reportMissingParameterType = false
|
|
149
|
+
reportUntypedFunctionDecorator = false
|
|
150
|
+
reportUntypedBaseClass = false
|
|
151
|
+
reportUnknownLambdaType = false
|
|
152
|
+
executionEnvironments = [
|
|
153
|
+
{ root = "tests", reportPrivateUsage = false, reportUnusedVariable = false, reportUnusedFunction = false, reportUnusedImport = false, reportMissingTypeArgument = false, reportArgumentType = false, reportOptionalOperand = false, reportOptionalMemberAccess = false, reportOperatorIssue = false, reportAttributeAccessIssue = false, reportCallIssue = false, reportReturnType = false },
|
|
154
|
+
{ root = "tools", reportUnusedImport = false, reportMissingTypeArgument = false, reportArgumentType = false, reportOptionalMemberAccess = false },
|
|
155
|
+
{ root = "src" },
|
|
156
|
+
]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
File without changes
|