schemathesis 4.0.0a3__py3-none-any.whl → 4.0.0a5__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 (53) hide show
  1. schemathesis/cli/__init__.py +3 -3
  2. schemathesis/cli/commands/run/__init__.py +159 -135
  3. schemathesis/cli/commands/run/checks.py +2 -3
  4. schemathesis/cli/commands/run/context.py +102 -19
  5. schemathesis/cli/commands/run/executor.py +33 -12
  6. schemathesis/cli/commands/run/filters.py +1 -0
  7. schemathesis/cli/commands/run/handlers/cassettes.py +27 -46
  8. schemathesis/cli/commands/run/handlers/junitxml.py +1 -1
  9. schemathesis/cli/commands/run/handlers/output.py +238 -102
  10. schemathesis/cli/commands/run/hypothesis.py +14 -41
  11. schemathesis/cli/commands/run/reports.py +72 -0
  12. schemathesis/cli/commands/run/validation.py +18 -12
  13. schemathesis/cli/ext/groups.py +42 -13
  14. schemathesis/cli/ext/options.py +15 -8
  15. schemathesis/core/__init__.py +7 -1
  16. schemathesis/core/errors.py +79 -11
  17. schemathesis/core/failures.py +2 -1
  18. schemathesis/core/transforms.py +1 -1
  19. schemathesis/engine/config.py +2 -2
  20. schemathesis/engine/core.py +11 -1
  21. schemathesis/engine/errors.py +8 -3
  22. schemathesis/engine/events.py +7 -0
  23. schemathesis/engine/phases/__init__.py +16 -4
  24. schemathesis/engine/phases/stateful/_executor.py +1 -1
  25. schemathesis/engine/phases/unit/__init__.py +77 -53
  26. schemathesis/engine/phases/unit/_executor.py +28 -23
  27. schemathesis/engine/phases/unit/_pool.py +8 -0
  28. schemathesis/errors.py +6 -2
  29. schemathesis/experimental/__init__.py +0 -6
  30. schemathesis/filters.py +8 -0
  31. schemathesis/generation/coverage.py +6 -1
  32. schemathesis/generation/hypothesis/builder.py +222 -97
  33. schemathesis/generation/stateful/state_machine.py +49 -3
  34. schemathesis/openapi/checks.py +3 -1
  35. schemathesis/pytest/lazy.py +43 -5
  36. schemathesis/pytest/plugin.py +4 -4
  37. schemathesis/schemas.py +1 -1
  38. schemathesis/specs/openapi/checks.py +28 -11
  39. schemathesis/specs/openapi/examples.py +2 -5
  40. schemathesis/specs/openapi/expressions/__init__.py +22 -6
  41. schemathesis/specs/openapi/expressions/nodes.py +15 -21
  42. schemathesis/specs/openapi/expressions/parser.py +1 -1
  43. schemathesis/specs/openapi/parameters.py +0 -2
  44. schemathesis/specs/openapi/patterns.py +24 -7
  45. schemathesis/specs/openapi/schemas.py +13 -13
  46. schemathesis/specs/openapi/serialization.py +14 -0
  47. schemathesis/specs/openapi/stateful/__init__.py +96 -23
  48. schemathesis/specs/openapi/{links.py → stateful/links.py} +60 -16
  49. {schemathesis-4.0.0a3.dist-info → schemathesis-4.0.0a5.dist-info}/METADATA +7 -26
  50. {schemathesis-4.0.0a3.dist-info → schemathesis-4.0.0a5.dist-info}/RECORD +53 -52
  51. {schemathesis-4.0.0a3.dist-info → schemathesis-4.0.0a5.dist-info}/WHEEL +0 -0
  52. {schemathesis-4.0.0a3.dist-info → schemathesis-4.0.0a5.dist-info}/entry_points.txt +0 -0
  53. {schemathesis-4.0.0a3.dist-info → schemathesis-4.0.0a5.dist-info}/licenses/LICENSE +0 -0
@@ -7,15 +7,17 @@ from typing import TYPE_CHECKING, Any, Callable, Iterator
7
7
  from hypothesis import strategies as st
8
8
  from hypothesis.stateful import Bundle, Rule, precondition, rule
9
9
 
10
+ from schemathesis.core.errors import InvalidStateMachine
10
11
  from schemathesis.core.result import Ok
12
+ from schemathesis.core.transforms import UNRESOLVABLE
11
13
  from schemathesis.engine.recorder import ScenarioRecorder
12
14
  from schemathesis.generation import GenerationMode
13
15
  from schemathesis.generation.case import Case
14
16
  from schemathesis.generation.hypothesis import strategies
15
17
  from schemathesis.generation.stateful.state_machine import APIStateMachine, StepInput, StepOutput, _normalize_name
16
18
  from schemathesis.schemas import APIOperation
17
- from schemathesis.specs.openapi.links import OpenApiLink, get_all_links
18
19
  from schemathesis.specs.openapi.stateful.control import TransitionController
20
+ from schemathesis.specs.openapi.stateful.links import OpenApiLink, get_all_links
19
21
  from schemathesis.specs.openapi.utils import expand_status_code
20
22
 
21
23
  if TYPE_CHECKING:
@@ -72,15 +74,35 @@ class ApiTransitions:
72
74
  self.operations.setdefault(link.target.label, OperationTransitions()).incoming.append(link)
73
75
 
74
76
 
77
+ @dataclass
78
+ class RootTransitions:
79
+ """Classification of API operations that can serve as entry points."""
80
+
81
+ __slots__ = ("reliable", "fallback")
82
+
83
+ def __init__(self) -> None:
84
+ # Operations likely to succeed and provide data for other transitions
85
+ self.reliable: set[str] = set()
86
+ # Operations that might work but are less reliable
87
+ self.fallback: set[str] = set()
88
+
89
+
75
90
  def collect_transitions(operations: list[APIOperation]) -> ApiTransitions:
76
91
  """Collect all transitions between operations."""
77
92
  transitions = ApiTransitions()
78
93
 
79
94
  selected_labels = {operation.label for operation in operations}
95
+ errors = []
80
96
  for operation in operations:
81
97
  for _, link in get_all_links(operation):
82
- if link.target.label in selected_labels:
83
- transitions.add_outgoing(operation.label, link)
98
+ if isinstance(link, Ok):
99
+ if link.ok().target.label in selected_labels:
100
+ transitions.add_outgoing(operation.label, link.ok())
101
+ else:
102
+ errors.append(link.err())
103
+
104
+ if errors:
105
+ raise InvalidStateMachine(errors)
84
106
 
