schemathesis 4.0.0a5__py3-none-any.whl → 4.0.0a6__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.
@@ -239,7 +239,7 @@ DEFAULT_PHASES = ("examples", "coverage", "fuzzing", "stateful")
239
239
  @grouped_option(
240
240
  "--report",
241
241
  "report_formats",
242
- help="Generate test reports in specified formats",
242
+ help="Generate test reports in formats specified as a comma-separated list",
243
243
  type=CsvEnumChoice(ReportFormat),
244
244
  is_eager=True,
245
245
  metavar="FORMAT",
@@ -788,7 +788,7 @@ class OutputHandler(EventHandler):
788
788
  warnings: WarningData = field(default_factory=WarningData)
789
789
  errors: set[events.NonFatalError] = field(default_factory=set)
790
790
  phases: dict[PhaseName, tuple[Status, PhaseSkipReason | None]] = field(
791
- default_factory=lambda: {phase: (Status.SKIP, None) for phase in PhaseName}
791
+ default_factory=lambda: dict.fromkeys(PhaseName, (Status.SKIP, None))
792
792
  )
793
793
  console: Console = field(default_factory=_default_console)
794
794
 
@@ -399,45 +399,62 @@ def find_matching_in_responses(examples: dict[str, list], param: str) -> Iterato
399
399
  if not isinstance(example, dict):
400
400
  continue
401
401
  # Unwrapping example from `{"item": [{...}]}`
402
- if isinstance(example, dict) and len(example) == 1 and list(example)[0].lower() == schema_name.lower():
403
- inner = list(example.values())[0]
404
- if isinstance(inner, list):
405
- for sub_example in inner:
406
- found = _find_matching_in_responses(sub_example, schema_name, param, normalized, is_id_param)
407
- if found is not NOT_FOUND:
408
- yield found
409
- continue
410
- if isinstance(inner, dict):
411
- example = inner
412
- found = _find_matching_in_responses(example, schema_name, param, normalized, is_id_param)
413
- if found is not NOT_FOUND:
414
- yield found
402
+ if isinstance(example, dict):
403
+ inner = next((value for key, value in example.items() if key.lower() == schema_name.lower()), None)
404
+ if inner is not None:
405
+ if isinstance(inner, list):
406
+ for sub_example in inner:
407
+ if isinstance(sub_example, dict):
408
+ for found in _find_matching_in_responses(
409
+ sub_example, schema_name, param, normalized, is_id_param
410
+ ):
411
+ if found is not NOT_FOUND:
412
+ yield found
413
+ continue
414
+ if isinstance(inner, dict):
415
+ example = inner
416
+ for found in _find_matching_in_responses(example, schema_name, param, normalized, is_id_param):
417
+ if found is not NOT_FOUND:
418
+ yield found
415
419
 
416
420
 
417
421
  def _find_matching_in_responses(
418
422
  example: dict[str, Any], schema_name: str, param: str, normalized: str, is_id_param: bool
419
- ) -> Any:
423
+ ) -> Iterator[Any]:
420
424
  # Check for exact match
421
425
  if param in example:
422
- return example[param]
426
+ yield example[param]
427
+ return
423
428
  if is_id_param and param[:-2] in example:
424
- return example[param[:-2]]
429
+ value = example[param[:-2]]
430
+ if isinstance(value, list):
431
+ for sub_example in value:
432
+ for found in _find_matching_in_responses(sub_example, schema_name, param, normalized, is_id_param):
433
+ if found is not NOT_FOUND:
434
+ yield found
435
+ return
436
+ else:
437
+ yield value
438
+ return
425
439
 
426
440
  # Check for case-insensitive match
427
441
  for key in example:
428
442
  if key.lower() == normalized:
429
- return example[key]
443
+ yield example[key]
444
+ return
430
445
  else:
431
446
  # If no match found and it's an ID parameter, try additional checks
432
447
  if is_id_param:
433
448
  # Check for 'id' if parameter is '{something}Id'
434
449
  if "id" in example:
435
- return example["id"]
450
+ yield example["id"]
451
+ return
436
452
  # Check for '{schemaName}Id' or '{schemaName}_id'
437
453
  if normalized == "id" or normalized.startswith(schema_name.lower()):
438
454
  for key in (schema_name, schema_name.lower()):
439
455
  for suffix in ("_id", "Id"):
440
456
  with_suffix = f"{key}{suffix}"
441
457
  if with_suffix in example:
