schemathesis 4.0.17__py3-none-any.whl → 4.0.19__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.
@@ -52,7 +52,7 @@ class InvalidSchema(SchemathesisError):
52
52
 
53
53
  @classmethod
54
54
  def from_jsonschema_error(
55
- cls, error: ValidationError, path: str | None, method: str | None, config: OutputConfig
55
+ cls, error: ValidationError | JsonSchemaError, path: str | None, method: str | None, config: OutputConfig
56
56
  ) -> InvalidSchema:
57
57
  if error.absolute_path:
58
58
  part = error.absolute_path[-1]
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import warnings
4
5
  from dataclasses import dataclass
5
6
  from enum import Enum
6
7
  from functools import wraps
@@ -311,25 +312,30 @@ def add_coverage(
311
312
  for container in LOCATION_TO_CONTAINER.values()
312
313
  if container in as_strategy_kwargs
313
314
  }
314
- for case in _iter_coverage_cases(
315
- operation=operation,
316
- generation_modes=generation_modes,
317
- generate_duplicate_query_parameters=generate_duplicate_query_parameters,
318
- unexpected_methods=unexpected_methods,
319
- generation_config=generation_config,
320
- ):
321
- if case.media_type and operation.schema.transport.get_first_matching_media_type(case.media_type) is None:
322
- continue
323
- adjust_urlencoded_payload(case)
324
- auths.set_on_case(case, auth_context, auth_storage)
325
- for container_name, value in overrides.items():
326
- container = getattr(case, container_name)
327
- if container is None:
328
- setattr(case, container_name, value)
329
- else:
330
- container.update(value)
331
-
332
- test = hypothesis.example(case=case)(test)
315
+
316
+ with warnings.catch_warnings():
317
+ warnings.filterwarnings(
318
+ "ignore", message=".*but this is not valid syntax for a Python regular expression.*", category=UserWarning
319
+ )
320
+ for case in _iter_coverage_cases(
321
+ operation=operation,
322
+ generation_modes=generation_modes,
323
+ generate_duplicate_query_parameters=generate_duplicate_query_parameters,
324
+ unexpected_methods=unexpected_methods,
325
+ generation_config=generation_config,
326
+ ):
327
+ if case.media_type and operation.schema.transport.get_first_matching_media_type(case.media_type) is None:
328
+ continue
329
+ adjust_urlencoded_payload(case)
330
+ auths.set_on_case(case, auth_context, auth_storage)
331
+ for container_name, value in overrides.items():
332
+ container = getattr(case, container_name)
333
+ if container is None:
334
+ setattr(case, container_name, value)
335
+ else:
336
+ container.update(value)
337
+
338
+ test = hypothesis.example(case=case)(test)
333
339
  return test
334
340
 
335
341
 
