Skip to content

Commit c44e4be

Browse files
committed
docs: update all version references to 0.2.0-M7, add changelog entry
1 parent d8494cd commit c44e4be

12 files changed

Lines changed: 48 additions & 23 deletions

File tree

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
66

77
---
88

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
30+
31+
---
32+
933
## v0.2.0-M6 (2026-02-19)
1034

1135
### Fixed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<a href="https://github.com/fireflyframework"><img src="https://img.shields.io/badge/Firefly_Framework-official-ff6600?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyeiIvPjwvc3ZnPg==" alt="Firefly Framework"></a>
1212
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.12%2B-blue?logo=python&logoColor=white" alt="Python 3.12+"></a>
1313
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="License: Apache 2.0"></a>
14-
<a href="#"><img src="https://img.shields.io/badge/version-0.2.0--M6-yellow" alt="Version: 0.2.0-M6"></a>
14+
<a href="#"><img src="https://img.shields.io/badge/version-0.2.0--M7-yellow" alt="Version: 0.2.0-M7"></a>
1515
<a href="#"><img src="https://img.shields.io/badge/type--checked-mypy%20strict-blue?logo=python&logoColor=white" alt="Type Checked: mypy strict"></a>
1616
<a href="#"><img src="https://img.shields.io/badge/code%20style-ruff-purple?logo=ruff&logoColor=white" alt="Code Style: Ruff"></a>
1717
<a href="#"><img src="https://img.shields.io/badge/async-first-brightgreen" alt="Async First"></a>
@@ -304,13 +304,13 @@ my-addon = "my_package.auto_configuration:MyAutoConfiguration"
304304

305305
```bash
306306
# Install the latest release
307-
pip install "pyfly @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a6-py3-none-any.whl"
307+
pip install "pyfly @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a7-py3-none-any.whl"
308308
309309
# Install with specific extras
310-
pip install "pyfly[web,data-relational,cache] @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a6-py3-none-any.whl"
310+
pip install "pyfly[web,data-relational,cache] @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a7-py3-none-any.whl"
311311
312312
# Or with uv
313-
uv pip install "pyfly @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a6-py3-none-any.whl"
313+
uv pip install "pyfly @ https://github.com/fireflyframework/pyfly/releases/latest/download/pyfly-0.2.0a7-py3-none-any.whl"
314314
```
315315

316316
### One-Line Install (CLI + Framework)
@@ -592,21 +592,21 @@ PyFly follows the same versioning system as Spring Boot, based on **Semantic Ver
592592
| Stage | Format | Description |
593593
|-------|--------|-------------|
594594
| **SNAPSHOT** | `0.2.0-SNAPSHOT` | Active development build. Unstable, changes daily. |
595-
| **Milestone** | `0.2.0-M6` | Pre-release feature preview. New functionality available for early feedback. |
595+
| **Milestone** | `0.2.0-M7` | Pre-release feature preview. New functionality available for early feedback. |
596596
| **Release Candidate** | `0.2.0-RC1` | Feature-complete. Only bug fixes from this point. |
597597
| **GA** | `0.2.0` | General Availability. Production-ready, fully tested and stable. |
598598
599599
**Release lifecycle:** `SNAPSHOT` → `M1` → `M2` → ... → `RC1` → `RC2` → ... → `GA`
600600
601-
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.
602602
603603
---
604604
605605
## Changelog
606606
607607
See **[CHANGELOG.md](CHANGELOG.md)** for detailed release notes.
608608
609-
**Current:** 0.2.0-M6 (2026-02-19) — ASGI pathsend extension fix for Granian in WebFilterChainMiddleware.
609+
**Current:** 0.2.0-M7 (2026-02-19) — Comprehensive audit: bug fixes, WebSocket, OAuth2, session management, i18n, XML serialization.
610610
611611
---
612612

ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ PyFly's roadmap is driven by achieving feature parity with the full [Firefly Fra
44

55
---
66

7-
## Current State (v0.2.0-M6)
7+
## Current State (v0.2.0-M7)
88

99
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.
1010

docs/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ Missing optional tools are shown with a `-` dash indicator (dimmed), while missi
645645
Verifies that PyFly itself is importable and displays the installed version:
646646

647647
```
648-
✓ pyfly v0.2.0-M6
648+
✓ pyfly v0.2.0-M7
649649
```
650650

651651
### Summary

docs/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ ______ ___.__._/ ____\ | ___.__.
470470
| __// ____| |__| |____/ ____|
471471
|__| \/ \/
472472
473-
PyFly v0.2.0-M6 | Python 3.12.0
473+
PyFly v0.2.0-M7 | Python 3.12.0
474474
475475
2026-01-15T10:30:00Z [info] starting_application app=my-service version=0.1.0
476476
2026-01-15T10:30:00Z [info] no_active_profiles message=No active profiles set, falling back to default

