Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v4

Expand Down
24 changes: 22 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,31 @@ install: ## Install dependencies and pre-commit hooks
git config --global --unset-all core.hooksPath 2>/dev/null || true
uv run pre-commit install

test: ## Run tests
PYTHON_VERSIONS := 3.10 3.11 3.12 3.13 3.14

test: ## Run tests (PY=all for all versions, PY=3.x for specific version)
ifeq ($(PY),all)
@for ver in $(PYTHON_VERSIONS); do \
echo "=== Python $$ver ==="; \
uv run --python $$ver --all-extras pytest tests/ -v -n auto || exit 1; \
done
else ifdef PY
uv run --python $(PY) --all-extras pytest tests/ -v -n auto
else
uv run --all-extras pytest tests/ -v -n auto
endif

coverage: ## Run tests with coverage report (terminal + HTML)
coverage: ## Run tests with coverage (PY=all for all versions, PY=3.x for specific version)
ifeq ($(PY),all)
@for ver in $(PYTHON_VERSIONS); do \
echo "=== Python $$ver ==="; \
uv run --python $$ver --all-extras pytest tests/ -n auto --cov --cov-report=term-missing --cov-report=html || exit 1; \
done
else ifdef PY
uv run --python $(PY) --all-extras pytest tests/ -n auto --cov --cov-report=term-missing --cov-report=html
else
uv run --all-extras pytest tests/ -n auto --cov --cov-report=term-missing --cov-report=html
endif
@echo "HTML report: htmlcov/index.html"

lint: ## Run linters
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ classifiers = [
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dependencies = [
"anthropic>=0.40",
Expand Down
4 changes: 2 additions & 2 deletions src/iac_code/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
__version__ = "0.1.2"
__release_date__ = "2026-05-18"
__version__ = "0.2.0"
__release_date__ = "2026-05-20"
12 changes: 8 additions & 4 deletions tests/acp/test_http_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,15 +375,17 @@ async def test_open_access_when_no_token_set(self, app):
class TestMemoryTransport:
"""E13-E16: _MemoryTransport write, is_closing, close, get_extra_info."""

def test_write_feeds_data_to_reader(self):
@pytest.mark.asyncio
async def test_write_feeds_data_to_reader(self):
"""E13: write() feeds bytes into the reader."""
reader = asyncio.StreamReader()
transport = _MemoryTransport(reader)
transport.write(b"hello")
# The data should be buffered in the reader
assert reader._buffer == b"hello" # noqa: SLF001

def test_write_ignored_when_closing(self):
@pytest.mark.asyncio
async def test_write_ignored_when_closing(self):
"""E14: write() is a no-op after close()."""
reader = asyncio.StreamReader()
transport = _MemoryTransport(reader)
Expand All @@ -392,15 +394,17 @@ def test_write_ignored_when_closing(self):
# Buffer should be empty (only EOF fed)
assert b"should-be-ignored" not in reader._buffer # noqa: SLF001

def test_is_closing_reflects_state(self):
@pytest.mark.asyncio
async def test_is_closing_reflects_state(self):
"""E15: is_closing() returns False initially, True after close()."""
reader = asyncio.StreamReader()
transport = _MemoryTransport(reader)
assert transport.is_closing() is False
transport.close()
assert transport.is_closing() is True

def test_get_extra_info_returns_default(self):
@pytest.mark.asyncio
async def test_get_extra_info_returns_default(self):
"""E16: get_extra_info() always returns the provided default."""
reader = asyncio.StreamReader()
transport = _MemoryTransport(reader)
Expand Down
Loading