schemathesis 4.0.0a11__py3-none-any.whl → 4.0.0a12__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 (62) hide show
  1. schemathesis/__init__.py +28 -25
  2. schemathesis/auths.py +65 -24
  3. schemathesis/checks.py +60 -36
  4. schemathesis/cli/commands/run/__init__.py +23 -21
  5. schemathesis/cli/commands/run/context.py +6 -1
  6. schemathesis/cli/commands/run/events.py +7 -1
  7. schemathesis/cli/commands/run/executor.py +12 -7
  8. schemathesis/cli/commands/run/handlers/output.py +175 -80
  9. schemathesis/cli/commands/run/validation.py +21 -6
  10. schemathesis/config/__init__.py +2 -1
  11. schemathesis/config/_generation.py +12 -13
  12. schemathesis/config/_operations.py +14 -0
  13. schemathesis/config/_phases.py +41 -5
  14. schemathesis/config/_projects.py +28 -0
  15. schemathesis/config/_report.py +6 -2
  16. schemathesis/config/_warnings.py +25 -0
  17. schemathesis/config/schema.json +49 -1
  18. schemathesis/core/errors.py +5 -2
  19. schemathesis/core/transport.py +36 -1
  20. schemathesis/engine/context.py +1 -0
  21. schemathesis/engine/errors.py +60 -1
  22. schemathesis/engine/events.py +10 -2
  23. schemathesis/engine/phases/probes.py +3 -0
  24. schemathesis/engine/phases/stateful/__init__.py +2 -1
  25. schemathesis/engine/phases/stateful/_executor.py +38 -5
  26. schemathesis/engine/phases/stateful/context.py +2 -2
  27. schemathesis/engine/phases/unit/_executor.py +36 -7
  28. schemathesis/generation/__init__.py +0 -3
  29. schemathesis/generation/case.py +1 -0
  30. schemathesis/generation/coverage.py +1 -1
  31. schemathesis/generation/hypothesis/builder.py +31 -7
  32. schemathesis/generation/metrics.py +93 -0
  33. schemathesis/generation/modes.py +0 -8
  34. schemathesis/generation/stateful/__init__.py +4 -0
  35. schemathesis/generation/stateful/state_machine.py +1 -0
  36. schemathesis/graphql/loaders.py +138 -4
  37. schemathesis/hooks.py +62 -35
  38. schemathesis/openapi/loaders.py +120 -4
  39. schemathesis/pytest/loaders.py +24 -0
  40. schemathesis/pytest/plugin.py +22 -0
  41. schemathesis/schemas.py +9 -6
  42. schemathesis/specs/graphql/scalars.py +37 -3
  43. schemathesis/specs/graphql/schemas.py +12 -3
  44. schemathesis/specs/openapi/_hypothesis.py +14 -20
  45. schemathesis/specs/openapi/checks.py +21 -18
  46. schemathesis/specs/openapi/formats.py +30 -3
  47. schemathesis/specs/openapi/media_types.py +44 -1
  48. schemathesis/specs/openapi/schemas.py +8 -2
  49. schemathesis/specs/openapi/stateful/__init__.py +2 -1
  50. schemathesis/transport/__init__.py +54 -16
  51. schemathesis/transport/prepare.py +31 -7
  52. schemathesis/transport/requests.py +9 -8
  53. schemathesis/transport/wsgi.py +8 -8
  54. {schemathesis-4.0.0a11.dist-info → schemathesis-4.0.0a12.dist-info}/METADATA +44 -90
  55. {schemathesis-4.0.0a11.dist-info → schemathesis-4.0.0a12.dist-info}/RECORD +58 -60
  56. schemathesis/contrib/__init__.py +0 -9
  57. schemathesis/contrib/openapi/__init__.py +0 -9
  58. schemathesis/contrib/openapi/fill_missing_examples.py +0 -20
  59. schemathesis/generation/targets.py +0 -69
  60. {schemathesis-4.0.0a11.dist-info → schemathesis-4.0.0a12.dist-info}/WHEEL +0 -0
  61. {schemathesis-4.0.0a11.dist-info → schemathesis-4.0.0a12.dist-info}/entry_points.txt +0 -0
  62. {schemathesis-4.0.0a11.dist-info → schemathesis-4.0.0a12.dist-info}/licenses/LICENSE +0 -0
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
19
19
  import werkzeug
20
20
 
21
21
 
22
- class WSGITransport(BaseTransport["Case", Response, "werkzeug.Client"]):
22
+ class WSGITransport(BaseTransport["werkzeug.Client"]):
23
23
  def serialize_case(self, case: Case, **kwargs: Any) -> dict[str, Any]:
24
24
  headers = kwargs.get("headers")
25
25
  params = kwargs.get("params")
@@ -119,24 +119,24 @@ WSGI_TRANSPORT = WSGITransport()
119
119
 
120
120
 
121
121
  @WSGI_TRANSPORT.serializer("application/json", "text/json")
122
- def json_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
122
+ def json_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
123
123
  return serialize_json(value)
124
124
 
125
125
 
126
126
  @WSGI_TRANSPORT.serializer(
127
127
  "text/yaml", "text/x-yaml", "text/vnd.yaml", "text/yml", "application/yaml", "application/x-yaml"
128
128
  )
129
- def yaml_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
129
+ def yaml_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
130
130
  return serialize_yaml(value)
131
131
 
132
132
 
133
133
  @WSGI_TRANSPORT.serializer("multipart/form-data", "multipart/mixed")
134
- def multipart_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
134
+ def multipart_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
135
135
  return {"data": value}
136
136
 
137
137
 
138
138
  @WSGI_TRANSPORT.serializer("application/xml", "text/xml")
139
- def xml_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
139
+ def xml_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
140
140
  media_type = ctx.case.media_type
141
141
 
142
142
  assert media_type is not None
@@ -148,17 +148,17 @@ def xml_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any
148
148
 
149
149
 
150
150
  @WSGI_TRANSPORT.serializer("application/x-www-form-urlencoded")
151
- def urlencoded_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
151
+ def urlencoded_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
152
152
  return {"data": value}
153
153
 
154
154
 
155
155
  @WSGI_TRANSPORT.serializer("text/plain")
156
- def text_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
156
+ def text_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
157
157
  if isinstance(value, bytes):
158
158
  return {"data": value}
159
159
  return {"data": str(value)}
160
160
 
161
161
 
162
162
  @WSGI_TRANSPORT.serializer("application/octet-stream")
