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.

@@ -112,7 +112,8 @@ class Statistic:
112
112
  if has_failures:
113
113
  self.cases_with_failures += 1
114
114
 
115
- if case.transition is None:
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]
@@ -105,18 +105,7 @@ class EngineContext:
105
105
  InferenceAlgorithm.DEPENDENCY_ANALYSIS
106
106
  )
107
107
  ):
108
- graph = dependencies.analyze(self.schema)
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] = {"merge_body": True}
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(SCHEMA_KEYS_TUPLE)
27
- SCHEMA_OBJECT_KEYS = frozenset(SCHEMA_OBJECT_KEYS_TUPLE)
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, "x-inferred": True}
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, "x-inferred": True}
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
- __slots__ = ("name", "status_code", "source", "target", "parameters", "body", "merge_body", "_cached_extract")
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
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=taegOHWc_B-HDwiU1R9Oi4q57mdfLXc-B954QUj8t7A,7984
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=iMyyum60AmZlX1reghxzCW6A_dDA43RA3NXJZqruHv8,6821
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=DJjIxeTFpVfBXqZYUNnfDZSUXXt0ydQqOe75lWLmqlk,9098
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=9o9V-UUpphW7u_Kqz5MCp1_JXS2H_rcAZwz0bwJnmbI,9637
166
- schemathesis/specs/openapi/stateful/links.py,sha256=G6vqW6JFOdhF044ZjG6PsSwAHU1yP4E3FolcNFE55NM,7918
167
- schemathesis/specs/openapi/stateful/dependencies/__init__.py,sha256=epBYtVw7q9mkV-UtlJNbfJQgwAs9d5jkOJYkyEeUMvE,3348
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=BkKSUK_irj-peBjQplvau-tyGbBKRJdKhzNkOTJ51l4,10650
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=pNV2GibNW8042KrdfUQBdJEkGj_dd84bTHbqunba48k,13976
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.3.dist-info/METADATA,sha256=VZo592TRmLn636zc-i_sq0FJh0d_zGmZoEZysc9bRe0,8540
183
- schemathesis-4.3.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
184
- schemathesis-4.3.3.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
185
- schemathesis-4.3.3.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
186
- schemathesis-4.3.3.dist-info/RECORD,,
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,,