schemathesis 4.3.3__py3-none-any.whl → 4.3.4__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.
Potentially problematic release.
This version of schemathesis might be problematic. Click here for more details.
- schemathesis/cli/commands/run/context.py +2 -1
- schemathesis/engine/context.py +1 -25
- schemathesis/generation/stateful/state_machine.py +2 -1
- schemathesis/specs/openapi/stateful/dependencies/__init__.py +85 -1
- schemathesis/specs/openapi/stateful/dependencies/models.py +14 -1
- schemathesis/specs/openapi/stateful/dependencies/schemas.py +21 -10
- schemathesis/specs/openapi/stateful/inference.py +3 -2
- schemathesis/specs/openapi/stateful/links.py +15 -2
- {schemathesis-4.3.3.dist-info → schemathesis-4.3.4.dist-info}/METADATA +1 -1
- {schemathesis-4.3.3.dist-info → schemathesis-4.3.4.dist-info}/RECORD +13 -13
- {schemathesis-4.3.3.dist-info → schemathesis-4.3.4.dist-info}/WHEEL +0 -0
- {schemathesis-4.3.3.dist-info → schemathesis-4.3.4.dist-info}/entry_points.txt +0 -0
- {schemathesis-4.3.3.dist-info → schemathesis-4.3.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -112,7 +112,8 @@ class Statistic:
|
|
|
112
112
|
if has_failures:
|
|
113
113
|
self.cases_with_failures += 1
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
# Don't report extraction failures for inferred transitions
|
|
116
|
+
if case.transition is None or case.transition.is_inferred:
|
|
116
117
|
continue
|
|
117
118
|
transition = case.transition
|
|
118
119
|
parent = recorder.cases[transition.parent_id]
|
schemathesis/engine/context.py
CHANGED
|
@@ -105,18 +105,7 @@ class EngineContext:
|
|
|
105
105
|
InferenceAlgorithm.DEPENDENCY_ANALYSIS
|
|
106
106
|
)
|
|
107
107
|
):
|
|
108
|
-
|
|
109
|
-
for response_links in graph.iter_links():
|
|
110
|
-
operation = self.schema.get_operation_by_reference(response_links.producer_operation_ref)
|
|
111
|
-
response = operation.responses.get(response_links.status_code)
|
|
112
|
-
links = response.definition.setdefault(self.schema.adapter.links_keyword, {})
|
|
113
|
-
|
|
114
|
-
for link_name, definition in response_links.links.items():
|
|
115
|
-
# Find unique name if collision exists
|
|
116
|
-
final_name = _resolve_link_name_collision(link_name, links)
|
|
117
|
-
links[final_name] = definition.to_openapi()
|
|
118
|
-
injected += 1
|
|
119
|
-
|
|
108
|
+
injected += dependencies.inject_links(self.schema)
|
|
120
109
|
return injected
|
|
121
110
|
|
|
122
111
|
def stop(self) -> None:
|
|
@@ -171,16 +160,3 @@ class EngineContext:
|
|
|
171
160
|
kwargs["proxies"] = {"all": proxy}
|
|
172
161
|
self._transport_kwargs_cache[key] = kwargs
|
|
173
162
|
return kwargs
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def _resolve_link_name_collision(proposed_name: str, existing_links: dict[str, Any]) -> str:
|
|
177
|
-
if proposed_name not in existing_links:
|
|
178
|
-
return proposed_name
|
|
179
|
-
|
|
180
|
-
# Name collision - find next available suffix
|
|
181
|
-
suffix = 0
|
|
182
|
-
while True:
|
|
183
|
-
candidate = f"{proposed_name}_{suffix}"
|
|
184
|
-
if candidate not in existing_links:
|
|
185
|
-
return candidate
|
|
186
|
-
suffix += 1
|
|
@@ -56,10 +56,11 @@ class Transition:
|
|
|
56
56
|
# ID of the transition (e.g. link name)
|
|
57
57
|
id: str
|
|
58
58
|
parent_id: str
|
|
59
|
+
is_inferred: bool
|
|
59
60
|
parameters: dict[str, dict[str, ExtractedParam]]
|
|
60
61
|
request_body: ExtractedParam | None
|
|
61
62
|
|
|
62
|
-
__slots__ = ("id", "parent_id", "parameters", "request_body")
|
|
63
|
+
__slots__ = ("id", "parent_id", "is_inferred", "parameters", "request_body")
|
|
63
64
|
|
|
64
65
|
|
|
65
66
|
@dataclass
|
|
@@ -5,7 +5,7 @@ Infers which operations must run before others by tracking resource creation and
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
-
from typing import TYPE_CHECKING
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
9
|
|
|
10
10
|
from schemathesis.core.compat import RefResolutionError
|
|
11
11
|
from schemathesis.core.result import Ok
|
|
@@ -16,6 +16,7 @@ from schemathesis.specs.openapi.stateful.dependencies.models import (
|
|
|
16
16
|
DefinitionSource,
|
|
17
17
|
DependencyGraph,
|
|
18
18
|
InputSlot,
|
|
19
|
+
NormalizedLink,
|
|
19
20
|
OperationMap,
|
|
20
21
|
OperationNode,
|
|
21
22
|
OutputSlot,
|
|
@@ -25,6 +26,7 @@ from schemathesis.specs.openapi.stateful.dependencies.models import (
|
|
|
25
26
|
from schemathesis.specs.openapi.stateful.dependencies.outputs import extract_outputs
|
|
26
27
|
|
|
27
28
|
if TYPE_CHECKING:
|
|
29
|
+
from schemathesis.schemas import APIOperation
|
|
28
30
|
from schemathesis.specs.openapi.schemas import BaseOpenAPISchema
|
|
29
31
|
|
|
30
32
|
__all__ = [
|
|
@@ -86,3 +88,85 @@ def analyze(schema: BaseOpenAPISchema) -> DependencyGraph:
|
|
|
86
88
|
update_input_field_bindings(resource, operations)
|
|
87
89
|
|
|
88
90
|
return DependencyGraph(operations=operations, resources=resources)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def inject_links(schema: BaseOpenAPISchema) -> int:
|
|
94
|
+
injected = 0
|
|
95
|
+
graph = analyze(schema)
|
|
96
|
+
for response_links in graph.iter_links():
|
|
97
|
+
operation = schema.get_operation_by_reference(response_links.producer_operation_ref)
|
|
98
|
+
response = operation.responses.get(response_links.status_code)
|
|
99
|
+
links = response.definition.setdefault(schema.adapter.links_keyword, {})
|
|
100
|
+
|
|
101
|
+
# Normalize existing links once
|
|
102
|
+
if links:
|
|
103
|
+
normalized_existing = [_normalize_link(link, schema) for link in links.values()]
|
|
104
|
+
else:
|
|
105
|
+
normalized_existing = []
|
|
106
|
+
|
|
107
|
+
for link_name, definition in response_links.links.items():
|
|
108
|
+
inferred_link = definition.to_openapi()
|
|
109
|
+
|
|
110
|
+
# Check if duplicate exists
|
|
111
|
+
if normalized_existing:
|
|
112
|
+
if _normalize_link(inferred_link, schema) in normalized_existing:
|
|
113
|
+
continue
|
|
114
|
+
|
|
115
|
+
# Find unique name if collision exists
|
|
116
|
+
final_name = _resolve_link_name_collision(link_name, links)
|
|
117
|
+
links[final_name] = inferred_link
|
|
118
|
+
injected += 1
|
|
119
|
+
return injected
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _normalize_link(link: dict[str, Any], schema: BaseOpenAPISchema) -> NormalizedLink:
|
|
123
|
+
"""Normalize a link definition for comparison."""
|
|
124
|
+
operation = _resolve_link_operation(link, schema)
|
|
125
|
+
|
|
126
|
+
normalized_params = _normalize_parameter_keys(link.get("parameters", {}), operation)
|
|
127
|
+
|
|
128
|
+
return NormalizedLink(
|
|
129
|
+
path=operation.path,
|
|
130
|
+
method=operation.method,
|
|
131
|
+
parameters=normalized_params,
|
|
132
|
+
request_body=link.get("requestBody", {}),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _normalize_parameter_keys(parameters: dict, operation: APIOperation) -> set[str]:
|
|
137
|
+
"""Normalize parameter keys to location.name format."""
|
|
138
|
+
normalized = set()
|
|
139
|
+
|
|
140
|
+
for parameter_name in parameters.keys():
|
|
141
|
+
# If already has location prefix, use as-is
|
|
142
|
+
if "." in parameter_name:
|
|
143
|
+
normalized.add(parameter_name)
|
|
144
|
+
continue
|
|
145
|
+
|
|
146
|
+
# Find the parameter and prepend location
|
|
147
|
+
for parameter in operation.iter_parameters():
|
|
148
|
+
if parameter.name == parameter_name:
|
|
149
|
+
normalized.add(f"{parameter.location.value}.{parameter_name}")
|
|
150
|
+
break
|
|
151
|
+
|
|
152
|
+
return normalized
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _resolve_link_operation(link: dict, schema: BaseOpenAPISchema) -> APIOperation:
|
|
156
|
+
"""Resolve link to operation, handling both operationRef and operationId."""
|
|
157
|
+
if "operationRef" in link:
|
|
158
|
+
return schema.get_operation_by_reference(link["operationRef"])
|
|
159
|
+
return schema.get_operation_by_id(link["operationId"])
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _resolve_link_name_collision(proposed_name: str, existing_links: dict[str, Any]) -> str:
|
|
163
|
+
"""Find unique link name if collision exists."""
|
|
164
|
+
if proposed_name not in existing_links:
|
|
165
|
+
return proposed_name
|
|
166
|
+
|
|
167
|
+
suffix = 0
|
|
168
|
+
while True:
|
|
169
|
+
candidate = f"{proposed_name}_{suffix}"
|
|
170
|
+
if candidate not in existing_links:
|
|
171
|
+
return candidate
|
|
172
|
+
suffix += 1
|
|
@@ -155,12 +155,13 @@ class LinkDefinition:
|
|
|
155
155
|
"""Convert to OpenAPI Links format."""
|
|
156
156
|
links: dict[str, Any] = {
|
|
157
157
|
"operationRef": self.operation_ref,
|
|
158
|
+
SCHEMATHESIS_LINK_EXTENSION: {"is_inferred": True},
|
|
158
159
|
}
|
|
159
160
|
if self.parameters:
|
|
160
161
|
links["parameters"] = self.parameters
|
|
161
162
|
if self.request_body:
|
|
162
163
|
links["requestBody"] = self.request_body
|
|
163
|
-
links[SCHEMATHESIS_LINK_EXTENSION]
|
|
164
|
+
links[SCHEMATHESIS_LINK_EXTENSION]["merge_body"] = True
|
|
164
165
|
return links
|
|
165
166
|
|
|
166
167
|
|
|
@@ -195,6 +196,18 @@ class ResponseLinks:
|
|
|
195
196
|
return {name: link_def.to_openapi() for name, link_def in self.links.items()}
|
|
196
197
|
|
|
197
198
|
|
|
199
|
+
@dataclass
|
|
200
|
+
class NormalizedLink:
|
|
201
|
+
"""Normalized representation of a link."""
|
|
202
|
+
|
|
203
|
+
path: str
|
|
204
|
+
method: str
|
|
205
|
+
parameters: set[str]
|
|
206
|
+
request_body: Any
|
|
207
|
+
|
|
208
|
+
__slots__ = ("path", "method", "parameters", "request_body")
|
|
209
|
+
|
|
210
|
+
|
|
198
211
|
class Cardinality(str, enum.Enum):
|
|
199
212
|
"""Whether there is one or many resources in a slot."""
|
|
200
213
|
|
|
@@ -3,14 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import TYPE_CHECKING, Any, Callable, Mapping
|
|
5
5
|
|
|
6
|
-
from hypothesis_jsonschema._canonicalise import (
|
|
7
|
-
SCHEMA_KEYS as SCHEMA_KEYS_TUPLE,
|
|
8
|
-
)
|
|
9
|
-
from hypothesis_jsonschema._canonicalise import (
|
|
10
|
-
SCHEMA_OBJECT_KEYS as SCHEMA_OBJECT_KEYS_TUPLE,
|
|
11
|
-
)
|
|
12
|
-
from hypothesis_jsonschema._canonicalise import canonicalish, merged
|
|
13
|
-
|
|
14
6
|
from schemathesis.core.jsonschema import ALL_KEYWORDS
|
|
15
7
|
from schemathesis.core.jsonschema.bundler import BUNDLE_STORAGE_KEY, bundle
|
|
16
8
|
from schemathesis.core.jsonschema.types import JsonSchema, JsonSchemaObject
|
|
@@ -23,8 +15,23 @@ if TYPE_CHECKING:
|
|
|
23
15
|
from schemathesis.core.compat import RefResolver
|
|
24
16
|
|
|
25
17
|
ROOT_POINTER = "/"
|
|
26
|
-
SCHEMA_KEYS = frozenset(
|
|
27
|
-
|
|
18
|
+
SCHEMA_KEYS = frozenset(
|
|
19
|
+
{
|
|
20
|
+
"propertyNames",
|
|
21
|
+
"contains",
|
|
22
|
+
"if",
|
|
23
|
+
"items",
|
|
24
|
+
"oneOf",
|
|
25
|
+
"anyOf",
|
|
26
|
+
"additionalProperties",
|
|
27
|
+
"then",
|
|
28
|
+
"else",
|
|
29
|
+
"not",
|
|
30
|
+
"additionalItems",
|
|
31
|
+
"allOf",
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
SCHEMA_OBJECT_KEYS = frozenset({"dependencies", "properties", "patternProperties"})
|
|
28
35
|
|
|
29
36
|
|
|
30
37
|
def resolve_all_refs(schema: JsonSchemaObject) -> dict[str, Any]:
|
|
@@ -48,6 +55,8 @@ def resolve_all_refs(schema: JsonSchemaObject) -> dict[str, Any]:
|
|
|
48
55
|
|
|
49
56
|
|
|
50
57
|
def resolve_all_refs_inner(schema: JsonSchema, *, resolve: Callable[[str], dict[str, Any]]) -> dict[str, Any]:
|
|
58
|
+
from hypothesis_jsonschema._canonicalise import merged
|
|
59
|
+
|
|
51
60
|
if schema is True:
|
|
52
61
|
return {}
|
|
53
62
|
if schema is False:
|
|
@@ -80,6 +89,8 @@ def resolve_all_refs_inner(schema: JsonSchema, *, resolve: Callable[[str], dict[
|
|
|
80
89
|
|
|
81
90
|
def canonicalize(schema: dict[str, Any], resolver: RefResolver) -> Mapping[str, Any]:
|
|
82
91
|
"""Transform the input schema into its canonical-ish form."""
|
|
92
|
+
from hypothesis_jsonschema._canonicalise import canonicalish
|
|
93
|
+
|
|
83
94
|
# Canonicalisation in `hypothesis_jsonschema` requires all references to be resovable and non-recursive
|
|
84
95
|
# On the Schemathesis side bundling solves this problem
|
|
85
96
|
bundled = bundle(schema, resolver, inline_recursive=True)
|
|
@@ -22,6 +22,7 @@ from werkzeug.routing import Map, MapAdapter, Rule
|
|
|
22
22
|
|
|
23
23
|
from schemathesis.core.adapter import ResponsesContainer
|
|
24
24
|
from schemathesis.core.transforms import encode_pointer
|
|
25
|
+
from schemathesis.specs.openapi.stateful.links import SCHEMATHESIS_LINK_EXTENSION
|
|
25
26
|
|
|
26
27
|
if TYPE_CHECKING:
|
|
27
28
|
from schemathesis.engine.observations import LocationHeaderEntry
|
|
@@ -39,7 +40,7 @@ class OperationById:
|
|
|
39
40
|
__slots__ = ("value", "method", "path")
|
|
40
41
|
|
|
41
42
|
def to_link_base(self) -> dict[str, Any]:
|
|
42
|
-
return {"operationId": self.value, "
|
|
43
|
+
return {"operationId": self.value, SCHEMATHESIS_LINK_EXTENSION: {"is_inferred": True}}
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
@dataclass(unsafe_hash=True)
|
|
@@ -53,7 +54,7 @@ class OperationByRef:
|
|
|
53
54
|
__slots__ = ("value", "method", "path")
|
|
54
55
|
|
|
55
56
|
def to_link_base(self) -> dict[str, Any]:
|
|
56
|
-
return {"operationRef": self.value, "
|
|
57
|
+
return {"operationRef": self.value, SCHEMATHESIS_LINK_EXTENSION: {"is_inferred": True}}
|
|
57
58
|
|
|
58
59
|
|
|
59
60
|
OperationReference = Union[OperationById, OperationByRef]
|
|
@@ -38,8 +38,19 @@ class OpenApiLink:
|
|
|
38
38
|
parameters: list[NormalizedParameter]
|
|
39
39
|
body: dict[str, Any] | NotSet
|
|
40
40
|
merge_body: bool
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
is_inferred: bool
|
|
42
|
+
|
|
43
|
+
__slots__ = (
|
|
44
|
+
"name",
|
|
45
|
+
"status_code",
|
|
46
|
+
"source",
|
|
47
|
+
"target",
|
|
48
|
+
"parameters",
|
|
49
|
+
"body",
|
|
50
|
+
"merge_body",
|
|
51
|
+
"is_inferred",
|
|
52
|
+
"_cached_extract",
|
|
53
|
+
)
|
|
43
54
|
|
|
44
55
|
def __init__(self, name: str, status_code: str, definition: dict[str, Any], source: APIOperation):
|
|
45
56
|
from schemathesis.specs.openapi.schemas import BaseOpenAPISchema
|
|
@@ -69,6 +80,7 @@ class OpenApiLink:
|
|
|
69
80
|
self.parameters = self._normalize_parameters(definition.get("parameters", {}), errors)
|
|
70
81
|
self.body = definition.get("requestBody", NOT_SET)
|
|
71
82
|
self.merge_body = extension.get("merge_body", True) if extension else True
|
|
83
|
+
self.is_inferred = extension.get("is_inferred", False) if extension else False
|
|
72
84
|
|
|
73
85
|
if errors:
|
|
74
86
|
raise InvalidTransition(
|
|
@@ -148,6 +160,7 @@ class OpenApiLink:
|
|
|
148
160
|
return Transition(
|
|
149
161
|
id=f"{self.source.label} -> [{self.status_code}] {self.name} -> {self.target.label}",
|
|
150
162
|
parent_id=output.case.id,
|
|
163
|
+
is_inferred=self.is_inferred,
|
|
151
164
|
parameters=self.extract_parameters(output),
|
|
152
165
|
request_body=self.extract_body(output),
|
|
153
166
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: schemathesis
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.4
|
|
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://github.com/schemathesis/schemathesis/blob/master/CHANGELOG.md
|
|
@@ -13,7 +13,7 @@ schemathesis/cli/core.py,sha256=ue7YUdVo3YvuzGL4s6i62NL6YqNDeVPBSnQ1znrvG2w,480
|
|
|
13
13
|
schemathesis/cli/commands/__init__.py,sha256=DNzKEnXu7GjGSVe0244ZErmygUBA3nGSyVY6JP3ixD0,3740
|
|
14
14
|
schemathesis/cli/commands/data.py,sha256=_ALywjIeCZjuaoDQFy-Kj8RZkEGqXd-Y95O47h8Jszs,171
|
|
15
15
|
schemathesis/cli/commands/run/__init__.py,sha256=_ApiSVh9q-TsJQ_-IiVBNnLCtTCDMTnOLwuJhOvbCp4,18925
|
|
16
|
-
schemathesis/cli/commands/run/context.py,sha256=
|
|
16
|
+
schemathesis/cli/commands/run/context.py,sha256=Usa89aSPf8Uv-2m-nWr0ghvTKM1ZZehALBI0m_lFHv4,8087
|
|
17
17
|
schemathesis/cli/commands/run/events.py,sha256=ew0TQOc9T2YBZynYWv95k9yfAk8-hGuZDLMxjT8EhvY,1595
|
|
18
18
|
schemathesis/cli/commands/run/executor.py,sha256=_koznTX0DoELPN_1mxr9K_Qg7-9MPXWdld1MFn3YG_Y,5329
|
|
19
19
|
schemathesis/cli/commands/run/filters.py,sha256=pzkNRcf5vLPSsMfnvt711GNzRSBK5iZIFjPA0fiH1N4,1701
|
|
@@ -76,7 +76,7 @@ schemathesis/core/jsonschema/types.py,sha256=C7f9g8yKFuoxC5_0YNIh8QAyGU0-tj8pzTM
|
|
|
76
76
|
schemathesis/core/output/__init__.py,sha256=SiHqONFskXl73AtP5dV29L14nZoKo7B-IeG52KZB32M,1446
|
|
77
77
|
schemathesis/core/output/sanitization.py,sha256=Ev3tae8dVwsYd7yVb2_1VBFYs92WFsQ4Eu1fGaymItE,2013
|
|
78
78
|
schemathesis/engine/__init__.py,sha256=QaFE-FinaTAaarteADo2RRMJ-Sz6hZB9TzD5KjMinIA,706
|
|
79
|
-
schemathesis/engine/context.py,sha256=
|
|
79
|
+
schemathesis/engine/context.py,sha256=YaBfwTUyTCZaMq7-jtAKFQj-Eh1aQdbZ0UNcC5d_epU,5792
|
|
80
80
|
schemathesis/engine/control.py,sha256=FXzP8dxL47j1Giqpy2-Bsr_MdMw9YiATSK_UfpFwDtk,1348
|
|
81
81
|
schemathesis/engine/core.py,sha256=qlPHnZVq2RrUe93fOciXd1hC3E1gVyF2BIWMPMeLIj8,6655
|
|
82
82
|
schemathesis/engine/errors.py,sha256=FlpEk44WRLzRkdK9m37z93EQuY3kbeMIQRGwU5e3Qm4,19005
|
|
@@ -105,7 +105,7 @@ schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5
|
|
|
105
105
|
schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
|
|
106
106
|
schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
|
|
107
107
|
schemathesis/generation/stateful/__init__.py,sha256=s7jiJEnguIj44IsRyMi8afs-8yjIUuBbzW58bH5CHjs,1042
|
|
108
|
-
schemathesis/generation/stateful/state_machine.py,sha256=
|
|
108
|
+
schemathesis/generation/stateful/state_machine.py,sha256=25kkYImw5byNwuTtt97aNE3kTHAF8rZ-p3ax_bmd3JI,9135
|
|
109
109
|
schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
|
|
110
110
|
schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
|
|
111
111
|
schemathesis/graphql/loaders.py,sha256=2tgG4HIvFmjHLr_KexVXnT8hSBM-dKG_fuXTZgE97So,9445
|
|
@@ -162,15 +162,15 @@ schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyD
|
|
|
162
162
|
schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
|
|
163
163
|
schemathesis/specs/openapi/stateful/__init__.py,sha256=CQx2WJ3mKn5qmYRc90DqsG9w3Gx7DrB60S9HFz81STY,16663
|
|
164
164
|
schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
|
|
165
|
-
schemathesis/specs/openapi/stateful/inference.py,sha256=
|
|
166
|
-
schemathesis/specs/openapi/stateful/links.py,sha256=
|
|
167
|
-
schemathesis/specs/openapi/stateful/dependencies/__init__.py,sha256=
|
|
165
|
+
schemathesis/specs/openapi/stateful/inference.py,sha256=B99jSTDVi2yKxU7-raIb91xpacOrr0nZkEZY5Ej3eCY,9783
|
|
166
|
+
schemathesis/specs/openapi/stateful/links.py,sha256=SSA66mU50FFBz7e6sA37CfL-Vt0OY3gont72oFSvZYU,8163
|
|
167
|
+
schemathesis/specs/openapi/stateful/dependencies/__init__.py,sha256=IE8WIeWNhQoNCwiivQKoDe3GD_aobxmjQYvarwxp_1M,6379
|
|
168
168
|
schemathesis/specs/openapi/stateful/dependencies/inputs.py,sha256=DJDDCq73OYvCIPMxLKXJGTQGloNf6z6mgxjzjD0kJHA,8739
|
|
169
|
-
schemathesis/specs/openapi/stateful/dependencies/models.py,sha256=
|
|
169
|
+
schemathesis/specs/openapi/stateful/dependencies/models.py,sha256=s8_RBwpciAmPMISp5WDabqEuX7dXW84S-QWnhkodz6g,10938
|
|
170
170
|
schemathesis/specs/openapi/stateful/dependencies/naming.py,sha256=MGoyh1bfw2SoKzdbzpHxed9LHMjokPJTU_YErZaF-Ls,11396
|
|
171
171
|
schemathesis/specs/openapi/stateful/dependencies/outputs.py,sha256=zvVUfQWNIuhMkKDpz5hsVGkkvkefLt1EswpJAnHajOw,1186
|
|
172
172
|
schemathesis/specs/openapi/stateful/dependencies/resources.py,sha256=7E2Z6LvomSRrp_0vCD_adzoux0wBLEjKi_EiSqiN43U,9664
|
|
173
|
-
schemathesis/specs/openapi/stateful/dependencies/schemas.py,sha256=
|
|
173
|
+
schemathesis/specs/openapi/stateful/dependencies/schemas.py,sha256=yMu13RsXIPDeZT1tATTxI1vkpYhjs-XFSFEvx3_Xh_Q,14094
|
|
174
174
|
schemathesis/specs/openapi/types/__init__.py,sha256=VPsWtLJle__Kodw_QqtQ3OuvBzBcCIKsTOrXy3eA7OU,66
|
|
175
175
|
schemathesis/specs/openapi/types/v3.py,sha256=Vondr9Amk6JKCIM6i6RGcmTUjFfPgOOqzBXqerccLpo,1468
|
|
176
176
|
schemathesis/transport/__init__.py,sha256=6yg_RfV_9L0cpA6qpbH-SL9_3ggtHQji9CZrpIkbA6s,5321
|
|
@@ -179,8 +179,8 @@ schemathesis/transport/prepare.py,sha256=erYXRaxpQokIDzaIuvt_csHcw72iHfCyNq8VNEz
|
|
|
179
179
|
schemathesis/transport/requests.py,sha256=wriRI9fprTplE_qEZLEz1TerX6GwkE3pwr6ZnU2o6vQ,10648
|
|
180
180
|
schemathesis/transport/serialization.py,sha256=GwO6OAVTmL1JyKw7HiZ256tjV4CbrRbhQN0ep1uaZwI,11157
|
|
181
181
|
schemathesis/transport/wsgi.py,sha256=kQtasFre6pjdJWRKwLA_Qb-RyQHCFNpaey9ubzlFWKI,5907
|
|
182
|
-
schemathesis-4.3.
|
|
183
|
-
schemathesis-4.3.
|
|
184
|
-
schemathesis-4.3.
|
|
185
|
-
schemathesis-4.3.
|
|
186
|
-
schemathesis-4.3.
|
|
182
|
+
schemathesis-4.3.4.dist-info/METADATA,sha256=Su_dAAs7RpHERfreFwrore0Nx6LqQJQB60HlC-C8TAQ,8540
|
|
183
|
+
schemathesis-4.3.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
184
|
+
schemathesis-4.3.4.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
|
|
185
|
+
schemathesis-4.3.4.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
|
|
186
|
+
schemathesis-4.3.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|