docs/installation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ PyFly Doctor
472472
✓ mypy — Type checker
473473
474474
PyFly packages:
475-
✓ pyfly v0.2.0-M6
475+
✓ pyfly v0.2.0-M7
476476
477477
All checks passed!
478478
```

docs/modules/core.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ class BannerMode(enum.Enum):
536536
| Mode | Behavior |
537537
|---|---|
538538
| `TEXT` | Full ASCII art banner (default) with a framework version line. |
539-
| `MINIMAL` | Single line: `:: PyFly :: (v0.2.0-M6)` |
539+
| `MINIMAL` | Single line: `:: PyFly :: (v0.2.0-M7)` |
540540
| `OFF` | No banner output at all. |
541541

542542
### BannerPrinter Class
@@ -577,7 +577,7 @@ ______ ___.__._/ ____\ | ___.__.
577577
| __// ____| |__| |____/ ____|
578578
|__| \/ \/
579579
580-
:: PyFly Framework :: (v0.2.0-M6)
580+
:: PyFly Framework :: (v0.2.0-M7)
581581
```
582582

583583
### Custom Banner Files

docs/versioning.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ All PyFly versions follow the `MAJOR.MINOR.PATCH` scheme:
1212
- **MINOR** — New functionality in a backward-compatible manner
1313
- **PATCH** — Backward-compatible bug fixes
1414

15-
Pre-release versions append a stage suffix: `0.2.0-M6`, `0.2.0-RC1`.
15+
Pre-release versions append a stage suffix: `0.2.0-M7`, `0.2.0-RC1`.
1616

1717
---
1818

@@ -40,7 +40,7 @@ SNAPSHOT versions represent the bleeding edge of development. They are rebuilt f
4040

4141
| | |
4242
|-|-|
43-
| **Format** | `X.Y.Z-MN` (e.g., `0.1.0-M1`, `0.2.0-M6`) |
43+
| **Format** | `X.Y.Z-MN` (e.g., `0.1.0-M1`, `0.2.0-M7`) |
4444
| **Stability** | Pre-release — APIs may still change |
4545
| **Purpose** | Feature previews and early feedback |
4646
| **Audience** | Developers evaluating upcoming features |
@@ -78,18 +78,19 @@ Python packaging standards ([PEP 440](https://peps.python.org/pep-0440/)) use a
7878
| PyFly (Spring Boot Style) | PEP 440 (`pyproject.toml`) | Example |
7979
|---------------------------|---------------------------|---------|
8080
| `0.2.0-SNAPSHOT` | `0.2.0.dev1` | Development |
81-
| `0.2.0-M6` | `0.2.0a6` | Milestone 6 |
81+
| `0.2.0-M7` | `0.2.0a7` | Milestone 7 |
8282
| `0.2.0-RC1` | `0.2.0rc1` | Release Candidate 1 |
8383
| `0.2.0` (GA) | `0.2.0` | General Availability |
8484

85-
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).
8686

8787
---
8888

8989
## Version History
9090

9191
| Version | Date | Stage | Highlights |
9292
|---------|------|-------|------------|
93+
| `0.2.0-M7` | 2026-02-19 | Milestone | Comprehensive audit: WebSocket, OAuth2, session, i18n, XML, bug fixes |
9394
| `0.2.0-M6` | 2026-02-19 | Milestone | ASGI pathsend extension fix for Granian |
9495
| `0.2.0-M5` | 2026-02-19 | Milestone | Auto-configuration audit (8 new auto-config classes), stdlib logging fallback, post-processor deduplication |
9596
| `0.2.0-M4` | 2026-02-18 | Milestone | Admin dashboard overhaul, pure ASGI middleware (anyio fix), built-in metrics, bean categories, mapping/trace/logger enhancements |
@@ -112,7 +113,7 @@ See **[CHANGELOG.md](../CHANGELOG.md)** for detailed release notes.
112113

113114
```python
114115
import pyfly
115-
print(pyfly.__version__) # e.g., "0.2.0-M6"
116+
print(pyfly.__version__) # e.g., "0.2.0-M7"
116117
```
117118

118119
**CLI:**
@@ -131,7 +132,7 @@ ______ ___.__._/ ____\ | ___.__.
131132
| __// ____| |__| |____/ ____|
132133
|__| \/ \/
133134
134-
:: PyFly Framework :: (v0.2.0-M6) (Python 3.13.9)
135+
:: PyFly Framework :: (v0.2.0-M7) (Python 3.13.9)
135136
Copyright 2026 Firefly Software Solutions Inc. | Apache License 2.0
136137
```
137138

install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ set -euo pipefail
2626

2727
# ── Constants ──────────────────────────────────────────────────────────────────
2828

29-
PYFLY_VERSION="0.2.0-M6"
29+
PYFLY_VERSION="0.2.0-M7"
3030
PYFLY_REPO="https://github.com/fireflyframework/pyfly.git"
3131
DEFAULT_INSTALL_DIR="$HOME/.pyfly"
3232
MIN_PYTHON_MAJOR=3

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "pyfly"
7-
version = "0.2.0a6"
7+
version = "0.2.0a7"
88
description = "The official Python implementation of the Firefly Framework — DI, CQRS, EDA, hexagonal architecture, and more."
99
readme = "README.md"
1010
license = "Apache-2.0"

0 commit comments

Comments
 (0)