@@ -32,6 +32,21 @@ def to_json_schema(
32
32
  schema["format"] = "binary"
33
33
  if update_quantifiers:
34
34
  update_pattern_in_schema(schema)
35
+ # Sometimes `required` is incorrectly has a boolean value
36
+ properties = schema.get("properties")
37
+ if isinstance(properties, dict):
38
+ for name, subschema in properties.items():
39
+ if not isinstance(subschema, dict):
40
+ continue
41
+ is_required = subschema.get("required")
42
+ if is_required is True:
43
+ schema.setdefault("required", []).append(name)
44
+ del subschema["required"]
45
+ elif is_required is False:
46
+ if "required" in schema and name in schema["required"]:
47
+ schema["required"].remove(name)
48
+ del subschema["required"]
49
+
35
50
  if schema_type == "object":
36
51
  if is_response_schema:
37
52
  # Write-only properties should not occur in responses
@@ -81,6 +81,11 @@ def _handle_parsed_pattern(parsed: list, pattern: str, min_length: int | None, m
81
81
  inner_pattern = "."
82
82
  else:
83
83
  inner_pattern = pattern[leading_anchor_length:-trailing_anchor_length]
84
+ # Single literal has the length of 1, but quantifiers could be != 1, which means we can't merge them
85
+ if op == LITERAL and (
86
+ (min_length is not None and min_length > 1) or (max_length is not None and max_length < 1)
87
+ ):
88
+ return pattern
84
89
  return leading_anchor + _update_quantifier(op, value, inner_pattern, min_length, max_length) + trailing_anchor
85
90
  elif (
86
91
  len(parsed) > 3
@@ -646,6 +646,10 @@ class BaseOpenAPISchema(BaseSchema):
646
646
  # Use a recent JSON Schema format checker to get most of formats checked for older drafts as well
647
647
  format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER,
648
648
  )
649
+ except jsonschema.SchemaError as exc:
650
+ raise InvalidSchema.from_jsonschema_error(
651
+ exc, path=operation.path, method=operation.method, config=self.config.output
652
+ ) from exc
649
653
  except jsonschema.ValidationError as exc:
650
654
  failures.append(
651
655
  JsonSchemaError.from_exception(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.17
3
+ Version: 4.0.19
4
4
  Summary: Property-based testing framework for Open API and GraphQL based apps
5
5
  Project-URL: Documentation, https://schemathesis.readthedocs.io/en/stable/
6
6
  Project-URL: Changelog, https://github.com/schemathesis/schemathesis/blob/master/CHANGELOG.md
@@ -51,7 +51,7 @@ schemathesis/core/compat.py,sha256=9BWCrFoqN2sJIaiht_anxe8kLjYMR7t0iiOkXqLRUZ8,1
51
51
  schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,130
52
52
  schemathesis/core/curl.py,sha256=yuaCe_zHLGwUjEeloQi6W3tOA3cGdnHDNI17-5jia0o,1723
53
53
  schemathesis/core/deserialization.py,sha256=qjXUPaz_mc1OSgXzTUSkC8tuVR8wgVQtb9g3CcAF6D0,2951
54
- schemathesis/core/errors.py,sha256=KuFLy5ZOGn8KlD4ai5HK_WFlB3fJ2rSKwV1yD4fn4BU,16295
54
+ schemathesis/core/errors.py,sha256=Afs2EFyJpcy9Pr1MvnP-jeoiPiAW14MtV3YJYgio2E8,16313
55
55
  schemathesis/core/failures.py,sha256=MYyRnom-XeUEuBmq2ffdz34xhxmpSHWaQunfHtliVsY,8932
56
56
  schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
57
57
  schemathesis/core/hooks.py,sha256=qhbkkRSf8URJ4LKv2wmKRINKpquUOgxQzWBHKWRWo3Q,475
@@ -91,7 +91,7 @@ schemathesis/generation/metrics.py,sha256=cZU5HdeAMcLFEDnTbNE56NuNq4P0N4ew-g1NEz
91
91
  schemathesis/generation/modes.py,sha256=Q1fhjWr3zxabU5qdtLvKfpMFZJAwlW9pnxgenjeXTyU,481
92
92
  schemathesis/generation/overrides.py,sha256=OBWqDQPreiliaf2M-oyXppVKHoJkCRzxtwSJx1b6AFw,3759
93
93
  schemathesis/generation/hypothesis/__init__.py,sha256=SVwM-rx07jPZzms0idWYACgUtWAxh49HRuTnaQ__zf0,1549
94
- schemathesis/generation/hypothesis/builder.py,sha256=ujPp9ByUfNYdxWyKoJlxE0h8pAVBpmNJwWIi9MnR968,34824
94
+ schemathesis/generation/hypothesis/builder.py,sha256=J5O08kaXV8q1dcjCgjNG7eGbpvlLpqBzl6xWiYZucNc,35111
95
95
  schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
96
96
  schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
97
97
  schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
@@ -126,15 +126,15 @@ schemathesis/specs/openapi/_cache.py,sha256=HpglmETmZU0RCHxp3DO_sg5_B_nzi54Zuw9v
126
126
  schemathesis/specs/openapi/_hypothesis.py,sha256=H-4pzT7dECY-AcDGhebKdTSELhGOdyA1WCbZQSMZY3E,22309
127
127
  schemathesis/specs/openapi/checks.py,sha256=0YiMoUy_wsnPvbOrsbnQ2iDxLloNe2-dc5-hnsst0ss,29863
128
128
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
129
- schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
129
+ schemathesis/specs/openapi/converter.py,sha256=LkpCCAxZzET4Qa_3YStSNuhGlsm5G6TVwpxYu6lPO4g,4169
130
130
  schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
131
131
  schemathesis/specs/openapi/examples.py,sha256=V1fbsbMto_So7lTWnyGa7f3u9On2br8yZ-cPzcC2-Bw,21542
132
132
  schemathesis/specs/openapi/formats.py,sha256=8AIS7Uey-Z1wm1WYRqnsVqHwG9d316PdqfKLqwUs7us,3516
133
133
  schemathesis/specs/openapi/media_types.py,sha256=F5M6TKl0s6Z5X8mZpPsWDEdPBvxclKRcUOc41eEwKbo,2472
134
134
  schemathesis/specs/openapi/parameters.py,sha256=ifu_QQCMUzsUHQAkvsOvLuokns6CzesssmQ3Nd3zxII,14594
135
- schemathesis/specs/openapi/patterns.py,sha256=cBj8W4wn7VLJd4nABaIH5f502-zBDiqljxLgPWUn-50,15609
135
+ schemathesis/specs/openapi/patterns.py,sha256=XhxZzIaCli3E67YZ9V6wQFvBkqDOEVwRrcUSEypjtHU,15890
136
136
  schemathesis/specs/openapi/references.py,sha256=40YcDExPLR2B8EOwt-Csw-5MYFi2xj_DXf91J0Pc9d4,8855
137
- schemathesis/specs/openapi/schemas.py,sha256=FXD6yLindLNtjiW5D_GllWxfMAigSKjpjl8_GbqJXxE,52557
137
+ schemathesis/specs/openapi/schemas.py,sha256=ZhFYxYzm0u9VpPMD5f_tt15l29OMa4-lrofOWf4Q6yM,52790
138
138
  schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
139
139
  schemathesis/specs/openapi/serialization.py,sha256=VdDLmeHqxlWM4cxQQcCkvrU6XurivolwEEaT13ohelA,11972
140
140
  schemathesis/specs/openapi/utils.py,sha256=ER4vJkdFVDIE7aKyxyYatuuHVRNutytezgE52pqZNE8,900
@@ -157,8 +157,8 @@ schemathesis/transport/prepare.py,sha256=erYXRaxpQokIDzaIuvt_csHcw72iHfCyNq8VNEz
157
157
  schemathesis/transport/requests.py,sha256=46aplzhSmBupegPNMawma-iJWCegWkEd6mzdWLTpgM4,10742
158
158
  schemathesis/transport/serialization.py,sha256=igUXKZ_VJ9gV7P0TUc5PDQBJXl_s0kK9T3ljGWWvo6E,10339
159
159
  schemathesis/transport/wsgi.py,sha256=KoAfvu6RJtzyj24VGB8e-Iaa9smpgXJ3VsM8EgAz2tc,6152
160
- schemathesis-4.0.17.dist-info/METADATA,sha256=W-ng4zywYAQxqVAdxHO-m6DAHhBnE5jGSgQIhx04uTY,8472
161
- schemathesis-4.0.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
162
- schemathesis-4.0.17.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
163
- schemathesis-4.0.17.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
164
- schemathesis-4.0.17.dist-info/RECORD,,
160
+ schemathesis-4.0.19.dist-info/METADATA,sha256=WPI61wfusysfYH6V3WBiySVn1vvhxqZgK2V88Q6RUk8,8472
161
+ schemathesis-4.0.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
162
+ schemathesis-4.0.19.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
163
+ schemathesis-4.0.19.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
164
+ schemathesis-4.0.19.dist-info/RECORD,,