163
- def binary_serializer(ctx: SerializationContext[Case], value: Any) -> dict[str, Any]:
163
+ def binary_serializer(ctx: SerializationContext, value: Any) -> dict[str, Any]:
164
164
  return {"data": serialize_binary(value)}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.0a11
3
+ Version: 4.0.0a12
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
@@ -62,6 +62,7 @@ Requires-Dist: fastapi>=0.86.0; extra == 'dev'
62
62
  Requires-Dist: flask<3.0,>=2.1.1; extra == 'dev'
63
63
  Requires-Dist: hypothesis-openapi<1,>=0.2; (python_version >= '3.10') and extra == 'dev'
64
64
  Requires-Dist: mkdocs-material; extra == 'dev'
65
+ Requires-Dist: mkdocstrings[python]; extra == 'dev'
65
66
  Requires-Dist: pydantic>=1.10.2; extra == 'dev'
66
67
  Requires-Dist: pytest-asyncio<1.0,>=0.18.0; extra == 'dev'
67
68
  Requires-Dist: pytest-codspeed==2.2.1; extra == 'dev'
@@ -75,6 +76,7 @@ Requires-Dist: tomli-w>=1.2.0; extra == 'dev'
75
76
  Requires-Dist: trustme<1.0,>=0.9.0; extra == 'dev'
76
77
  Provides-Extra: docs
77
78
  Requires-Dist: mkdocs-material; extra == 'docs'
79
+ Requires-Dist: mkdocstrings[python]; extra == 'docs'
78
80
  Provides-Extra: tests
79
81
  Requires-Dist: aiohttp<4.0,>=3.9.1; extra == 'tests'
80
82
  Requires-Dist: coverage>=6; extra == 'tests'
@@ -116,137 +118,89 @@ Description-Content-Type: text/markdown
116
118
 
117
119
  ## Schemathesis
118
120
 
119
- Schemathesis automatically generates and runs API tests from your OpenAPI or GraphQL schema to find bugs and spec violations.
121
+ > **Catch API bugs before your users do.**
122
+
123
+ Schemathesis automatically generates thousands of test cases from your OpenAPI or GraphQL schema and finds edge cases that break your API.
120
124
 
121
125
  <p align="center">
122
126
  <img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis automatically finding a server error"/>
123
127
  <br>
124
- <i>Automatically finding specification violations and server errors</i>
128
+ <i>Finding bugs that manual testing missed</i>
125
129
  </p>
126
130
 
