mockserver-client 9.2.0__tar.gz → 9.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/PKG-INFO +2 -2
  2. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/README.md +1 -1
  3. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/launcher.py +1 -1
  4. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/models.py +14 -0
  5. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/PKG-INFO +2 -2
  6. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/pyproject.toml +1 -1
  7. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_models.py +16 -0
  8. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/__init__.py +0 -0
  9. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/a2a.py +0 -0
  10. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/async_client.py +0 -0
  11. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/client.py +0 -0
  12. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/exceptions.py +0 -0
  13. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/fluent.py +0 -0
  14. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/llm.py +0 -0
  15. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/mcp.py +0 -0
  16. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/py.typed +0 -0
  17. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/pytest_plugin.py +0 -0
  18. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver/websocket_client.py +0 -0
  19. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/SOURCES.txt +0 -0
  20. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/dependency_links.txt +0 -0
  21. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/entry_points.txt +0 -0
  22. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/requires.txt +0 -0
  23. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/mockserver_client.egg-info/top_level.txt +0 -0
  24. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/setup.cfg +0 -0
  25. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_a2a.py +0 -0
  26. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_any_of_request_definition.py +0 -0
  27. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_async_client.py +0 -0
  28. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_auth_tls.py +0 -0
  29. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_body_date_time_matcher.py +0 -0
  30. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_breakpoint.py +0 -0
  31. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_client.py +0 -0
  32. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_conditional_request_and_load_check.py +0 -0
  33. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_control_plane.py +0 -0
  34. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_date_time_matcher.py +0 -0
  35. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_exceptions.py +0 -0
  36. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_expectation_filter.py +0 -0
  37. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_explain.py +0 -0
  38. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_fluent.py +0 -0
  39. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_from_dict_fidelity.py +0 -0
  40. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_init.py +0 -0
  41. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_integration.py +0 -0
  42. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_key_multi_value_forms.py +0 -0
  43. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_launcher.py +0 -0
  44. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_llm.py +0 -0
  45. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_mcp.py +0 -0
  46. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_override_forwarded_request.py +0 -0
  47. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_pytest_plugin.py +0 -0
  48. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_recorded_expectations_options.py +0 -0
  49. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_roundtrip_fidelity.py +0 -0
  50. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_sync_chain_parity.py +0 -0
  51. {mockserver_client-9.2.0 → mockserver_client-9.3.0}/tests/test_websocket_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mockserver-client
3
- Version: 9.2.0
3
+ Version: 9.3.0
4
4
  Summary: Official Python client for MockServer — create expectations, verify requests, and register dynamic callbacks via WebSocket
5
5
  Author-email: James Bloom <jamesdbloom@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -679,7 +679,7 @@ launcher_path = ensure_binary() # returns Path to the launcher executable
679
679
  ```python
680
680
  from mockserver.launcher import start
681
681
 
682
- server = start(port=1080, version="9.2.0")
682
+ server = start(port=1080, version="9.3.0")
683
683
  # ...
684
684
  server.stop()
685
685
  ```
@@ -649,7 +649,7 @@ launcher_path = ensure_binary() # returns Path to the launcher executable
649
649
  ```python
650
650
  from mockserver.launcher import start
651
651
 
652
- server = start(port=1080, version="9.2.0")
652
+ server = start(port=1080, version="9.3.0")
653
653
  # ...
654
654
  server.stop()
655
655
  ```
@@ -45,7 +45,7 @@ logger = logging.getLogger(__name__)
45
45
 
46
46
  # The version shipped with this client. ``ensure_binary()`` defaults to this
47
47
  # when no explicit version is passed.
48
- _CLIENT_VERSION = "9.2.0"
48
+ _CLIENT_VERSION = "9.3.0"
49
49
 
50
50
  _REPO = "mock-server/mockserver-monorepo"
51
51
 
@@ -2126,6 +2126,7 @@ class SseEvent:
2126
2126
  id: str | None = None
2127
2127
  retry: int | None = None
2128
2128
  delay: Delay | None = None
2129
+ comment: str | None = None
2129
2130
 
2130
2131
  def to_dict(self) -> dict:
2131
2132
  result: dict = {}
@@ -2137,6 +2138,8 @@ class SseEvent:
2137
2138
  result["id"] = self.id
2138
2139
  if self.retry is not None:
2139
2140
  result["retry"] = self.retry
2141
+ if self.comment is not None:
2142
+ result["comment"] = self.comment
2140
2143
  if self.delay is not None:
2141
2144
  result["delay"] = self.delay.to_dict()
2142
2145
  return result
@@ -2151,6 +2154,7 @@ class SseEvent:
2151
2154
  id=data.get("id"),
2152
2155
  retry=data.get("retry"),
2153
2156
  delay=Delay.from_dict(data.get("delay")),
2157
+ comment=data.get("comment"),
2154
2158
  )
2155
2159
 
2156
2160
 
@@ -2164,6 +2168,10 @@ class HttpSseResponse:
2164
2168
  primary: bool | None = None
2165
2169
  # Renders each event's fields with this engine (VELOCITY / JAVASCRIPT / MUSTACHE).
2166
2170
  template_type: str | None = None
2171
+ # The wait after the last event before the stream ends.
2172
+ close_delay: Delay | None = None
2173
+ # When True the stream stays open after its last event until the client leaves; close_delay is then ignored.
2174
+ keep_stream_open: bool | None = None
2167
2175
 
2168
2176
  def to_dict(self) -> dict:
2169
2177
  result: dict = {}
@@ -2175,6 +2183,10 @@ class HttpSseResponse:
2175
2183
  result["events"] = [e.to_dict() if hasattr(e, 'to_dict') else e for e in self.events]
2176
2184
  if self.close_connection is not None:
2177
2185
  result["closeConnection"] = self.close_connection
2186
+ if self.close_delay is not None:
2187
+ result["closeDelay"] = self.close_delay.to_dict()
2188
+ if self.keep_stream_open is not None:
2189
+ result["keepStreamOpen"] = self.keep_stream_open
2178
2190
  if self.template_type is not None:
2179
2191
  result["templateType"] = self.template_type
2180
2192
  if self.delay is not None:
@@ -2199,6 +2211,8 @@ class HttpSseResponse:
2199
2211
  delay=Delay.from_dict(data.get("delay")),
2200
2212
  primary=data.get("primary"),
2201
2213
  template_type=data.get("templateType"),
2214
+ close_delay=Delay.from_dict(data.get("closeDelay")),
2215
+ keep_stream_open=data.get("keepStreamOpen"),
2202
2216
  )
2203
2217
 
2204
2218
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mockserver-client
3
- Version: 9.2.0
3
+ Version: 9.3.0
4
4
  Summary: Official Python client for MockServer — create expectations, verify requests, and register dynamic callbacks via WebSocket
5
5
  Author-email: James Bloom <jamesdbloom@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -679,7 +679,7 @@ launcher_path = ensure_binary() # returns Path to the launcher executable
679
679
  ```python
680
680
  from mockserver.launcher import start
681
681
 
682
- server = start(port=1080, version="9.2.0")
682
+ server = start(port=1080, version="9.3.0")
683
683
  # ...
684
684
  server.stop()
685
685
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mockserver-client"
3
- version = "9.2.0"
3
+ version = "9.3.0"
4
4
  description = "Official Python client for MockServer — create expectations, verify requests, and register dynamic callbacks via WebSocket"
5
5
  authors = [
6
6
  {name = "James Bloom", email = "jamesdbloom@gmail.com"},
@@ -4467,6 +4467,22 @@ class TestActionFieldsTheServerAccepts:
4467
4467
  assert HttpSseResponse.from_dict(data).to_dict() == data
4468
4468
  assert "templateType" not in HttpSseResponse(status_code=200).to_dict()
4469
4469
 
4470
+ def test_sse_end_of_stream_round_trip(self):
4471
+ data = {"events": [{"data": "last"}], "closeDelay": {"timeUnit": "SECONDS", "value": 15}, "keepStreamOpen": True}
4472
+ resp = HttpSseResponse.from_dict(data)
4473
+ assert resp.close_delay.value == 15
4474
+ assert resp.keep_stream_open is True
4475
+ assert resp.to_dict() == data
4476
+ assert "closeDelay" not in HttpSseResponse(status_code=200).to_dict()
4477
+ assert "keepStreamOpen" not in HttpSseResponse(status_code=200).to_dict()
4478
+
4479
+ def test_sse_event_comment_round_trip(self):
4480
+ data = {"statusCode": 200, "events": [{"comment": "heartbeat"}, {"data": "d", "comment": "a\nb"}]}
4481
+ resp = HttpSseResponse.from_dict(data)
4482
+ assert resp.events[0].comment == "heartbeat"
4483
+ assert resp.to_dict() == data
4484
+ assert "comment" not in HttpSseResponse.from_dict({"events": [{"data": "d"}]}).to_dict()["events"][0]
4485
+
4470
4486
  def test_expectation_carries_the_fields_through(self):
4471
4487
  data = {
4472
4488
  "httpRequest": {"path": "/x"},