85
107
  return transitions
86
108
 
@@ -109,15 +131,37 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
109
131
  rules = {}
110
132
  catch_all = Bundle("catch_all")
111
133
 
134
+ # We want stateful testing to be effective and focus on meaningful transitions.
135
+ # An operation is considered as a "root" transition (entry point) if it satisfies certain criteria
136
+ # that indicate it's likely to succeed and provide data for other transitions.
137
+ # For example:
138
+ # - POST operations that create resources
139
+ # - GET operations without path parameters (e.g., GET /users/ to list all users)
140
+ #
141
+ # We avoid adding operations as roots if they:
142
+ # 1. Have incoming transitions that will provide proper data
143
+ # Example: If POST /users/ -> GET /users/{id} exists, we don't need
144
+ # to generate random user IDs for GET /users/{id}
145
+ # 2. Are unlikely to succeed with random data
146
+ # Example: GET /users/{id} with random ID is likely to return 404
147
+ #
148
+ # This way we:
149
+ # 1. Maximize the chance of successful transitions
150
+ # 2. Don't waste the test budget (limited number of steps) on likely-to-fail operations
151
+ # 3. Focus on transitions that are designed to work together via links
152
+
153
+ roots = classify_root_transitions(operations, transitions)
154
+
112
155
  for target in operations:
113
156
  if target.label in transitions.operations:
114
157
  incoming = transitions.operations[target.label].incoming
115
158
  if incoming:
116
159
  for link in incoming:
117
160
  bundle_name = f"{link.source.label} -> {link.status_code}"
118
- name = _normalize_name(f"{link.status_code} -> {target.label}")
119
- name = _normalize_name(f"{link.source.label} -> {link.status_code} -> {target.label}")
120
- assert name not in rules
161
+ name = _normalize_name(
162
+ f"{link.source.label} -> {link.status_code} -> {link.name} -> {target.label}"
163
+ )
164
+ assert name not in rules, name
121
165
  rules[name] = precondition(is_transition_allowed(bundle_name, link.source.label, target.label))(
122
166
  transition(
123
167
  name=name,
@@ -127,13 +171,8 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
127
171
  ),
128
172
  )
129
173
  )
130
- if transitions.operations[target.label].outgoing and target.method == "post":
131
- # Allow POST methods for operations with outgoing transitions.
132
- # This approach also includes cases when there is an incoming transition back to POST
133
- # For example, POST /users/ -> GET /users/{id}/
134
- # The source operation has no prerequisite, but we need to allow this rule to be executed
135
- # in order to reach other transitions
136
- name = _normalize_name(f"{target.label} -> X")
174
+ if target.label in roots.reliable or (not roots.reliable and target.label in roots.fallback):
175
+ name = _normalize_name(f"RANDOM -> {target.label}")
137
176
  if len(schema.generation_config.modes) == 1:
138
177
  case_strategy = target.as_strategy(generation_mode=schema.generation_config.modes[0])
139
178
  else:
@@ -168,41 +207,75 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
168
207
  )
169
208
 
170
209
 
210
+ def classify_root_transitions(operations: list[APIOperation], transitions: ApiTransitions) -> RootTransitions:
211
+ """Find operations that can serve as root transitions."""
212
+ roots = RootTransitions()
213
+
214
+ for operation in operations:
215
+ # Skip if operation has no outgoing transitions
216
+ operation_transitions = transitions.operations.get(operation.label)
217
+ if not operation_transitions or not operation_transitions.outgoing:
218
+ continue
219
+
220
+ if is_likely_root_transition(operation, operation_transitions):
221
+ roots.reliable.add(operation.label)
222
+ else:
223
+ roots.fallback.add(operation.label)
224
+
225
+ return roots
226
+
227
+
228
+ def is_likely_root_transition(operation: APIOperation, transitions: OperationTransitions) -> bool:
229
+ """Check if operation is likely to succeed as a root transition."""
230
+ # POST operations with request bodies are likely to create resources
231
+ if operation.method == "post" and operation.body:
232
+ return True
233
+
234
+ # GET operations without path parameters are likely to return lists
235
+ if operation.method == "get" and not operation.path_parameters:
236
+ return True
237
+
238
+ return False
239
+
240
+
171
241
  def into_step_input(
172
242
  target: APIOperation, link: OpenApiLink, modes: list[GenerationMode]
173
243
  ) -> Callable[[StepOutput], st.SearchStrategy[StepInput]]:
174
244
  def builder(_output: StepOutput) -> st.SearchStrategy[StepInput]:
175
245
  @st.composite # type: ignore[misc]
176
246
  def inner(draw: st.DrawFn, output: StepOutput) -> StepInput:
177
- transition_data = link.extract(output)
247
+ transition = link.extract(output)
178
248
 
179
249
  kwargs: dict[str, Any] = {
180
250
  container: {
181
251
  name: extracted.value.ok()
182
252
  for name, extracted in data.items()
183
- if isinstance(extracted.value, Ok) and extracted.value.ok() is not None
253
+ if isinstance(extracted.value, Ok) and extracted.value.ok() not in (None, UNRESOLVABLE)
184
254
  }
185
- for container, data in transition_data.parameters.items()
255
+ for container, data in transition.parameters.items()
186
256
  }
257
+
187
258
  if (
188
- transition_data.request_body is not None
189
- and isinstance(transition_data.request_body.value, Ok)
259
+ transition.request_body is not None
260
+ and isinstance(transition.request_body.value, Ok)
261
+ and transition.request_body.value.ok() is not UNRESOLVABLE
190
262
  and not link.merge_body
191
263
  ):
192
- kwargs["body"] = transition_data.request_body.value.ok()
264
+ kwargs["body"] = transition.request_body.value.ok()
193
265
  cases = strategies.combine([target.as_strategy(generation_mode=mode, **kwargs) for mode in modes])
194
266
  case = draw(cases)
195
267
  if (
196
- transition_data.request_body is not None
197
- and isinstance(transition_data.request_body.value, Ok)
268
+ transition.request_body is not None
269
+ and isinstance(transition.request_body.value, Ok)
270
+ and transition.request_body.value.ok() is not UNRESOLVABLE
198
271
  and link.merge_body
199
272
  ):
200
- new = transition_data.request_body.value.ok()
273
+ new = transition.request_body.value.ok()
201
274
  if isinstance(case.body, dict) and isinstance(new, dict):
202
275
  case.body = {**case.body, **new}
203
276
  else:
204
277
  case.body = new
