Metadata-Version: 2.4
Name: brunns-matchers
Version: 2.11.0
Summary: Custom PyHamcrest matchers
Author-email: Simon Brunning <simon@brunningonline.net>
License-Expression: MIT
Project-URL: Homepage, https://github.com/brunns/brunns-matchers/
Project-URL: Documentation, https://brunns-matchers.readthedocs.io/
Project-URL: Repository, https://github.com/brunns/brunns-matchers/
Project-URL: Issues, https://github.com/brunns/brunns-matchers/issues
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Testing
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pyhamcrest>=2.0
Requires-Dist: Deprecated>=1.2
Requires-Dist: brunns-row>=2.0
Requires-Dist: beautifulsoup4>=4.0
Requires-Dist: requests>=2.0
Requires-Dist: httpx>=0.28
Requires-Dist: yarl>=1.9
Requires-Dist: furl>=2.0
Requires-Dist: Werkzeug>=2.0
Requires-Dist: feedparser>=6.0
Requires-Dist: scripttest>=1.3
Provides-Extra: test
Requires-Dist: mockito>=1.5.5; extra == "test"
Requires-Dist: pytest>=9.0; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: contexttimer>=0.3; extra == "test"
Requires-Dist: brunns-builder>=1.1.1; extra == "test"
Requires-Dist: pytest-docker~=3.1; extra == "test"
Requires-Dist: pytest-mockito>=0.0.5; extra == "test"
Requires-Dist: mbtest~=2.14.0; extra == "test"
Provides-Extra: lint
Requires-Dist: ruff; extra == "lint"
Requires-Dist: bandit~=1.4; extra == "lint"
Requires-Dist: mypy>=1.2; extra == "lint"
Requires-Dist: types-requests; extra == "lint"
Provides-Extra: docs
Requires-Dist: sphinx>=3.0; extra == "docs"
Requires-Dist: sphinx-autodoc-typehints>=2.3; extra == "docs"
Requires-Dist: furo; extra == "docs"
Provides-Extra: dev
Requires-Dist: brunns-matchers[docs,lint,test]; extra == "dev"
Requires-Dist: mutmut; extra == "dev"
Requires-Dist: pipdeptree; extra == "dev"
Dynamic: license-file

# brunns-matchers

Various custom [PyHamcrest](https://pyhamcrest.readthedocs.io) matchers. See [the documentation](https://brunns-matchers.readthedocs.io/) for details.

[![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/)
[![Build Status](https://travis-ci.org/brunns/brunns-matchers.svg?branch=master&logo=travis)](https://travis-ci.org/brunns/brunns-matchers)
[![PyPi Version](https://img.shields.io/pypi/v/brunns-matchers.svg?logo=pypi)](https://pypi.org/project/brunns-matchers/#history)
[![Python Versions](https://img.shields.io/pypi/pyversions/brunns-matchers.svg?logo=python)](https://pypi.org/project/brunns-matchers/)
[![Licence](https://img.shields.io/github/license/brunns/brunns-matchers.svg)](https://github.com/brunns/brunns-matchers/blob/master/LICENSE)
[![GitHub all releases](https://img.shields.io/github/downloads/brunns/brunns-matchers/total.svg?logo=github)](https://github.com/brunns/brunns-matchers/releases/)
[![GitHub forks](https://img.shields.io/github/forks/brunns/brunns-matchers.svg?label=Fork&logo=github)](https://github.com/brunns/brunns-matchers/network/members)
[![GitHub stars](https://img.shields.io/github/stars/brunns/brunns-matchers.svg?label=Star&logo=github)](https://github.com/brunns/brunns-matchers/stargazers/)
[![GitHub watchers](https://img.shields.io/github/watchers/brunns/brunns-matchers.svg?label=Watch&logo=github)](https://github.com/brunns/brunns-matchers/watchers/)
[![GitHub contributors](https://img.shields.io/github/contributors/brunns/brunns-matchers.svg?logo=github)](https://github.com/brunns/brunns-matchers/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/brunns/brunns-matchers.svg?logo=github)](https://github.com/brunns/brunns-matchers/issues/)
[![GitHub issues-closed](https://img.shields.io/github/issues-closed/brunns/brunns-matchers.svg?logo=github)](https://github.com/brunns/brunns-matchers/issues?q=is%3Aissue+is%3Aclosed)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/brunns/brunns-matchers.svg?logo=github)](https://github.com/brunns/brunns-matchers/pulls)
[![GitHub pull-requests closed](https://img.shields.io/github/issues-pr-closed/brunns/brunns-matchers.svg?logo=github)](https://github.com/brunns/brunns-matchers/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/0b22e28c2ebe4722899a07c4cfa5bc69)](https://www.codacy.com/app/brunns/brunns-matchers)
[![Codacy Coverage](https://api.codacy.com/project/badge/coverage/0b22e28c2ebe4722899a07c4cfa5bc69)](https://www.codacy.com/app/brunns/brunns-matchers)
[![Lines of Code](https://tokei.rs/b1/github/brunns/brunns-matchers)](https://github.com/brunns/brunns-matchers)

## Setup

Install with pip:

    pip install brunns-matchers

(As usual, use of a [venv](https://docs.python.org/3/library/venv.html) or [virtualenv](https://virtualenv.pypa.io) is recommended.)

## Developing

Requires [uv](https://docs.astral.sh/uv/). Install with:

```shell
curl -LsSf https://astral.sh/uv/install.sh | sh
```

Then install dependencies:

```shell
uv sync --all-extras
```

Run `make precommit` to check if you're OK to commit. For more options, run:

    make help

## Releasing

Releases are automated via GitHub Actions. To release version `n.n.n`:

1. Update version in `pyproject.toml`
2. Run `make precommit` to ensure all checks pass
3. Commit and tag:
   ```sh
   version="n.n.n"
   git commit -am "Release v$version"
   git tag "v$version"
   git push origin master --tags
   ```

The GitHub Actions workflow will automatically:
- Run tests and coverage checks
- Build distribution packages
- Publish to PyPI (using OIDC trusted publishing)
- Create a GitHub release with auto-generated notes

**Note**: Ensure PyPI trusted publishing is configured. See CLAUDE.md for setup instructions.
