schemathesis 3.25.6__py3-none-any.whl → 3.26.1__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 (42) hide show
  1. schemathesis/_dependency_versions.py +1 -0
  2. schemathesis/_hypothesis.py +11 -1
  3. schemathesis/_xml.py +1 -0
  4. schemathesis/auths.py +1 -0
  5. schemathesis/cli/__init__.py +26 -18
  6. schemathesis/cli/cassettes.py +4 -4
  7. schemathesis/cli/context.py +4 -1
  8. schemathesis/cli/output/default.py +154 -39
  9. schemathesis/cli/output/short.py +4 -0
  10. schemathesis/experimental/__init__.py +7 -0
  11. schemathesis/filters.py +1 -0
  12. schemathesis/models.py +3 -0
  13. schemathesis/parameters.py +1 -0
  14. schemathesis/runner/__init__.py +12 -0
  15. schemathesis/runner/events.py +12 -0
  16. schemathesis/runner/impl/core.py +29 -2
  17. schemathesis/runner/probes.py +1 -0
  18. schemathesis/runner/serialization.py +6 -2
  19. schemathesis/schemas.py +1 -0
  20. schemathesis/serializers.py +1 -1
  21. schemathesis/service/client.py +35 -2
  22. schemathesis/service/extensions.py +224 -0
  23. schemathesis/service/hosts.py +1 -0
  24. schemathesis/service/metadata.py +24 -0
  25. schemathesis/service/models.py +210 -2
  26. schemathesis/service/serialization.py +31 -1
  27. schemathesis/specs/graphql/schemas.py +4 -0
  28. schemathesis/specs/openapi/__init__.py +1 -0
  29. schemathesis/specs/openapi/_hypothesis.py +11 -0
  30. schemathesis/specs/openapi/expressions/__init__.py +1 -0
  31. schemathesis/specs/openapi/expressions/lexer.py +1 -0
  32. schemathesis/specs/openapi/expressions/nodes.py +1 -0
  33. schemathesis/specs/openapi/links.py +1 -0
  34. schemathesis/specs/openapi/media_types.py +34 -0
  35. schemathesis/specs/openapi/negative/mutations.py +1 -0
  36. schemathesis/specs/openapi/schemas.py +1 -0
  37. schemathesis/specs/openapi/security.py +5 -1
  38. {schemathesis-3.25.6.dist-info → schemathesis-3.26.1.dist-info}/METADATA +8 -5
  39. {schemathesis-3.25.6.dist-info → schemathesis-3.26.1.dist-info}/RECORD +42 -40
  40. {schemathesis-3.25.6.dist-info → schemathesis-3.26.1.dist-info}/WHEEL +0 -0
  41. {schemathesis-3.25.6.dist-info → schemathesis-3.26.1.dist-info}/entry_points.txt +0 -0
  42. {schemathesis-3.25.6.dist-info → schemathesis-3.26.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,11 +1,15 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import asdict
3
4
  from typing import Any, Callable, Dict, Optional, TypeVar, cast
4
5
 
6
+ from ..exceptions import format_exception
7
+ from ..internal.result import Err, Ok
8
+ from ..internal.transformation import merge_recursively
5
9
  from ..models import Response
10
+ from .models import AnalysisSuccess
6
11
  from ..runner import events
7
12
  from ..runner.serialization import SerializedCase
8
- from ..internal.transformation import merge_recursively
9
13
 
10
14
  S = TypeVar("S", bound=events.ExecutionEvent)
11
15
  SerializeFunc = Callable[[S], Optional[Dict[str, Any]]]
@@ -28,6 +32,24 @@ def serialize_after_probing(event: events.AfterProbing) -> dict[str, Any] | None
28
32
  return {"probes": [probe.serialize() for probe in probes]}
29
33
 
30
34
 
35
+ def serialize_before_analysis(_: events.BeforeAnalysis) -> None:
36
+ return None
37
+
38
+
39
+ def serialize_after_analysis(event: events.AfterAnalysis) -> dict[str, Any] | None:
40
+ data = {}
41
+ analysis = event.analysis
42
+ if isinstance(analysis, Ok):
43
+ result = analysis.ok()
44
+ if isinstance(result, AnalysisSuccess):
45
+ data["analysis_id"] = result.id
46
+ else:
47
+ data["error"] = result.message
48
+ elif isinstance(analysis, Err):
49
+ data["error"] = format_exception(analysis.err())
50
+ return data
51
+
52
+
31
53
  def serialize_before_execution(event: events.BeforeExecution) -> dict[str, Any] | None:
32
54
  return {
33
55
  "correlation_id": event.correlation_id,
@@ -38,6 +60,8 @@ def serialize_before_execution(event: events.BeforeExecution) -> dict[str, Any]
38
60
 
39
61
  def _serialize_case(case: SerializedCase) -> dict[str, Any]:
40
62
  return {
63
+ "id": case.id,
64
+ "generation_time": case.generation_time,
41
65
  "verbose_name": case.verbose_name,
42
66
  "path_template": case.path_template,
43
67
  "path_parameters": stringify_path_parameters(case.path_parameters),
@@ -127,6 +151,8 @@ SERIALIZER_MAP = {
127
151
  events.Initialized: serialize_initialized,
128
152
  events.BeforeProbing: serialize_before_probing,
129
153
  events.AfterProbing: serialize_after_probing,
154
+ events.BeforeAnalysis: serialize_before_analysis,
155
+ events.AfterAnalysis: serialize_after_analysis,
130
156
  events.BeforeExecution: serialize_before_execution,
131
157
  events.AfterExecution: serialize_after_execution,
132
158
  events.Interrupted: serialize_interrupted,
@@ -141,6 +167,8 @@ def serialize_event(
141
167
  on_initialized: SerializeFunc | None = None,
142
168
  on_before_probing: SerializeFunc | None = None,
143
169
  on_after_probing: SerializeFunc | None = None,
170
+ on_before_analysis: SerializeFunc | None = None,
171
+ on_after_analysis: SerializeFunc | None = None,
144
172
  on_before_execution: SerializeFunc | None = None,
145
173
  on_after_execution: SerializeFunc | None = None,
146
174
  on_interrupted: SerializeFunc | None = None,
@@ -154,6 +182,8 @@ def serialize_event(
154
182
  events.Initialized: on_initialized,
155
183
  events.BeforeProbing: on_before_probing,
156
184
  events.AfterProbing: on_after_probing,
185
+ events.BeforeAnalysis: on_before_analysis,
186
+ events.AfterAnalysis: on_after_analysis,
157
187
  events.BeforeExecution: on_before_execution,
158
188
  events.AfterExecution: on_after_execution,
159
189
  events.Interrupted: on_interrupted,
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import enum
4
+ import time
4
5
  from dataclasses import dataclass, field
5
6
  from difflib import get_close_matches
6
7
  from enum import unique
@@ -287,6 +288,7 @@ class GraphQLSchema(BaseSchema):
287
288
  query=query,
288
289
  body=body,
289
290
  media_type=media_type,
291
+ generation_time=0.0,
290
292
  )
291
293
 
292
294
  def get_tags(self, operation: APIOperation) -> list[str] | None:
@@ -337,6 +339,7 @@ def get_case_strategy(
337
339
  generation_config: GenerationConfig | None = None,
338
340
  **kwargs: Any,
339
341
  ) -> Any:
342
+ start = time.monotonic()
340
343
  definition = cast(GraphQLOperationDefinition, operation.definition)
341
344
  strategy_factory = {
342
345
  RootType.QUERY: gql_st.queries,
@@ -369,6 +372,7 @@ def get_case_strategy(
369
372
  body=body,
370
373
  operation=operation,
371
374
  data_generation_method=data_generation_method,
375
+ generation_time=time.monotonic() - start,
372
376
  ) # type: ignore
373
377
  context = auths.AuthContext(
374
378
  operation=operation,
@@ -1,3 +1,4 @@
1
1
  from .formats import register_string_format as format
2
2
  from .formats import unregister_string_format
3
3
  from .loaders import from_aiohttp, from_asgi, from_dict, from_file, from_path, from_pytest_fixture, from_uri, from_wsgi
4
+ from .media_types import register_media_type as media_type
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
  import string
3
+ import time
3
4
  from base64 import b64encode
4
5
  from contextlib import suppress
5
6
  from dataclasses import dataclass
@@ -30,6 +31,7 @@ from ...types import NotSet
30
31
  from ...serializers import Binary
31
32
  from ...utils import compose, skip
32
33
  from .constants import LOCATION_TO_CONTAINER
34
+ from .media_types import MEDIA_TYPES
33
35
  from .negative import negative_schema
34
36
  from .negative.utils import can_negate
35
37
  from .parameters import OpenAPIBody, parameters_to_json_schema
@@ -130,6 +132,7 @@ def get_case_strategy(
130
132
  The primary purpose of this behavior is to prevent sending incomplete explicit examples by generating missing parts
131
133
  as it works with `body`.
132
134
  """
135
+ start = time.monotonic()
133
136
  strategy_factory = DATA_GENERATION_METHOD_TO_STRATEGY_FACTORY[generator]
134
137
 
135
138
  context = HookContext(operation)
@@ -175,6 +178,11 @@ def get_case_strategy(
175
178
  else:
176
179
  body_ = ValueContainer(value=body, location="body", generator=None)
177
180
  else:
181
+ # This explicit body payload comes for a media type that has a custom strategy registered
182
+ # Such strategies only support binary payloads, otherwise they can't be serialized
183
+ if not isinstance(body, bytes) and media_type in MEDIA_TYPES:
184
+ all_media_types = operation.get_request_payload_content_types()
185
+ raise SerializationNotPossible.from_media_types(*all_media_types)
178
186
  body_ = ValueContainer(value=body, location="body", generator=None)
179
187
 
180
188
  if operation.schema.validate_schema and operation.method.upper() == "GET" and operation.body:
@@ -187,6 +195,7 @@ def get_case_strategy(
187
195
  reject()
188
196
  instance = Case(
189
197
  operation=operation,
198
+ generation_time=time.monotonic() - start,
190
199
  media_type=media_type,
191
200
  path_parameters=path_parameters_.value,
192
201
  headers=CaseInsensitiveDict(headers_.value) if headers_.value is not None else headers_.value,
@@ -212,6 +221,8 @@ def _get_body_strategy(
212
221
  operation: APIOperation,
213
222
  generation_config: GenerationConfig,
214
223
  ) -> st.SearchStrategy:
224
+ if parameter.media_type in MEDIA_TYPES:
225
+ return MEDIA_TYPES[parameter.media_type]
215
226
  # The cache key relies on object ids, which means that the parameter should not be mutated
216
227
  # Note, the parent schema is not included as each parameter belong only to one schema
217
228
  if parameter in _BODY_STRATEGIES_CACHE and strategy_factory in _BODY_STRATEGIES_CACHE[parameter]:
@@ -2,6 +2,7 @@
2
2
 
3
3
  https://swagger.io/docs/specification/links/#runtime-expressions
4
4
  """
5
+
5
6
  from typing import Any
6
7
 
7
8
  from . import lexer, nodes, parser
@@ -1,4 +1,5 @@
1
1
  """Lexical analysis of runtime expressions."""
2
+
2
3
  from dataclasses import dataclass
3
4
  from enum import Enum, unique
4
5
  from typing import Callable, Generator
@@ -1,4 +1,5 @@
1
1
  """Expression nodes description and evaluation logic."""
2
+
2
3
  from __future__ import annotations
3
4
  from dataclasses import dataclass
4
5
  from enum import Enum, unique
@@ -2,6 +2,7 @@
2
2
 
3
3
  Based on https://swagger.io/docs/specification/links/
4
4
  """
5
+
5
6
  from __future__ import annotations
6
7
  from dataclasses import dataclass, field
7
8
  from difflib import get_close_matches
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, Collection
4
+
5
+ if TYPE_CHECKING:
6
+ from hypothesis import strategies as st
7
+
8
+
9
+ MEDIA_TYPES: dict[str, st.SearchStrategy[bytes]] = {}
10
+
11
+
12
+ def register_media_type(name: str, strategy: st.SearchStrategy[bytes], *, aliases: Collection[str] = ()) -> None:
13
+ """Register a strategy for the given media type."""
14
+ from ...serializers import SerializerContext, register
15
+
16
+ @register(name, aliases=aliases)
17
+ class MediaTypeSerializer:
18
+ def as_requests(self, context: SerializerContext, value: Any) -> dict[str, Any]:
19
+ return {"data": value}
20
+
21
+ def as_werkzeug(self, context: SerializerContext, value: Any) -> dict[str, Any]:
22
+ return {"data": value}
23
+
24
+ MEDIA_TYPES[name] = strategy
25
+ for alias in aliases:
26
+ MEDIA_TYPES[alias] = strategy
27
+
28
+
29
+ def unregister_all() -> None:
30
+ from ...serializers import unregister
31
+
32
+ for media_type in MEDIA_TYPES:
33
+ unregister(media_type)
34
+ MEDIA_TYPES.clear()
@@ -1,4 +1,5 @@
1
1
  """Schema mutations."""
2
+
2
3
  from __future__ import annotations
3
4
  import enum
4
5
  from dataclasses import dataclass
@@ -953,6 +953,7 @@ class SwaggerV20(BaseOpenAPISchema):
953
953
  query=query,
954
954
  body=body,
955
955
  media_type=media_type,
956
+ generation_time=0.0,
956
957
  )
957
958
 
958
959
  def _get_consumes_for_operation(self, definition: dict[str, Any]) -> list[str]:
@@ -1,4 +1,5 @@
1
1
  """Processing of ``securityDefinitions`` or ``securitySchemes`` keywords."""
2
+
2
3
  from __future__ import annotations
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, ClassVar, Generator
@@ -126,7 +127,10 @@ class OpenAPISecurityProcessor(BaseSecurityProcessor):
126
127
  security_schemes = components.get("securitySchemes", {})
127
128
  if "$ref" in security_schemes:
128
129
  return resolver.resolve(security_schemes["$ref"])[1]
129
- return security_schemes
130
+ return {
131
+ key: resolver.resolve(value["$ref"])[1] if "$ref" in value else value
132
+ for key, value in security_schemes.items()
133
+ }
130
134
 
131
135
  def _make_http_auth_parameter(self, definition: dict[str, Any]) -> dict[str, Any]:
132
136
  schema = make_auth_header_schema(definition)
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schemathesis
3
- Version: 3.25.6
3
+ Version: 3.26.1
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
7
7
  Project-URL: Bug Tracker, https://github.com/schemathesis/schemathesis
8
8
  Project-URL: Funding, https://github.com/sponsors/Stranger6667
9
9
  Project-URL: Source Code, https://github.com/schemathesis/schemathesis
10
- Author-email: Dmitry Dygalo <dadygalo@gmail.com>
11
- Maintainer-email: Dmitry Dygalo <dadygalo@gmail.com>
10
+ Author-email: Dmitry Dygalo <dmitry@dygalo.dev>
11
+ Maintainer-email: Dmitry Dygalo <dmitry@dygalo.dev>
12
12
  License-Expression: MIT
13
13
  License-File: LICENSE
14
14
  Keywords: graphql,hypothesis,openapi,pytest,testing
@@ -35,7 +35,8 @@ Requires-Dist: colorama<1.0,>=0.4
35
35
  Requires-Dist: httpx<1.0,>=0.22.0
36
36
  Requires-Dist: hypothesis-graphql<1,>=0.11.0
37
37
  Requires-Dist: hypothesis-jsonschema<0.24,>=0.23.1
38
- Requires-Dist: hypothesis<7,>=6.84.3
38
+ Requires-Dist: hypothesis<7,>=6.84.3; python_version > '3.8'
39
+ Requires-Dist: hypothesis[zoneinfo]<7,>=6.84.3; python_version == '3.8'
39
40
  Requires-Dist: jsonschema<5.0,>=4.18.0
40
41
  Requires-Dist: junit-xml<2.0,>=1.9
41
42
  Requires-Dist: pyrate-limiter<3.0,>=2.10
@@ -224,7 +225,9 @@ Receive automatic comments in your pull requests and updates on GitHub checks st
224
225
 
225
226
  ### Software as a Service
226
227
 
227
- If you prefer an all-in-one solution with quick setup, we have a [free tier](https://schemathesis.io/#pricing) available.
228
+ Schemathesis CLI integrates with Schemathesis.io to enhance bug detection by optimizing test case generation for efficiency and realism. It leverages various techniques to infer appropriate data generation strategies, provide support for uncommon media types, and adjust schemas for faster data generation. The integration also detects the web server being used to generate more targeted test data.
229
+
230
+ Schemathesis.io offers a user-friendly UI that simplifies viewing and analyzing test results. If you prefer an all-in-one solution with quick setup, we have a [free tier](https://schemathesis.io/#pricing) available.
228
231
 
229
232
  ## How it works
230
233
 
@@ -1,51 +1,51 @@
1
1
  schemathesis/__init__.py,sha256=WW1NBZxmc5jRR0c24xz-ZtTkJMUQG5MOw1MGVRRGc1s,1970
2
2
  schemathesis/_compat.py,sha256=VizWR0QAVj4l7WZautNe_zmo3AJ7WBl2zrJQOfJAQtk,1837
3
- schemathesis/_dependency_versions.py,sha256=_y0aBRMxa5ey6duwMy6cSaMVUAtfbJNBINjFd1ObWF0,727
4
- schemathesis/_hypothesis.py,sha256=AI7N7n4g7IPx2CeF5sHaaDkw9DJzVO-MQPkDKICnBn0,10243
3
+ schemathesis/_dependency_versions.py,sha256=sLlY3jGtnjIg2JRMbVt89lYKiD3K2zl1A5QF0_5_O08,728
4
+ schemathesis/_hypothesis.py,sha256=O3rfMbT0rChFONMUsYmMEGV9nPG5cHd_6v9NhWDI_IQ,10763
5
5
  schemathesis/_lazy_import.py,sha256=LTki2tM168fCcXet1e6qDoQq8SLgInUA3xjXgi7cXJk,469
6
6
  schemathesis/_override.py,sha256=oetGCvMGqP8plf2Suvql2E0n3P-PU9SIySKwlBjzuR4,1629
7
- schemathesis/_xml.py,sha256=VatOQxdMFzD1vDnaHFNtK69uY9R0RlICa5UplgALyMM,6921
8
- schemathesis/auths.py,sha256=09tlGuNGpl3rrsU3ua3UI3rIefqUIpaVtG89U5P6rJo,14731
7
+ schemathesis/_xml.py,sha256=5AMZuno3fS4YWPqBlrv5V-f-BmawkdwmpD3GpAsaxnA,6922
8
+ schemathesis/auths.py,sha256=tUuaHvXO96HJr22Gu9OmlSpL2wbAqKZr3TRbb9dVyA4,14732
9
9
  schemathesis/checks.py,sha256=SYts1Teecg-5kSHBo32Pzhh7YQ4a1Y7DIfldd-0VTj8,2155
10
10
  schemathesis/code_samples.py,sha256=QFwyA7dmc_ij2FRwfbe0uMRm6j2yeofQ8zXynZV3SZI,4122
11
11
  schemathesis/constants.py,sha256=gptQZnXJwEJjuLgw62n7LL_kbkE7dhxUgyyJw_dEEAc,2672
12
12
  schemathesis/exceptions.py,sha256=fAkismvT-QcIunr6rZ6OllhXFK3sHjwiZJlD63fttQw,19631
13
13
  schemathesis/failures.py,sha256=oKbIDD075ymLT4h7SQK-herHDT608d-StPX9pXmOSVU,5996
14
- schemathesis/filters.py,sha256=cNwU2TUpCpEx2W8VuEzhpXQ0s9DVSXIoTwRdlus4Eeg,10249
14
+ schemathesis/filters.py,sha256=9SJyZ8mcuDyKG2G1hp2Nfz-TvyJWP_NcntsgwFWYY_Q,10250
15
15
  schemathesis/graphql.py,sha256=YkoKWY5K8lxp7H3ikAs-IsoDbiPwJvChG7O8p3DgwtI,229
16
16
  schemathesis/hooks.py,sha256=cNJgCh7SyLWT1sYDKF5ncDC80ld08CinvKo2IqLMV4g,12396
17
17
  schemathesis/lazy.py,sha256=CivWpvesh4iYLSkatXbQPTEOruWmXvuZQ29gng5p9wM,14846
18
18
  schemathesis/loaders.py,sha256=RJnrbf-3vZ7KXmRBkmr3uqWyg0eHzOnONABuudWcTIg,4586
19
- schemathesis/models.py,sha256=F2aWZW_BqCFzgv9s7KFkRt-EGQTimhKbYaehRtqC6Lw,46757
20
- schemathesis/parameters.py,sha256=xHd3DAkq7z9FAnYDJXXeeOW8XKRsCIW23qtFOPYvGVs,2256
19
+ schemathesis/models.py,sha256=Rcgm2VX7oQN3HN-ThZlqWmBuNsV1Hrd2_xbvh0K6KQY,46883
20
+ schemathesis/parameters.py,sha256=VheEffVzoSfYaSEcG7KhPlA4ypifosG8biiHifzwL8g,2257
21
21
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  schemathesis/sanitization.py,sha256=WSV_MB5YRrYkp1pQRPHrzsidqsKcqYZiq64N9grKobo,8956
23
- schemathesis/schemas.py,sha256=VfNMjBzQNSY7YFhtM_IfpjI48wyff0yZ_QnXM6gA48A,18251
24
- schemathesis/serializers.py,sha256=RUvFrZftIk3bcAlG2WP-HlP_r_xRyKSd3uRnyFomlFU,11587
23
+ schemathesis/schemas.py,sha256=rtlbHoEmZt5sF31E7Mn_MJdfcaCRUejVAkxFicrq3c0,18252
24
+ schemathesis/serializers.py,sha256=_xoebWkVrgbGbPjPgTgwuN-fN4YT004aj7kImyPComY,11619
25
25
  schemathesis/targets.py,sha256=tzp7VZ2-7g2nZHCooRgFzTMtOVcbl0rvtNR421hQthA,1162
26
26
  schemathesis/throttling.py,sha256=QQcS7TFpXHavUjm0kdFaCcCRhAGlgQ4y3XIbkdRoW20,1079
27
27
  schemathesis/types.py,sha256=AglR5M0bce-YXeDRkweToXTP0GjNOWVjS_mIsxLobwc,919
28
28
  schemathesis/utils.py,sha256=4HXvHysnHp-Uz2HfNgLfW5F5VjL-mtixrjjzRCEJhYo,5233
29
- schemathesis/cli/__init__.py,sha256=1m3rkoJyK35uvE2NCVjL2FJ8kprqiRppRAcDtPtLAsQ,64586
29
+ schemathesis/cli/__init__.py,sha256=MSdz9Xt2qvey-3HbWj5nfwV2nZ-rdV05u_Eh_Be9m0c,64909
30
30
  schemathesis/cli/callbacks.py,sha256=HmD0WmSYf5x8v4xeZdOKzy_8CEk23NitUlL8JQ7LHdQ,14950
31
- schemathesis/cli/cassettes.py,sha256=gPPvcuIj1WnoP-yqqvGCJNe49SWlDFu8OdQkOmY453A,12988
31
+ schemathesis/cli/cassettes.py,sha256=1ucgYyOZiNu44uOv044FdfKTzQolUyhAM2onk4m3MD0,12988
32
32
  schemathesis/cli/constants.py,sha256=XoezT0_fHuiOY2e--cmBUhNieJsepcUoW8e48QuLSDI,1544
33
- schemathesis/cli/context.py,sha256=jfCIzPsdnxsKzdtKKxVM8Jygr2fMIWlAWRi0rP1cmZ8,1731
33
+ schemathesis/cli/context.py,sha256=wwfdSL_NKHEyzQnj8PcnaJdzasa_N08e2KPvy4Wl8N4,1874
34
34
  schemathesis/cli/debug.py,sha256=PDEa-oHyz5bZ8aYjRYARwQaCv_AC6HM_L43LJfe4vUM,657
35
35
  schemathesis/cli/handlers.py,sha256=62GPWPmgeGUz3pkDd01H4UCXcIy5a9yRtU7qaAeeR-A,389
36
36
  schemathesis/cli/junitxml.py,sha256=jMZzYBYpBE7Rl5n1ct3J0bhhPa1lhBeYb33lTZE1eW8,1792
37
37
  schemathesis/cli/options.py,sha256=7_dXcrPT0kWqAkm60cAT1J0IsTOcvNFxT1pcHYttBuI,2558
38
38
  schemathesis/cli/sanitization.py,sha256=v-9rsMCBpWhom0Bfzj_8c6InqxkVjSWK6kRoURa52Nk,727
39
39
  schemathesis/cli/output/__init__.py,sha256=AXaUzQ1nhQ-vXhW4-X-91vE2VQtEcCOrGtQXXNN55iQ,29
40
- schemathesis/cli/output/default.py,sha256=1Kmx6WTIhE2AMivoe631y9ES0KwSLnxwhHn56zmqxRw,33011
41
- schemathesis/cli/output/short.py,sha256=kr_1WBPh-_hIST3rpV34py2oquKn1Il5E0ZBlmZjjA4,1846
40
+ schemathesis/cli/output/default.py,sha256=XxnfZXXERuB1X3M8dlVBZnYUuZ0JXsQMCX4EEv5-oYg,38213
41
+ schemathesis/cli/output/short.py,sha256=MmFMOKBRqqvgq7Kmx6XJc7Vqkr9g5BrJBxRbyZ0Rh-k,2068
42
42
  schemathesis/contrib/__init__.py,sha256=FH8NL8NXgSKBFOF8Jy_EB6T4CJEaiM-tmDhz16B2o4k,187
43
43
  schemathesis/contrib/unique_data.py,sha256=zxrmAlQH7Bcil9YSfy2EazwLj2rxLzOvAE3O6QRRkFY,1317
44
44
  schemathesis/contrib/openapi/__init__.py,sha256=YMj_b2f3ohGwEt8QQXlxBT60wqvdCFS6516I4EHWVNM,217
45
45
  schemathesis/contrib/openapi/fill_missing_examples.py,sha256=dY1ygG41PWmITOegdv2uwpDm-UiBcyDSOuGCZMGxYAg,582
46
46
  schemathesis/contrib/openapi/formats/__init__.py,sha256=OpHWPW8MkTLVv83QXPYY1HVLflhmSH49hSVefm1oVV0,111
47
47
  schemathesis/contrib/openapi/formats/uuid.py,sha256=SsTH_bInSXnlGLNyYLmwUfvafVnVOTHdmhmKytQVoUQ,390
48
- schemathesis/experimental/__init__.py,sha256=9q_ok4f7djj4Ur9Ji0ABHsYsOzW_8GM5IMjbLglcMEM,1977
48
+ schemathesis/experimental/__init__.py,sha256=e4QbqDYeGU769e5XhWOK6nJeCj9GfNFqdernZw05bQs,2275
49
49
  schemathesis/extra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  schemathesis/extra/_aiohttp.py,sha256=YQIV-jHdlAyyw5O4FQDQC8KTLjwKi-LWfD3U7JU4Pns,956
51
51
  schemathesis/extra/_flask.py,sha256=BHCbxBDoMlIvNS5sRNyrPN1NwHxiDQt0IsyfYwwoFes,289
@@ -63,35 +63,36 @@ schemathesis/internal/jsonschema.py,sha256=eQEkBLTdJ__U7Z0XYXB_RVBQJ4texfFO0AaOo
63
63
  schemathesis/internal/result.py,sha256=Og_ZfwwQ6JFmW79ExC1ndjVMIOHJB7o9XtrfhYIjOOs,461
64
64
  schemathesis/internal/transformation.py,sha256=ZNEtL8ezryLdP9-of4eSRBMSjjV_lBQ5DZZfoPGZFEU,449
65
65
  schemathesis/internal/validation.py,sha256=G7i8jIMUpAeOnDsDF_eWYvRZe_yMprRswx0QAtMPyEw,966
66
- schemathesis/runner/__init__.py,sha256=PZ2kdk4xI853BC3nmJsPRCbBFoR_PKgpjTja1dn9SPA,20888
67
- schemathesis/runner/events.py,sha256=A0vyMQOM5OjsNMR7OZ-OtWEU7tKKggt-z81nBulvxxU,9950
68
- schemathesis/runner/probes.py,sha256=WrMc_BX7PaaqNTL3UEDQd_nfgyw7b1kjrlaYUhUGSXM,5545
69
- schemathesis/runner/serialization.py,sha256=WvAVInu_Pe088p5lWupHvWVDMUjepcf8CIfPi0tLYdg,15900
66
+ schemathesis/runner/__init__.py,sha256=kkqjC_5G2Mrq00syLNUDHP3sXqwiId8_cusKtIlOyXM,21419
67
+ schemathesis/runner/events.py,sha256=eZc4TT8C8mWCMr9h4JvlijvQQ-x8wFry8LntdsYIL-A,10200
68
+ schemathesis/runner/probes.py,sha256=t_B38-ljy-p3Odw-dqcZUVIjYTPwBvac8KE5GaLnz4M,5546
69
+ schemathesis/runner/serialization.py,sha256=JgkZrbELi2rL7iCsQ0yySOADwxSNF96gd_DOHVANPVU,16080
70
70
  schemathesis/runner/impl/__init__.py,sha256=1E2iME8uthYPBh9MjwVBCTFV-P3fi7AdphCCoBBspjs,199
71
- schemathesis/runner/impl/core.py,sha256=uRQpd5KXHNwfXJSBu9nTwYTqaEOUSO6sb2oaQacq_Fo,38406
71
+ schemathesis/runner/impl/core.py,sha256=vaw6OBgYOVT44-gR2t_EiWLArX2RmtAxITR3WZWCX8k,39558
72
72
  schemathesis/runner/impl/solo.py,sha256=Y_tNhVBVxcuxv65hN0FjxLlVSC41ebHMOM1xSzVrNk8,3358
73
73
  schemathesis/runner/impl/threadpool.py,sha256=2-2Wvw7msezZtenZY5vU_x3FGLLVlH-ywvhU9hTwAAo,15073
74
74
  schemathesis/service/__init__.py,sha256=cDVTCFD1G-vvhxZkJUwiToTAEQ-0ByIoqwXvJBCf_V8,472
75
75
  schemathesis/service/auth.py,sha256=AiZXvSNwz1Hi3fn-OCp6XD-E4GAMDlfcX8fORJ8_dLo,445
76
76
  schemathesis/service/ci.py,sha256=Nke_GHtUlbJtZA-7JmjD1Nu4aKBCtkUo8AwFwm38qpk,6781
77
- schemathesis/service/client.py,sha256=lkop8gLgv0KN4Y_vA6RWVFqIzVPUdJWn144dgZlqxo4,3953
77
+ schemathesis/service/client.py,sha256=TcUnLyiGYuU3ENZRStycx5p6tQe_iknioYKPqlEe5Xk,5218
78
78
  schemathesis/service/constants.py,sha256=Q1bhtLRkmhso4KSVAtWl0u446Wlbk3ShOL3ZdbPoJOM,1502
79
79
  schemathesis/service/events.py,sha256=oysiTeHkE1r65CZTPlyNXW3XFh0_Xt0eq9-FNBUy5U0,1237
80
- schemathesis/service/hosts.py,sha256=WEiVaLpVka3mhl-T0LjD4WJDEGC-dqOFNmiB4H7Cx5Q,3121
81
- schemathesis/service/metadata.py,sha256=jsPeif2XbrwjZgzDD3YysuUgGaSZm6Hkc4e3raDewqo,1475
82
- schemathesis/service/models.py,sha256=bY9g48TdtEPS0yO2lTKEsHtKl81Hh5vSJtMDe8kkWSI,850
80
+ schemathesis/service/extensions.py,sha256=PuG-Qfb9Y1oWOaa2Dxb8qhTH0t9CyawzZ2xkUoL7Sd4,7827
81
+ schemathesis/service/hosts.py,sha256=Qxa-BGV56z9pRHl8kUm8LNZQiW3fALDYVcgZqUMh4qQ,3122
82
+ schemathesis/service/metadata.py,sha256=ajiDb2VDquXRoYl7h9LGDoj9GWq6pKv5nN-WVtTnCIE,2086
83
+ schemathesis/service/models.py,sha256=45J7lugoFP1QbQFAEFCi9aj-yuTBKKHtil9vA8BWnfk,6577
83
84
  schemathesis/service/report.py,sha256=ua1-cfa-TgGshZgimUQ3-YQqykhZqMHCkEificBKncM,8294
84
- schemathesis/service/serialization.py,sha256=Tx-gEBw6J1qMFMbE9O_r504DNSVHYpW5VhgoOH80AQc,7342
85
+ schemathesis/service/serialization.py,sha256=OjWG7FfihEl4LtpOD8N-fmjOTzSPUm6A4x6sypt2nW4,8377
85
86
  schemathesis/service/usage.py,sha256=Z-GCwFcW1pS6YdC-ziEOynikqgOttxp2Uyj_dfK5Q7A,2437
86
87
  schemathesis/specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
88
  schemathesis/specs/graphql/__init__.py,sha256=fgyHtvWNUVWismBTOqxQtgLoTighTfvMv6v6QCD_Oyc,85
88
89
  schemathesis/specs/graphql/loaders.py,sha256=16fGT4rSqVF91DPY90cKDaFsbtRb9_ZdLnlGY1Gb_vg,11391
89
90
  schemathesis/specs/graphql/nodes.py,sha256=7F5jbk96uTZZXK9Ulr86KpCAn8z6LKMBcrLrdJHggH0,540
90
91
  schemathesis/specs/graphql/scalars.py,sha256=W5oj6AcjiXpR-Z6eSSp1oPWl0mjH2NF-w87nRFhrHHg,1805
91
- schemathesis/specs/graphql/schemas.py,sha256=pbonjYD2neMujoMZZMM_MXFJt-gk1qsW59Qkfed9Ltg,13967
92
+ schemathesis/specs/graphql/schemas.py,sha256=XK-zbR_d8zER2HLU3zH-BrKnfoV9hb0VXvDueryp8Y0,14091
92
93
  schemathesis/specs/graphql/validation.py,sha256=SqQbj9uymGUQxlHXc8HkQccIq25uwP5CvLF1zReb1Xg,1636
93
- schemathesis/specs/openapi/__init__.py,sha256=Ue1Qod8IpzeJ5dwxjAHNv97Nh8NVzm_6fnHR2BIzfHY,220
94
- schemathesis/specs/openapi/_hypothesis.py,sha256=wVbww3uxbwvAwc-LVldV8xTJsnGaR4zj_9SIYsXAeUc,22173
94
+ schemathesis/specs/openapi/__init__.py,sha256=HDcx3bqpa6qWPpyMrxAbM3uTo0Lqpg-BUNZhDJSJKnw,279
95
+ schemathesis/specs/openapi/_hypothesis.py,sha256=VPjIiGgsVBMffcCxHpaHFxpgjI2hq180Hpcsub46UC8,22807
95
96
  schemathesis/specs/openapi/checks.py,sha256=1WB_UGNqptfJThWLUNbds1Q-IzOGbbHCOYPIhBYk-zs,5411
96
97
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
97
98
  schemathesis/specs/openapi/converter.py,sha256=9TKeKvNi9MVvoNMfqoPz_cODO8oNrMSTXTOwLLfjD_Q,2799
@@ -99,23 +100,24 @@ schemathesis/specs/openapi/definitions.py,sha256=t5xffHLBnSgptBdDkSqYN1OfT-DaXoe
99
100
  schemathesis/specs/openapi/examples.py,sha256=igLDfMpNhRMAk7mYBqi93CtVRQTZCWjCJ2KxlQFotdA,14932
100
101
  schemathesis/specs/openapi/filters.py,sha256=Ei-QTFcGCvGSIunT-GYQrtqzB-kqvUePOcUuC7B7mT8,1436
101
102
  schemathesis/specs/openapi/formats.py,sha256=JmmkQWNAj5XreXb7Edgj4LADAf4m86YulR_Ec8evpJ4,1220
102
- schemathesis/specs/openapi/links.py,sha256=YryI35djHOhTikRV3FLafy_jhYFypF7E8Yb6dg9ksWc,14575
103
+ schemathesis/specs/openapi/links.py,sha256=FUjqEf6Sv6PeS0UX7CLL5p2VHa9vA1MGDPhx2pfYg1s,14576
103
104
  schemathesis/specs/openapi/loaders.py,sha256=Jm37MTUmbVVkOxoRAJOo_T_Ex-tWu2ir7YG7y-v-BjM,24014
105
+ schemathesis/specs/openapi/media_types.py,sha256=dNTxpRQbY3SubdVjh4Cjb38R6Bc9MF9BsRQwPD87x0g,1017
104
106
  schemathesis/specs/openapi/parameters.py,sha256=5jMZQZFsZNBFjG22Bqot-Rc65emiSA4E95rIzwImThk,13610
105
107
  schemathesis/specs/openapi/references.py,sha256=YGunHAGubYPKbMqQtpFWZm1D4AGxB8wLuiVhE6T6cWo,8978
106
- schemathesis/specs/openapi/schemas.py,sha256=mIoJkuaQeF5fcrjBFGuudglQJz93vbaMc0wFVJjdVTg,50424
107
- schemathesis/specs/openapi/security.py,sha256=lNRD4RSYe341f_ayhl_bQuYlFbGzx4luhXi6qJwzrOY,6495
108
+ schemathesis/specs/openapi/schemas.py,sha256=BuBKfToNYIsQ1RIh3EedNaB948-33wLSrjSi1lBV0F0,50457
109
+ schemathesis/specs/openapi/security.py,sha256=nCUIaZTzI6t26HAfd8YTHW6mFxXAPN9Ds-P9UnXxmNA,6628
108
110
  schemathesis/specs/openapi/serialization.py,sha256=jajqowTIiyEVWEx-Gy4ZinXZewNg0n_ipsGzz7JXP7c,11383
109
111
  schemathesis/specs/openapi/utils.py,sha256=gmW4v6o6sZQifajfPquhFeWmZWGQM89mOOBYZvjnE7g,741
110
112
  schemathesis/specs/openapi/validation.py,sha256=UJWtW7VTRyMbbBHMRhMwNSUn92k1Hnp4p7IIVqCvqiI,998
111
- schemathesis/specs/openapi/expressions/__init__.py,sha256=7TZeRPpCPt0Bjzs5L--AkQnnIbDgTRnpkgYeJKma5Bc,660
113
+ schemathesis/specs/openapi/expressions/__init__.py,sha256=GIOeU0wU40LJ5V8vSdrDjpChAkGibZyGFijNSoF81xw,661
112
114
  schemathesis/specs/openapi/expressions/context.py,sha256=ngZQPUvN8PKqvH8SIvhM3yyDZjb_g1aPzH9hzquRsKE,350
113
115
  schemathesis/specs/openapi/expressions/errors.py,sha256=YLVhps-sYcslgVaahfcUYxUSHlIfWL-rQMeT5PZSMZ8,219
114
- schemathesis/specs/openapi/expressions/lexer.py,sha256=pYoqIlogmw2gyAwec01OTvUb_d8fG1zLiKwlCkLK8RA,3824
115
- schemathesis/specs/openapi/expressions/nodes.py,sha256=fb9yvxDWfq3WQcrtsn1dcj8GSMyzsvofW3Tn2mFOdL4,3298
116
+ schemathesis/specs/openapi/expressions/lexer.py,sha256=j-zGtpeJlaMsuZXbOvLI-m0BF2cYJMs4o0FkMN8tykg,3825
117
+ schemathesis/specs/openapi/expressions/nodes.py,sha256=YkYcMq_myhdBQrjPCYoBdxadVNtrxyt4y226HjLGGK8,3299
116
118
  schemathesis/specs/openapi/expressions/parser.py,sha256=xFA3cTTxl7VgAOiFF-vSDZ3usUFXpd3jk6ewMLeg6ao,3523
117
119
  schemathesis/specs/openapi/negative/__init__.py,sha256=Nhe6qeSCnlgf5l-Fu6yHvL--3tkAkxYyIGffuo77bLs,3696
118
- schemathesis/specs/openapi/negative/mutations.py,sha256=I2YKm6N3VoP3TpxRQMbYQze3XSVdLn1k7z8vqV1oJ4s,18642
120
+ schemathesis/specs/openapi/negative/mutations.py,sha256=SQjQR5aK-LpbSWzwrtbFX3PQ2xb5hzJV7eZXw6MlRJo,18643
119
121
  schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
120
122
  schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
121
123
  schemathesis/specs/openapi/stateful/__init__.py,sha256=R8RhPJD3rDzqL4eA9jSnUwh9Q_Mv27ka1C5FdRuyusY,4509
@@ -127,8 +129,8 @@ schemathesis/transports/auth.py,sha256=ZKFku9gjhIG6445qNC2p_64Yt9Iz_4azbvja8AMpt
127
129
  schemathesis/transports/content_types.py,sha256=xU8RZWxz-CyWRqQTI2fGYQacB7KasoY7LL_bxPQdyPY,2144
128
130
  schemathesis/transports/headers.py,sha256=EDxpm8su0AuhyqZUkMex-OFZMAJN_5NHah7fDT2HDZE,989
129
131
  schemathesis/transports/responses.py,sha256=U6z1VW5w19c9qRRoyf2ljkuXR2smTfWikmrTGqlgl18,1619
130
- schemathesis-3.25.6.dist-info/METADATA,sha256=z6ZLtx0WmChQbDgAb0WmCJlts2QywnGX3CUU4z6FpcQ,15668
131
- schemathesis-3.25.6.dist-info/WHEEL,sha256=hKi7AIIx6qfnsRbr087vpeJnrVUuDokDHZacPPMW7-Y,87
132
- schemathesis-3.25.6.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
133
- schemathesis-3.25.6.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
134
- schemathesis-3.25.6.dist-info/RECORD,,
132
+ schemathesis-3.26.1.dist-info/METADATA,sha256=UjWFZfyYDSYLiD8diepu3d2yF9mZSU36rJ6FrHdNtqU,16257
133
+ schemathesis-3.26.1.dist-info/WHEEL,sha256=hKi7AIIx6qfnsRbr087vpeJnrVUuDokDHZacPPMW7-Y,87
134
+ schemathesis-3.26.1.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
135
+ schemathesis-3.26.1.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
136
+ schemathesis-3.26.1.dist-info/RECORD,,