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
+24Lines changed: 24 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,30 @@ 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-M7 (2026-02-19)
10
+
11
+
### Added
12
+
13
+
-**WebSocket support**: New `pyfly.websocket` module with `@websocket_mapping` decorator, `WebSocketSession` wrapper, and auto-discovery in `create_app()` via `WebSocketRegistrar`
14
+
-**OAuth2 auto-configuration**: Three new auto-configuration classes — `OAuth2ResourceServerAutoConfiguration` (JWKS-based Bearer validation), `OAuth2AuthorizationServerAutoConfiguration` (token endpoint with client_credentials/refresh_token grants), `OAuth2ClientAutoConfiguration` (client registrations from config)
15
+
-**OAuth2ResourceServerFilter**: WebFilter for Bearer token validation using `JWKSTokenValidator`, with configurable exclude patterns
16
+
-**Session management**: New `pyfly.session` module with `HttpSession`, `SessionStore` Protocol, `InMemorySessionStore`, `RedisSessionStore`, `SessionFilter` middleware, and auto-configuration
17
+
-**i18n / locale support**: New `pyfly.i18n` module with `MessageSource` Protocol, `ResourceBundleMessageSource` (YAML/JSON), `AcceptHeaderLocaleResolver`, `FixedLocaleResolver`, and auto-configuration
18
+
-**XML serialization**: `dict_to_xml()` / `xml_to_dict()` converters (stdlib xml.etree), `XMLResponse` class, and content negotiation via `Accept` header in controller dispatch
19
+
-**`@controller_advice`**: New stereotype for global exception handling across all controllers, with MRO-sorted handler resolution
20
+
-**`@shell_method_availability`**: Decorator for conditional shell command registration — unavailable commands are skipped during wiring
21
+
-**`@Value` injection**: Existing `Value` descriptor now wired into `Container._inject_autowired_fields()` for config property injection
22
+
-**`EventFailureStrategy`**: Configurable strategy (LOG/RAISE) for `CommandBus` event publishing failures
23
+
24
+
### Fixed
25
+
26
+
-**InMemoryMessageBroker race condition**: Added `asyncio.Lock` to protect subscriptions and group iterators from concurrent access
27
+
-**InMemoryPersistenceAdapter race condition**: Added `asyncio.Lock` to protect saga state store from concurrent mutations
28
+
-**Background task lifecycle**: Background tasks created during startup are now tracked and cancelled on `stop()`
29
+
-**ASGI pathsend OOM risk**: Changed `read_bytes()` to chunked 64 KB streaming for large file responses
For Python packaging (PEP 440), milestone versions map to alpha pre-releases (`0.2.0a6`), 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.
601
+
For Python packaging (PEP 440), milestone versions map to alpha pre-releases (`0.2.0a7`), 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.
602
602
603
603
---
604
604
605
605
## Changelog
606
606
607
607
See **[CHANGELOG.md](CHANGELOG.md)** for detailed release notes.
608
608
609
-
**Current:** 0.2.0-M6 (2026-02-19) — ASGI pathsend extension fix for Granian in WebFilterChainMiddleware.
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-M6)
7
+
## Current State (v0.2.0-M7)
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-M6`), 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-M7`), 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).
0 commit comments