schemathesis 4.0.0a1__py3-none-any.whl → 4.0.0a2__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 (35) hide show
  1. schemathesis/checks.py +6 -4
  2. schemathesis/cli/commands/run/__init__.py +4 -4
  3. schemathesis/cli/commands/run/events.py +4 -9
  4. schemathesis/cli/commands/run/executor.py +6 -3
  5. schemathesis/cli/commands/run/filters.py +27 -19
  6. schemathesis/cli/commands/run/handlers/base.py +1 -1
  7. schemathesis/cli/commands/run/handlers/cassettes.py +1 -3
  8. schemathesis/cli/commands/run/handlers/output.py +765 -143
  9. schemathesis/cli/commands/run/validation.py +1 -1
  10. schemathesis/cli/ext/options.py +4 -1
  11. schemathesis/core/failures.py +54 -24
  12. schemathesis/engine/core.py +1 -1
  13. schemathesis/engine/events.py +3 -97
  14. schemathesis/engine/phases/stateful/__init__.py +1 -0
  15. schemathesis/engine/phases/stateful/_executor.py +19 -44
  16. schemathesis/engine/phases/unit/__init__.py +1 -0
  17. schemathesis/engine/phases/unit/_executor.py +2 -1
  18. schemathesis/engine/phases/unit/_pool.py +1 -1
  19. schemathesis/engine/recorder.py +8 -3
  20. schemathesis/generation/stateful/state_machine.py +53 -36
  21. schemathesis/graphql/checks.py +3 -9
  22. schemathesis/openapi/checks.py +8 -33
  23. schemathesis/schemas.py +34 -14
  24. schemathesis/specs/graphql/schemas.py +16 -15
  25. schemathesis/specs/openapi/expressions/__init__.py +11 -15
  26. schemathesis/specs/openapi/expressions/nodes.py +20 -20
  27. schemathesis/specs/openapi/links.py +126 -119
  28. schemathesis/specs/openapi/schemas.py +18 -22
  29. schemathesis/specs/openapi/stateful/__init__.py +77 -55
  30. {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/METADATA +1 -1
  31. {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/RECORD +34 -35
  32. schemathesis/specs/openapi/expressions/context.py +0 -14
  33. {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/WHEEL +0 -0
  34. {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/entry_points.txt +0 -0
  35. {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -7,39 +7,33 @@ 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 import NOT_SET, NotSet
11
10
  from schemathesis.core.result import Ok
12
11
  from schemathesis.generation.case import Case
13
12
  from schemathesis.generation.hypothesis import strategies
14
- from schemathesis.generation.stateful.state_machine import APIStateMachine, Direction, StepResult, _normalize_name
13
+ from schemathesis.generation.stateful.state_machine import APIStateMachine, StepInput, StepOutput, _normalize_name
14
+ from schemathesis.schemas import APIOperation
15
15
 
16
16
  from ....generation import GenerationMode
17
- from .. import expressions
18
- from ..links import get_all_links
17
+ from ..links import OpenApiLink, get_all_links
19
18
  from ..utils import expand_status_code
20
19
 
21
20
  if TYPE_CHECKING:
22
- from schemathesis.generation.stateful.state_machine import StepResult
21
+ from schemathesis.generation.stateful.state_machine import StepOutput
23
22
 
24
23
  from ..schemas import BaseOpenAPISchema
25
24
 
26
- FilterFunction = Callable[["StepResult"], bool]
25
+ FilterFunction = Callable[["StepOutput"], bool]
27
26
 
28
27
 
29
28
  class OpenAPIStateMachine(APIStateMachine):
30
- _response_matchers: dict[str, Callable[[StepResult], str | None]]
29
+ _response_matchers: dict[str, Callable[[StepOutput], str | None]]
31
30
 
32
- def _get_target_for_result(self, result: StepResult) -> str | None:
31
+ def _get_target_for_result(self, result: StepOutput) -> str | None:
33
32
  matcher = self._response_matchers.get(result.case.operation.label)
34
33
  if matcher is None:
35
34
  return None
36
35
  return matcher(result)
37
36
 
38
- def transform(self, result: StepResult, direction: Direction, case: Case) -> Case:
39
- context = expressions.ExpressionContext(case=result.case, response=result.response)
40
- direction.set_data(case, context=context)
41
- return case
42
-
43
37
 
44
38
  # The proportion of negative tests generated for "root" transitions
45
39
  NEGATIVE_TEST_CASES_THRESHOLD = 20
@@ -57,7 +51,7 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
57
51
  operations = [result.ok() for result in schema.get_all_operations() if isinstance(result, Ok)]
58
52
  bundles = {}
59
53
  incoming_transitions = defaultdict(list)
60
- _response_matchers: dict[str, Callable[[StepResult], str | None]] = {}
54
+ _response_matchers: dict[str, Callable[[StepOutput], str | None]] = {}
61
55
  # Statistic structure follows the links and count for each response status code
62
56
  for operation in operations:
63
57
  all_status_codes = tuple(operation.definition.raw["responses"])
@@ -65,8 +59,7 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
65
59
  for _, link in get_all_links(operation):
66
60
  bundle_name = f"{operation.label} -> {link.status_code}"
67
61
  bundles[bundle_name] = Bundle(bundle_name)
68
- target_operation = link.get_target_operation()
69
- incoming_transitions[target_operation.label].append(link)
62
+ incoming_transitions[link.target.label].append(link)
70
63
  bundle_matchers.append((bundle_name, make_response_filter(link.status_code, all_status_codes)))
71
64
  if bundle_matchers:
72
65
  _response_matchers[operation.label] = make_response_matcher(bundle_matchers)
@@ -77,22 +70,19 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
77
70
  incoming = incoming_transitions.get(target.label)
78
71
  if incoming is not None:
79
72
  for link in incoming:
80
- source = link.operation
81
- bundle_name = f"{source.label} -> {link.status_code}"
82
- name = _normalize_name(f"{target.label} -> {link.status_code}")
83
- case_strategy = strategies.combine(
84
- [target.as_strategy(generation_mode=mode) for mode in schema.generation_config.modes]
85
- )
86
- bundle = bundles[bundle_name]
87
- rules[name] = transition(
88
- name=name,
89
- target=catch_all,
90
- previous=bundle,
91
- case=case_strategy,
92
- link=st.just(link),
73
+ bundle_name = f"{link.source.label} -> {link.status_code}"
74
+ name = _normalize_name(f"{link.status_code} -> {target.label}")
75
+ rules[name] = precondition(ensure_non_empty_bundle(bundle_name))(
76
+ transition(
77
+ name=name,
78
+ target=catch_all,
79
+ input=bundles[bundle_name].flatmap(
80
+ into_step_input(target=target, link=link, modes=schema.generation_config.modes)
81
+ ),
82
+ )
93
83
  )
94
84
  elif any(
95
- incoming.operation.label == target.label
85
+ incoming.source.label == target.label
96
86
  for transitions in incoming_transitions.values()
97
87
  for incoming in transitions
98
88
  ):
@@ -119,12 +109,7 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
119
109
  case_strategy = case_strategy_factory()
120
110
 
121
111
  rules[name] = precondition(ensure_links_followed)(
122
- transition(
123
- name=name,
124
- target=catch_all,
125
- previous=st.none(),
126
- case=case_strategy,
127
- )
112
+ transition(name=name, target=catch_all, input=case_strategy.map(StepInput.initial))
128
113
  )
129
114
 
130
115
  return type(
@@ -139,6 +124,54 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
139
124
  )
140
125
 
141
126
 
127
+ def into_step_input(
128
+ target: APIOperation, link: OpenApiLink, modes: list[GenerationMode]
129
+ ) -> Callable[[StepOutput], st.SearchStrategy[StepInput]]:
130
+ def builder(_output: StepOutput) -> st.SearchStrategy[StepInput]:
131
+ @st.composite # type: ignore[misc]
132
+ def inner(draw: st.DrawFn, output: StepOutput) -> StepInput:
133
+ transition_data = link.extract(output)
134
+
135
+ kwargs: dict[str, Any] = {
136
+ container: {
137
+ name: extracted.value.ok()
138
+ for name, extracted in data.items()
139
+ if isinstance(extracted.value, Ok) and extracted.value.ok() is not None
140
+ }
141
+ for container, data in transition_data.parameters.items()
142
+ }
143
+ if (
144
+ transition_data.request_body is not None
145
+ and isinstance(transition_data.request_body.value, Ok)
146
+ and not link.merge_body
147
+ ):
148
+ kwargs["body"] = transition_data.request_body.value.ok()
149
+ cases = strategies.combine([target.as_strategy(generation_mode=mode, **kwargs) for mode in modes])
150
+ case = draw(cases)
151
+ if (
152
+ transition_data.request_body is not None
153
+ and isinstance(transition_data.request_body.value, Ok)
154
+ and link.merge_body
155
+ ):
156
+ new = transition_data.request_body.value.ok()
157
+ if isinstance(case.body, dict) and isinstance(new, dict):
158
+ case.body = {**case.body, **new}
159
+ else:
160
+ case.body = new
161
+ return StepInput(case=case, transition=transition_data)
162
+
163
+ return inner(output=_output)
164
+
165
+ return builder
166
+
167
+
168
+ def ensure_non_empty_bundle(bundle_name: str) -> Callable[[APIStateMachine], bool]:
169
+ def inner(machine: APIStateMachine) -> bool:
170
+ return bool(machine.bundles.get(bundle_name))
171
+
172
+ return inner
173
+
174
+
142
175
  def ensure_links_followed(machine: APIStateMachine) -> bool:
143
176
  # If there are responses that have links to follow, reject any rule without incoming transitions
144
177
  for bundle in machine.bundles.values():
@@ -147,28 +180,17 @@ def ensure_links_followed(machine: APIStateMachine) -> bool:
147
180
  return True
148
181
 
149
182
 
150
- def transition(
151
- *,
152
- name: str,
153
- target: Bundle,
154
- previous: Bundle | st.SearchStrategy,
155
- case: st.SearchStrategy,
156
- link: st.SearchStrategy | NotSet = NOT_SET,
157
- ) -> Callable[[Callable], Rule]:
158
- def step_function(*args_: Any, **kwargs_: Any) -> StepResult | None:
159
- return APIStateMachine._step(*args_, **kwargs_)
183
+ def transition(*, name: str, target: Bundle, input: st.SearchStrategy[StepInput]) -> Callable[[Callable], Rule]:
184
+ def step_function(self: APIStateMachine, input: StepInput) -> StepOutput | None:
185
+ return APIStateMachine._step(self, input=input)
160
186
 
161
187
  step_function.__name__ = name
162
188
 
163
- kwargs = {"target": target, "previous": previous, "case": case}
164
- if not isinstance(link, NotSet):
165
- kwargs["link"] = link
166
-
167
- return rule(**kwargs)(step_function)
189
+ return rule(target=target, input=input)(step_function)
168
190
 
169
191
 
170
- def make_response_matcher(matchers: list[tuple[str, FilterFunction]]) -> Callable[[StepResult], str | None]:
171
- def compare(result: StepResult) -> str | None:
192
+ def make_response_matcher(matchers: list[tuple[str, FilterFunction]]) -> Callable[[StepOutput], str | None]:
193
+ def compare(result: StepOutput) -> str | None:
172
194
  for bundle_name, response_filter in matchers:
173
195
  if response_filter(result):
174
196
  return bundle_name
@@ -196,7 +218,7 @@ def match_status_code(status_code: str) -> FilterFunction:
196
218
  """
197
219
  status_codes = set(expand_status_code(status_code))
198
220
 
199
- def compare(result: StepResult) -> bool:
221
+ def compare(result: StepOutput) -> bool:
200
222
  return result.response.status_code in status_codes
201
223
 
202
224
  compare.__name__ = f"match_{status_code}_response"
@@ -214,7 +236,7 @@ def default_status_code(status_codes: Iterator[str]) -> FilterFunction:
214
236
  status_code for value in status_codes if value != "default" for status_code in expand_status_code(value)
215
237
  }
216
238
 
217
- def match_default_response(result: StepResult) -> bool:
239
+ def match_default_response(result: StepOutput) -> bool:
218
240
  return result.response.status_code not in expanded_status_codes
219
241
 
220
242
  return match_default_response
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.0a1
3
+ Version: 4.0.0a2
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
@@ -1,35 +1,35 @@
1
1
  schemathesis/__init__.py,sha256=ggp1CxctLo__wwFwlDhvtrexxDXGSbRjFKzXw_Twi7k,1139
2
2
  schemathesis/auths.py,sha256=t-YuPyoLqL7jlRUH-45JxO7Ir3pYxpe31CRmNIJh7rI,15423
3
- schemathesis/checks.py,sha256=PfEdX9xoyk70dAcqvBhXZhUlwXcMMik9PiAC7LrTIMQ,4988
3
+ schemathesis/checks.py,sha256=B5-ROnjvvwpaqgj_iQ7eCjGqvRRVT30eWNPLKmwdrM8,5084
4
4
  schemathesis/errors.py,sha256=v5LpP5Yv78E96HoMJCsiKT_epDjkzLYMT0TtkarqomY,1336
5
5
  schemathesis/filters.py,sha256=6kffe_Xbi7-xThsUciWfmy1IU-LBgSYkXROUJJONJ48,13311
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=h_ByEEBcw3mZ0OKYwbsuzpw3JTlMi8ZPHYHDwm8agWg,27200
8
+ schemathesis/schemas.py,sha256=wQqKfZIaPgfAzLVUOxkgW7LqwBdWtLJeryeouytUlTw,27412
9
9
  schemathesis/cli/__init__.py,sha256=Fxsopap2Mw6mYh27l6xMRJ5PhUsCJ19pDxDj2hCc2wg,582
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=Y3V0I0EtzLDeIJqUjrjqyhfYit4_piqnfzcac-hJQLg,22635
15
+ schemathesis/cli/commands/run/__init__.py,sha256=mpXoFTAuyaBjTQiusLVfzU9BXwcNN84vcmll22bQ-18,22651
16
16
  schemathesis/cli/commands/run/checks.py,sha256=-p6bzuc98kNR1VhkTI2s4xaJx-b5zYSMwdlhONwUhRM,3337
17
17
  schemathesis/cli/commands/run/context.py,sha256=o_lUkR2bpsxO4oMB7eJVCMIR9jmfS0nLZCd_LdOluF4,3906
18
- schemathesis/cli/commands/run/events.py,sha256=iYE8h625GgNOv28qzxCpc2odrdVejVdhyhUMvucVl0Y,1041
19
- schemathesis/cli/commands/run/executor.py,sha256=Zh04Po_Hh0YuUPoR2omlZHtO3rPrRA56a-bCvY3uog4,4616
20
- schemathesis/cli/commands/run/filters.py,sha256=0ytY9kdfe8neiXcHoom6twZSmckRYEXyfT5cgOrhY-0,6755
18
+ schemathesis/cli/commands/run/events.py,sha256=rGR0Gm2Vw8YZGz7w2buj8Gck_UO9TDl1oSLLoEitDz8,960
19
+ schemathesis/cli/commands/run/executor.py,sha256=vTqr4eq88d3Q0pIh14wgkO6B6N6r-uEP0hdUG7gemqg,4699
20
+ schemathesis/cli/commands/run/filters.py,sha256=vBYH_Q1Gc2yjo4pysd1nSKfNVQADh5POFoAExvUPmqQ,7390
21
21
  schemathesis/cli/commands/run/hypothesis.py,sha256=3PkcUSe-P6zgkhPJbN8RstjGNzgcY76AVlJ7ayu44Eg,3582
22
22
  schemathesis/cli/commands/run/loaders.py,sha256=VedoeIE1tgFBqVokWxOoUReAjBl-Zhx87RjCEBtCVfs,4840
23
- schemathesis/cli/commands/run/validation.py,sha256=LT8Phfaw8-Xvui639QIHJfTSjEak1qoZ7Abpnv8E2s8,12670
23
+ schemathesis/cli/commands/run/validation.py,sha256=zeMQ2QAlVTwxUriRJjo9AQbQRXqm41F7YMP3JysY6vQ,12667
24
24
  schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
25
- schemathesis/cli/commands/run/handlers/base.py,sha256=tVfXxZqtc_NnPLchVbs8bjMforwbeBm-bxJMCVLY9wQ,507
26
- schemathesis/cli/commands/run/handlers/cassettes.py,sha256=VKM-XK8-uQMKlytlcSIVlAaPfsnACls6HfgvnF3Ha5E,19061
25
+ schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
26
+ schemathesis/cli/commands/run/handlers/cassettes.py,sha256=y4gtGnAfhE9dskhXPnDAQSx3kY4R2a1hvAiE3o8AsUA,19001
27
27
  schemathesis/cli/commands/run/handlers/junitxml.py,sha256=MkFq_DyMWves4Ytj72-4secMTlBOt7Gs9W3nfBzknIA,2316
28
- schemathesis/cli/commands/run/handlers/output.py,sha256=G9vjmCKYIAzsnLC12Hwp_4kWoNPIVkrG49FdWspMhvY,29998
28
+ schemathesis/cli/commands/run/handlers/output.py,sha256=l6Q_UZk_Fd3EzLQHU2TgaXvcn9M-ASLfjT4Y9wx9PyU,50197
29
29
  schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  schemathesis/cli/ext/fs.py,sha256=OA3mRzra4rq3NyDTcBvlRh0WJrh4ByN-QQ8loI04m88,408
31
31
  schemathesis/cli/ext/groups.py,sha256=9mIZUnQasUxGz6gZA0IoGVGKtSQuVNl8w2pwX_a1nBk,1796
32
- schemathesis/cli/ext/options.py,sha256=id7IIxJkVnOOOK3VA2S5iV2mgxASHMw0sQGK3rtGNEE,3519
32
+ schemathesis/cli/ext/options.py,sha256=Cm56WoktqBjKb8uDf063XT1der7lWOnTd81Y56PjoIg,3657
33
33
  schemathesis/contrib/__init__.py,sha256=wxpX86xrEGRAS3f7eugQfKVbnqV6ZfOqFBS_DmWxOok,120
34
34
  schemathesis/contrib/openapi/__init__.py,sha256=-7mBZ9RQj0EGzzmC-HKiT5ZslwHcoWFqCVpRG0GHO_o,162
35
35
  schemathesis/contrib/openapi/fill_missing_examples.py,sha256=BfBpuy3vCKbE_uILqPXnm7kxEDopAr5tNQwP5E9xX8A,585
@@ -39,7 +39,7 @@ schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,
39
39
  schemathesis/core/curl.py,sha256=yuaCe_zHLGwUjEeloQi6W3tOA3cGdnHDNI17-5jia0o,1723
40
40
  schemathesis/core/deserialization.py,sha256=ygIj4fNaOd0mJ2IvTsn6bsabBt_2AbSLCz-z9UqfpdQ,2406
41
41
  schemathesis/core/errors.py,sha256=Euy3YfF49dAH70KgMz4uFO5eRRX485RkT8v4go0TxOc,13423
42
- schemathesis/core/failures.py,sha256=vw3DKDkvRdHqwTRRqagoSxUFK1N-lSWrEf6TycjmbI4,7880
42
+ schemathesis/core/failures.py,sha256=4ftUsY0q1QqqfWpYkl5lWCZVBUAMy8VP9pXsyDZ8Q3o,8723
43
43
  schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
44
44
  schemathesis/core/lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
45
45
  schemathesis/core/loaders.py,sha256=SQQ-8m64-D2FaOgvwKZLyTtLJuzP3RPo7Ud2BERK1c0,3404
@@ -58,18 +58,18 @@ schemathesis/engine/__init__.py,sha256=xncZMXY8S-v4mrfnW4CK6-RQ0S0bigfLDJScpQysb
58
58
  schemathesis/engine/config.py,sha256=vWwtaWuSLvE-w0S9n4_MlJADjN58zlgSp84ZQS2z0ls,1919
59
59
  schemathesis/engine/context.py,sha256=HeLX-0aqSAbXJe_ZlkqVfg3QlhmbCrazbb9-ZPbi0h0,3723
60
60
  schemathesis/engine/control.py,sha256=QKUOs5VMphe7EcAIro_DDo9ZqdOU6ZVwTU1gMNndHWw,1006
61
- schemathesis/engine/core.py,sha256=hvmY4WEtFtfiPoLm-juO3HIGKdEAjtUcVOErAnXQ4_s,5075
61
+ schemathesis/engine/core.py,sha256=Q7fkHlGJdMDTt4PBFp53rWJbyQdNOMgn1QIt2nI74KQ,5088
62
62
  schemathesis/engine/errors.py,sha256=nvl-2DKQSBAbas1MpEveUGLb_DL-LtMkcg9LijmctPM,16179
63
- schemathesis/engine/events.py,sha256=K626Kw8Eo4h5mAwY8RAGD3SSm3v1j2o0hWFSESqmg2c,7940
64
- schemathesis/engine/recorder.py,sha256=nkms_L6mwz-SuXsYX4MnGUOJHX8n-b_jlUu0PzYmzVI,8070
63
+ schemathesis/engine/events.py,sha256=7tpxCxptKx_WvcFgv9_6v0E-5wiQfDs1O5bsOH46xb8,5989
64
+ schemathesis/engine/recorder.py,sha256=jmYhsk-RCIXvUyOqmSTL2shMBFepL58s0r1z2Ydg1YE,8428
65
65
  schemathesis/engine/phases/__init__.py,sha256=HZmlOjGvtDkfTwAw2rJFcfsJ2qg2h973l4zDy3AzsQg,2034
66
66
  schemathesis/engine/phases/probes.py,sha256=3M9g3E7CXbDDK_8inuvkRZibCCcoO2Ce5U3lnyTeWXQ,5131
67
- schemathesis/engine/phases/stateful/__init__.py,sha256=8y_vfqtXP-JjMM9p9f6nCUAOA_PrkzVhe9noOwENmnI,2264
68
- schemathesis/engine/phases/stateful/_executor.py,sha256=qj2tDhih8066mJvzwnR_88mg_lwAxMJxCE617ZOZZ8A,13777
67
+ schemathesis/engine/phases/stateful/__init__.py,sha256=_m0gx9ASfAKawAlHtI5hnWdMJs5QFUw1jd8VlxjETJo,2308
68
+ schemathesis/engine/phases/stateful/_executor.py,sha256=V_nJJDaDSOEGH2hcoCyZH4xz_57Vqu8k4XpNd53znSg,12640
69
69
  schemathesis/engine/phases/stateful/context.py,sha256=SKWsok-tlWbUDagiUmP7cLNW6DsgFDc_Afv0vQfWv6c,2964
70
- schemathesis/engine/phases/unit/__init__.py,sha256=h2bDQ1arYZc3oU70ipP0IjQs_g1z887vz__7PpVuuOk,7492
71
- schemathesis/engine/phases/unit/_executor.py,sha256=GwXDvcluDutpWsR6HRMHUw896XRl_KFKQDokfwVOJlg,12883
72
- schemathesis/engine/phases/unit/_pool.py,sha256=1mcoqXOQhTr1Rhk49NOHivVleihTEHqI8uNSTKHOl8w,2199
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
73
  schemathesis/experimental/__init__.py,sha256=36H1vLQhrw4SMD_jx76Wt07PHneELRDY1jfBSh7VxU0,2257
74
74
  schemathesis/generation/__init__.py,sha256=2htA0TlQee6AvQmLl1VNxEptRDqvPjksXKJLMVLAJng,1580
75
75
  schemathesis/generation/case.py,sha256=Rt5MCUtPVYVQzNyjUx8magocPJpHV1svyuqQSTwUE-I,7306
@@ -85,12 +85,12 @@ schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5
85
85
  schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
86
86
  schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
87
87
  schemathesis/generation/stateful/__init__.py,sha256=kXpCGbo1-QqfR2N0Z07tLw0Z5_tvbuG3Tk-WI_I1doI,653
88
- schemathesis/generation/stateful/state_machine.py,sha256=6G8Bw_pV8AYMaJLYV00QULIbszXwKG1aPJkB0ozA3lg,11163
88
+ schemathesis/generation/stateful/state_machine.py,sha256=hV-npuzfvp0cxT6SBxAYoseuxmTdbChGnDZ3Wf7nL9o,10962
89
89
  schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
90
- schemathesis/graphql/checks.py,sha256=3xBjNCwa8-M5-yzkuL8i_p5xGQTTRscSE9JbGGl_QeY,3424
90
+ schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
91
91
  schemathesis/graphql/loaders.py,sha256=96R_On1jFvsNuLwqXnO3_TTpsYhdCv0LAmR5jWRXXnY,4756
92
92
  schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
93
- schemathesis/openapi/checks.py,sha256=rBYqqkYaJbflkLbj9tupTBbkSLP8I2bMRsEKxhrCZNA,11618
93
+ schemathesis/openapi/checks.py,sha256=Rt6uX0yEVIG30YJdQeQKLu-9XZ1Bx-In1LCautTcghg,10760
94
94
  schemathesis/openapi/loaders.py,sha256=jskoCnMgpjg_cpn17FRI4oDUpMdsMYjxfXdRPHYnPqs,6472
95
95
  schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
96
  schemathesis/openapi/generation/filters.py,sha256=MB2t_k6OVc2Rt6qXUrV-u-3sDg5wX6c0Mli9WgfMUF4,2001
@@ -107,7 +107,7 @@ schemathesis/specs/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
107
107
  schemathesis/specs/graphql/_cache.py,sha256=QIcEFy2Koy5K0-u1nB-iab52LDlYsTm_9N5t42GplkM,770
108
108
  schemathesis/specs/graphql/nodes.py,sha256=bE3G1kNmqJ8OV4igBvIK-UORrkQA6Nofduf87O3TD9I,541
109
109
  schemathesis/specs/graphql/scalars.py,sha256=ERUECtwWuEe4_T_fpM6DQJKLrkvahbnaswM7oEOcC0M,1850
110
- schemathesis/specs/graphql/schemas.py,sha256=thRl5WDAr-8P8r5PRKCTI8k3ITu828b8yo7leNo9cFY,14362
110
+ schemathesis/specs/graphql/schemas.py,sha256=cQNQNfn_tE6-C6R8HdB-ln7swdAW8UNuT4PMdAxuMlI,14341
111
111
  schemathesis/specs/graphql/validation.py,sha256=-W1Noc1MQmTb4RX-gNXMeU2qkgso4mzVfHxtdLkCPKM,1422
112
112
  schemathesis/specs/openapi/__init__.py,sha256=C5HOsfuDJGq_3mv8CRBvRvb0Diy1p0BFdqyEXMS-loE,238
113
113
  schemathesis/specs/openapi/_cache.py,sha256=HpglmETmZU0RCHxp3DO_sg5_B_nzi54Zuw9vGzzYCxY,4295
@@ -118,35 +118,34 @@ schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i
118
118
  schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
119
119
  schemathesis/specs/openapi/examples.py,sha256=Uy6naFBq-m1vo_18j4KuZBUYc9qKrBk19jBCWT7tnRg,20464
120
120
  schemathesis/specs/openapi/formats.py,sha256=ViVF3aFeFI1ctwGQbiRDXhU3so82P0BCaF2aDDbUUm8,2816
121
- schemathesis/specs/openapi/links.py,sha256=EaAnr7exuwSeOMIUuDr4TCn_72ExXMbBh53uRORf81Y,8617
121
+ schemathesis/specs/openapi/links.py,sha256=c3ko0jrASbqpo7JaD22DKtlZaUvGUTG51jHvEJPzDpQ,8802
122
122
  schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
123
123
  schemathesis/specs/openapi/parameters.py,sha256=fmOkH-KhMVzWmE6eSw2pw2hernril5MDL7DwwEG4344,14655
124
124
  schemathesis/specs/openapi/patterns.py,sha256=RpvsAfpcm2dAcFYj-N6w0iQ1VdCT9h8BLdS1mrso6II,5518
125
125
  schemathesis/specs/openapi/references.py,sha256=YjD1xMlaYS7xLt6PrrVS20R72ZWHuFZFTa8Llzf54Rg,8808
126
- schemathesis/specs/openapi/schemas.py,sha256=dYC3KsyKP1GNKhMHyqrbrhpVci_BeC2JY-LKkoRp3j8,53626
126
+ schemathesis/specs/openapi/schemas.py,sha256=kFihC15IMAMce_o1VtHGhZawjmczFlMkbKUj9sbnmbk,53692
127
127
  schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
128
128
  schemathesis/specs/openapi/serialization.py,sha256=JFxMqCr8YWwPT4BVrbvVytcAmkzGXyL1_Q1xR1JKBPs,11464
129
129
  schemathesis/specs/openapi/utils.py,sha256=ER4vJkdFVDIE7aKyxyYatuuHVRNutytezgE52pqZNE8,900
130
- schemathesis/specs/openapi/expressions/__init__.py,sha256=hFpJrIWbPi55GcIVjNFRDDUL8xmDu3mdbdldoHBoFJ0,1729
131
- schemathesis/specs/openapi/expressions/context.py,sha256=mSgY-8qMCuYKbDYmHP2GaVhq7laHgnR196EwdNi7gc4,298
130
+ schemathesis/specs/openapi/expressions/__init__.py,sha256=7W6Nv6sWusiBr7MxEhG_MoTKimuY6B7vJMGB80FPzV0,1691
132
131
  schemathesis/specs/openapi/expressions/errors.py,sha256=YLVhps-sYcslgVaahfcUYxUSHlIfWL-rQMeT5PZSMZ8,219
133
132
  schemathesis/specs/openapi/expressions/extractors.py,sha256=Py3of3_vBACP4ljiZIcgd-xQCrWIpcMsfQFc0EtAUoA,470
134
133
  schemathesis/specs/openapi/expressions/lexer.py,sha256=LeVE6fgYT9-fIsXrv0-YrRHnI4VPisbwsexyh9Q5YU0,3982
135
- schemathesis/specs/openapi/expressions/nodes.py,sha256=hDmo_K7gxUyRMaeEtrvGAD-Vw1rImrFxNo1MDSPqYtg,4131
134
+ schemathesis/specs/openapi/expressions/nodes.py,sha256=Lfy1CcSSoYUnX-C_S5T-IqQOszRCteallLBaMnsNwVs,4076
136
135
  schemathesis/specs/openapi/expressions/parser.py,sha256=gM_Ob-TlTGxpgjZGRHNyPhBj1YAvRgRoSlNCrE7-djk,4452
137
136
  schemathesis/specs/openapi/negative/__init__.py,sha256=60QqVBTXPTsAojcf7GDs7v8WbOE_k3g_VC_DBeQUqBw,3749
138
137
  schemathesis/specs/openapi/negative/mutations.py,sha256=7jTjD9rt5vxWSVBL5Hx8Avj4WhTA63frDQiFMKysrUU,19248
139
138
  schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
140
139
  schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
141
- schemathesis/specs/openapi/stateful/__init__.py,sha256=oZ-FtK9-EtQvZb4HdBVidyD4FaYwqmDSZONVCsMRNtw,8484
140
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=W1CwDtYYiy4hwpMFEqD6Ya9Sif_shQo7mbeWgo-XJXA,9728
142
141
  schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
143
142
  schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
144
143
  schemathesis/transport/prepare.py,sha256=qQ6zXBw5NN2AIM0bzLAc5Ryc3dmMb0R6xN14lnR49pU,3826
145
144
  schemathesis/transport/requests.py,sha256=OObRvcTL72-BZ7AfuDUrZZU9nZtfBqr22oF8nkzaOLE,8389
146
145
  schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
147
146
  schemathesis/transport/wsgi.py,sha256=RWSuUXPrl91GxAy8a4jyNNozOWVMRBxKx_tljlWA_Lo,5697
148
- schemathesis-4.0.0a1.dist-info/METADATA,sha256=CnWHlCwfgGHDScB9iFwIsMlGl0gEA7sznHB2u9IXB5M,12292
149
- schemathesis-4.0.0a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
150
- schemathesis-4.0.0a1.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
151
- schemathesis-4.0.0a1.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
152
- schemathesis-4.0.0a1.dist-info/RECORD,,
147
+ schemathesis-4.0.0a2.dist-info/METADATA,sha256=IcvZ7pOCr48wivV_O6DKm6HGqsXvZzkMpYVkM_lv88M,12292
148
+ schemathesis-4.0.0a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
149
+ schemathesis-4.0.0a2.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
150
+ schemathesis-4.0.0a2.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
151
+ schemathesis-4.0.0a2.dist-info/RECORD,,
@@ -1,14 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
-
5
- from schemathesis.core.transport import Response
6
- from schemathesis.generation.case import Case
7
-
8
-
9
- @dataclass
10
- class ExpressionContext:
11
- """Context in what an expression are evaluated."""
12
-
13
- response: Response
14
- case: Case