diff --git a/CHANGELOG.md b/CHANGELOG.md index 355cdf0..5ea5ab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.7.0] - 2026-05-21 ### Added diff --git a/SECURITY.md b/SECURITY.md index aa2e583..8301399 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,8 +6,9 @@ We release patches for security vulnerabilities for the following versions: | Version | Supported | | ------- | ------------------ | -| 1.5.x | :white_check_mark: | -| < 1.5 | :x: | +| 1.7.x | :white_check_mark: | +| 1.6.x | :white_check_mark: | +| < 1.6 | :x: | Older releases may receive a fix at maintainers' discretion when the issue is severe and an upgrade is not feasible. The latest 1.x release is always the recommended target. diff --git a/pyproject.toml b/pyproject.toml index 55ba374..865905a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "hyperping" -version = "1.6.0" +version = "1.7.0" description = "Python SDK for the Hyperping uptime monitoring and incident management API" readme = {file = "README.md", content-type = "text/markdown"} license = {text = "MIT"} @@ -51,7 +51,7 @@ Issues = "https://github.com/develeap/hyperping-python/issues" packages = ["src/hyperping"] [tool.hatch.build.targets.sdist] -exclude = [".claude/", ".github/", "dist/", "uv.lock", "BACKLOG.md"] +exclude = [".claude/", ".github/", ".worktrees/", "dist/", "docs/plans/", "uv.lock", "BACKLOG.md"] [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/src/hyperping/_version.py b/src/hyperping/_version.py index e4adfb8..14d9d2f 100644 --- a/src/hyperping/_version.py +++ b/src/hyperping/_version.py @@ -1 +1 @@ -__version__ = "1.6.0" +__version__ = "1.7.0" diff --git a/tests/unit/test_mcp_client.py b/tests/unit/test_mcp_client.py index 3de9c9d..f36e14b 100644 --- a/tests/unit/test_mcp_client.py +++ b/tests/unit/test_mcp_client.py @@ -321,20 +321,27 @@ def test_readme_contains_mcp_rate_limits_section(): ) -def test_changelog_contains_unreleased_entry(): - """CHANGELOG must contain an [Unreleased] block with Added and Fixed.""" +def test_changelog_top_section_documents_mcp_rate_limit_work(): + """CHANGELOG's most recent section (either [Unreleased] or a released + version) must document the MCP rate-limit work shipped in this change. + """ import re changelog = (_repo_root() / "CHANGELOG.md").read_text(encoding="utf-8") - assert re.search(r"^## \[Unreleased\]\s*$", changelog, re.MULTILINE), ( - "CHANGELOG is missing an '## [Unreleased]' top-level heading" - ) - # Slice the Unreleased section: from its heading up to the next ## release. + # Match the first ## heading (Unreleased or a released version) and slice + # up to the next ## heading. match = re.search( - r"^## \[Unreleased\]\s*\n(.*?)(?=^## \[)", + r"^## \[(?:Unreleased|\d+\.\d+\.\d+)\][^\n]*\n(.*?)(?=^## \[)", changelog, re.MULTILINE | re.DOTALL, ) - section = match.group(1) if match else changelog.split("## [Unreleased]", 1)[-1] - assert "### Added" in section, "Unreleased section is missing '### Added'" - assert "### Fixed" in section, "Unreleased section is missing '### Fixed'" + assert match, "CHANGELOG is missing a top '## [Unreleased]' or '## [X.Y.Z]' heading" + section = match.group(1) + assert "### Added" in section, "Top CHANGELOG section is missing '### Added'" + assert "### Fixed" in section, "Top CHANGELOG section is missing '### Fixed'" + assert "ensure_initialized" in section, ( + "Top CHANGELOG section must mention ensure_initialized()" + ) + assert "rate limit" in section.lower(), ( + "Top CHANGELOG section must mention rate-limit handling" + ) diff --git a/uv.lock b/uv.lock index 1ec0883..955afdc 100644 --- a/uv.lock +++ b/uv.lock @@ -335,7 +335,7 @@ wheels = [ [[package]] name = "hyperping" -version = "1.6.0" +version = "1.7.0" source = { editable = "." } dependencies = [ { name = "httpx" },