205
- return StepInput(case=case, transition=transition_data)
278
+ return StepInput(case=case, transition=transition)
206
279
 
207
280
  return inner(output=_output)
208
281
 
@@ -5,14 +5,13 @@ from functools import lru_cache
5
5
  from typing import TYPE_CHECKING, Any, Callable, Generator, Literal, Union, cast
6
6
 
7
7
  from schemathesis.core import NOT_SET, NotSet
8
- from schemathesis.core.errors import InvalidLinkDefinition, InvalidSchema, OperationNotFound
8
+ from schemathesis.core.errors import InvalidTransition, OperationNotFound, TransitionValidationError
9
9
  from schemathesis.core.result import Err, Ok, Result
10
10
  from schemathesis.generation.stateful.state_machine import ExtractedParam, StepOutput, Transition
11
11
  from schemathesis.schemas import APIOperation
12
-
13
- from . import expressions
14
- from .constants import LOCATION_TO_CONTAINER
15
- from .references import RECURSION_DEPTH_LIMIT
12
+ from schemathesis.specs.openapi import expressions
13
+ from schemathesis.specs.openapi.constants import LOCATION_TO_CONTAINER
14
+ from schemathesis.specs.openapi.references import RECURSION_DEPTH_LIMIT
16
15
 
17
16
  if TYPE_CHECKING:
18
17
  from jsonschema import RefResolver
@@ -55,6 +54,7 @@ class OpenApiLink:
55
54
  self.status_code = status_code
56
55
  self.source = source
57
56
  assert isinstance(source.schema, BaseOpenAPISchema)
57
+ errors = []
58
58
 
59
59
  get_operation: Callable[[str], APIOperation]
60
60
  if "operationId" in definition:
@@ -66,19 +66,30 @@ class OpenApiLink:
66
66
 
67
67
  try:
68
68
  self.target = get_operation(operation_reference)
69
- except OperationNotFound as exc:
70
- raise InvalidLinkDefinition(
71
- f"Link '{name}' references non-existent operation '{operation_reference}' from {status_code} response of '{source.label}'"
72
- ) from exc
69
+ target = self.target.label
70
+ except OperationNotFound:
71
+ target = operation_reference
72
+ errors.append(TransitionValidationError(f"Operation '{operation_reference}' not found"))
73
73
 
74
74
  extension = definition.get(SCHEMATHESIS_LINK_EXTENSION)
75
- self.parameters = self._normalize_parameters(definition.get("parameters", {}))
75
+ self.parameters = self._normalize_parameters(definition.get("parameters", {}), errors)
76
76
  self.body = definition.get("requestBody", NOT_SET)
77
77
  self.merge_body = extension.get("merge_body", True) if extension else True
78
78
 
79
+ if errors:
80
+ raise InvalidTransition(
81
+ name=self.name,
82
+ source=self.source.label,
83
+ target=target,
84
+ status_code=self.status_code,
85
+ errors=errors,
86
+ )
87
+
79
88
  self._cached_extract = lru_cache(8)(self._extract_impl)
80
89
 