442
- return example[with_suffix]
443
- return NOT_FOUND
458
+ yield example[with_suffix]
459
+ return
460
+ yield NOT_FOUND
@@ -124,6 +124,21 @@ def _handle_anchored_pattern(parsed: list, pattern: str, min_length: int | None,
124
124
 
125
125
  for op, value in pattern_parts:
126
126
  if op == LITERAL:
127
+ # Check if the literal comes from a bracketed expression,
128
+ # e.g. Python regex parses "[+]" as a single LITERAL token.
129
+ if pattern[current_position] == "[":
130
+ # Find the matching closing bracket.
131
+ end_idx = current_position + 1
132
+ while end_idx < len(pattern):
133
+ # Check for an unescaped closing bracket.
134
+ if pattern[end_idx] == "]" and (end_idx == current_position + 1 or pattern[end_idx - 1] != "\\"):
135
+ end_idx += 1
136
+ break
137
+ end_idx += 1
138
+ # Append the entire character set.
139
+ result += pattern[current_position:end_idx]
140
+ current_position = end_idx
141
+ continue
127
142
  if pattern[current_position] == "\\":
128
143
  # Escaped value
129
144
  current_position += 2
@@ -56,12 +56,21 @@ class RequestsTransport(BaseTransport["Case", Response, "requests.Session"]):
56
56
  for key, value in additional_headers.items():
57
57
  final_headers.setdefault(key, value)
58
58
 
59
+ params = case.query
60
+
61
+ # Replace empty dictionaries with empty strings, so the parameters actually present in the query string
62
+ if any(value == {} for value in (params or {}).values()):
63
+ params = deepclone(params)
64
+ for key, value in params.items():
65
+ if value == {}:
66
+ params[key] = ""
67
+
59
68
  data = {
60
69
  "method": case.method,
61
70
  "url": url,
62
71
  "cookies": case.cookies,
63
72
  "headers": final_headers,
64
- "params": case.query,
73
+ "params": params,
65
74
  **extra,
66
75
  }
67
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.0a5
3
+ Version: 4.0.0a6
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
@@ -117,62 +117,47 @@ Description-Content-Type: text/markdown
117
117
 
118
118
  ## Schemathesis
119
119
 
120
- > ⚠️ You are viewing the Schemathesis V4 README (Work in Progress) ⚠️
121
-
122
- > This branch is under active development, with substantial changes expected before stabilization. While V4 is fully functional and passing tests, some features are missing, and the documentation may be outdated.
123
-
124
- > For the stable release, see the [V3 branch](https://github.com/schemathesis/schemathesis/tree/v3).
125
-
126
- > 💡 Have feedback? Share your thoughts in [this discussion](https://github.com/schemathesis/schemathesis/discussions/2677)!
127
-
128
- Schemathesis is an API testing tool that automatically finds crashes and validates spec compliance.
129
-
130
- <p align="center">
131
- <img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis Demo"/>
132
- </p>
120
+ Schemathesis automatically generates and runs API tests from your OpenAPI or GraphQL schema to find bugs and spec violations.
133
121
 
134
122
  <p align="center">
135
- <i>Finding server crashes in the Demo API.</i>
123
+ <img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis automatically finding a server error"/>
124
+ <br>
125
+ <i>Automatically finding specification violations and server errors</i>
136
126
  </p>
137
127
 
138
- ### Highlights
139
-
140
- - 🎯 **Catches Hard-to-Find Bugs**: Automatically uncover crashes and spec violations that manual testing might miss.
141
-
142
- - ⚡ **Accelerates Testing**: Generate a wide range of test cases directly from your API schema.
143
-
144
- - 🧩 **Integrates Seamlessly**: Works with popular API formats such as OpenAPI and GraphQL, and easily integrates into your existing CI/CD workflows.
128
+ > **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).
145
129
 
146
- - 🔧 **Customizable and Extendable**: Leverage Python extensions to configure and extend your test generation.
130
+ ## Why Schemathesis?
147
131
 
148
- - 🐞 **Simplifies Debugging**: Detailed reports and reproducible test cases with cURL commands streamline troubleshooting.
149
-
150
- - 🔬 **Proven by Research**: Validated through academic studies on API testing automation, featured in the [ICSE 2022 paper](https://ieeexplore.ieee.org/document/9793781) on semantics-aware fuzzing, and recognized in an [ACM survey](https://dl.acm.org/doi/10.1145/3617175) as a state-of-the-art RESTful API testing tool.
132
+ - 📑 **Schema-Based Testing** - Transform API documentation into a comprehensive test suite
133
+ - 🚀 **Zero Configuration** - Begin testing immediately with a valid OpenAPI or GraphQL schema
134
+ - ⚙️ **CI-Ready** - Integrate API testing into existing pipelines without complex configuration
135
+ - 🛡️ **Effective Coverage** - Find edge cases no manual testing could uncover
136
+ - 🔬 **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
151
137
 
152
138
  ## Installation
153
139
 
154
- Use Schemathesis via Docker, or install it from [PyPI](https://pypi.org/project/schemathesis/)
155
-
156
140
  ```console
157
- # Via Docker.
158
- $ docker pull schemathesis/schemathesis:stable
141
+ # Using uv (recommended)
142
+ $ uv pip install schemathesis
159
143
 
160
- # With pip.
144
+ # Using pip
161
145
  $ pip install schemathesis
146
+
147
+ # Using Docker
148
+ $ docker pull schemathesis/schemathesis:stable
162
149
  ```
163
150
 
164
- ## Getting Started
151
+ ## Usage
165
152
 
166
- Schemathesis works as a standalone CLI:
153
+ ### Command Line
167
154
 
168
155
  ```console
169
- docker run schemathesis/schemathesis:stable
170
- run --checks all https://example.schemathesis.io/openapi.json
171
- # Or when installed with pip
172
- schemathesis run --checks all https://example.schemathesis.io/openapi.json
156
+ # Run tests against a schema URL
157
+ $ st run https://example.schemathesis.io/openapi.json
173
158
  ```
174
159
 
175
- Or a Python library:
160
+ ### Python Library
176
161
 
177
162
  ```python
178
163
  import schemathesis
@@ -185,36 +170,35 @@ def test_api(case):
185
170
  case.call_and_validate()
186
171
  ```
187
172
 
188
- See a complete working example project in the [/example](https://github.com/schemathesis/schemathesis/tree/master/example) directory.
189
-
190
- Schemathesis can be easily integrated into your CI/CD pipeline using GitHub Actions. Add this block to your GitHub Actions to run Schemathesis against your API:
173
+ ### CI/CD Integration
191
174
 
192
175
  ```yaml
193
- api-tests:
194
- runs-on: ubuntu-latest
195
- steps:
196
- - uses: schemathesis/action@v1
197
- with:
198
- schema: "https://example.schemathesis.io/openapi.json"
176
+ # GitHub Actions example
177
+ steps:
178
+ - uses: schemathesis/action@v1
179
+ with:
180
+ schema: "https://example.schemathesis.io/openapi.json"
199
181
  ```
200
182
 
201
- For more details, check out our [GitHub Action](https://github.com/schemathesis/action) repository or see our [GitHub Tutorial](https://docs.schemathesis.io/tutorials/github).
183
+ ## Documentation
184
+
185
+ 📚 **[Read the full documentation](https://schemathesis.readthedocs.io/)** for guides, examples, and reference material.
202
186
 
203
187
  ## Who's Using Schemathesis?
204
188
 
205
- Schemathesis is used by a number of projects and companies, including direct usage or integration into other tools:
189
+ Schemathesis is used by companies and open-source projects including:
206
190
 
207
- - Abstract Machines ([Magistrala](https://github.com/absmach/magistrala))
208
- - Bundesstelle für Open Data ([smard-api](https://github.com/bundesAPI/smard-api))
209
- - [CheckMK](https://github.com/Checkmk/checkmk)
210
- - Chronosphere.io ([Calyptia](https://github.com/chronosphereio/calyptia-api))
211
- - HXSecurity ([DongTai](https://github.com/HXSecurity/DongTai))
212
191
  - Netflix ([Dispatch](https://github.com/Netflix/dispatch))
213
- - [Pixie](https://github.com/pixie-io/pixie)
214
- - [Qdrant](https://github.com/qdrant/qdrant)
215
192
  - Spotify ([Backstage](https://github.com/backstage/backstage))
216
- - [Weechat](https://github.com/weechat/weechat)
217
193
  - WordPress ([OpenVerse](https://github.com/WordPress/openverse))
194
+ - Chronosphere.io ([Calyptia](https://github.com/chronosphereio/calyptia-api))
195
+ - [Qdrant](https://github.com/qdrant/qdrant)
196
+ - [Pixie](https://github.com/pixie-io/pixie)
197
+ - [CheckMK](https://github.com/Checkmk/checkmk)
198
+ - [Weechat](https://github.com/weechat/weechat)
199
+ - HXSecurity ([DongTai](https://github.com/HXSecurity/DongTai))
200
+ - Abstract Machines ([Magistrala](https://github.com/absmach/magistrala))
201
+ - Bundesstelle für Open Data ([smard-api](https://github.com/bundesAPI/smard-api))
218
202
 
219
203
  ## Testimonials
220
204
 
@@ -230,7 +214,7 @@ Schemathesis is used by a number of projects and companies, including direct usa
230
214
 
231
215
  ---
232
216
 
233
- "_The tool is absolutely amazing as it can do the negative scenario testing instead of me and much faster! Before I was doing the same tests in Postman client. But it's much slower and brings maintenance burden._"
217
+ "_The tool is amazing as it can test negative scenarios instead of me and much faster!_"
234
218
 
235
219
  <div>Luděk Nový - <strong>JetBrains</strong></div>
236
220
 
@@ -250,24 +234,15 @@ Schemathesis is used by a number of projects and companies, including direct usa
250
234
 
251
235
  ## Contributing
252
236
 
253
- We welcome contributions in code and are especially interested in learning about your use cases. Your input is essential for improving Schemathesis and directly influences future updates.
254
-
255
- ### How to Contribute
256
-
257
- 1. Discuss ideas and questions through [GitHub issues](https://github.com/schemathesis/schemathesis/issues) or on our [Discord channel](https://discord.gg/R9ASRAmHnA).
258
- 2. For code contributions, see our [contributing guidelines](https://github.com/schemathesis/schemathesis/blob/master/CONTRIBUTING.rst).
259
- 3. Share your experience and thoughts using [this feedback form](https://forms.gle/kJ4hSxc1Yp6Ga96t5).
260
-
261
- ### Why Your Input Matters
262
-
263
- - Enables us to develop useful features and fix bugs faster
264
- - Improves our test suite and documentation
237
+ We welcome contributions! Your input directly influences Schemathesis development.
265
238
 
266
- Thank you for contributing to making Schemathesis better! 👍
239
+ - Discuss ideas in [GitHub issues](https://github.com/schemathesis/schemathesis/issues) or our [Discord server](https://discord.gg/R9ASRAmHnA)
240
+ - See our [contributing guidelines](https://github.com/schemathesis/schemathesis/blob/master/CONTRIBUTING.rst) for code contributions
241
+ - Share your experience using [this feedback form](https://forms.gle/kJ4hSxc1Yp6Ga96t5)
267
242
 
268
243
  ## Get in Touch
269
244
 
270
- If you need assistance with integrating Schemathesis into your workflows or have specific questions, feel free to reach out at <a href="mailto:support@schemathesis.io">support@schemathesis.io</a>.
245
+ Need assistance with integration or have specific questions? Contact us at <a href="mailto:support@schemathesis.io">support@schemathesis.io</a>.
271
246
 
272
247
  ## Acknowledgements
273
248
 
@@ -12,7 +12,7 @@ schemathesis/cli/constants.py,sha256=rUixnqorraUFDtOu3Nmm1x_k0qbgmW9xW96kQB_fBCQ
12
12
  schemathesis/cli/core.py,sha256=Qm5xvpIIMwJDTeR3N3TjKhMCHV5d5Rp0UstVS2GjWgw,459
13
13
  schemathesis/cli/hooks.py,sha256=vTrA8EN99whRns5K5AnExViQ6WL9cak5RGsC-ZBEiJM,1458
14
14
  schemathesis/cli/commands/__init__.py,sha256=FFalEss3D7mnCRO0udtYb65onXSjQCCOv8sOSjqvTTM,1059
15
- schemathesis/cli/commands/run/__init__.py,sha256=ToPLYJrLcan5-fVqo-xs8peVy7O51fQMXxu1y5K2Ei4,23112
15
+ schemathesis/cli/commands/run/__init__.py,sha256=pLuXYxgO0z1CLZH_2P_uW8xeGOy1S2VtxLnNqKXanHk,23138
16
16
  schemathesis/cli/commands/run/checks.py,sha256=lLtBCt6NhhQisrWo8aC6i0M3dSXlbjGWTTlOyjzatks,3278
17
17
  schemathesis/cli/commands/run/context.py,sha256=pUwSlS7UwW2cq1nJXfKZFEaWDipsQAElCO4tdv1qYJA,7739
18
18
  schemathesis/cli/commands/run/events.py,sha256=Dj-xvIr-Hkms8kvh4whNwKSk1Q2Hx4NIENi_4A8nQO8,1224
@@ -26,7 +26,7 @@ schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31M
26
26
  schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
27
27
  schemathesis/cli/commands/run/handlers/cassettes.py,sha256=SVk13xPhsQduCpgvvBwzEMDNTju-SHQCW90xTQ6iL1U,18525
28
28
  schemathesis/cli/commands/run/handlers/junitxml.py,sha256=c24UiwXqRCnv2eWQWEaNXLOghMI9JtGoZ9RTJY4ao6M,2350
29
- schemathesis/cli/commands/run/handlers/output.py,sha256=AcnFAOm03QR4eKNQcQV2EZFV-YUcRaL4rKvMrmOyCuM,58806
29
+ schemathesis/cli/commands/run/handlers/output.py,sha256=n25QDGvYMXPKRPHBDckkDVwkkieY3Gq4HHSG0h3paTA,58800
30
30
  schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  schemathesis/cli/ext/fs.py,sha256=OA3mRzra4rq3NyDTcBvlRh0WJrh4ByN-QQ8loI04m88,408
32
32
  schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
@@ -117,11 +117,11 @@ schemathesis/specs/openapi/checks.py,sha256=m3n5N3_iZcS7inJojW47FF6dfbUQzrBH-bXw
117
117
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
118
118
  schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
119
119
  schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
120
- schemathesis/specs/openapi/examples.py,sha256=aURgeCsQrpsdWEAhjmW6BiRFabuSf5TeRlZBd4ltgNw,20381
120
+ schemathesis/specs/openapi/examples.py,sha256=Xvjp60QUcLaeGsJRbi2i6XM15_4uO0ceVoClIaJehiE,21062
121
121
  schemathesis/specs/openapi/formats.py,sha256=ViVF3aFeFI1ctwGQbiRDXhU3so82P0BCaF2aDDbUUm8,2816
122
122
  schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
123
123
  schemathesis/specs/openapi/parameters.py,sha256=hv1reNpSjVuzFbtMpSTwWZ75zcWTOy5ZE0ah6AVEqAo,14565
124
- schemathesis/specs/openapi/patterns.py,sha256=-1_0twbsyAiSbm0uTFipcXZTYgBY8UK6PriJkzhdET0,12038
124
+ schemathesis/specs/openapi/patterns.py,sha256=NLnGybcana_kYLVKVEjkEyAzdClAV0xKe4Oy4NVayMI,12834
125
125
  schemathesis/specs/openapi/references.py,sha256=YjD1xMlaYS7xLt6PrrVS20R72ZWHuFZFTa8Llzf54Rg,8808
126
126
  schemathesis/specs/openapi/schemas.py,sha256=VSeacEAVJJ6EKJ-llwOaX4aalzUTXyWP8s4wbxTqtWc,54720
127
127
  schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
@@ -143,11 +143,11 @@ schemathesis/specs/openapi/stateful/links.py,sha256=8oHpmb-yBa3kZKoCv9ytndpOp80d
143
143
  schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
144
144
  schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
145
145
  schemathesis/transport/prepare.py,sha256=qQ6zXBw5NN2AIM0bzLAc5Ryc3dmMb0R6xN14lnR49pU,3826
146
- schemathesis/transport/requests.py,sha256=OObRvcTL72-BZ7AfuDUrZZU9nZtfBqr22oF8nkzaOLE,8389
146
+ schemathesis/transport/requests.py,sha256=j5wI1Uo_PnVuP1eV8l6ddsXosyxAPQ1mLSyWEZmTI9I,8747
147
147
  schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
148
148
  schemathesis/transport/wsgi.py,sha256=RWSuUXPrl91GxAy8a4jyNNozOWVMRBxKx_tljlWA_Lo,5697
149
- schemathesis-4.0.0a5.dist-info/METADATA,sha256=uftZyIy9oqwJ76F5tKRz5tMu-jlUwK2pg-JHxKxiUeg,12103
150
- schemathesis-4.0.0a5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
- schemathesis-4.0.0a5.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
152
- schemathesis-4.0.0a5.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
153
- schemathesis-4.0.0a5.dist-info/RECORD,,
149
+ schemathesis-4.0.0a6.dist-info/METADATA,sha256=W8GlnQVnH1VOEqPqS-ElR_yk0RvdB9TOXTxHy_p3zTU,10427
150
+ schemathesis-4.0.0a6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
+ schemathesis-4.0.0a6.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
152
+ schemathesis-4.0.0a6.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
153
+ schemathesis-4.0.0a6.dist-info/RECORD,,
@@ -1,7 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2019 Kiwi.com
4
- Copyright (c) 2020-2022 Dmitry Dygalo
4
+ Copyright (c) 2020-2025 Dmitry Dygalo & Schemathesis.io
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal