schemathesis 3.33.2__py3-none-any.whl → 3.34.0__py3-none-any.whl

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 (33) hide show
  1. schemathesis/auths.py +71 -13
  2. schemathesis/checks.py +2 -0
  3. schemathesis/cli/__init__.py +10 -0
  4. schemathesis/cli/callbacks.py +3 -6
  5. schemathesis/cli/junitxml.py +20 -17
  6. schemathesis/cli/sanitization.py +5 -0
  7. schemathesis/exceptions.py +8 -0
  8. schemathesis/failures.py +20 -0
  9. schemathesis/generation/__init__.py +2 -0
  10. schemathesis/hooks.py +81 -8
  11. schemathesis/internal/transformation.py +10 -0
  12. schemathesis/models.py +12 -26
  13. schemathesis/runner/events.py +1 -0
  14. schemathesis/runner/impl/core.py +13 -1
  15. schemathesis/sanitization.py +1 -0
  16. schemathesis/schemas.py +12 -2
  17. schemathesis/service/serialization.py +1 -0
  18. schemathesis/specs/graphql/schemas.py +4 -0
  19. schemathesis/specs/openapi/checks.py +249 -12
  20. schemathesis/specs/openapi/examples.py +18 -1
  21. schemathesis/specs/openapi/links.py +45 -14
  22. schemathesis/specs/openapi/schemas.py +33 -17
  23. schemathesis/specs/openapi/stateful/__init__.py +18 -7
  24. schemathesis/stateful/__init__.py +20 -16
  25. schemathesis/stateful/config.py +16 -4
  26. schemathesis/stateful/runner.py +1 -1
  27. schemathesis/stateful/state_machine.py +20 -1
  28. schemathesis/transports/__init__.py +9 -1
  29. {schemathesis-3.33.2.dist-info → schemathesis-3.34.0.dist-info}/METADATA +11 -3
  30. {schemathesis-3.33.2.dist-info → schemathesis-3.34.0.dist-info}/RECORD +33 -33
  31. {schemathesis-3.33.2.dist-info → schemathesis-3.34.0.dist-info}/WHEEL +0 -0
  32. {schemathesis-3.33.2.dist-info → schemathesis-3.34.0.dist-info}/entry_points.txt +0 -0
  33. {schemathesis-3.33.2.dist-info → schemathesis-3.34.0.dist-info}/licenses/LICENSE +0 -0
@@ -5,7 +5,7 @@ from functools import lru_cache
5
5
  from typing import TYPE_CHECKING, Any, Callable, ClassVar, Iterator
6
6
 
7
7
  from hypothesis import strategies as st
8
- from hypothesis.stateful import Bundle, Rule, rule
8
+ from hypothesis.stateful import Bundle, Rule, precondition, rule
9
9
 
10
10
  from ....constants import NOT_SET
11
11
  from ....internal.result import Ok
@@ -93,10 +93,11 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
93
93
  for data_generation_method in schema.data_generation_methods
94
94
  ]
95
95
  )
96
+ bundle = bundles[bundle_name]
96
97
  rules[name] = transition(
97
98
  name=name,
98
99
  target=catch_all,
99
- previous=bundles[bundle_name],
100
+ previous=bundle,
100
101
  case=case_strategy,
101
102
  link=st.just(link),
102
103
  )
@@ -116,11 +117,13 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
116
117
  for data_generation_method in schema.data_generation_methods
117
118
  ]
118
119
  )
