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.
- schemathesis/checks.py +6 -4
- schemathesis/cli/commands/run/__init__.py +4 -4
- schemathesis/cli/commands/run/events.py +4 -9
- schemathesis/cli/commands/run/executor.py +6 -3
- schemathesis/cli/commands/run/filters.py +27 -19
- schemathesis/cli/commands/run/handlers/base.py +1 -1
- schemathesis/cli/commands/run/handlers/cassettes.py +1 -3
- schemathesis/cli/commands/run/handlers/output.py +765 -143
- schemathesis/cli/commands/run/validation.py +1 -1
- schemathesis/cli/ext/options.py +4 -1
- schemathesis/core/failures.py +54 -24
- schemathesis/engine/core.py +1 -1
- schemathesis/engine/events.py +3 -97
- schemathesis/engine/phases/stateful/__init__.py +1 -0
- schemathesis/engine/phases/stateful/_executor.py +19 -44
- schemathesis/engine/phases/unit/__init__.py +1 -0
- schemathesis/engine/phases/unit/_executor.py +2 -1
- schemathesis/engine/phases/unit/_pool.py +1 -1
- schemathesis/engine/recorder.py +8 -3
- schemathesis/generation/stateful/state_machine.py +53 -36
- schemathesis/graphql/checks.py +3 -9
- schemathesis/openapi/checks.py +8 -33
- schemathesis/schemas.py +34 -14
- schemathesis/specs/graphql/schemas.py +16 -15
- schemathesis/specs/openapi/expressions/__init__.py +11 -15
- schemathesis/specs/openapi/expressions/nodes.py +20 -20
- schemathesis/specs/openapi/links.py +126 -119
- schemathesis/specs/openapi/schemas.py +18 -22
- schemathesis/specs/openapi/stateful/__init__.py +77 -55
- {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/METADATA +1 -1
- {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/RECORD +34 -35
- schemathesis/specs/openapi/expressions/context.py +0 -14
- {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/WHEEL +0 -0
- {schemathesis-4.0.0a1.dist-info → schemathesis-4.0.0a2.dist-info}/entry_points.txt +0 -0
- {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,
|
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
|
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
|
21
|
+
from schemathesis.generation.stateful.state_machine import StepOutput
|
23
22
|
|
24
23
|
from ..schemas import BaseOpenAPISchema
|
25
24
|
|
26
|
-
FilterFunction = Callable[["
|
25
|
+
FilterFunction = Callable[["StepOutput"], bool]
|
27
26
|
|
28
27
|
|
29
28
|
class OpenAPIStateMachine(APIStateMachine):
|
30
|
-
_response_matchers: dict[str, Callable[[
|
29
|
+
_response_matchers: dict[str, Callable[[StepOutput], str | None]]
|
31
30
|
|
32
|
-
def _get_target_for_result(self, result:
|
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[[
|
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
|
-
|
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
|
-
|
81
|
-
|
82
|
-
name =
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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.
|
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
|
-
|
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
|
-
|
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[[
|
171
|
-
def compare(result:
|
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:
|
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:
|
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.
|
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=
|
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=
|
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=
|
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=
|
19
|
-
schemathesis/cli/commands/run/executor.py,sha256=
|
20
|
-
schemathesis/cli/commands/run/filters.py,sha256=
|
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=
|
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=
|
26
|
-
schemathesis/cli/commands/run/handlers/cassettes.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
64
|
-
schemathesis/engine/recorder.py,sha256=
|
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=
|
68
|
-
schemathesis/engine/phases/stateful/_executor.py,sha256=
|
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=
|
71
|
-
schemathesis/engine/phases/unit/_executor.py,sha256=
|
72
|
-
schemathesis/engine/phases/unit/_pool.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
149
|
-
schemathesis-4.0.
|
150
|
-
schemathesis-4.0.
|
151
|
-
schemathesis-4.0.
|
152
|
-
schemathesis-4.0.
|
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
|
File without changes
|
File without changes
|
File without changes
|