Val Kolovos
12/03/2024, 4:24 PMVal Kolovos
12/04/2024, 8:50 PMArtur Neumann
12/05/2024, 11:21 AMassert
So far I have been using the same port for every test for the pact server and when one test fails other random tests also would fail with RuntimeError: Pact mock server could not be started for PactHandle(64169).
I am just changing it to use a random port, so its not an issue anymore for me. But wanted to know if that is a bug or feature?Pietro Di Bello
12/17/2024, 11:23 AMJoshua Ellis
12/30/2024, 11:05 PMpact.v3
preview!
Unfortunately, this means that the v2.3.0
release will have breaking changes within the pact.v3
interface. You can view the details of the breaking changes in my recent blog post.
I want to thank everyone who has been using pact.v3
and providing feedback, and I hope that the new features help significantly with the user experience, despite the breaking changes.GitHub
12/31/2024, 12:02 AMmessage_handler
signature has been changed and
expanded.
• set_state
has been renamed to state_handler
. If
using a URL still, the body
keyword argument is now a required
parameter.
• The provider name must be given as an argument of the
Verifier
constructor, instead of the first argument of the
set_info
method.
BREAKING CHANGE: The set_info
verifier method is removed, with
add_transport
needing to be used.
Signed-off-by: JP-Ellis josh@jpellis.me
• pact.v3.util
has been renamed to pact.v3._util
and
is now private.
• The PactServer __exit__
arguments no longer have
leading underscores. This is typically handled by Python itself and
therefore is unlikely to be a change for any user, unless the end
user was calling the __exit__
method explicitly and using
keyword arguments.
Feat
• v3: further simplify message interface
• v3: add state handler server
• v3: integrate message relay server
• v3: add message relay and callback servers
Fix
• deps: update dependency mypy to v1.14.1
• deps: update dependency mypy to v1.14.0
• deps: update ruff to v0.8.4
• deps: update ruff to v0.8.3
• deps: update dependency pytest-cov to v6
Pull Requests
What's Changed
• chore: update changelog by @JP-Ellis in #826
• chore(deps): update actions/upload-artifact digest to b4b15b8 by @renovate in #817
• chore(deps): update astral-sh/setup-uv action to v3.1.6 by @renovate in #828
• chore(deps): update astral-sh/setup-uv action to v3.1.7 by @renovate in #831
• chore(deps): update dependency mypy to v1.12.0 by @renovate in #830
• chore(deps): update ubuntu:24.04 docker digest to d4f6f70 by @renovate in #827
• chore: fix url by @JP-Ellis in #832
• chore(deps): update ruff to v0.7.0 by @renovate in #833
• chore(deps): update dependency mypy to v1.12.1 by @renovate in #835
• chore(deps): update ubuntu:24.04 docker digest to 99c3519 by @renovate in #834
• chore(deps): update actions/checkout digest to 11bd719 by @renovate in #839
• chore(deps): update pre-commit hook crate-ci/typos to v1.26.1 by @renovate in #838
• chore(deps): update actions/cache digest to 6849a64 by @renovate in #836
• chore(deps): update dependency mypy to v1.13.0 by @renovate in #837
• chore(deps): update pre-commit hook crate-ci/typos to v1.26.8 by @renovate in #841
• chore(deps): update ruff to v0.7.1 by @renovate in #840
• chore(deps): update astral-sh/setup-uv action to v3.2.0 by @renovate in #842
• fix(deps): update dependency pytest-cov to v6 by @renovate in #843
• chore(deps): update pre-commit hook crate-ci/committed to v1.1.0 by @renovate in #845
• chore(deps): update pypa/gh-action-pypi-publish action to v1.11.0 by @renovate in #844
• chore(deps): update softprops/action-gh-release digest to e7a8f85 by @renovate in #847
• chore(deps): update pre-commit hook crate-ci/committed to v1.1.1 by @renovate in #846
• chore(deps): update pre-commit hook crate-ci/typos to v1.27.0 by @renovate in #849
• chore(deps): update ruff to v0.7.2 by @renovate in #848
• chore(deps): update astral-sh/setup-uv action to v3.2.1 by @renovate in #852
• chore(deps): update pypa/gh-action-pypi-publish action to v1.12.0 by @renovate in #851
• chore(deps): update pre-commit hook crate-ci/typos to v1.27.1 by @renovate in #854
• chore(deps): update astral-sh/setup-uv action to v3.2.2 by @renovate in #853
• chore(deps): update pypa/gh-action-pypi-publish action to v1.12.1 by @renovate in #855
• chore(deps): update pypa/gh-action-pypi-publish action to v1.12.2 by @renovate in #857
• chore(deps): update pre-commit hook crate-ci/typos to v1.27.2 by @renovate in #856
• chore(deps): update pre-commit hook crate-ci/typos to v1.27.3 by @renovate in #860
• chore(deps): update ruff to v0.7.3 by @renovate in #859
• chore(deps): update softprops/action-gh-release action to v2.1.0 by @renovate in #861
• chore(deps): update codecov/codecov-action action to v5 by @renovate in #862
• chore(deps): update codecov/codecov-action action to v5.0.2 by @renovate in #866
• chore(deps): update astral-sh/setup-uv action to v3.2.3 by @renovate in #864
• chore(deps): update ubuntu:24.04 docker digest to 278628f by @renovate in #867
• chore(deps): update codecov/codecov-action action to v5.0.3 by @renovate in #868
• chore(deps): update codecov/codecov-action action to v5.0.6 by @renovate in #869
• chore(deps): update codecov/codecov-action action to v5.0.7 by <https://github.com/re…
pact-foundation/pact-pythonRamon Saraiva
01/17/2025, 5:09 PMTom Lopez
01/22/2025, 4:04 PMGitHub
01/23/2025, 12:07 AMSpencer
02/11/2025, 3:34 PMVal Kolovos
02/27/2025, 6:20 PMpact-python
2.3.1, and I have a feature request. It would appear that neither the state_handler
nor the message_handler
functions in the v3 Verifier
can be async
functions. Is it possible to allow for that? Should I just create an issue in the github repo?Ruud Welling
03/05/2025, 8:05 AMpact.v3
:
We have our verifier configured with include_pending
enabled. When a consumer publishes a pact on a branch, a webhook triggers the verification and the CI output states
> This pact is in pending state for this version of ProviderName because a successful verification result for ProviderName has not yet been published. If this verification fails, it will not cause the overall build to fail. Read more at https://docs.pact.io/go/pending
It also shows that the test fails:
> has a matching body (FAILED)
2 questions:
• I see that the broker shows all results as green, even though some tests failed, is this a bug?
• After the change got merged, the pact on main was shown as NOT pending, and caused the build to fail. Why was the pact considered pending when it was still on the branch, but not on main? (there was a previous successful verification on main before for a different version of that pact)Adam Mitchell
04/22/2025, 8:21 AMVasyl
04/22/2025, 9:31 PMPendingDeprecationWarning: This class will be deprecated Pact Python v3 (see pact-foundation/pact-python#396)
messages make me try to find V3 release timeframe, but I don't have luck finding it so far.
Is there any estimation of when v3 might be available, End of 2025? middle of 2026? 🤔Jun Yi
04/28/2025, 3:36 AMverifier = Verifier().set_info(name=PROVIDER_NAME, url=PROVIDER_URL)
verifier.broker_source(url=URL(settings.pact_flow_url), token=settings.pact_broker_token)
verifier.set_state(url=PROVIDER_URL / "_pact" / "callback", teardown=True)
verifier.filter_consumers(consumer_name)
verifier.set_publish_options(version=str(version))
verifier.verify()
Thanks for your help!Patrick
04/28/2025, 12:39 PMLachlan Newman
05/01/2025, 11:13 PMset_publish_options
but what is the behaviour if that function is not called ?GitHub
05/07/2025, 3:33 AMThe signature of functional arguments must form a subset of the### 📚 Documentation • Replace commitizen with git cliff • Update blog post • Rename params -> parameters • (example) Elaborate on state handler ### ⚙️ Miscellaneous Tasks • Update pre-commit hooks • Update committed configuration • Add taplo • (ci) Update ubuntu runners • Reduce noise from taiki-e/install-action • (ci) Upload test results to codecov • Add apply_arg utility • (tests) Use consistent return value • (test) Tweak type signature • (examples) Fix state handler args ### Contributors • @JP-Ellis ## Pull Requests ## What's Changed • chore: update changelog by @JP-Ellis in #937 • chore: update pre-commit hooks by @JP-Ellis in #939 • chore: update committed configuration by @JP-Ellis in #940 • docs: replace commitizen with git cliff by @JP-Ellis in #938 • chore: add taplo by @JP-Ellis in #941 • chore(deps): update codecov/codecov-action action to v5.3.0 by @renovate in #944 • chore(deps): update taiki-e/install-action action to v2.47.24 by @renovate in #942 • fix(deps): update ruff to v0.9.3 by @renovate in #943 • chore(deps): update codecov/codecov-action action to v5.3.1 by @renovate in #946 • chore(deps): update taiki-e/install-action action to v2.47.25 by @renovate in #947 • chore(deps): update pre-commit hook igorshubovych/markdownlint-cli to v0.44.0 by @renovate in #948 • chore(deps): update pypa/gh-action-pypi-publish action to v1.12.4 by @renovate in #945 • chore(deps): update taiki-e/install-action action to v2.47.26 by @renovate in #949 • chore(deps): update taiki-e/install-action action to v2.47.28 by @renovate in #950 • chore(deps): update taiki-e/install-action action to v2.47.29 by @renovate in #951 • chore(deps): update taiki-e/install-action action to v2.47.30 by @renovate in #952 • fix(deps): update ruff to v0.9.4 by @renovate in #956 • chore(deps): update taiki-e/install-action action to v2.47.31 by @renovate in #954 • chore(deps): update astral-sh/setup-uv action to v5.2.2 by @renovate in #955 • chore(deps): update pre-commit hook crate-ci/typos to v1.29.5 by @renovate in #957 • chore(deps): update taiki-e/install-action action to v2.48.1 by @renovate in #958 • fix(deps): update dependency mypy to v1.15.0 by @renovate in #960 • chore(deps): update docker/setup-qemu-action action to v3.4.0 by @renovate in #962 • chore(deps): update pre-commit hook biomejs/pre-commit to v1 by @renovate in #961 • fix(deps): update ruff to v0.9.5 by @renovate in #963 • chore(deps): update tests/v3/compatibility_suite/definition digest to cc76eac by @renovate in #573 • chore(deps): update taiki-e/install-action action to v2.48.2 by @renovate in #964 • chore(deps): update taiki-e/install-action action to v2.48.4 by @renovate in #965 • chore(deps): update taiki-e/install-action action to v2.48.5 by @renovate in #966 • fix(deps): update ruff to v0.9.6 by @renovate in #969 • chore(deps): update taiki-e/install-action action to v2.48.6 by @renovate in #968 • chore(deps): update taiki-e/install-action action to v2.48.7 by @renovate in #970 • chore(deps): update taiki-e/install-action action to v2.48.9 by @renovate in #971 • chore(deps): update pre-commit hook crate-ci/typos to v1.29.7 by @renovate in #974 • chore(deps): update pactfoundation/pact-broker:latest docker digest to 1abd7da by @renovate in #973 • chore(deps): update taiki-e/install-action action to v2.48.10 by @renovate in #972 • chore(deps): update taiki-e/install-action action to v2.48.12 by @renovate in #976 • fix(deps): update dependency psutil to v7 by @renovate in #977 • chore(deps): update taiki-e/install-action action to v2.48.13 by @renovate in #978 • chore(deps): update taiki-e/install-action action to v2.48.14 by @renovate in #979 • chore(deps): update actions/cache action to v4.2.1 by @renovate in #980 • chore(deps): update taiki-e/install-action action to v2.48.15 by @renovate in #981 • chore(deps): update pre-commit hook crate-ci/typos to v1.29.8 by @renovate in <https://github.com/pact-foundation/pact-python/pull/982|#… pact-foundation/pact-pythonandMessageProducerArgs
typed dictionaries.StateHandlerArgs
Joshua Ellis
05/07/2025, 3:37 AMDilip Punna
06/19/2025, 5:02 PMAdriano Tanoue
06/23/2025, 8:43 AMquery_params = {"count": "1", "skip": "0"}
interaction.with_query_parameters(query_params)
...becomes:
"request": {
"query": {
"count": [
"1"
],
"skip": [
"0"
]
}
So the actual url path is something like: /status?count[0]=1&skip[0]=0
instead of /status?count=1&skip=0
. Is that by design? Doesn't it make a wrong contract?Zachary Lysobey
06/24/2025, 9:42 PMDavid Mason
07/09/2025, 2:41 PM@pytest.fixture(scope="module")
def sqs_pact_verifier(pact_dir: str, version: str) -> Verifier:
verifier = Verifier("my-provider")
if broker_url := os.environ.get("PACT_BROKER_BASE_URL"):
verifier = verifier.set_publish_options(version=version)
verifier = verifier.broker_source(broker_url, token=os.environ["PACT_BROKER_TOKEN"]).set_error_on_empty_pact()
return verifier
def test_verify_payment_network_request(sqs_pact_verifier: Verifier):
sqs_pact_verifier.message_handler(run_message_handler).verify()
I've double checked the versions match, any ideas?Patrick
07/14/2025, 10:41 AMverifier = (
Verifier(PROVIDER)
.add_transport(url=server)
.state_handler(provider_state_handler, teardown=False)
.broker_source(url=BROKER_URL, selector=True)
.consumer_versions('{"mainBranch": true}', '{"deployedOrReleased": true}')
.include_pending()
.include_wip_since("2025-07-11")
.build
)
if os.getenv("CI"):
verifier.set_publish_options(
version=os.getenv("VERSION")
branch=os.getenv("CI_COMMIT_REF_NAME")
)
verifier.verify()
GitHub
07/17/2025, 11:38 AMGitHub
07/22/2025, 6:17 AMGitHub
07/23/2025, 11:31 AMGitHub
07/29/2025, 10:29 AMGitHub
08/12/2025, 4:23 AM• [breaking] Prepare for v3 releaseis removed, and to be replaced bypact.v3.ffi
. That is,pact_ffi
should be replaced bypact.v3.ffi.$fn
.pact_ffi.$fn
This prepares for version 3. Pact Python v2 will be still accessible under• [breaking] Simplifyand all imports should be appropriate renamed. Everyone is encouraged to migrate to Pact Python v3.pact.v2
given
The signature of• [breaking] Deserialize metadata valueshas been updated. The following changes are required: - ChangeInteraction.given
togiven("state", key="user_id", value=123)
. This can take an arbitrary number of keyword arguments. If the key is not a valid Python keyword argument, use the dictionary input below. - Changegiven("state", user_id=123)
togiven("state", parameters={"user_id": 123})
.given("state", {"user_id": 123})
As the metadata values are now deserialised, the type of the metadata values may change. For example, setting metadata### 🐛 Bug Fixes • Matcher type variance • With metadata function signature • [breaking] Use correct datetime default formatwill now passuser_id=123
through to the function handler. Previously, this would have been{"user_id": 123}
.{"user_id": "123"}
If you relied on the previous default (undocumented) behaviour, prefer specifying the format explicitly now:• Handle empty state callback • (verifier) [breaking] Propagate branch.match.datetime(regex="%Y-%m-%dT%H:%M:%S.%f%z")
If a branch is set through either### 🚜 Refactor • Functional state handler ### 📚 Documentation • Update changelog for v2.3.3 • (blog) Fix v3 references • Fix v3 references • V3 review • Update git cliff configuration ### ⚙️ Miscellaneous Tasks • Update pre-commit hooks • Use the neworset_publish_options
, the value will be saved and used as a default for both in subsequent calls.provider_branch
pact_cli
package
• Remove packaging of pact cli
• (ci) Incorporate tests of pact cli
• (ci) Use new pact-python/*
tags
• (ci) Add build cli pipeline
• Exclude hatch_build from mypy checks
• (ci) Narrow token permissions
• Remove macosx deployment target
• (ci) Fix cli publish permissions
• Properly extract tag version
• Update gitignore
• (ci) Fix core package build
• Split out dependencies and tests
• (ci) Update labels
• (ci) Fix labels
• (tests) Re-organise tests
• Fix bad copy-paste in tests
• Log exceptions from apply_args
• Improve logging from apply_args
• (examples) Start examples overhaul
• (ci) Use new examples
• Update protobuf examples
• (ci) Cancel ci on PRs
• Add vscode settings and extensions
• Add envrc
• Replace yamlfix with yamlfmt
• Remove deptry config
• Support pre and post release tags
• Fix typo
### Contributors
• @JP-Ellis
• @kevinrvaz
## Pull Requests
## What's Changed
• docs: update ffi changelog by @JP-Ellis in #1131
• feat(v3)!: remove pact.v3.ffi module by @JP-Ellis in #1132
• docs(ffi): fix old references to pact.v3.ffi by @JP-Ellis in #1133
• chore(cli): cleanup build script by @JP-Ellis in #1136
• chore(ffi): cleanup build script by @JP-Ellis in #1135
• chore(cli): fix flakey test by @JP-Ellis in #1137
• chore(deps): update pypa/cibuildwheel action to v3.1.2 by @renovate[bot] in #1075
• chore(deps): update pre-commit hook biomejs/pre-commit to v2.1.3 by @renovate[bot] in #1138
• fix(deps): update ruff to v0.12.7 by @renovate[bot] in #1128
• feat!: prepare for v3 release by @JP-Ellis in #1139
• fix(deps): update dependency mypy to v1.17.1 by @renovate[bot] in #1141
• chore(ci): update labels by @JP-Ellis in #1140
• chore(ci): fix labels by @JP-Ellis in #1142
• chore(deps): update pypa/cibuildwheel action to v3.1.3 by @renovate[bot] in #1143
• chore(deps): update taiki-e/install-action action to v2.57.5 by @renovate[bot] in #1144
• chore(deps): update pre-commit hook crate-ci/typos to v1.35.1 by @renovate[bot] in #1145
• chore(deps): update actions/download-artifact action to v5 by @renovate[bot] in #1146
• docs: v3 review by @JP-Ellis in #1147
• chore(deps): fix optional dependencies by @JP-Ellis in #1148
• chore(deps): remove unused optional dependency by @JP-Ellis in #1149
• feat!: simplify given
by @JP-Ellis in #1150
• feat!: with_metadata by @JP-Ellis in #1151
• chore(deps): update actions/cache action to v4.2.4 by @renovate[bot] in #1152
• fix(deps): update ruff to v0.12.8 by @renovate[bot] in #1153
• chore(deps): update pre-commit hook crate-ci/typos to v1.35.2 by @renovate[bot] in #1155
• chore: log exceptions from apply_args by @JP-Ellis in #1157
• chore: improve logging from apply_args by @JP-Ellis in #1158
• fix: use correct datetime default format by @JP-Ellis in #1156
• refactor: functional state handler by @JP-Ellis in #1159
• chore(deps): update pre-commit hook biomejs/pre-commit to v2.1.4 by @renovate[bot] in #1160
• fix: handle empty state callback by @JP-Ellis in #1161
• chore(deps): update pre-commit …
pact-foundation/pact-pythonMatt (pactflow.io / pact-js / pact-go)