119
- rules[name] = transition(
120
- name=name,
121
- target=catch_all,
122
- previous=st.none(),
123
- case=case_strategy,
120
+ rules[name] = precondition(ensure_links_followed)(
121
+ transition(
122
+ name=name,
123
+ target=catch_all,
124
+ previous=st.none(),
125
+ case=case_strategy,
126
+ )
124
127
  )
125
128
 
126
129
  return type(
@@ -136,6 +139,14 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
136
139
  )
137
140
 
138
141
 
142
+ def ensure_links_followed(machine: APIStateMachine) -> bool:
143
+ # If there are responses that have links to follow, reject any rule without incoming transitions
144
+ for bundle in machine.bundles.values():
145
+ if bundle:
146
+ return False
147
+ return True
148
+
149
+
139
150
  def transition(
140
151
  *,
141
152
  name: str,
@@ -60,6 +60,9 @@ class StatefulTest:
60
60
  def parse(self, case: Case, response: GenericResponse) -> ParsedData:
61
61
  raise NotImplementedError
62
62
 
63
+ def is_match(self) -> bool:
64
+ raise NotImplementedError
65
+
63
66
  def make_operation(self, collected: list[ParsedData]) -> APIOperation:
64
67
  raise NotImplementedError
65
68
 
@@ -113,22 +116,23 @@ class Feedback:
113
116
  from .._hypothesis import create_test
114
117
 
115
118
  for data in self.stateful_tests.values():
116
- operation = data.make_operation()
117
- _as_strategy_kwargs: dict[str, Any] | None
118
- if callable(as_strategy_kwargs):
119
- _as_strategy_kwargs = as_strategy_kwargs(operation)
120
- else:
121
- _as_strategy_kwargs = as_strategy_kwargs
122
- test_function = create_test(
123
- operation=operation,
124
- test=test,
125
- settings=settings,
126
- seed=seed,
127
- data_generation_methods=operation.schema.data_generation_methods,
128
- generation_config=generation_config,
129
- as_strategy_kwargs=_as_strategy_kwargs,
130
- )
131
- yield Ok((operation, test_function))
119
+ if data.stateful_test.is_match():
120
+ operation = data.make_operation()
121
+ _as_strategy_kwargs: dict[str, Any] | None
122
+ if callable(as_strategy_kwargs):
123
+ _as_strategy_kwargs = as_strategy_kwargs(operation)
124
+ else:
125
+ _as_strategy_kwargs = as_strategy_kwargs
126
+ test_function = create_test(
127
+ operation=operation,
128
+ test=test,
129
+ settings=settings,
130
+ seed=seed,
131
+ data_generation_methods=operation.schema.data_generation_methods,
132
+ generation_config=generation_config,
133
+ as_strategy_kwargs=_as_strategy_kwargs,
134
+ )
135
+ yield Ok((operation, test_function))
132
136
 
133
137
 
134
138
  def run_state_machine_as_test(
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
+ from datetime import timedelta
4
5
  from typing import TYPE_CHECKING, Any
5
6
 
7
+ from ..constants import DEFAULT_DEADLINE
8
+
6
9
  if TYPE_CHECKING:
7
10
  import hypothesis
8
11
  from requests.auth import HTTPDigestAuth
@@ -16,15 +19,20 @@ if TYPE_CHECKING:
16
19
 
17
20
  def _default_checks_factory() -> tuple[CheckFunction, ...]:
18
21
  from ..checks import ALL_CHECKS
19
- from ..specs.openapi.checks import use_after_free
22
+ from ..specs.openapi.checks import ensure_resource_availability, use_after_free
20
23
 
21
- return ALL_CHECKS + (use_after_free,)
24
+ return ALL_CHECKS + (use_after_free, ensure_resource_availability)
22
25
 
23
26
 
24
27
  def _get_default_hypothesis_settings_kwargs() -> dict[str, Any]:
25
28
  import hypothesis
26
29
 
27
- return {"phases": (hypothesis.Phase.generate,), "deadline": None}
30
+ return {
31
+ "phases": (hypothesis.Phase.generate,),
32
+ "deadline": None,
33
+ "stateful_step_count": 6,
34
+ "suppress_health_check": list(hypothesis.HealthCheck),
35
+ }
28
36
 
29
37
 
30
38
  def _default_hypothesis_settings_factory() -> hypothesis.settings:
@@ -79,6 +87,10 @@ def _get_hypothesis_settings_kwargs_override(settings: hypothesis.settings) -> d
79
87
  state_machine_default = _default_hypothesis_settings_factory()
80
88
  if settings.phases == hypothesis_default.phases:
81
89
  kwargs["phases"] = state_machine_default.phases
82
- if settings.deadline == hypothesis_default.deadline:
90
+ if settings.stateful_step_count == hypothesis_default.stateful_step_count:
91
+ kwargs["stateful_step_count"] = state_machine_default.stateful_step_count
92
+ if settings.deadline in (hypothesis_default.deadline, timedelta(milliseconds=DEFAULT_DEADLINE)):
83
93
  kwargs["deadline"] = state_machine_default.deadline
94
+ if settings.suppress_health_check == hypothesis_default.suppress_health_check:
95
+ kwargs["suppress_health_check"] = state_machine_default.suppress_health_check
84
96
  return kwargs
@@ -7,10 +7,10 @@ from dataclasses import dataclass, field
7
7
  from typing import TYPE_CHECKING, Any, Generator, Iterator, Type
8
8
 
9
9
  import hypothesis
10
- from hypothesis.stateful import Rule
11
10
  import requests
12
11
  from hypothesis.control import current_build_context
13
12
  from hypothesis.errors import Flaky
13
+ from hypothesis.stateful import Rule
14
14
 
15
15
  from ..exceptions import CheckFailed
16
16
  from ..targets import TargetMetricCollector
@@ -3,7 +3,8 @@ from __future__ import annotations
3
3
  import re
4
4
  import time
5
5
  from dataclasses import dataclass
6
- from typing import TYPE_CHECKING, Any, ClassVar
6
+ from functools import lru_cache
7
+ from typing import TYPE_CHECKING, Any, ClassVar, Type
7
8
 
8
9
  from hypothesis.errors import InvalidDefinition
9
10
  from hypothesis.stateful import RuleBasedStateMachine
@@ -12,6 +13,7 @@ from .._dependency_versions import HYPOTHESIS_HAS_STATEFUL_NAMING_IMPROVEMENTS
12
13
  from ..constants import NO_LINKS_ERROR_MESSAGE, NOT_SET
13
14
  from ..exceptions import UsageError
14
15
  from ..models import APIOperation, Case, CheckFunction
16
+ from .config import _default_hypothesis_settings_factory
15
17
  from .runner import StatefulTestRunner, StatefulTestRunnerConfig
16
18
  from .sink import StateMachineSink
17
19
  from .statistic import TransitionStats
@@ -60,6 +62,23 @@ class APIStateMachine(RuleBasedStateMachine):
60
62
  raise
61
63
  self.setup()
62
64
 
65
+ @classmethod
66
+ @lru_cache
67
+ def _to_test_case(cls) -> Type:
68
+ from . import run_state_machine_as_test
69
+
70
+ class StateMachineTestCase(RuleBasedStateMachine.TestCase):
71
+ settings = _default_hypothesis_settings_factory()
72
+
73
+ def runTest(self) -> None:
74
+ run_state_machine_as_test(cls, settings=self.settings)
75
+
76
+ runTest.is_hypothesis_test = True # type: ignore[attr-defined]
77
+
78
+ StateMachineTestCase.__name__ = cls.__name__ + ".TestCase"
79
+ StateMachineTestCase.__qualname__ = cls.__qualname__ + ".TestCase"
80
+ return StateMachineTestCase
81
+
63
82
  def _pretty_print(self, value: Any) -> str:
64
83
  if isinstance(value, Case):
65
84
  # State machines suppose to be reproducible, hence it is OK to get kwargs here
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import base64
4
+ import inspect
4
5
  import time
5
6
  from contextlib import contextmanager
6
7
  from dataclasses import dataclass
@@ -219,8 +220,15 @@ def validate_vanilla_requests_kwargs(data: dict[str, Any]) -> None:
219
220
  """
220
221
  url = data["url"]
221
222
  if not urlparse(url).netloc:
223
+ stack = inspect.stack()
224
+ method_name = "call"
225
+ for frame in stack[1:]:
226
+ if frame.function == "call_and_validate":
227
+ method_name = "call_and_validate"
228
+ break
222
229
  raise RuntimeError(
223
- "The URL should be absolute, so Schemathesis knows where to send the data. \n"
230
+ "The `base_url` argument is required when specifying a schema via a file, so Schemathesis knows where to send the data. \n"
231
+ f"Pass `base_url` either to the `schemathesis.from_*` loader or to the `Case.{method_name}`.\n"
224
232
  f"If you use the ASGI integration, please supply your test client "
225
233
  f"as the `session` argument to `call`.\nURL: {url}"
226
234
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schemathesis
3
- Version: 3.33.2
3
+ Version: 3.34.0
4
4
  Summary: Property-based testing framework for Open API and GraphQL based apps
5
5
  Project-URL: Documentation, https://schemathesis.readthedocs.io/en/stable/
6
6
  Project-URL: Changelog, https://schemathesis.readthedocs.io/en/stable/changelog.html
@@ -33,11 +33,11 @@ Requires-Dist: click<9.0,>=7.0
33
33
  Requires-Dist: colorama<1.0,>=0.4
34
34
  Requires-Dist: harfile<1.0,>=0.3.0
35
35
  Requires-Dist: httpx<1.0,>=0.22.0
36
- Requires-Dist: hypothesis-graphql<1,>=0.11.0
36
+ Requires-Dist: hypothesis-graphql<1,>=0.11.1
37
37
  Requires-Dist: hypothesis-jsonschema<0.24,>=0.23.1
38
38
  Requires-Dist: hypothesis<7,>=6.103.4; python_version > '3.8'
39
39
  Requires-Dist: hypothesis[zoneinfo]<7,>=6.103.4; python_version == '3.8'
40
- Requires-Dist: jsonschema<5.0,>=4.18.0
40
+ Requires-Dist: jsonschema[format]<5.0,>=4.18.0
41
41
  Requires-Dist: junit-xml<2.0,>=1.9
42
42
  Requires-Dist: pyrate-limiter<4.0,>=2.10
43
43
  Requires-Dist: pytest-subtests<0.8.0,>=0.2.1
@@ -344,6 +344,10 @@ Schemathesis is used by a number of project and companies, including direct usag
344
344
 
345
345
  ### Articles
346
346
 
347
+ - [Boost Your FastAPI Reliability with Schemathesis Automated Testing](https://medium.com/@jeremy3/boost-your-fastapi-reliability-with-schemathesis-automated-testing-e8b70ff704f6) by **Jeremy**
348
+ - **Description**: Showcases how easy Schemathesis covers API testing in FastAPI projects.
349
+ - **Date**: 17 Jul 2024
350
+
347
351
  - [Implementing Schemathesis at PayLead](https://medium.com/paylead/implementing-schemathesis-at-paylead-a469a5d43626) by **Jérémy Pelletier** at **PayLead**
348
352
  - **Description**: In-depth walkthrough including custom hooks, stateful testing and CI/CD integration.
349
353
  - **Date**: 29 May 2024
@@ -369,6 +373,10 @@ Schemathesis is used by a number of project and companies, including direct usag
369
373
 
370
374
  ### Videos
371
375
 
376
+ - [API Testing With Unittest Mock, Pytest & Schemathesis](https://youtu.be/56whiv57T9I) by **
377
+ Ssali Jonathan**
378
+ - **Description**: Describes various API testing techniques and features Schemathesis for automatic test generation.
379
+ - **Date**: 29 Jul 2024
372
380
  - [API Fuzzing: What it is and why you should use it](https://youtu.be/wX3GMJY9B6A) by **José Haro Peralta**
373
381
  - **Description**: A comprehensive overview and demo of Schemathesis.
374
382
  - **Date**: 14 Feb 2023
@@ -6,39 +6,39 @@ schemathesis/_lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,
6
6
  schemathesis/_override.py,sha256=3CbA7P9Q89W3ymaYxiOV5Xpv1yhoBqroLK4YRpYMjX4,1630
7
7
  schemathesis/_rate_limiter.py,sha256=q_XWst5hzuAyXQRiZc4s_bx7-JlPYZM_yKDmeavt3oo,242
8
8
  schemathesis/_xml.py,sha256=lwRaKEMQvl6SUySnhGgooNsdmXPnDh11YSPpbsW8dR8,6923
9
- schemathesis/auths.py,sha256=NeJqsjtDgJtHMyrHc6V1NTpkAh1K8ZKLalpB3v80cT4,14734
10
- schemathesis/checks.py,sha256=U4JoOvkeI4tobZr3vM61GgVI2w2VEYNurQR7keGdLps,2447
9
+ schemathesis/auths.py,sha256=FvBgJWmaTFWH0dW3aLgNmRAubE03VME3gU8Dbv8NwrA,16786
10
+ schemathesis/checks.py,sha256=5wugI6gNVX1W3hUPU7G6l2u20R_A3fxI_7fwC-9_vto,2483
11
11
  schemathesis/code_samples.py,sha256=xk1-1jnXg5hS40VzIZp8PEtZwGaazNlVKMT7_X-zG-M,4123
12
12
  schemathesis/constants.py,sha256=l1YQ7PXhEj9dyf9CTESVUpPOaFCH7iz-Fe8o4v6Th_s,2673
13
- schemathesis/exceptions.py,sha256=w-5A-2Yb6EJOSvPycbx79T9Lr1IcMWJ8UFq6DW9kIMc,19975
14
- schemathesis/failures.py,sha256=wXz5Kr5i-ojcYc-BdzFlNbNGOfoVXHZM6kd4iULdHK4,7003
13
+ schemathesis/exceptions.py,sha256=iKNKlQhxYOCQOoKu_Tztg9JXO4XyJHh5UNvwLGsvQw8,20268
14
+ schemathesis/failures.py,sha256=dlvobJxkbxab-P1GMVrcnbcvf0-1qyhz79Fdw9pFJEw,7578
15
15
  schemathesis/filters.py,sha256=t1P236DPVaWvhu2Sm6OGy6Oe2x-nnwEVYRau4qqX6C4,17034
16
16
  schemathesis/graphql.py,sha256=YkoKWY5K8lxp7H3ikAs-IsoDbiPwJvChG7O8p3DgwtI,229
17
- schemathesis/hooks.py,sha256=YuPauQfs-xFDiBDoGxMRmWX5bb4IfCf02nw7IH36J9g,12400
17
+ schemathesis/hooks.py,sha256=Uv9rZHqM2bpb_uYBjf4kqsMeu7XdLOHpRWSaN43xIgw,14774
18
18
  schemathesis/lazy.py,sha256=hGwSuWe5tDaGpjZTV4Mj8zqdrHDYHxR22N2p5h2yh1g,18897
19
19
  schemathesis/loaders.py,sha256=OtCD1o0TVmSNAUF7dgHpouoAXtY6w9vEtsRVGv4lE0g,4588
20
- schemathesis/models.py,sha256=HiFWcZO1m2DrmM8fGrXm2sW_uSk2tcYbY5ignfqPpJM,44927
20
+ schemathesis/models.py,sha256=WpF-W592_MVWnMZ8t7wt_A2fr3YNLEwPX3r-jwW8GpY,44266
21
21
  schemathesis/parameters.py,sha256=PndmqQRlEYsCt1kWjSShPsFf6vj7X_7FRdz_-A95eNg,2258
22
22
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- schemathesis/sanitization.py,sha256=mRR4YvXpzqbmgX8Xu6rume6LBcz9g_oyusvbesZl44I,8958
24
- schemathesis/schemas.py,sha256=MJv5NQn55o9ezsJTQxdlP-AD0vqJ7NCs62VW_Thhz6o,20441
23
+ schemathesis/sanitization.py,sha256=_qSt04f_XcHrgguyUnowvdfj-b6u409Ubu07i0ivQUQ,9011
24
+ schemathesis/schemas.py,sha256=YXTWWM1JTFNQEKrxWPye1uQgm3I1_MQPBbc2Y4KW19o,20610
25
25
  schemathesis/serializers.py,sha256=kxXZ-UGa1v_vOm0sC4QYcrNv4rfvI7tHGT2elRVbCbc,11649
26
26
  schemathesis/targets.py,sha256=XIGRghvEzbmEJjse9aZgNEj67L3jAbiazm2rxURWgDE,2351
27
27
  schemathesis/throttling.py,sha256=aisUc4MJDGIOGUAs9L2DlWWpdd4KyAFuNVKhYoaUC9M,1719
28
28
  schemathesis/types.py,sha256=xOzNAeMs6qqeaJnWs5Fpw5JPbvVjyfRfxTJa3G2Ln5I,920
29
29
  schemathesis/utils.py,sha256=NX04p9mO-lCAH3DIISXDXPxWZk6lkGNM4-ubRi8vlvY,5234
30
- schemathesis/cli/__init__.py,sha256=BvV9r2HG5lCclzsfTuydmJrJFq8CFmZrIF0e_YzROBY,73032
30
+ schemathesis/cli/__init__.py,sha256=ZxFkRvpRAaV5OuDZeHEeWrFTnVjJXX-w4cQfYe_R6Yw,73390
31
31
  schemathesis/cli/__main__.py,sha256=MWaenjaUTZIfNPFzKmnkTiawUri7DVldtg3mirLwzU8,92
32
- schemathesis/cli/callbacks.py,sha256=R2noVRu8zDBWmA3dJ2YnmhAjYdkxPDA1zIpA3_2DkFQ,15144
32
+ schemathesis/cli/callbacks.py,sha256=PJs64n6qGrGC5Yv_yl3fGm797cvN6pp2enFLmSljGKs,15127
33
33
  schemathesis/cli/cassettes.py,sha256=lKKKKLjoVT8VnZXjCOCmDYhvLKn1XSrCXCMF9EeftHA,18498
34
34
  schemathesis/cli/constants.py,sha256=wk-0GsoJIel8wFFerQ6Kf_6eAYUtIWkwMFwyAqv3yj4,1635
35
35
  schemathesis/cli/context.py,sha256=EMeyAbU9mRujR46anc43yr6ab4rGYtIDaHC3cV9Qa-Q,2092
36
36
  schemathesis/cli/debug.py,sha256=_YA-bX1ujHl4bqQDEum7M-I2XHBTEGbvgkhvcvKhmgU,658
37
37
  schemathesis/cli/handlers.py,sha256=RjvogPCqqFTiyVYWrGG6euw9-6h-7uSeFvS-ouU8eWs,389
38
- schemathesis/cli/junitxml.py,sha256=yWacOIrTC9UI-IlgZnu8nfSmpkxfMT22NqJ3L1SZa3w,4743
38
+ schemathesis/cli/junitxml.py,sha256=FeQbgjYYwD0twk1QSbP3AivLPhHGwIuikQ6CN2Kw9ho,5050
39
39
  schemathesis/cli/options.py,sha256=DY5PUzpUNyYgpcqqFTeZjmVUykpbaI9fbN44QIWNOfA,2559
40
40
  schemathesis/cli/reporting.py,sha256=zNKaRAUfDZ23-gMtiWbnG2OBndkYlM7ljKvk0Mc_lqI,3589
41
- schemathesis/cli/sanitization.py,sha256=pVlQnVDC1_Ugp0oe1LEkRorFdBRDHqr_NWWKaOaNdY0,728
41
+ schemathesis/cli/sanitization.py,sha256=Onw_NWZSom6XTVNJ5NHnC0PAhrYAcGzIXJbsBCzLkn4,1005
42
42
  schemathesis/cli/output/__init__.py,sha256=AXaUzQ1nhQ-vXhW4-X-91vE2VQtEcCOrGtQXXNN55iQ,29
43
43
  schemathesis/cli/output/default.py,sha256=nYuUwm2M3pIsDebofgXuIFb7Vl4t4sLO0PKmJcE6tb8,39385
44
44
  schemathesis/cli/output/short.py,sha256=CL6-Apxr5tuZ3BL1vecV1MiRY1wDt21g0wiUwZu6mLM,2607
@@ -57,7 +57,7 @@ schemathesis/extra/pytest_plugin.py,sha256=ymicV2NjmSzee0ccUUUjNEvb9ihCxxf_8M60g
57
57
  schemathesis/fixups/__init__.py,sha256=RP5QYJVJhp8LXjhH89fCRaIVU26dHCy74jD9seoYMuc,967
58
58
  schemathesis/fixups/fast_api.py,sha256=mn-KzBqnR8jl4W5fY-_ZySabMDMUnpzCIESMHnlvE1c,1304
59
59
  schemathesis/fixups/utf8_bom.py,sha256=lWT9RNmJG8i-l5AXIpaCT3qCPUwRgzXPW3eoOjmZETA,745
60
- schemathesis/generation/__init__.py,sha256=mC1NVAHyce1_B_wu-GYO9U21Gut8KFrjPXETREC9ABQ,2366
60
+ schemathesis/generation/__init__.py,sha256=wUd5HqIh96Aw91Un0rLOd3XXi2E3BXedSMMjS5RXkuo,2472
61
61
  schemathesis/internal/__init__.py,sha256=93HcdG3LF0BbQKbCteOsFMa1w6nXl8yTmx87QLNJOik,161
62
62
  schemathesis/internal/copy.py,sha256=DcL56z-d69kKR_5u8mlHvjSL1UTyUKNMAwexrwHFY1s,1031
63
63
  schemathesis/internal/datetime.py,sha256=zPLBL0XXLNfP-KYel3H2m8pnsxjsA_4d-zTOhJg2EPQ,136
@@ -66,14 +66,14 @@ schemathesis/internal/extensions.py,sha256=h0aHRK_PTKfiAufkeBziegQS8537TL-Gr1hPW
66
66
  schemathesis/internal/jsonschema.py,sha256=-7tF15cXo1ZdhiRFYYfEClXihX2Svc5Loi_Dz1x201k,1157
67
67
  schemathesis/internal/output.py,sha256=zMaG5knIuBieVH8CrcmPJgbmQukDs2xdekX0BrK7BZs,1989
68
68
  schemathesis/internal/result.py,sha256=d449YvyONjqjDs-A5DAPgtAI96iT753K8sU6_1HLo2Q,461
69
- schemathesis/internal/transformation.py,sha256=3S6AzAqdsEsB5iobFgSuvL0UMUqH0JHC7hGxKwcpqPw,450
69
+ schemathesis/internal/transformation.py,sha256=M5LA4pFZC4nD_0iGfih1wLF3_q8xJas94Uuaymt-7Cw,690
70
70
  schemathesis/internal/validation.py,sha256=G7i8jIMUpAeOnDsDF_eWYvRZe_yMprRswx0QAtMPyEw,966
71
71
  schemathesis/runner/__init__.py,sha256=-aedUaRBCiTiaooC0OsBbdi4XP8APFOpj6eOzwt5nQ8,21366
72
- schemathesis/runner/events.py,sha256=2XnZJQN3bx_AjYqCuucDjFSuVr-UrkN0yiOatXWWn8E,11507
72
+ schemathesis/runner/events.py,sha256=F3TizErDI490cDakpyeCbyK9IOecWpuToQ1HGXvBXzo,11531
73
73
  schemathesis/runner/probes.py,sha256=no5AfO3kse25qvHevjeUfB0Q3C860V2AYzschUW3QMQ,5688
74
74
  schemathesis/runner/serialization.py,sha256=erbXEHyI8rIlkQ42AwgmlH7aAbh313EPqCEfrGKxUls,20040
75
75
  schemathesis/runner/impl/__init__.py,sha256=1E2iME8uthYPBh9MjwVBCTFV-P3fi7AdphCCoBBspjs,199
76
- schemathesis/runner/impl/core.py,sha256=4HsnVYXcJ3qNj_vPpQJn7uu6nQwobzS0aGwmvtKy3L0,45022
76
+ schemathesis/runner/impl/core.py,sha256=H4sYY59kMXQPeOD4BH3j47Ymvix71FSgyQh36flrQxM,45605
77
77
  schemathesis/runner/impl/solo.py,sha256=N7-pUL6nWGiSRUC4Zqy1T4h99vbeQowP6b6cMnobOow,3042
78
78
  schemathesis/runner/impl/threadpool.py,sha256=JtTn5X7gqpbkO4q8n5kykGEPQCpJ9hXJrvU3KMF1CXA,14948
79
79
  schemathesis/service/__init__.py,sha256=cDVTCFD1G-vvhxZkJUwiToTAEQ-0ByIoqwXvJBCf_V8,472
@@ -87,7 +87,7 @@ schemathesis/service/hosts.py,sha256=ad2Lxq9Zcc9PP-1eFLQnxen4ImglcGOH8n7CGG72NNg
87
87
  schemathesis/service/metadata.py,sha256=x2LeCED1mdPf-YQJmjY8xtcIKHfD1ap5V0BGl-UgqNo,2087
88
88
  schemathesis/service/models.py,sha256=ihItUJ9CvH4TvmdfJY3W88NR82OODF8a3RD7WRXn6RM,6578
89
89
  schemathesis/service/report.py,sha256=4A8nf6_KOjDW3x1VXF8gSf_WY2xXp1Cbz-Owl_GeR7o,8294
90
- schemathesis/service/serialization.py,sha256=QX7-wbh3vvUrZtRQWZkwaIUSIkcPtD-RMNFmHBY8J5s,6196
90
+ schemathesis/service/serialization.py,sha256=DSpDu2f9KTW7PVcFAb4uSA_rnHctuvFlnF-JJ0XyDnE,6240
91
91
  schemathesis/service/usage.py,sha256=UbXqxeDq5mAjKkfV4hApZsReZmQHXiqoXUYn_Z6YuZk,2438
92
92
  schemathesis/specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  schemathesis/specs/graphql/__init__.py,sha256=fgyHtvWNUVWismBTOqxQtgLoTighTfvMv6v6QCD_Oyc,85
@@ -95,23 +95,23 @@ schemathesis/specs/graphql/_cache.py,sha256=7ras3q_InDJBPykgHroerl9f2jFamC8xJD35
95
95
  schemathesis/specs/graphql/loaders.py,sha256=qxNGL67_AfhoRh0hIxlnJVe6do26vqwWS_TrJtB-Lro,12198
96
96
  schemathesis/specs/graphql/nodes.py,sha256=bE3G1kNmqJ8OV4igBvIK-UORrkQA6Nofduf87O3TD9I,541
97
97
  schemathesis/specs/graphql/scalars.py,sha256=9tvLTiYVe8A_E8ASA0czz3Z0Mp9lyak7R4wHpAE_jKo,1805
98
- schemathesis/specs/graphql/schemas.py,sha256=w9EvZZ3KrRAmpfIIWZz4qHPRwCOmKX_eovTiqpqLoKs,13926
98
+ schemathesis/specs/graphql/schemas.py,sha256=L7u73YXnmqypghWhmj5FaGUAmU57IporT9NteinEVYY,14036
99
99
  schemathesis/specs/graphql/validation.py,sha256=uINIOt-2E7ZuQV2CxKzwez-7L9tDtqzMSpnVoRWvxy0,1635
100
100
  schemathesis/specs/openapi/__init__.py,sha256=HDcx3bqpa6qWPpyMrxAbM3uTo0Lqpg-BUNZhDJSJKnw,279
101
101
  schemathesis/specs/openapi/_cache.py,sha256=PAiAu4X_a2PQgD2lG5H3iisXdyg4SaHpU46bRZvfNkM,4320
102
102
  schemathesis/specs/openapi/_hypothesis.py,sha256=XtC-rYiH-GHvWykdSSzPFVK7jHNNL7NtibjSEeIZDQw,24122
103
- schemathesis/specs/openapi/checks.py,sha256=eFjbV9-0202qg0s0JjaBNRr7nf8Bd8VMLPHEfMvZoc4,10967
103
+ schemathesis/specs/openapi/checks.py,sha256=K4Eu9e85Tue54_xGp9dp5P8CuuDAcDlqJAM4iRVzXA0,21090
104
104
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
105
105
  schemathesis/specs/openapi/converter.py,sha256=TaYgc5BBHPdkN-n0lqpbeVgLu3eL3L8Wu3y_Vo3TJaQ,2800
106
106
  schemathesis/specs/openapi/definitions.py,sha256=Z186F0gNBSCmPg-Kk7Q-n6XxEZHIOzgUyeqixlC62XE,94058
107
- schemathesis/specs/openapi/examples.py,sha256=t3mYEgUq-akoe3sc9r0Eqb6y2STjIM4m7Lj7kDKG57Y,15293
107
+ schemathesis/specs/openapi/examples.py,sha256=ElfX1kZ4XWfOSOVbes_ovy4P6q_NgWpa0RF0rNJLVM4,16170
108
108
  schemathesis/specs/openapi/formats.py,sha256=JmmkQWNAj5XreXb7Edgj4LADAf4m86YulR_Ec8evpJ4,1220
109
- schemathesis/specs/openapi/links.py,sha256=2ucOLs50OhCqu0PEdbT_BGUM3fKnHBl97YGISLpAxLY,16023
109
+ schemathesis/specs/openapi/links.py,sha256=DCOu14VOFqKYYFbQJHWICDpmTBzJfeP2v2FXBwW3vBI,17531
110
110
  schemathesis/specs/openapi/loaders.py,sha256=AcpvTK8qdirSRcHcinCjQbwfSQSx448LAh_GvFML1C0,25515
111
111
  schemathesis/specs/openapi/media_types.py,sha256=dNTxpRQbY3SubdVjh4Cjb38R6Bc9MF9BsRQwPD87x0g,1017
112
112
  schemathesis/specs/openapi/parameters.py,sha256=_6vNCnPXcdxjfAQbykCRLHjvmTpu_02xDJghxDrGYr8,13611
113
113
  schemathesis/specs/openapi/references.py,sha256=euxM02kQGMHh4Ss1jWjOY_gyw_HazafKITIsvOEiAvI,9831
114
- schemathesis/specs/openapi/schemas.py,sha256=EvdW-aJ-OY-zdSU3AbgK1TydsEJueWMfCZRIfAyMUbI,52420
114
+ schemathesis/specs/openapi/schemas.py,sha256=c732S1iDo-Ns-mw8xfRn98KXzhE6bgmgYk9KN9lTqhc,53003
115
115
  schemathesis/specs/openapi/security.py,sha256=nEhDB_SvEFldmfpa9uOQywfWN6DtXHKmgtwucJvfN5Q,7096
116
116
  schemathesis/specs/openapi/serialization.py,sha256=5qGdFHZ3n80UlbSXrO_bkr4Al_7ci_Z3aSUjZczNDQY,11384
117
117
  schemathesis/specs/openapi/utils.py,sha256=-TCu0hTrlwp2x5qHNp-TxiHRMeIZC9OBmlhLssjRIiQ,742
@@ -127,25 +127,25 @@ schemathesis/specs/openapi/negative/__init__.py,sha256=gw0w_9tVQf_MY5Df3_xTZFC4r
127
127
  schemathesis/specs/openapi/negative/mutations.py,sha256=lLEN0GLxvPmZBQ3tHCznDSjmZ4yQiQxspjv1UpO4Kx0,19019
128
128
  schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
129
129
  schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
130
- schemathesis/specs/openapi/stateful/__init__.py,sha256=bQLAavl0-B3hGjEgfrS8o7cPSJ-bK9j-RsG7O9COBBM,8261
130
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=WV0iPWE_BiSoTu2bt0IMbuk71TDJvLPv403thTSXcqc,8662
131
131
  schemathesis/specs/openapi/stateful/statistic.py,sha256=EJK4NqeAYRYl1FtU9YEuTLyhGhPmks0bLoxUPuQlOvM,7443
132
132
  schemathesis/specs/openapi/stateful/types.py,sha256=UuGcCTFvaHsqeLN9ZeUNcbjsEwmthoT3UcHfDHchOYo,419
133
- schemathesis/stateful/__init__.py,sha256=qyQJ-9Ect-AWZiAsK63F3BTGu-jZnPCOp1q46YAonkQ,4911
134
- schemathesis/stateful/config.py,sha256=rtGl3egoUuPFxrWcl5xZj_6KmKzZyYaC0b_AUotvurs,2930
133
+ schemathesis/stateful/__init__.py,sha256=gONzl3pgZ8DihjK52Wd3Ye1LeP6gnulmevHI_jEqHWI,5088
134
+ schemathesis/stateful/config.py,sha256=s0klpsesAJuK9IS6V8pVJNO-OwB0MbmzlXkU3WlMO1g,3556
135
135
  schemathesis/stateful/context.py,sha256=MeP3-lKyhtAd-jzApC65AWlDZSOBzQq0IgK-nvagYqs,4519
136
136
  schemathesis/stateful/events.py,sha256=reGjsmS-y2izRd3bahpEZNe4zxTSpKAkPI-nCQyoUzI,6733
137
- schemathesis/stateful/runner.py,sha256=5YLWTzTWGfT3u14-9EQRe3zgJjwdvNUJi9YGrOJ03_c,11110
137
+ schemathesis/stateful/runner.py,sha256=tIlXRpy0Y0vuQYjTlafpZ4Ur_KhFhdK5CH7ScRvDPWk,11110
138
138
  schemathesis/stateful/sink.py,sha256=xjsqJYH5WETKh5pDGlchYyjT3HcjzHEotUjvo1p0JsE,2470
139
- schemathesis/stateful/state_machine.py,sha256=iRbznWxHnUdLhMpiBaHxe6Nh1EacyGnGFz4DCRwV5j4,12228
139
+ schemathesis/stateful/state_machine.py,sha256=u7PkwCjxTZZcePC7GPiOUuu4uhqUees3UuorD_0Sx_c,12938
140
140
  schemathesis/stateful/statistic.py,sha256=xPLiCw61ofNXQicqcK_sZyLHiqiGcgQARpwd8AiRubM,487
141
141
  schemathesis/stateful/validation.py,sha256=JtqnRzl11ZbVR8Lcr0xBJKoOXzx8VUfRz92jOnB2Smg,3605
142
- schemathesis/transports/__init__.py,sha256=j5WwdEzXi4XGT-Q_IrCI0fYJw19h17Qq4LJIMbmPXnk,12445
142
+ schemathesis/transports/__init__.py,sha256=tIJm79N_pBHM5ccvez4Z4mW-VrG1LfN8yq7B0v9YDGk,12832
143
143
  schemathesis/transports/auth.py,sha256=yELjkEkfx4g74hNrd0Db9aFf0xDJDRIwhg2vzKOTZGg,1138
144
144
  schemathesis/transports/content_types.py,sha256=VrcRQvF5T_TUjrCyrZcYF2LOwKfs3IrLcMtkVSp1ImI,2189
145
145
  schemathesis/transports/headers.py,sha256=hr_AIDOfUxsJxpHfemIZ_uNG3_vzS_ZeMEKmZjbYiBE,990
146
146
  schemathesis/transports/responses.py,sha256=6-gvVcRK0Ho_lSydUysBNFWoJwZEiEgf6Iv-GWkQGd8,1675
147
- schemathesis-3.33.2.dist-info/METADATA,sha256=gdrfnhSVNZu9U2o6paLsjRF_CKO1tseEnbe4MeQx_KA,17795
148
- schemathesis-3.33.2.dist-info/WHEEL,sha256=hKi7AIIx6qfnsRbr087vpeJnrVUuDokDHZacPPMW7-Y,87
149
- schemathesis-3.33.2.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
150
- schemathesis-3.33.2.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
151
- schemathesis-3.33.2.dist-info/RECORD,,
147
+ schemathesis-3.34.0.dist-info/METADATA,sha256=J6cG2yfIh_VOAI7UbhuD_TEKHla0zgqghCjawG6nwLw,18373
148
+ schemathesis-3.34.0.dist-info/WHEEL,sha256=hKi7AIIx6qfnsRbr087vpeJnrVUuDokDHZacPPMW7-Y,87
149
+ schemathesis-3.34.0.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
150
+ schemathesis-3.34.0.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
151
+ schemathesis-3.34.0.dist-info/RECORD,,