81
- def _normalize_parameters(self, parameters: dict[str, str]) -> list[NormalizedParameter]:
90
+ def _normalize_parameters(
91
+ self, parameters: dict[str, str], errors: list[TransitionValidationError]
92
+ ) -> list[NormalizedParameter]:
82
93
  """Process link parameters and resolve their container locations.
83
94
 
84
95
  Handles both explicit locations (e.g., "path.id") and implicit ones resolved from target operation.
@@ -94,7 +105,34 @@ class OpenApiLink:
94
105
  location = None
95
106
  name = parameter
96
107
 
97
- container_name = self._get_parameter_container(location, name)
108
+ if isinstance(expression, str):
109
+ try:
110
+ parsed = expressions.parser.parse(expression)
111
+ # Find NonBodyRequest nodes that reference source parameters
112
+ for node in parsed:
113
+ if isinstance(node, expressions.nodes.NonBodyRequest):
114
+ # Check if parameter exists in source operation
115
+ if not any(
116
+ p.name == node.parameter and p.location == node.location
117
+ for p in self.source.iter_parameters()
118
+ ):
119
+ errors.append(
120
+ TransitionValidationError(
121
+ f"Expression `{expression}` references non-existent {node.location} parameter "
122
+ f"`{node.parameter}` in `{self.source.label}`"
123
+ )
124
+ )
125
+ except Exception as exc:
126
+ errors.append(TransitionValidationError(str(exc)))
127
+
128
+ if hasattr(self, "target"):
129
+ try:
130
+ container_name = self._get_parameter_container(location, name)
131
+ except TransitionValidationError as exc:
132
+ errors.append(exc)
133
+ continue
134
+ else:
135
+ continue
98
136
  result.append(NormalizedParameter(location, name, expression, container_name))
99
137
  return result
100
138
 
@@ -106,7 +144,7 @@ class OpenApiLink:
106
144
  for param in self.target.iter_parameters():
107
145
  if param.name == name:
108
146
  return LOCATION_TO_CONTAINER[param.location]
109
- raise InvalidSchema(f"Parameter `{name}` is not defined in API operation `{self.target.label}`")
147
+ raise TransitionValidationError(f"Parameter `{name}` is not defined in API operation `{self.target.label}`")
110
148
 
111
149
  def extract(self, output: StepOutput) -> Transition:
112
150
  return self._cached_extract(StepOutputWrapper(output))
@@ -114,7 +152,7 @@ class OpenApiLink:
114
152
  def _extract_impl(self, wrapper: StepOutputWrapper) -> Transition:
115
153
  output = wrapper.output
116
154
  return Transition(
117
- id=f"{self.source.label} - {self.status_code} - {self.name}",
155
+ id=f"{self.source.label} -> [{self.status_code}] {self.name} -> {self.target.label}",
118
156
  parent_id=output.case.id,
119
157
  parameters=self.extract_parameters(output),
120
158
  request_body=self.extract_body(output),
@@ -162,11 +200,17 @@ class StepOutputWrapper:
162
200
  return self.output.case.id == other.output.case.id
163
201
 
164
202
 
165
- def get_all_links(operation: APIOperation) -> Generator[tuple[str, OpenApiLink], None, None]:
203
+ def get_all_links(
204
+ operation: APIOperation,
205
+ ) -> Generator[tuple[str, Result[OpenApiLink, InvalidTransition]], None, None]:
166
206
  for status_code, definition in operation.definition.raw["responses"].items():
167
207
  definition = operation.schema.resolver.resolve_all(definition, RECURSION_DEPTH_LIMIT - 8) # type: ignore[attr-defined]
168
208
  for name, link_definition in definition.get(operation.schema.links_field, {}).items(): # type: ignore
169
- yield status_code, OpenApiLink(name, status_code, link_definition, operation)
209
+ try:
210
+ link = OpenApiLink(name, status_code, link_definition, operation)
211
+ yield status_code, Ok(link)
212
+ except InvalidTransition as exc:
213
+ yield status_code, Err(exc)
170
214
 
171
215
 
172
216
  StatusCode = Union[str, int]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.0a3
3
+ Version: 4.0.0a5
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
@@ -137,36 +137,17 @@ Schemathesis is an API testing tool that automatically finds crashes and validat
137
137
 
138
138
  ### Highlights
139
139
 
140
- 🎯 **Catches Hard-to-Find Bugs**
140
+ - 🎯 **Catches Hard-to-Find Bugs**: Automatically uncover crashes and spec violations that manual testing might miss.
141
141
 
142
- - Uncover hidden crashes and edge cases that manual testing might miss
143
- - Identify spec violations and ensure your API adheres to its contract
142
+ - **Accelerates Testing**: Generate a wide range of test cases directly from your API schema.
144
143
 
145
- **Accelerates Testing Cycles**
144
+ - 🧩 **Integrates Seamlessly**: Works with popular API formats such as OpenAPI and GraphQL, and easily integrates into your existing CI/CD workflows.
146
145
 
147
- - Automatically generate a wide range of test cases based on your API schema
148
- - Save time by reducing the need for manual test case creation
146
+ - 🔧 **Customizable and Extendable**: Leverage Python extensions to configure and extend your test generation.
149
147
 
150
- 🧩 **Integrates Seamlessly**
148
+ - 🐞 **Simplifies Debugging**: Detailed reports and reproducible test cases with cURL commands streamline troubleshooting.
151
149
 
152
- - Works with popular API formats such as OpenAPI, GraphQL.
153
- - Easily integrate into your existing CI/CD workflows.
154
-
155
- 🔧 **Customizable and Extendable**
156
-
157
- - Tune the testing process using Python extensions.
158
- - Adjust the testing flow to suit your needs with rich configuration options.
159
-
160
- 🐞 **Simplifies Debugging**
161
-
162
- - Get detailed reports to identify and fix issues quickly.
163
- - Reproduce failing test cases with cURL commands.
164
-
165
- 🔬 **Proven by Research**
166
-
167
- - Validated through academic studies on API testing automation
168
- - Featured in [ICSE 2022 paper](https://ieeexplore.ieee.org/document/9793781) on semantics-aware fuzzing
169
- - Recognized in [ACM survey](https://dl.acm.org/doi/10.1145/3617175) as state-of-the-art RESTful API testing tool
150
+ - 🔬 **Proven by Research**: Validated through academic studies on API testing automation, featured in the [ICSE 2022 paper](https://ieeexplore.ieee.org/document/9793781) on semantics-aware fuzzing, and recognized in an [ACM survey](https://dl.acm.org/doi/10.1145/3617175) as a state-of-the-art RESTful API testing tool.
170
151
 
171
152
  ## Installation
172
153
 
@@ -1,45 +1,46 @@
1
1
  schemathesis/__init__.py,sha256=ggp1CxctLo__wwFwlDhvtrexxDXGSbRjFKzXw_Twi7k,1139
2
2
  schemathesis/auths.py,sha256=t-YuPyoLqL7jlRUH-45JxO7Ir3pYxpe31CRmNIJh7rI,15423
3
3
  schemathesis/checks.py,sha256=B5-ROnjvvwpaqgj_iQ7eCjGqvRRVT30eWNPLKmwdrM8,5084
4
- schemathesis/errors.py,sha256=R_GkKg9o-XYWsU4f-Devn_clIrhMi5ZXpiAjqi5Tupw,791
5
- schemathesis/filters.py,sha256=6kffe_Xbi7-xThsUciWfmy1IU-LBgSYkXROUJJONJ48,13311
4
+ schemathesis/errors.py,sha256=VSZ-h9Bt7QvrvywOGB-MoHCshR8OWJegYlBxfVh5Vuw,899
5
+ schemathesis/filters.py,sha256=CzVPnNSRLNgvLlU5_WssPEC0wpdQi0dMvDpHSQbAlkE,13577
6
6
  schemathesis/hooks.py,sha256=jTdN5GJbxHRMshxgcuI_th9ouuL32CN4m2Jt0pmT_bs,13148
7
7
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- schemathesis/schemas.py,sha256=wQqKfZIaPgfAzLVUOxkgW7LqwBdWtLJeryeouytUlTw,27412
9
- schemathesis/cli/__init__.py,sha256=cT8DmZYudre1a0cX2KOBytquJ85CMdmMnqqMZsIATJU,822
8
+ schemathesis/schemas.py,sha256=Hs2pJTUa2Od3x5YRprrKYIfE7ndpKbAqeDylAWkB6yM,27407
9
+ schemathesis/cli/__init__.py,sha256=U9gjzWWpiFhaqevPjZbwyTNjABdpvXETI4HgwdGKnvs,877
10
10
  schemathesis/cli/__main__.py,sha256=MWaenjaUTZIfNPFzKmnkTiawUri7DVldtg3mirLwzU8,92
11
11
  schemathesis/cli/constants.py,sha256=rUixnqorraUFDtOu3Nmm1x_k0qbgmW9xW96kQB_fBCQ,338
12
12
  schemathesis/cli/core.py,sha256=Qm5xvpIIMwJDTeR3N3TjKhMCHV5d5Rp0UstVS2GjWgw,459
13
13
  schemathesis/cli/hooks.py,sha256=vTrA8EN99whRns5K5AnExViQ6WL9cak5RGsC-ZBEiJM,1458
14
14
  schemathesis/cli/commands/__init__.py,sha256=FFalEss3D7mnCRO0udtYb65onXSjQCCOv8sOSjqvTTM,1059
15
- schemathesis/cli/commands/run/__init__.py,sha256=mpXoFTAuyaBjTQiusLVfzU9BXwcNN84vcmll22bQ-18,22651
16
- schemathesis/cli/commands/run/checks.py,sha256=-p6bzuc98kNR1VhkTI2s4xaJx-b5zYSMwdlhONwUhRM,3337
17
- schemathesis/cli/commands/run/context.py,sha256=o_lUkR2bpsxO4oMB7eJVCMIR9jmfS0nLZCd_LdOluF4,3906
15
+ schemathesis/cli/commands/run/__init__.py,sha256=ToPLYJrLcan5-fVqo-xs8peVy7O51fQMXxu1y5K2Ei4,23112
16
+ schemathesis/cli/commands/run/checks.py,sha256=lLtBCt6NhhQisrWo8aC6i0M3dSXlbjGWTTlOyjzatks,3278
17
+ schemathesis/cli/commands/run/context.py,sha256=pUwSlS7UwW2cq1nJXfKZFEaWDipsQAElCO4tdv1qYJA,7739
18
18
  schemathesis/cli/commands/run/events.py,sha256=Dj-xvIr-Hkms8kvh4whNwKSk1Q2Hx4NIENi_4A8nQO8,1224
19
- schemathesis/cli/commands/run/executor.py,sha256=pozPf5kzizsQtCzssE_5M8AV2lgzPcE3o9xxoOA1n78,4816
20
- schemathesis/cli/commands/run/filters.py,sha256=vBYH_Q1Gc2yjo4pysd1nSKfNVQADh5POFoAExvUPmqQ,7390
21
- schemathesis/cli/commands/run/hypothesis.py,sha256=3PkcUSe-P6zgkhPJbN8RstjGNzgcY76AVlJ7ayu44Eg,3582
19
+ schemathesis/cli/commands/run/executor.py,sha256=lKQZswH7vLsKCUNdDL8IOwJYsUicyPxRJ3vXOi1pwAk,5446
20
+ schemathesis/cli/commands/run/filters.py,sha256=MdymOZtzOolvXCNBIdfHbBbWEXVF7Se0mmDpy3sVWu4,7411
21
+ schemathesis/cli/commands/run/hypothesis.py,sha256=hdEHim_Hc2HwCGxAiRTf4t2OfQf0IeCUhyjNT_btB1o,2553
22
22
  schemathesis/cli/commands/run/loaders.py,sha256=VedoeIE1tgFBqVokWxOoUReAjBl-Zhx87RjCEBtCVfs,4840
23
- schemathesis/cli/commands/run/validation.py,sha256=zeMQ2QAlVTwxUriRJjo9AQbQRXqm41F7YMP3JysY6vQ,12667
23
+ schemathesis/cli/commands/run/reports.py,sha256=OjyakiV0lpNDBZb1xsb_2HmLtcqhTThPYMpJGXyNNO8,2147
24
+ schemathesis/cli/commands/run/validation.py,sha256=7fvLeDREQ9FTV8ZMJRnCdycD858j21k7j56ow4_iIcY,12789
24
25
  schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
25
26
  schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
26
- schemathesis/cli/commands/run/handlers/cassettes.py,sha256=y4gtGnAfhE9dskhXPnDAQSx3kY4R2a1hvAiE3o8AsUA,19001
27
- schemathesis/cli/commands/run/handlers/junitxml.py,sha256=MkFq_DyMWves4Ytj72-4secMTlBOt7Gs9W3nfBzknIA,2316
28
- schemathesis/cli/commands/run/handlers/output.py,sha256=KlT_omUWRWzygvqz_nwRvXJXjtbmzTYhfWqPCLOQTBw,51917
27
+ schemathesis/cli/commands/run/handlers/cassettes.py,sha256=SVk13xPhsQduCpgvvBwzEMDNTju-SHQCW90xTQ6iL1U,18525
28
+ schemathesis/cli/commands/run/handlers/junitxml.py,sha256=c24UiwXqRCnv2eWQWEaNXLOghMI9JtGoZ9RTJY4ao6M,2350
29
+ schemathesis/cli/commands/run/handlers/output.py,sha256=AcnFAOm03QR4eKNQcQV2EZFV-YUcRaL4rKvMrmOyCuM,58806
29
30
  schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  schemathesis/cli/ext/fs.py,sha256=OA3mRzra4rq3NyDTcBvlRh0WJrh4ByN-QQ8loI04m88,408
31
- schemathesis/cli/ext/groups.py,sha256=9mIZUnQasUxGz6gZA0IoGVGKtSQuVNl8w2pwX_a1nBk,1796
32
- schemathesis/cli/ext/options.py,sha256=Cm56WoktqBjKb8uDf063XT1der7lWOnTd81Y56PjoIg,3657
32
+ schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
33
+ schemathesis/cli/ext/options.py,sha256=gBjfYPoiSoxCymWq41x0oKcQ2frv1fQnweETVpYiIsA,4096
33
34
  schemathesis/contrib/__init__.py,sha256=wxpX86xrEGRAS3f7eugQfKVbnqV6ZfOqFBS_DmWxOok,120
34
35
  schemathesis/contrib/openapi/__init__.py,sha256=-7mBZ9RQj0EGzzmC-HKiT5ZslwHcoWFqCVpRG0GHO_o,162
35
36
  schemathesis/contrib/openapi/fill_missing_examples.py,sha256=BfBpuy3vCKbE_uILqPXnm7kxEDopAr5tNQwP5E9xX8A,585
36
- schemathesis/core/__init__.py,sha256=Lag-8jUqWpcRdiTUtKS3v9HJZgwRy_JS854ZA7wh0W4,1573
37
+ schemathesis/core/__init__.py,sha256=4SLVPpUZgZYABL6QPVRtanMemibKxTQEYcp4LFu4Jco,1761
37
38
  schemathesis/core/compat.py,sha256=Lflo6z-nQ6S4uKZINc4Fr90pd3LTN6cIG9HJJmmaHeY,754
38
39
  schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,130
39
40
  schemathesis/core/curl.py,sha256=yuaCe_zHLGwUjEeloQi6W3tOA3cGdnHDNI17-5jia0o,1723
40
41
  schemathesis/core/deserialization.py,sha256=ygIj4fNaOd0mJ2IvTsn6bsabBt_2AbSLCz-z9UqfpdQ,2406
41
- schemathesis/core/errors.py,sha256=ocwWs8xtoiTtzGn8eCdCtb_Hrdn-jHi_d_TNl29UIkI,13656
42
- schemathesis/core/failures.py,sha256=4ftUsY0q1QqqfWpYkl5lWCZVBUAMy8VP9pXsyDZ8Q3o,8723
42
+ schemathesis/core/errors.py,sha256=97Fk3udsMaS5xZrco7ZaShqe4W6g2aZ55J7d58HPRac,15881
43
+ schemathesis/core/failures.py,sha256=jbbxOXB8LDYoLI97YrLCKi9XLuSqVqFJSLeeixVJPRU,8828
43
44
  schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
44
45
  schemathesis/core/lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
45
46
  schemathesis/core/loaders.py,sha256=SQQ-8m64-D2FaOgvwKZLyTtLJuzP3RPo7Ud2BERK1c0,3404
@@ -48,57 +49,57 @@ schemathesis/core/media_types.py,sha256=vV0CEu34sDoZWXvu4R1Y1HosxVS4YXZV8iTov8fU
48
49
  schemathesis/core/rate_limit.py,sha256=7tg9Znk11erTfw8-ANutjEmu7hbfUHZx_iEdkoaP174,1757
49
50
  schemathesis/core/registries.py,sha256=T4jZB4y3zBHdeSgQc0pRbgSeMblvO-6z4I3zmzIfTi0,811
50
51
  schemathesis/core/result.py,sha256=d449YvyONjqjDs-A5DAPgtAI96iT753K8sU6_1HLo2Q,461
51
- schemathesis/core/transforms.py,sha256=oFyUcGILC_bUrPShKKS0C2KyROJLWQnCirbdElHuQSI,3521
52
+ schemathesis/core/transforms.py,sha256=63aeLkR93r3krq4CwYtDcoS_pFBky4L16c9DcFsBHuE,3535
52
53
  schemathesis/core/transport.py,sha256=VqtVF4JxMuPXSBORzS8SOSLUnCEZL6gPOr0kuymMCAk,3249
53
54
  schemathesis/core/validation.py,sha256=JJbSymYUKKcbkY2L3nECKrbIVUb9PRyUsTqa-aeDEAw,1153
54
55
  schemathesis/core/version.py,sha256=O-6yFbNocbD4RDwiBZLborxTp54htyKxBWTqpZDnPvg,202
55
56
  schemathesis/core/output/__init__.py,sha256=lhVc4OzzxCsmvEPPvg1k8x19iPf_HF-9YonTaqsxvx8,2015
56
57
  schemathesis/core/output/sanitization.py,sha256=EODHJMHD8gqlIA0Yqs1OnElZ2JyNxjvQ0WWErZV1K3s,6210
57
58
  schemathesis/engine/__init__.py,sha256=xncZMXY8S-v4mrfnW4CK6-RQ0S0bigfLDJScpQysblE,831
58
- schemathesis/engine/config.py,sha256=vWwtaWuSLvE-w0S9n4_MlJADjN58zlgSp84ZQS2z0ls,1919
59
+ schemathesis/engine/config.py,sha256=92Ud_aSTj-xi4Mwf8gej_gcvzjemH_ISjHQiXGGKskA,1885
59
60
  schemathesis/engine/context.py,sha256=HeLX-0aqSAbXJe_ZlkqVfg3QlhmbCrazbb9-ZPbi0h0,3723
60
61
  schemathesis/engine/control.py,sha256=QKUOs5VMphe7EcAIro_DDo9ZqdOU6ZVwTU1gMNndHWw,1006
61
- schemathesis/engine/core.py,sha256=_Z89tc_aWQ0kHajVXmoTaEbIRYeERvb1s0rD82XpYxg,5085
62
- schemathesis/engine/errors.py,sha256=EtgqS-6ngtFg6TtloN_g07t3wYPMF6JOSesZ3C2VyXY,16576
63
- schemathesis/engine/events.py,sha256=7tpxCxptKx_WvcFgv9_6v0E-5wiQfDs1O5bsOH46xb8,5989
62
+ schemathesis/engine/core.py,sha256=DfulRMVTivmZj-wwLekIhuSzLsFnuVPtSg7j9HyWdz0,5536
63
+ schemathesis/engine/errors.py,sha256=8PHYsuq2qIEJHm2FDf_UnWa4IDc-DRFTPckLAr22yhE,16895
64
+ schemathesis/engine/events.py,sha256=gslRAWQKMPqBCQzLDS4wAbsKcVuONSy5SPqimJJJYT4,6250
64
65
  schemathesis/engine/recorder.py,sha256=K3HfMARrT5mPWXPnYebjjcq5CcsBRhMrtZwEL9_Lvtg,8432
65
- schemathesis/engine/phases/__init__.py,sha256=HZmlOjGvtDkfTwAw2rJFcfsJ2qg2h973l4zDy3AzsQg,2034
66
+ schemathesis/engine/phases/__init__.py,sha256=3p_T3JYBFOtrwtgmMM7J-6a41QJgk83dUtm7NKcVl3o,2490
66
67
  schemathesis/engine/phases/probes.py,sha256=3M9g3E7CXbDDK_8inuvkRZibCCcoO2Ce5U3lnyTeWXQ,5131
67
68
  schemathesis/engine/phases/stateful/__init__.py,sha256=lWo2RLrutNblHvohTzofQqL22GORwBRA8bf6jvLuGPg,2391
68
- schemathesis/engine/phases/stateful/_executor.py,sha256=oZSfgvGUmiyjVDGpTeZCRv8KLjesYXJeE3cs0OTkQ1E,12428
69
+ schemathesis/engine/phases/stateful/_executor.py,sha256=m1ZMqFUPc4Hdql10l0gF3tpP4JOImSA-XeBd4jg3Ll8,12443
69
70
  schemathesis/engine/phases/stateful/context.py,sha256=SKWsok-tlWbUDagiUmP7cLNW6DsgFDc_Afv0vQfWv6c,2964
70
- schemathesis/engine/phases/unit/__init__.py,sha256=XgLGwkVemmobLP6cyfAGYLu8RFRCrv6osfB3BD6OAS0,7537
71
- schemathesis/engine/phases/unit/_executor.py,sha256=X8hziN6rAd9vRTkbiMKcZWN6ujj4pUEiVdm6OmFsniI,12931
72
- schemathesis/engine/phases/unit/_pool.py,sha256=01xRGJnmfLqGBH-f3nQEDv7vOufmen5ZCiXwNLpkxOw,2210
73
- schemathesis/experimental/__init__.py,sha256=36H1vLQhrw4SMD_jx76Wt07PHneELRDY1jfBSh7VxU0,2257
71
+ schemathesis/engine/phases/unit/__init__.py,sha256=LcBQpGNPeEFB9XPGpcHBcH-C7nF-e8bZNPop9PIfiKA,7861
72
+ schemathesis/engine/phases/unit/_executor.py,sha256=buMEr7e01SFSeNuEQNGMf4hoiLxX9_sp0JhH4LBAk9M,12928
73
+ schemathesis/engine/phases/unit/_pool.py,sha256=9OgmFd-ov1AAvcZGquK40PXkGLp7f2qCjZoPZuoZl4A,2529
74
+ schemathesis/experimental/__init__.py,sha256=jYY3Mq6okqTRTMudPzcaT0JVjzJW5IN_ZVJdGU0stBs,2011
74
75
  schemathesis/generation/__init__.py,sha256=2htA0TlQee6AvQmLl1VNxEptRDqvPjksXKJLMVLAJng,1580
75
76
  schemathesis/generation/case.py,sha256=Rt5MCUtPVYVQzNyjUx8magocPJpHV1svyuqQSTwUE-I,7306
76
- schemathesis/generation/coverage.py,sha256=yQwazaxhKacHU3sA8shMPWQ1JhLE_90YgIZjvAymsG8,39133
77
+ schemathesis/generation/coverage.py,sha256=hyDb465tBoCWE7nI-ZJjhTUzk7f2WDufaadWdSAkdr0,39276
77
78
  schemathesis/generation/meta.py,sha256=36h6m4E7jzLGa8TCvl7eBl_xUWLiRul3qxzexl5cB58,2515
78
79
  schemathesis/generation/modes.py,sha256=t_EvKr2aOXYMsEfdMu4lLF4KCGcX1LVVyvzTkcpJqhk,663
79
80
  schemathesis/generation/overrides.py,sha256=FhqcFoliEvgW6MZyFPYemfLgzKt3Miy8Cud7OMOCb7g,3045
80
81
  schemathesis/generation/targets.py,sha256=_rN2qgxTE2EfvygiN-Fy3WmDnRH0ERohdx3sKRDaYhU,2120
81
82
  schemathesis/generation/hypothesis/__init__.py,sha256=Rl7QwvMBMJI7pBqTydplX6bXC420n0EGQHVm-vZgaYQ,1204
82
- schemathesis/generation/hypothesis/builder.py,sha256=K8pA5hFkx7sXSFIR8zX7ltYCwJHx3CFcq4Rm12ou1wk,24650
83
+ schemathesis/generation/hypothesis/builder.py,sha256=lAxBePbfqGsp6iPjjXeDL-X8RnOgUhsgpYQpeKc1VKg,29292
83
84
  schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
84
85
  schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
85
86
  schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
86
87
  schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
87
88
  schemathesis/generation/stateful/__init__.py,sha256=kXpCGbo1-QqfR2N0Z07tLw0Z5_tvbuG3Tk-WI_I1doI,653
88
- schemathesis/generation/stateful/state_machine.py,sha256=S-mTOyLEeiO3PMv9LfSxQWSi8KxD5URptDxRpkO5Fmw,10947
89
+ schemathesis/generation/stateful/state_machine.py,sha256=3NoB3pYd3BZ0XzlQlhCf8WBCMGttJw25DWCTDsuulGc,12306
89
90
  schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
90
91
  schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
91
92
  schemathesis/graphql/loaders.py,sha256=96R_On1jFvsNuLwqXnO3_TTpsYhdCv0LAmR5jWRXXnY,4756
92
93
  schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
93
- schemathesis/openapi/checks.py,sha256=Rt6uX0yEVIG30YJdQeQKLu-9XZ1Bx-In1LCautTcghg,10760
94
+ schemathesis/openapi/checks.py,sha256=i26qtVqsNUb46Aqu191qWK5lVC51KK6ezbhm1rSSyr4,10781
94
95
  schemathesis/openapi/loaders.py,sha256=jskoCnMgpjg_cpn17FRI4oDUpMdsMYjxfXdRPHYnPqs,6472
95
96
  schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
97
  schemathesis/openapi/generation/filters.py,sha256=MB2t_k6OVc2Rt6qXUrV-u-3sDg5wX6c0Mli9WgfMUF4,2001
97
98
  schemathesis/pytest/__init__.py,sha256=7W0q-Thcw03IAQfXE_Mo8JPZpUdHJzfu85fjK1ZdfQM,88
98
99
  schemathesis/pytest/control_flow.py,sha256=F8rAPsPeNv_sJiJgbZYtTpwKWjauZmqFUaKroY2GmQI,217
99
- schemathesis/pytest/lazy.py,sha256=FK_fVndvGn02wuVDMwaGfl2NlbVbQWEmCgMjRxeOmRk,10541
100
+ schemathesis/pytest/lazy.py,sha256=g7DpOeQNsjXC03FCG5e1L65iz3zE48qAyaqG81HzCZY,12028
100
101
  schemathesis/pytest/loaders.py,sha256=oQJ78yyuIm3Ye9X7giVjDB1vYfaW5UY5YuhaTLm_ZFU,266
101
- schemathesis/pytest/plugin.py,sha256=ZIF75b4G81IGtGle0c8PHYeWcR_pHGC2NoSlijsznCQ,12372
102
+ schemathesis/pytest/plugin.py,sha256=RDOuT25Uotese7W-SD3Pu-nb7zdnaPbyPOoJSkJKSoQ,12379
102
103
  schemathesis/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
104
  schemathesis/python/asgi.py,sha256=5PyvuTBaivvyPUEi3pwJni91K1kX5Zc0u9c6c1D8a1Q,287
104
105
  schemathesis/python/wsgi.py,sha256=uShAgo_NChbfYaV1117e6UHp0MTg7jaR0Sy_to3Jmf8,219
@@ -112,41 +113,41 @@ schemathesis/specs/graphql/validation.py,sha256=-W1Noc1MQmTb4RX-gNXMeU2qkgso4mzV
112
113
  schemathesis/specs/openapi/__init__.py,sha256=C5HOsfuDJGq_3mv8CRBvRvb0Diy1p0BFdqyEXMS-loE,238
113
114
  schemathesis/specs/openapi/_cache.py,sha256=HpglmETmZU0RCHxp3DO_sg5_B_nzi54Zuw9vGzzYCxY,4295
114
115
  schemathesis/specs/openapi/_hypothesis.py,sha256=n_39iyz1rt2EdSe-Lyr-3sOIEyJIthnCVR4tGUUvH1c,21328
115
- schemathesis/specs/openapi/checks.py,sha256=R-vehTWC6ZcVYVfKiXVdYHnZBTosMpZQzPPBsJ2dt-Y,26909
116
+ schemathesis/specs/openapi/checks.py,sha256=m3n5N3_iZcS7inJojW47FF6dfbUQzrBH-bXwsCAOyhM,27737
116
117
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
117
118
  schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
118
119
  schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
119
- schemathesis/specs/openapi/examples.py,sha256=Uy6naFBq-m1vo_18j4KuZBUYc9qKrBk19jBCWT7tnRg,20464
120
+ schemathesis/specs/openapi/examples.py,sha256=aURgeCsQrpsdWEAhjmW6BiRFabuSf5TeRlZBd4ltgNw,20381
120
121
  schemathesis/specs/openapi/formats.py,sha256=ViVF3aFeFI1ctwGQbiRDXhU3so82P0BCaF2aDDbUUm8,2816
121
- schemathesis/specs/openapi/links.py,sha256=eVlZVnlIcBUSSnYEEb_Bes3tfY5F_BNsOo0IZCBb-io,9452
122
122
  schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
123
- schemathesis/specs/openapi/parameters.py,sha256=fmOkH-KhMVzWmE6eSw2pw2hernril5MDL7DwwEG4344,14655
124
- schemathesis/specs/openapi/patterns.py,sha256=6qNZRYQkHtJ98_JMjwhqIGpeR4aR7rlxcCmr1nOHMzk,11258
123
+ schemathesis/specs/openapi/parameters.py,sha256=hv1reNpSjVuzFbtMpSTwWZ75zcWTOy5ZE0ah6AVEqAo,14565
124
+ schemathesis/specs/openapi/patterns.py,sha256=-1_0twbsyAiSbm0uTFipcXZTYgBY8UK6PriJkzhdET0,12038
125
125
  schemathesis/specs/openapi/references.py,sha256=YjD1xMlaYS7xLt6PrrVS20R72ZWHuFZFTa8Llzf54Rg,8808
126
- schemathesis/specs/openapi/schemas.py,sha256=UAukxlH2bVlpZNnx_4EzhDefPpsEtC2ieWz_x336-SQ,54906
126
+ schemathesis/specs/openapi/schemas.py,sha256=VSeacEAVJJ6EKJ-llwOaX4aalzUTXyWP8s4wbxTqtWc,54720
127
127
  schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
128
- schemathesis/specs/openapi/serialization.py,sha256=JFxMqCr8YWwPT4BVrbvVytcAmkzGXyL1_Q1xR1JKBPs,11464
128
+ schemathesis/specs/openapi/serialization.py,sha256=VdDLmeHqxlWM4cxQQcCkvrU6XurivolwEEaT13ohelA,11972
129
129
  schemathesis/specs/openapi/utils.py,sha256=ER4vJkdFVDIE7aKyxyYatuuHVRNutytezgE52pqZNE8,900
130
- schemathesis/specs/openapi/expressions/__init__.py,sha256=7W6Nv6sWusiBr7MxEhG_MoTKimuY6B7vJMGB80FPzV0,1691
130
+ schemathesis/specs/openapi/expressions/__init__.py,sha256=hfuRtXD75tQFhzSo6QgDZ3zByyWeZRKevB8edszAVj4,2272
131
131
  schemathesis/specs/openapi/expressions/errors.py,sha256=YLVhps-sYcslgVaahfcUYxUSHlIfWL-rQMeT5PZSMZ8,219
132
132
  schemathesis/specs/openapi/expressions/extractors.py,sha256=Py3of3_vBACP4ljiZIcgd-xQCrWIpcMsfQFc0EtAUoA,470
133
133
  schemathesis/specs/openapi/expressions/lexer.py,sha256=LeVE6fgYT9-fIsXrv0-YrRHnI4VPisbwsexyh9Q5YU0,3982
134
- schemathesis/specs/openapi/expressions/nodes.py,sha256=Lfy1CcSSoYUnX-C_S5T-IqQOszRCteallLBaMnsNwVs,4076
135
- schemathesis/specs/openapi/expressions/parser.py,sha256=gM_Ob-TlTGxpgjZGRHNyPhBj1YAvRgRoSlNCrE7-djk,4452
134
+ schemathesis/specs/openapi/expressions/nodes.py,sha256=YvpbAi8OFdb6RqqrqReGBeADpAmFaoyWN-lGiyYOXTc,4072
135
+ schemathesis/specs/openapi/expressions/parser.py,sha256=e-ZxshrGE_5CVbgcZLYgdGSjdifgyzgKkLQp0dI0cJY,4503
136
136
  schemathesis/specs/openapi/negative/__init__.py,sha256=60QqVBTXPTsAojcf7GDs7v8WbOE_k3g_VC_DBeQUqBw,3749
137
137
  schemathesis/specs/openapi/negative/mutations.py,sha256=7jTjD9rt5vxWSVBL5Hx8Avj4WhTA63frDQiFMKysrUU,19248
138
138
  schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
139
139
  schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
140
- schemathesis/specs/openapi/stateful/__init__.py,sha256=Tk9ahg6VVXwVw8yfFmrz9xhDWskBUaKEeBobdtd44HU,12020
140
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=0pu_iGjRiKuqUDN3ewz1zUOt6f1SdvSxVtHC5uK-CYw,14750
141
141
  schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
142
+ schemathesis/specs/openapi/stateful/links.py,sha256=8oHpmb-yBa3kZKoCv9ytndpOp80dG1vVis2-EpbkeVA,11432
142
143
  schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
143
144
  schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
144
145
  schemathesis/transport/prepare.py,sha256=qQ6zXBw5NN2AIM0bzLAc5Ryc3dmMb0R6xN14lnR49pU,3826
145
146
  schemathesis/transport/requests.py,sha256=OObRvcTL72-BZ7AfuDUrZZU9nZtfBqr22oF8nkzaOLE,8389
146
147
  schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
147
148
  schemathesis/transport/wsgi.py,sha256=RWSuUXPrl91GxAy8a4jyNNozOWVMRBxKx_tljlWA_Lo,5697
148
- schemathesis-4.0.0a3.dist-info/METADATA,sha256=80kE1Tg6m91KKgpuMEUsuPEPYJzCxeXcGthSlW1_BYs,12292
149
- schemathesis-4.0.0a3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
150
- schemathesis-4.0.0a3.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
151
- schemathesis-4.0.0a3.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
152
- schemathesis-4.0.0a3.dist-info/RECORD,,
149
+ schemathesis-4.0.0a5.dist-info/METADATA,sha256=uftZyIy9oqwJ76F5tKRz5tMu-jlUwK2pg-JHxKxiUeg,12103
150
+ schemathesis-4.0.0a5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
+ schemathesis-4.0.0a5.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
152
+ schemathesis-4.0.0a5.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
153
+ schemathesis-4.0.0a5.dist-info/RECORD,,