127
- > **Note:** This is the V4 branch under active development. While fully functional and passing tests, some features may be missing, and documentation is being updated. For the stable release, see the [V3 branch](https://github.com/schemathesis/schemathesis/tree/v3).
128
-
129
- ## Why Schemathesis?
130
-
131
- - 📑 **Schema-Based Testing** - Transform API documentation into a comprehensive test suite
132
- - 🚀 **Zero Configuration** - Begin testing immediately with a valid OpenAPI or GraphQL schema
133
- - ⚙️ **CI-Ready** - Integrate API testing into existing pipelines without complex configuration
134
- - 🛡️ **Effective Coverage** - Find edge cases no manual testing could uncover
135
- - 🔬 **Research-Backed**: [Recognized](https://dl.acm.org/doi/10.1145/3617175) in [academic research](https://ieeexplore.ieee.org/document/9793781) as a state-of-the-art API testing tool
136
-
137
- ## Installation
131
+ ## Try it now
138
132
 
139
133
  ```console
140
- # Using uv (recommended)
141
- $ uv pip install schemathesis
142
-
143
- # Using pip
144
- $ pip install schemathesis
134
+ # Test a demo API - finds real bugs instantly
135
+ uvx schemathesis run https://example.schemathesis.io/openapi.json
145
136
 
146
- # Using Docker
147
- $ docker pull schemathesis/schemathesis:stable
137
+ # Test your own API
138
+ uvx schemathesis run https://your-api.com/openapi.json
148
139
  ```
149
140
 
150
- ## Usage
151
141
 
152
- ### Command Line
142
+ ## What problems does it solve?
153
143
 
144
+ - 💥 **500 errors** that crash your API on edge case inputs
145
+ - 📋 **Schema violations** where your API returns different data than documented
146
+ - 🚪 **Validation bypasses** where invalid data gets accepted
147
+ - 🔗 **Integration failures** when responses don't match client expectations
148
+
149
+ # Installation & Usage
150
+
151
+ **Command Line:**
154
152
  ```console
155
- # Run tests against a schema URL
156
- $ st run https://example.schemathesis.io/openapi.json
153
+ uv pip install schemathesis
154
+ schemathesis run https://your-api.com/openapi.json
157
155
  ```
158
156
 
159
- ### Python Library
160
-
157
+ **Python Tests:**
161
158
  ```python
162
159
  import schemathesis
163
160
 
164
- schema = schemathesis.openapi.from_url("https://example.schemathesis.io/openapi.json")
165
-
161
+ schema = schemathesis.openapi.from_url("https://your-api.com/openapi.json")
166
162
 
167
163
  @schema.parametrize()
168
164
  def test_api(case):
169
- case.call_and_validate()
165
+ case.call_and_validate() # Finds bugs automatically
170
166
  ```
171
167
 
172
- ### CI/CD Integration
173
-
168
+ **CI/CD:**
174
169
  ```yaml
175
- # GitHub Actions example
176
- steps:
177
- - uses: schemathesis/action@v1
178
- with:
179
- schema: "https://example.schemathesis.io/openapi.json"
170
+ - uses: schemathesis/action@v1
171
+ with:
172
+ schema: "https://your-api.com/openapi.json"
180
173
  ```
181
174
 
182
- ## Documentation
183
-
184
- 📚 **[Read the full documentation](https://schemathesis.readthedocs.io/)** for guides, examples, and reference material.
185
-
186
- ## Who's Using Schemathesis?
187
-
188
- Schemathesis is used by companies and open-source projects including:
189
-
190
- - Netflix ([Dispatch](https://github.com/Netflix/dispatch))
191
- - Spotify ([Backstage](https://github.com/backstage/backstage))
192
- - WordPress ([OpenVerse](https://github.com/WordPress/openverse))
193
- - Chronosphere.io ([Calyptia](https://github.com/chronosphereio/calyptia-api))
194
- - [Qdrant](https://github.com/qdrant/qdrant)
195
- - [Pixie](https://github.com/pixie-io/pixie)
196
- - [CheckMK](https://github.com/Checkmk/checkmk)
197
- - [Weechat](https://github.com/weechat/weechat)
198
- - HXSecurity ([DongTai](https://github.com/HXSecurity/DongTai))
199
- - Abstract Machines ([Magistrala](https://github.com/absmach/magistrala))
200
- - Bundesstelle für Open Data ([smard-api](https://github.com/bundesAPI/smard-api))
201
-
202
- ## Testimonials
203
-
204
- "_The world needs modern, spec-based API tests, so we can deliver APIs as-designed. Schemathesis is the right tool for that job._"
205
-
206
- <div>Emmanuel Paraskakis - <strong>Level 250</strong></div>
175
+ ## Who uses it
207
176
 
208
- ---
209
-
210
- "_Schemathesis is the only sane way to thoroughly test an API._"
211
-
212
- <div>Zdenek Nemec - <strong>superface.ai</strong></div>
213
-
214
- ---
215
-
216
- "_The tool is amazing as it can test negative scenarios instead of me and much faster!_"
217
-
218
- <div>Luděk Nový - <strong>JetBrains</strong></div>
219
-
220
- ---
177
+ Used by teams at **[Spotify](https://github.com/backstage/backstage)**, **[WordPress](https://github.com/WordPress/openverse)**, **JetBrains**, **Red Hat** and dozens other companies.
221
178
 
222
- "_Schemathesis is the best tool for fuzz testing of REST API on the market. We are at Red Hat use it for examining our applications in functional and integrations testing levels._"
223
179
 
224
- <div>Dmitry Misharov - <strong>RedHat</strong></div>
180
+ > "_Schemathesis is the best tool for fuzz testing of REST API on the market. We are at Red Hat use it for examining our applications in functional and integrations testing levels._" - Dmitry Misharov, RedHat
225
181
 
226
- ---
182
+ ## Documentation
227
183
 
228
- "_There are different levels of usability and documentation quality among these tools which have been reported, where Schemathesis clearly stands out among the most user-friendly and industry-strength tools._"
184
+ 📚 **[Complete documentation](https://schemathesis.readthedocs.io/)** with guides, examples, and API reference.
229
185
 
230
- <div>Testing RESTful APIs: A Survey - <strong>a research paper by Golmohammadi, at al</strong></div>
186
+ ## Get Help
231
187
 
232
- ---
188
+ - 💬 [Discord community](https://discord.gg/R9ASRAmHnA)
189
+ - 🐛 [GitHub issues](https://github.com/schemathesis/schemathesis/issues)
190
+ - ✉️ [Email support](mailto:support@schemathesis.io)
233
191
 
234
192
  ## Contributing
235
193
 
236
- We welcome contributions! Your input directly influences Schemathesis development.
237
-
238
- - Discuss ideas in [GitHub issues](https://github.com/schemathesis/schemathesis/issues) or our [Discord server](https://discord.gg/R9ASRAmHnA)
239
- - See our [contributing guidelines](https://github.com/schemathesis/schemathesis/blob/master/CONTRIBUTING.rst) for code contributions
240
- - Share your experience using [this feedback form](https://forms.gle/kJ4hSxc1Yp6Ga96t5)
241
-
242
- ## Get in Touch
243
-
244
- Need assistance with integration or have specific questions? Contact us at <a href="mailto:support@schemathesis.io">support@schemathesis.io</a>.
194
+ We welcome contributions! See our [contributing guidelines](CONTRIBUTING.rst) and join discussions in [issues](https://github.com/schemathesis/schemathesis/issues) or [Discord](https://discord.gg/R9ASRAmHnA).
245
195
 
246
196
  ## Acknowledgements
247
197
 
248
198
  Schemathesis is built on top of <a href="https://hypothesis.works/" target="_blank">Hypothesis</a>, a powerful property-based testing library for Python.
249
199
 
200
+ ---
201
+
202
+ > **Note:** This is the V4 development branch. For the stable release, see [V3](https://github.com/schemathesis/schemathesis/tree/v3).
203
+
250
204
  ## License
251
205
 
252
206
  This project is licensed under the terms of the [MIT license](https://opensource.org/licenses/MIT).
@@ -1,59 +1,57 @@
1
- schemathesis/__init__.py,sha256=IznSJx_si-x3bBolTLGcq_NakcVoeMCtE11ctKuz9uE,1119
2
- schemathesis/auths.py,sha256=t-YuPyoLqL7jlRUH-45JxO7Ir3pYxpe31CRmNIJh7rI,15423
3
- schemathesis/checks.py,sha256=bNrebGDOryn2SmXcgMUVWhItCmGgiGSq54JMNvGiZjE,5421
1
+ schemathesis/__init__.py,sha256=c-zgYns-v0qpXvTJSc2gxz2medwiQgFRanoTZQiP7BA,1254
2
+ schemathesis/auths.py,sha256=hoKKM1POr4AeMcopGLK8fHqhH36-FSLpySxXI2xlc2M,16839
3
+ schemathesis/checks.py,sha256=eDs2WwVNS_T_Q8rKlfUKYbUcR7TURzW8eQ8ts9GsqVk,6382
4
4
  schemathesis/errors.py,sha256=T8nobEi5tQX_SkwaYb8JFoIlF9F_vOQVprZ8EVPAhjA,931
5
5
  schemathesis/filters.py,sha256=OEub50Ob5sf0Tn3iTeuIaxSMtepF7KVoiEM9wtt5GGA,13433
6
- schemathesis/hooks.py,sha256=ZSGEnsLJ7UVezf4CcaJebVkjEpvwgJolJFZo5fjQNDc,13153
6
+ schemathesis/hooks.py,sha256=zhrA32jznnTxzRFWk2rM6gYtfC9tBodUGJygpKyu2pk,13943
7
7
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- schemathesis/schemas.py,sha256=KyYuL04FAPEkc6mN53NioDEUgn7rmTDkvv5Q2_PGgoY,25824
8
+ schemathesis/schemas.py,sha256=GjjcD39k08McIsf62jCp959MDPt-wuE6SvOcrSSMOmM,25935
9
9
  schemathesis/cli/__init__.py,sha256=U9gjzWWpiFhaqevPjZbwyTNjABdpvXETI4HgwdGKnvs,877
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=ue7YUdVo3YvuzGL4s6i62NL6YqNDeVPBSnQ1znrvG2w,480
13
13
  schemathesis/cli/commands/__init__.py,sha256=rubTCCRGuMIbNYOl8yQEioiuHtTq__tWjkUtFWYGhqQ,3433
14
14
  schemathesis/cli/commands/data.py,sha256=_ALywjIeCZjuaoDQFy-Kj8RZkEGqXd-Y95O47h8Jszs,171
15
- schemathesis/cli/commands/run/__init__.py,sha256=wOrs_7aj-6nYBuuVnMTJ24u2s7C9_hsMwYYes0l5A-k,18818
16
- schemathesis/cli/commands/run/context.py,sha256=15jijsCgwFZYLfWbeQZJ9lWD0b3Jp3NfWTURzh6Uyuc,7663
17
- schemathesis/cli/commands/run/events.py,sha256=CuS5iZ5IoYl7d9ytvNmW73WEjjQ3SriEm1O9as8O2wU,1348
18
- schemathesis/cli/commands/run/executor.py,sha256=x4vfwP3B5OUhx9fiZMH3shjDmTkXZUcRAm3by613_lY,5132
15
+ schemathesis/cli/commands/run/__init__.py,sha256=OzmofeSlyngQAQ1KRmjrQO3kTL-6APCpoG2TfpB34RA,18626
16
+ schemathesis/cli/commands/run/context.py,sha256=taegOHWc_B-HDwiU1R9Oi4q57mdfLXc-B954QUj8t7A,7984
17
+ schemathesis/cli/commands/run/events.py,sha256=ew0TQOc9T2YBZynYWv95k9yfAk8-hGuZDLMxjT8EhvY,1595
18
+ schemathesis/cli/commands/run/executor.py,sha256=kFbZw583SZ-jqjv8goTp2yEJOpZ_bzecyTeZvdc6qTE,5327
19
19
  schemathesis/cli/commands/run/filters.py,sha256=pzkNRcf5vLPSsMfnvt711GNzRSBK5iZIFjPA0fiH1N4,1701
20
20
  schemathesis/cli/commands/run/loaders.py,sha256=6j0ez7wduAUYbUT28ELKxMf-dYEWr_67m_KIuTSyNGk,4358
21
- schemathesis/cli/commands/run/validation.py,sha256=xiDFkR_9lwRVLJXL-0paVMK1Q2JNu1qreDjwf1hoiGA,8502
21
+ schemathesis/cli/commands/run/validation.py,sha256=FzCzYdW1-hn3OgyzPO1p6wHEX5PG7HdewbPRvclV_vc,9002
22
22
  schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
23
23
  schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
24
24
  schemathesis/cli/commands/run/handlers/cassettes.py,sha256=Gu0qcxzvHp1zMY-SVkY96T-Ifwtdh6oj-w0gE1MShnA,19157
25
25
  schemathesis/cli/commands/run/handlers/junitxml.py,sha256=FX_347PcHhGLG7XY3eG8VwhB_8tSX4mOtqjZj_s6yLM,2402
26
- schemathesis/cli/commands/run/handlers/output.py,sha256=i0UGeKKVY4o1eiMzFtg3azXvCOOSj1FS4ZdScW4Nm5Y,58198
26
+ schemathesis/cli/commands/run/handlers/output.py,sha256=e-mPAomU2yhA44EHBoGOSdT6OZ9bvtZ2rIv1JXtO-qI,61726
27
27
  schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  schemathesis/cli/ext/fs.py,sha256=3lvoAsEDDdih75ITJJNxemd3nwxX55gGWrI7uDxm0cM,447
29
29
  schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
30
30
  schemathesis/cli/ext/options.py,sha256=6yYwZNJL__FCEEL7kI3r5MbVmbp3ZeQjm7DrZ6J_h7s,3347
31
- schemathesis/config/__init__.py,sha256=A7KvfcX_o2sWBXiO798vDUYVDSEQisI9-L84mLyYFZM,6192
31
+ schemathesis/config/__init__.py,sha256=Ff-mcdwCatFIS_WpJNpSe-gl7ez0-m_s4F2_4Teg2eM,6240
32
32
  schemathesis/config/_auth.py,sha256=83RLVPm97W2thbn-yi01Rt94YwOxLG_a5VoxhEfjUjs,1528
33
33
  schemathesis/config/_checks.py,sha256=F0r16eSSiICvoiTUkNNOE2PH73EGd8bikoeZdME_3Yw,10763
34
34
  schemathesis/config/_diff_base.py,sha256=-XqS6cTzZC5fplz8_2RSZHDMSAPJhBBIEP6H8wcgHmo,4221
35
35
  schemathesis/config/_env.py,sha256=8XfIyrnGNQuCDnfG0lwmKRFbasRUjgeQGBAMupsmtOU,613
36
36
  schemathesis/config/_error.py,sha256=TxuuqQ1olwJc7P7ssfxXb1dB_Xn5uVsoazjvYvRxrxA,5437
37
- schemathesis/config/_generation.py,sha256=gHLv3wiMuGKg47gwtq6Y6xLCJBE-pceIAlu6Jg4Kmlk,5136
37
+ schemathesis/config/_generation.py,sha256=_THqCfC20i8RRRsO2hAwoJ52FV-CS1xOA6me3Wp3FHw,5087
38
38
  schemathesis/config/_health_check.py,sha256=zC9inla5ibMBlEy5WyM4_TME7ju_KH3Bwfo21RI3Gks,561
39
- schemathesis/config/_operations.py,sha256=l1jQHQY18OGefFtvePNPmYhr7hLT0Re0fAUMY5VO2G4,11584
39
+ schemathesis/config/_operations.py,sha256=OZMTcfTLef6M8CR9logi6vyaz3XdmZfEMjIobgxjOHA,12181
40
40
  schemathesis/config/_output.py,sha256=3G9SOi-4oNcQPHeNRG3HggFCwvcKOW1kF28a9m0H-pU,4434
41
41
  schemathesis/config/_parameters.py,sha256=i76Hwaf834fBAMmtKfKTl1SFCicJ-Y-5tZt5QNGW2fA,618
42
- schemathesis/config/_phases.py,sha256=C-OLJNwkVIdp9w4Uw6qNTV2inQZdaT6UGkS7anHxUdg,5090
43
- schemathesis/config/_projects.py,sha256=U78ZixEIlWIFBXGHgMXrkKRNeol2PkOrHrSFRDvTIlk,18147
42
+ schemathesis/config/_phases.py,sha256=NFUhn-xzEQdNtgNVW1t51lMquXbjRNGR_QuiCRLCi28,6454
43
+ schemathesis/config/_projects.py,sha256=ddAPTE-uEgjp5SXzQhQoliWtP6feT1ApXPXpsyvdo5I,19367
44
44
  schemathesis/config/_rate_limit.py,sha256=ekEW-jP_Ichk_O6hYpj-h2TTTKfp7Fm0nyFUbvlWcbA,456
45
- schemathesis/config/_report.py,sha256=FAmmOndCuXju2Eat5DX1lBMobIHWLNSGyJBb7Q32bLk,3739
45
+ schemathesis/config/_report.py,sha256=aYLnPO74B7Wfn_qTwlEp5zY9L74U1XFuYS10yjwKKWY,3885
46
46
  schemathesis/config/_validator.py,sha256=IcE8geFZ0ZwR18rkIRs25i7pTl7Z84XbjYGUB-mqReU,258
47
- schemathesis/config/schema.json,sha256=dJSUxWvrME5JoknxBgkOBtWKZgkgYy-I9RCWIDQRkFE,17843
48
- schemathesis/contrib/__init__.py,sha256=wxpX86xrEGRAS3f7eugQfKVbnqV6ZfOqFBS_DmWxOok,120
49
- schemathesis/contrib/openapi/__init__.py,sha256=-7mBZ9RQj0EGzzmC-HKiT5ZslwHcoWFqCVpRG0GHO_o,162
50
- schemathesis/contrib/openapi/fill_missing_examples.py,sha256=BfBpuy3vCKbE_uILqPXnm7kxEDopAr5tNQwP5E9xX8A,585
47
+ schemathesis/config/_warnings.py,sha256=sI0VZcTj3dOnphhBwYwU_KTagxr89HGWTtQ99HcY84k,772
48
+ schemathesis/config/schema.json,sha256=wC1qe9M_fXotfmlBOmW_FCTRw9K5YC814-PipMGKllE,18907
51
49
  schemathesis/core/__init__.py,sha256=5fAAKG6BAA5DP9qOUnMT1cG5LLN3tU7D7VdLyb-MxfM,1880
52
50
  schemathesis/core/compat.py,sha256=9BWCrFoqN2sJIaiht_anxe8kLjYMR7t0iiOkXqLRUZ8,1058
53
51
  schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,130
54
52
  schemathesis/core/curl.py,sha256=yuaCe_zHLGwUjEeloQi6W3tOA3cGdnHDNI17-5jia0o,1723
55
53
  schemathesis/core/deserialization.py,sha256=ygIj4fNaOd0mJ2IvTsn6bsabBt_2AbSLCz-z9UqfpdQ,2406
56
- schemathesis/core/errors.py,sha256=HbQJyxJbW0-GfhYvm-6nK20f4hiqsdDGEOy--agdvHE,16319
54
+ schemathesis/core/errors.py,sha256=hOXoPKlMdaoRp1MRHkrpQs-5BmJt7PMecEcYOAelQe4,16404
57
55
  schemathesis/core/failures.py,sha256=MYyRnom-XeUEuBmq2ffdz34xhxmpSHWaQunfHtliVsY,8932
58
56
  schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
59
57
  schemathesis/core/hooks.py,sha256=qhbkkRSf8URJ4LKv2wmKRINKpquUOgxQzWBHKWRWo3Q,475
@@ -65,54 +63,54 @@ schemathesis/core/rate_limit.py,sha256=7tg9Znk11erTfw8-ANutjEmu7hbfUHZx_iEdkoaP1
65
63
  schemathesis/core/registries.py,sha256=T4jZB4y3zBHdeSgQc0pRbgSeMblvO-6z4I3zmzIfTi0,811
66
64
  schemathesis/core/result.py,sha256=d449YvyONjqjDs-A5DAPgtAI96iT753K8sU6_1HLo2Q,461
67
65
  schemathesis/core/transforms.py,sha256=63aeLkR93r3krq4CwYtDcoS_pFBky4L16c9DcFsBHuE,3535
68
- schemathesis/core/transport.py,sha256=VqtVF4JxMuPXSBORzS8SOSLUnCEZL6gPOr0kuymMCAk,3249
66
+ schemathesis/core/transport.py,sha256=kijYBWjSYoL3EDvfmUwwKS0TsopM_y8MlQ8YK-w0L9U,4534
69
67
  schemathesis/core/validation.py,sha256=rnhzsqWukMWyrc7sRm0kZNHTePoPCQ3A4kLpLxrb0jM,1641
70
68
  schemathesis/core/version.py,sha256=O-6yFbNocbD4RDwiBZLborxTp54htyKxBWTqpZDnPvg,202
71
69
  schemathesis/core/output/__init__.py,sha256=SiHqONFskXl73AtP5dV29L14nZoKo7B-IeG52KZB32M,1446
72
70
  schemathesis/core/output/sanitization.py,sha256=Ev3tae8dVwsYd7yVb2_1VBFYs92WFsQ4Eu1fGaymItE,2013
73
71
  schemathesis/engine/__init__.py,sha256=QaFE-FinaTAaarteADo2RRMJ-Sz6hZB9TzD5KjMinIA,706
74
- schemathesis/engine/context.py,sha256=1m6KiD2M9_fVRiUnYxFw2csUQeZV0N4FepR7w_DZCHA,3902
72
+ schemathesis/engine/context.py,sha256=x-I9KX6rO6hdCvvN8FEdzIZBqIcNaxdNYHgQjcXbZhM,3931
75
73
  schemathesis/engine/control.py,sha256=QKUOs5VMphe7EcAIro_DDo9ZqdOU6ZVwTU1gMNndHWw,1006
76
74
  schemathesis/engine/core.py,sha256=Pnpf1zNTxruUOnnJ9rQ-MskXj4WuA4A27_fWrf0hXWc,5609
77
- schemathesis/engine/errors.py,sha256=8PHYsuq2qIEJHm2FDf_UnWa4IDc-DRFTPckLAr22yhE,16895
78
- schemathesis/engine/events.py,sha256=gslRAWQKMPqBCQzLDS4wAbsKcVuONSy5SPqimJJJYT4,6250
75
+ schemathesis/engine/errors.py,sha256=KK76ScUlV7Ce-Gj61kRs_PpaF8zX-4hrzCw3SKQYI28,18797
76
+ schemathesis/engine/events.py,sha256=VV6epicFIJnX4c87fVNSd0ibDccX3gryDv52OUGa3FI,6370
79
77
  schemathesis/engine/recorder.py,sha256=K3HfMARrT5mPWXPnYebjjcq5CcsBRhMrtZwEL9_Lvtg,8432
80
78
  schemathesis/engine/phases/__init__.py,sha256=zzILnWjoDJQwNmvEmrj3HXVAKT2q7Vb614svjyt8E-U,2794
81
- schemathesis/engine/phases/probes.py,sha256=MgjH3yLw0siiSnaESzDVww70Uz4dAyJ2W22H1Ome03Q,4964
82
- schemathesis/engine/phases/stateful/__init__.py,sha256=lWo2RLrutNblHvohTzofQqL22GORwBRA8bf6jvLuGPg,2391
83
- schemathesis/engine/phases/stateful/_executor.py,sha256=3_UV5r2O_nx4UCAF-m0xo_pdrvPwdZ_g_qQDr7JhTXE,13624
84
- schemathesis/engine/phases/stateful/context.py,sha256=SKWsok-tlWbUDagiUmP7cLNW6DsgFDc_Afv0vQfWv6c,2964
79
+ schemathesis/engine/phases/probes.py,sha256=-8JdQhMwANTkq64s5h8867oojorM5nUU8P0btdfJne4,5141
80
+ schemathesis/engine/phases/stateful/__init__.py,sha256=Lz1rgNqCfUSIz173XqCGsiMuUI5bh4L-RIFexU1-c_Q,2461
81
+ schemathesis/engine/phases/stateful/_executor.py,sha256=CV4jUuXpV4uSXVJqDI4btnLR8dpzOQVqbv2qVCgE4_s,15182
82
+ schemathesis/engine/phases/stateful/context.py,sha256=A7X1SLDOWFpCvFN9IiIeNVZM0emjqatmJL_k9UsO7vM,2946
85
83
  schemathesis/engine/phases/unit/__init__.py,sha256=BvZh39LZmXg90Cy_Tn0cQY5y7eWzYvAEmJ43fGKFAt8,8715
86
- schemathesis/engine/phases/unit/_executor.py,sha256=GE_uFbaaF7SuwL3K7HjSoDf5P3PFc7B1inhMhB3QRcE,14939
84
+ schemathesis/engine/phases/unit/_executor.py,sha256=jay_D7fmmBTjZigifmY30RiVP5Jb0OlK450fknSWZ_I,16471
87
85
  schemathesis/engine/phases/unit/_pool.py,sha256=iU0hdHDmohPnEv7_S1emcabuzbTf-Cznqwn0pGQ5wNQ,2480
88
- schemathesis/generation/__init__.py,sha256=QA2BiS4nk9VmcBn8_Ad6vaIbj6B9ToigLHLVn-DjCwM,700
89
- schemathesis/generation/case.py,sha256=dca80qoI4JZot84I7eqpxE_yWbNQ-iwKG6pXTIhxKP0,7486
90
- schemathesis/generation/coverage.py,sha256=ISXKXTdfYLpdo6bOIW3--AiwWVWnwfOwKb1KQZ7AEM8,47913
86
+ schemathesis/generation/__init__.py,sha256=tvNO2FLiY8z3fZ_kL_QJhSgzXfnT4UqwSXMHCwfLI0g,645
87
+ schemathesis/generation/case.py,sha256=ejglUXCqGYC7IwQkSvpVUPHNYHbYSZWf6kotFNKn-UQ,7516
88
+ schemathesis/generation/coverage.py,sha256=bKP0idU5-eiK4VwhH4kjxDPtCZzMg81mbN1tEDuT6EA,47913
91
89
  schemathesis/generation/meta.py,sha256=5ikrlhdk424dWcYLekZSMoWJYRl9_IhI80GKZzhByi4,2512
92
- schemathesis/generation/modes.py,sha256=t_EvKr2aOXYMsEfdMu4lLF4KCGcX1LVVyvzTkcpJqhk,663
90
+ schemathesis/generation/metrics.py,sha256=cZU5HdeAMcLFEDnTbNE56NuNq4P0N4ew-g1NEz5-kt4,2836
91
+ schemathesis/generation/modes.py,sha256=Q1fhjWr3zxabU5qdtLvKfpMFZJAwlW9pnxgenjeXTyU,481
93
92
  schemathesis/generation/overrides.py,sha256=iPxnxPIKKhO9mwPwKszYv40VM4ylxFJvhzWvrC6qkOE,4385
94
- schemathesis/generation/targets.py,sha256=_rN2qgxTE2EfvygiN-Fy3WmDnRH0ERohdx3sKRDaYhU,2120
95
93
  schemathesis/generation/hypothesis/__init__.py,sha256=SVwM-rx07jPZzms0idWYACgUtWAxh49HRuTnaQ__zf0,1549
96
- schemathesis/generation/hypothesis/builder.py,sha256=PYJaBbXMAPpM_9WkUmStQKoxQ67tWyJYybt6y4Izjg0,31487
94
+ schemathesis/generation/hypothesis/builder.py,sha256=0BX_UfVqgLaYEk9sikcSeEzYPB7kJfK0Pb7pbZqw4C8,32374
97
95
  schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
98
96
  schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
99
97
  schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
100
98
  schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
101
- schemathesis/generation/stateful/__init__.py,sha256=kXpCGbo1-QqfR2N0Z07tLw0Z5_tvbuG3Tk-WI_I1doI,653
102
- schemathesis/generation/stateful/state_machine.py,sha256=h79_G8oUOU8TVJFFF6EKbrW8KPuz6E8gc7us0TC2lrA,12656
99
+ schemathesis/generation/stateful/__init__.py,sha256=0nx0A1G7MmuGMqrLFNl7SWSvRC0H7PBNTM0DwvPuozU,724
100
+ schemathesis/generation/stateful/state_machine.py,sha256=ScbueD_KRL6wXuAEzdPIVfaV7Hrk2Z_g2cDVKgOgITo,12689
103
101
  schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
104
102
  schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
105
- schemathesis/graphql/loaders.py,sha256=bBXWLbwyF31nQILSVldysP1IEMrYle-j71n8nx1TZAE,5301
103
+ schemathesis/graphql/loaders.py,sha256=GbUEsF0MbHZIYo_3pFShjeAM-Yjc2iIfcQsmBqjnNJ8,9236
106
104
  schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
107
105
  schemathesis/openapi/checks.py,sha256=5AP_pjTIJ7GcHNhTtGz-IOeoutZ4HqkxyoANrRKf23M,10825
108
- schemathesis/openapi/loaders.py,sha256=18vdQZGUtwvHUrHZYRmKDoLzuNA5kBx3YdSTKEfuSzQ,7062
106
+ schemathesis/openapi/loaders.py,sha256=34j6TTwJiMbSlndOfOgqFbK_6QP4zg-NRCNriolklfk,10537
109
107
  schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
108
  schemathesis/openapi/generation/filters.py,sha256=EBbgW9zH3wA4d9FyBWp4koiPrrIpNGFnousBDl9qJso,2079
111
109
  schemathesis/pytest/__init__.py,sha256=7W0q-Thcw03IAQfXE_Mo8JPZpUdHJzfu85fjK1ZdfQM,88
112
110
  schemathesis/pytest/control_flow.py,sha256=F8rAPsPeNv_sJiJgbZYtTpwKWjauZmqFUaKroY2GmQI,217
113
111
  schemathesis/pytest/lazy.py,sha256=Wbyn3fYqcmDL7uOFO0PgVpR7--MP8g3Z8q1yArjmDEo,11824
114
- schemathesis/pytest/loaders.py,sha256=oQJ78yyuIm3Ye9X7giVjDB1vYfaW5UY5YuhaTLm_ZFU,266
115
- schemathesis/pytest/plugin.py,sha256=j8L3JV1ijf9dYpoLTDNJpdFnS2fbsYM3Gzv-3r2nk60,12454
112
+ schemathesis/pytest/loaders.py,sha256=Sbv8e5F77_x4amLP50iwubfm6kpOhx7LhLFGsVXW5Ys,925
113
+ schemathesis/pytest/plugin.py,sha256=aeICgN9NJ14M-EjEv8SKGORH81Wspb4oR-zq51ayXbo,13305
116
114
  schemathesis/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
115
  schemathesis/python/asgi.py,sha256=5PyvuTBaivvyPUEi3pwJni91K1kX5Zc0u9c6c1D8a1Q,287
118
116
  schemathesis/python/wsgi.py,sha256=uShAgo_NChbfYaV1117e6UHp0MTg7jaR0Sy_to3Jmf8,219
@@ -120,23 +118,23 @@ schemathesis/specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
120
118
  schemathesis/specs/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
119
  schemathesis/specs/graphql/_cache.py,sha256=QIcEFy2Koy5K0-u1nB-iab52LDlYsTm_9N5t42GplkM,770
122
120
  schemathesis/specs/graphql/nodes.py,sha256=bE3G1kNmqJ8OV4igBvIK-UORrkQA6Nofduf87O3TD9I,541
123
- schemathesis/specs/graphql/scalars.py,sha256=ERUECtwWuEe4_T_fpM6DQJKLrkvahbnaswM7oEOcC0M,1850
124
- schemathesis/specs/graphql/schemas.py,sha256=EjvXLjti2w11AJF5Hi0m-AXVgtMXw4Z1BoCW1OQfQfU,14168
121
+ schemathesis/specs/graphql/scalars.py,sha256=6lew8mnwhrtg23leiEbG43mLGPLlRln8mClCY94XpDA,2680
122
+ schemathesis/specs/graphql/schemas.py,sha256=3LROUVR81pm5za1VtLTjeb1LF5r8pe_ihXe6Uif2a2Y,14491
125
123
  schemathesis/specs/graphql/validation.py,sha256=-W1Noc1MQmTb4RX-gNXMeU2qkgso4mzVfHxtdLkCPKM,1422
126
124
  schemathesis/specs/openapi/__init__.py,sha256=C5HOsfuDJGq_3mv8CRBvRvb0Diy1p0BFdqyEXMS-loE,238
127
125
  schemathesis/specs/openapi/_cache.py,sha256=HpglmETmZU0RCHxp3DO_sg5_B_nzi54Zuw9vGzzYCxY,4295
128
- schemathesis/specs/openapi/_hypothesis.py,sha256=gLQjVkYkR8Z_dw3HzHeAKDm08qdTZphPHlM0Jzu0xe4,21576
129
- schemathesis/specs/openapi/checks.py,sha256=oEnogK5H8c_GEJrYe-2_crhDKiOijYFdspVUjtOW1So,27469
126
+ schemathesis/specs/openapi/_hypothesis.py,sha256=IB39ELO6G58OlRyz5pn7RWKSFfSfGezaXhjVy-T3e2w,21491
127
+ schemathesis/specs/openapi/checks.py,sha256=M7gFS9wLSWj9h7uTq4aSd1-e-BykV05uiV-lT5l8BYU,27628
130
128
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
131
129
  schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
132
130
  schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
133
131
  schemathesis/specs/openapi/examples.py,sha256=9dMY4d2WWz32JywKZzyLO5jdbMWcRqjjGHzhMqlqwIs,21129
134
- schemathesis/specs/openapi/formats.py,sha256=CbuFP_pegtIQfG0AH2gTl0KCCAI6y1a_z6hGvjeIa5A,2810
135
- schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
132
+ schemathesis/specs/openapi/formats.py,sha256=8AIS7Uey-Z1wm1WYRqnsVqHwG9d316PdqfKLqwUs7us,3516
133
+ schemathesis/specs/openapi/media_types.py,sha256=F5M6TKl0s6Z5X8mZpPsWDEdPBvxclKRcUOc41eEwKbo,2472
136
134
  schemathesis/specs/openapi/parameters.py,sha256=tVL61gDe9A8_jwoVKZZvpXKPerMyq7vkAvwdMsi44TI,14622
137
135
  schemathesis/specs/openapi/patterns.py,sha256=cBj8W4wn7VLJd4nABaIH5f502-zBDiqljxLgPWUn-50,15609
138
136
  schemathesis/specs/openapi/references.py,sha256=40YcDExPLR2B8EOwt-Csw-5MYFi2xj_DXf91J0Pc9d4,8855
139
- schemathesis/specs/openapi/schemas.py,sha256=bTa7LEod5Oaqc42TD4JwUDCDLDwB4PYtkU60hsY9IQE,54672
137
+ schemathesis/specs/openapi/schemas.py,sha256=2AcbX2ABkZZGfhrkbN6ZMvParwRFfpCtIZDZbFutBOs,54928
140
138
  schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
141
139
  schemathesis/specs/openapi/serialization.py,sha256=VdDLmeHqxlWM4cxQQcCkvrU6XurivolwEEaT13ohelA,11972
142
140
  schemathesis/specs/openapi/utils.py,sha256=ER4vJkdFVDIE7aKyxyYatuuHVRNutytezgE52pqZNE8,900
@@ -150,17 +148,17 @@ schemathesis/specs/openapi/negative/__init__.py,sha256=eKiBWsMYjcJ0mNmh07IOnbVMH
150
148
  schemathesis/specs/openapi/negative/mutations.py,sha256=MIFVSWbZHW92KhpWruJT3XLisgc-rFnvYasRtwMmExs,19253
151
149
  schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
152
150
  schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
153
- schemathesis/specs/openapi/stateful/__init__.py,sha256=AZoc9lTb0P6zeVf8Yf4D5ZcVecz2E1osCeDpv3WS-sw,14994
151
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=FSitLbJxjBYU814cqjI_QCkdyoIc-9xfT_1HQcYwsXw,15064
154
152
  schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
155
153
  schemathesis/specs/openapi/stateful/links.py,sha256=8oHpmb-yBa3kZKoCv9ytndpOp80dG1vVis2-EpbkeVA,11432
156
- schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
154
+ schemathesis/transport/__init__.py,sha256=6yg_RfV_9L0cpA6qpbH-SL9_3ggtHQji9CZrpIkbA6s,5321
157
155
  schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
158
- schemathesis/transport/prepare.py,sha256=wBqKgDyrIxaH1HOP7hjb5ERoSh0WkCBDu7yCaAJQlEY,3958
159
- schemathesis/transport/requests.py,sha256=zGpTJiDjeX-H6WOJHf13TMe9WSblGCcrVbSEekj8zMU,8831
156
+ schemathesis/transport/prepare.py,sha256=c7__wdblBC4zqnmtcs99zoAeEY8jfXiGbdzh74icj6g,4668
157
+ schemathesis/transport/requests.py,sha256=MiMa9Y0db50fKFveipgGA8SMSAvH5ajuaY-fywhm1Eo,8804
160
158
  schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
161
- schemathesis/transport/wsgi.py,sha256=Eva8iTYGSmdqV7-1WSUXLe3Ysdr8vTijTwadM6ybPxE,5736
162
- schemathesis-4.0.0a11.dist-info/METADATA,sha256=fWWqGEuqISnHZCYthJw9bMx3XmndCWScfSUSMugrpJc,10380
163
- schemathesis-4.0.0a11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
- schemathesis-4.0.0a11.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
165
- schemathesis-4.0.0a11.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
166
- schemathesis-4.0.0a11.dist-info/RECORD,,
159
+ schemathesis/transport/wsgi.py,sha256=8i_pR_xOc2qiN6BtEYVetkVrNIFhpvSnO1QtJ-qX2JE,5676
160
+ schemathesis-4.0.0a12.dist-info/METADATA,sha256=W4MVtKBpgG1SsAWaIQPZkhYsamwFln4sW_sbsuJdupU,8494
161
+ schemathesis-4.0.0a12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
162
+ schemathesis-4.0.0a12.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
163
+ schemathesis-4.0.0a12.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
164
+ schemathesis-4.0.0a12.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- from . import openapi
2
-
3
-
4
- def install() -> None:
5
- openapi.install()
6
-
7
-
8
- def uninstall() -> None:
9
- openapi.uninstall()
@@ -1,9 +0,0 @@
1
- from . import fill_missing_examples
2
-
3
-
4
- def install() -> None:
5
- fill_missing_examples.install()
6
-
7
-
8
- def uninstall() -> None:
9
- fill_missing_examples.uninstall()
@@ -1,20 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from schemathesis.generation.case import Case
4
- from schemathesis.hooks import HookContext, register, unregister
5
-
6
-
7
- def install() -> None:
8
- register(before_add_examples)
9
-
10
-
11
- def uninstall() -> None:
12
- unregister(before_add_examples)
13
-
14
-
15
- def before_add_examples(context: HookContext, examples: list[Case]) -> None:
16
- if not examples and context.operation is not None:
17
- from schemathesis.generation.hypothesis.examples import add_single_example
18
-
19
- strategy = context.operation.as_strategy()
20
- add_single_example(strategy, examples)
@@ -1,69 +0,0 @@
1
- """Support for Targeted Property-Based Testing."""
2
-
3
- from __future__ import annotations
4
-
5
- from dataclasses import dataclass
6
- from typing import Callable, Sequence
7
-
8
- from schemathesis.core.registries import Registry
9
- from schemathesis.core.transport import Response
10
- from schemathesis.generation.case import Case
11
-
12
-
13
- @dataclass
14
- class TargetContext:
15
- case: Case
16
- response: Response
17
-
18
- __slots__ = ("case", "response")
19
-
20
-
21
- TargetFunction = Callable[[TargetContext], float]
22
-
23
- TARGETS = Registry[TargetFunction]()
24
- target = TARGETS.register
25
-
26
-
27
- @target
28
- def response_time(ctx: TargetContext) -> float:
29
- """Response time as a metric to maximize."""
30
- return ctx.response.elapsed
31
-
32
-
33
- class TargetMetricCollector:
34
- """Collect multiple observations for target metrics."""
35
-
36
- __slots__ = ("targets", "observations")
37
-
38
- def __init__(self, targets: list[TargetFunction] | None = None) -> None:
39
- self.targets = targets or []
40
- self.observations: dict[str, list[float]] = {target.__name__: [] for target in self.targets}
41
-
42
- def reset(self) -> None:
43
- """Reset all collected observations."""
44
- for target in self.targets:
45
- self.observations[target.__name__].clear()
46
-
47
- def store(self, case: Case, response: Response) -> None:
48
- """Calculate target metrics & store them."""
49
- context = TargetContext(case=case, response=response)
50
- for target in self.targets:
51
- self.observations[target.__name__].append(target(context))
52
-
53
- def maximize(self) -> None:
54
- """Give feedback to the Hypothesis engine, so it maximizes the aggregated metrics."""
55
- import hypothesis
56
-
57
- for target in self.targets:
58
- # Currently aggregation is just a sum
59
- metric = sum(self.observations[target.__name__])
60
- hypothesis.target(metric, label=target.__name__)
61
-
62
-
63
- def run(targets: Sequence[TargetFunction], case: Case, response: Response) -> None:
64
- import hypothesis
65
-
66
- context = TargetContext(case=case, response=response)
67
- for target in targets:
68
- value = target(context)
69
- hypothesis.target(value, label=target.__name__)