You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+26Lines changed: 26 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
7
7
---
8
8
9
+
## v0.2.0-M11 (2026-03-01)
10
+
11
+
### Fixed
12
+
-**Thread-safe singleton initialization**: DI container now uses RLock with double-check pattern to prevent duplicate singleton creation under concurrent access
13
+
-**Condition list inheritance**: `@conditional_on_*` decorators now copy conditions via `cls.__dict__` instead of `getattr()` to prevent cross-class mutation through MRO
14
+
-**`@transactional` rollback_for semantics**: Replaced `session.begin()` context manager with explicit `begin()`/`commit()`/`rollback()` to support selective rollback matching Spring's `@Transactional`
15
+
-**SecurityException status code**: Base `SecurityException` now maps to 403 (Forbidden) instead of 401; `UnauthorizedException` subclass retains 401
16
+
-**`@secure` decorator**: Authorization failures now raise `ForbiddenException` (403) instead of base `SecurityException`
17
+
-**Security context bridge**: `SecurityMiddleware` now sets `security_context` on both `request.state` and `RequestContext` for `@pre_authorize`/`@post_authorize`
18
+
-**Lazy controller race condition**: Added `asyncio.Lock` with double-check to prevent duplicate bean resolution on concurrent first requests
19
+
-**Parameter coercion errors**: `_coerce()` now raises `InvalidRequestException` (HTTP 400) instead of unhandled `ValueError`/`TypeError`
20
+
-**Bulkhead TOCTOU**: Replaced `semaphore.locked()` check with `_active >= _max_concurrent` for consistent capacity tracking
21
+
-**`asyncio.get_event_loop()`**: Replaced 3 occurrences with `get_running_loop()` to avoid deprecation warnings and ensure correct loop in nested contexts
22
+
23
+
### Changed
24
+
-**Resilience sync/async support**: All 4 resilience decorators (`@fallback`, `@rate_limiter`, `@time_limiter`, `@bulkhead`) now detect sync functions via `inspect.iscoroutinefunction` and wrap accordingly
25
+
-**Event bus optimization**: Listeners are pre-sorted at subscribe time instead of on every `publish()` call
26
+
-**Repository dynamic PK**: `find_all_by_ids()` and `delete_all()` use `_pk_column` property (via `sa_inspect`) instead of hardcoded `.id`
27
+
-**Nested repository patching**: `_patch_repositories()` now patches repositories one level deep into nested services
28
+
-**Kahn's algorithm**: `_sort_bean_methods` uses `collections.deque` instead of `list.pop(0)` for O(1) popleft
29
+
-**Auto-config logging**: `ImportError` during entry point discovery now logged at DEBUG level instead of silently swallowed
30
+
-**Exception handling**: `_inject_autowired_fields` catches `NameError` specifically (not bare `Exception`) and logs a warning
31
+
-**Filter chain**: Fast path bypasses response buffering when no filters are registered; 100MB body size guard prevents OOM
For Python packaging (PEP 440), milestone versions map to alpha pre-releases (`0.2.0a10`), release candidates map to `rc` (`0.2.0rc1`), and GA is the final release (`0.2.0`). See [docs/versioning.md](docs/versioning.md) for full details.
604
+
For Python packaging (PEP 440), milestone versions map to alpha pre-releases (`0.2.0a11`), release candidates map to `rc` (`0.2.0rc1`), and GA is the final release (`0.2.0`). See [docs/versioning.md](docs/versioning.md) for full details.
605
605
606
606
---
607
607
608
608
## Changelog
609
609
610
610
See **[CHANGELOG.md](CHANGELOG.md)** for detailed release notes.
**Current:** 0.2.0-M11 (2026-03-01) — Thread-safety, correctness, and robustness audit: 18 fixes across DI container, web layer, resilience, security, and data modules.
Copy file name to clipboardExpand all lines: ROADMAP.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ PyFly's roadmap is driven by achieving feature parity with the full [Firefly Fra
4
4
5
5
---
6
6
7
-
## Current State (v0.2.0-M10)
7
+
## Current State (v0.2.0-M11)
8
8
9
9
PyFly ships with **27 modules** covering the foundation, application, infrastructure, and cross-cutting layers. See the [Changelog](CHANGELOG.md) for full details on what's included.
The display version (`__version__` in `pyfly/__init__.py`) uses the Spring Boot format (`0.2.0-M10`), which is what you see in the startup banner, CLI output, and admin dashboard. The `pyproject.toml` version uses PEP 440 format for compatibility with Python packaging tools (pip, uv, hatchling).
85
+
The display version (`__version__` in `pyfly/__init__.py`) uses the Spring Boot format (`0.2.0-M11`), which is what you see in the startup banner, CLI output, and admin dashboard. The `pyproject.toml` version uses PEP 440 format for compatibility with Python packaging tools (pip, uv, hatchling).
86
86
87
87
---
88
88
89
89
## Version History
90
90
91
91
| Version | Date | Stage | Highlights |
92
92
|---------|------|-------|------------|
93
+
|`0.2.0-M11`| 2026-03-01 | Milestone | Thread-safety, correctness, and robustness audit: 18 fixes across DI, web, resilience, security, data |
0 commit comments