assertpy2 2.29.1__tar.gz → 2.30.0__tar.gz

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 (304) hide show
  1. {assertpy2-2.29.1 → assertpy2-2.30.0}/PKG-INFO +4 -3
  2. {assertpy2-2.29.1 → assertpy2-2.30.0}/README.md +2 -2
  3. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_clustering.py +2 -1
  4. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_builder_check_typing.py +56 -47
  5. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_capable_typing.py +2 -0
  6. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_check_typing.py +17 -15
  7. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_compare.py +177 -28
  8. assertpy2-2.30.0/assertpy2/_engine/_contract.py +1798 -0
  9. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_diff.py +218 -76
  10. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_equality.py +328 -73
  11. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_introspection.py +295 -4
  12. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_mixin_base.py +65 -0
  13. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_negated_typing.py +3 -0
  14. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_operations.py +1 -1
  15. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_ordering.py +121 -5
  16. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_poll_typing.py +185 -178
  17. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_require.py +35 -7
  18. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_typing.py +34 -24
  19. assertpy2-2.30.0/assertpy2/_hints.py +1001 -0
  20. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_matcher_impls.py +115 -65
  21. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_satisfies.py +124 -23
  22. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/assertpy.py +108 -39
  23. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/async_assertions.py +18 -1
  24. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/base.py +88 -75
  25. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/collection.py +34 -19
  26. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/contains.py +344 -88
  27. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/date.py +52 -18
  28. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/dict.py +12 -7
  29. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/dynamic.py +87 -6
  30. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/errors.py +154 -27
  31. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/extracting.py +1 -1
  32. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/file.py +9 -9
  33. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/helpers.py +268 -133
  34. assertpy2-2.30.0/assertpy2/json_mixin.py +1263 -0
  35. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/matchers.py +36 -9
  36. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/numeric.py +40 -39
  37. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/pytest_plugin.py +94 -13
  38. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/string.py +112 -31
  39. {assertpy2-2.29.1 → assertpy2-2.30.0}/benchmarks/test_perf.py +12 -4
  40. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/concepts/stability.md +6 -5
  41. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/concepts/type-safety.md +150 -38
  42. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/getting-started/migration.md +9 -0
  43. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/getting-started/quickstart.md +1 -1
  44. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/guides/assertions.md +97 -9
  45. assertpy2-2.30.0/docs/guides/data.md +248 -0
  46. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/guides/errors.md +344 -22
  47. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/guides/fluent.md +20 -0
  48. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/guides/matchers.md +37 -1
  49. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/guides/testing.md +6 -2
  50. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/index.md +19 -1
  51. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/recipes.md +53 -1
  52. {assertpy2-2.29.1 → assertpy2-2.30.0}/pyproject.toml +13 -2
  53. {assertpy2-2.29.1 → assertpy2-2.30.0}/scripts/generate_check_protocols.py +1 -0
  54. {assertpy2-2.29.1 → assertpy2-2.30.0}/scripts/generate_poll_protocols.py +33 -7
  55. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/api_snapshot.json +22 -15
  56. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/conftest.py +2 -0
  57. assertpy2-2.30.0/tests/data/json_schema_test_suite/LICENSE +19 -0
  58. assertpy2-2.30.0/tests/data/json_schema_test_suite/date-time.json +226 -0
  59. assertpy2-2.30.0/tests/data/json_schema_test_suite/date.json +423 -0
  60. assertpy2-2.30.0/tests/data/json_schema_test_suite/duration.json +273 -0
  61. assertpy2-2.30.0/tests/data/json_schema_test_suite/email.json +368 -0
  62. assertpy2-2.30.0/tests/data/json_schema_test_suite/hostname.json +376 -0
  63. assertpy2-2.30.0/tests/data/json_schema_test_suite/multipleOf.json +102 -0
  64. assertpy2-2.30.0/tests/data/json_schema_test_suite/time.json +297 -0
  65. assertpy2-2.30.0/tests/data/json_schema_test_suite/uri.json +248 -0
  66. assertpy2-2.30.0/tests/format_corpus.py +137 -0
  67. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/pyright_baseline.py +4 -3
  68. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_attrs_support.py +5 -3
  69. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_capable_protocol.py +9 -2
  70. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_chain_machine.py +8 -1
  71. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_check.py +29 -2
  72. assertpy2-2.30.0/tests/test_class_in_spec.py +293 -0
  73. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_clustering.py +21 -0
  74. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_complexity.py +6 -8
  75. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_custom_dict.py +4 -1
  76. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_datetime.py +301 -13
  77. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_deep_nesting.py +4 -3
  78. assertpy2-2.30.0/tests/test_dict_compare.py +1086 -0
  79. assertpy2-2.30.0/tests/test_diff_laws.py +1772 -0
  80. assertpy2-2.30.0/tests/test_difference_places.py +223 -0
  81. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_duality.py +5 -1
  82. assertpy2-2.30.0/tests/test_dynamic.py +460 -0
  83. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_equality_signals.py +60 -0
  84. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_evaluation_core.py +14 -8
  85. assertpy2-2.30.0/tests/test_exception_fields.py +267 -0
  86. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_expected_contract.py +4 -2
  87. assertpy2-2.30.0/tests/test_fixed_width_integers.py +717 -0
  88. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_hints.py +193 -11
  89. assertpy2-2.30.0/tests/test_import_cost.py +44 -0
  90. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_iterable_cluster.py +1 -1
  91. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_list.py +50 -6
  92. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_matchers.py +71 -3
  93. assertpy2-2.30.0/tests/test_membership_failures.py +270 -0
  94. assertpy2-2.30.0/tests/test_membership_family.py +523 -0
  95. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_message_elision.py +11 -0
  96. assertpy2-2.30.0/tests/test_message_values.py +345 -0
  97. assertpy2-2.30.0/tests/test_missing_names.py +488 -0
  98. assertpy2-2.30.0/tests/test_moment_relations.py +866 -0
  99. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_number_zoo.py +10 -11
  100. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_numbers.py +83 -15
  101. assertpy2-2.30.0/tests/test_one_shot_chains.py +550 -0
  102. assertpy2-2.30.0/tests/test_openapi_30_keywords.py +576 -0
  103. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_openapi_contract.py +442 -12
  104. assertpy2-2.30.0/tests/test_openapi_format_suite.py +118 -0
  105. assertpy2-2.30.0/tests/test_openapi_formats.py +1007 -0
  106. assertpy2-2.30.0/tests/test_openapi_multiple_of.py +322 -0
  107. assertpy2-2.30.0/tests/test_openapi_oracle.py +328 -0
  108. assertpy2-2.30.0/tests/test_openapi_part_read.py +441 -0
  109. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_overload_order.py +10 -1
  110. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_pin_coverage.py +324 -54
  111. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_poll_parity.py +11 -1
  112. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_prerequisites.py +1 -1
  113. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_property_based.py +65 -1
  114. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_pyright_baseline.py +3 -0
  115. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_pytest_plugin.py +818 -4
  116. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_recursive_assertion.py +17 -6
  117. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_recursive_compare.py +9 -3
  118. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_recursive_compare_config.py +121 -6
  119. assertpy2-2.30.0/tests/test_refusal_frames.py +288 -0
  120. assertpy2-2.30.0/tests/test_render_laws.py +651 -0
  121. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_rich_diff.py +131 -77
  122. assertpy2-2.30.0/tests/test_skip_guard.py +240 -0
  123. assertpy2-2.30.0/tests/test_strict_reach.py +466 -0
  124. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_string.py +8 -2
  125. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_structural.py +2573 -176
  126. assertpy2-2.30.0/tests/test_structure_sentence.py +539 -0
  127. assertpy2-2.30.0/tests/test_text_relations.py +404 -0
  128. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing.py +49 -3
  129. assertpy2-2.30.0/tests/test_typing_harness.py +79 -0
  130. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_negative.py +9 -1
  131. assertpy2-2.30.0/tests/test_verdicts_held_to_python.py +277 -0
  132. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_cases.py +58 -6
  133. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_harness.py +33 -5
  134. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_negative_baseline.py +60 -18
  135. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/verdict_golden.txt +2 -2
  136. assertpy2-2.29.1/assertpy2/_engine/_contract.py +0 -927
  137. assertpy2-2.29.1/assertpy2/_hints.py +0 -369
  138. assertpy2-2.29.1/assertpy2/json_mixin.py +0 -424
  139. assertpy2-2.29.1/docs/guides/data.md +0 -180
  140. assertpy2-2.29.1/tests/test_dict_compare.py +0 -537
  141. assertpy2-2.29.1/tests/test_dynamic.py +0 -173
  142. assertpy2-2.29.1/tests/test_skip_guard.py +0 -115
  143. {assertpy2-2.29.1 → assertpy2-2.30.0}/.gitignore +0 -0
  144. {assertpy2-2.29.1 → assertpy2-2.30.0}/CONTRIBUTING.md +0 -0
  145. {assertpy2-2.29.1 → assertpy2-2.30.0}/LICENSE +0 -0
  146. {assertpy2-2.29.1 → assertpy2-2.30.0}/SECURITY.md +0 -0
  147. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/__init__.py +0 -0
  148. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_dangling.py +0 -0
  149. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/__init__.py +0 -0
  150. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_compat.py +0 -0
  151. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_membership.py +0 -0
  152. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_pairing.py +0 -0
  153. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_path.py +0 -0
  154. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_size.py +0 -0
  155. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_engine/_text.py +0 -0
  156. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_inline.py +0 -0
  157. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/_snapshot_codec.py +0 -0
  158. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/behave_matchers.py +0 -0
  159. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/bytes_mixin.py +0 -0
  160. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/dataframe.py +0 -0
  161. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/exception.py +0 -0
  162. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/http_mixin.py +0 -0
  163. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/outcome.py +0 -0
  164. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/py.typed +0 -0
  165. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/snapshot.py +0 -0
  166. {assertpy2-2.29.1 → assertpy2-2.30.0}/assertpy2/warning.py +0 -0
  167. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-equal.png +0 -0
  168. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-equal.svg +0 -0
  169. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-gallery.png +0 -0
  170. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-match.svg +0 -0
  171. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-sequence.svg +0 -0
  172. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-set.svg +0 -0
  173. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/assets/diff-string.svg +0 -0
  174. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/extending/custom-assertions.md +0 -0
  175. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/extending/integrations.md +0 -0
  176. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/getting-started/comparison.md +0 -0
  177. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/logo-dark.svg +0 -0
  178. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/logo.svg +0 -0
  179. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/async.md +0 -0
  180. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/bytes.md +0 -0
  181. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/collections.md +0 -0
  182. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/containment.md +0 -0
  183. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/core.md +0 -0
  184. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/dataframes.md +0 -0
  185. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/dates.md +0 -0
  186. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/dicts.md +0 -0
  187. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/dynamic.md +0 -0
  188. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/entry-points.md +0 -0
  189. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/errors.md +0 -0
  190. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/exceptions.md +0 -0
  191. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/extracting.md +0 -0
  192. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/files.md +0 -0
  193. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/http.md +0 -0
  194. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/json.md +0 -0
  195. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/matchers.md +0 -0
  196. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/numbers.md +0 -0
  197. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/overview.md +0 -0
  198. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/snapshots.md +0 -0
  199. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/strings.md +0 -0
  200. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/reference/warnings.md +0 -0
  201. {assertpy2-2.29.1 → assertpy2-2.30.0}/docs/stylesheets/extra.css +0 -0
  202. {assertpy2-2.29.1 → assertpy2-2.30.0}/mkdocs.yml +0 -0
  203. {assertpy2-2.29.1 → assertpy2-2.30.0}/mkdocs_hooks.py +0 -0
  204. {assertpy2-2.29.1 → assertpy2-2.30.0}/scripts/mutation_report.py +0 -0
  205. {assertpy2-2.29.1 → assertpy2-2.30.0}/scripts/regenerate.py +0 -0
  206. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/api_surface.py +0 -0
  207. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/chain_corpus.py +0 -0
  208. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/chain_model.py +0 -0
  209. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/chain_surfaces.py +0 -0
  210. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/docs_fixtures.py +0 -0
  211. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/group_compat.py +0 -0
  212. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/poll_parity_baseline.py +0 -0
  213. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/poll_parity_cases.py +0 -0
  214. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_api_compatibility.py +0 -0
  215. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_api_vocabulary.py +0 -0
  216. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_architecture_doc.py +0 -0
  217. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_async.py +0 -0
  218. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_async_predicates.py +0 -0
  219. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_behave_matchers.py +0 -0
  220. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_bool.py +0 -0
  221. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_boundary_cases.py +0 -0
  222. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_bytes.py +0 -0
  223. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_call_awaitables.py +0 -0
  224. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_callable.py +0 -0
  225. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_chaining.py +0 -0
  226. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_check_protocols.py +0 -0
  227. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_class.py +0 -0
  228. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_collection.py +0 -0
  229. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_core.py +0 -0
  230. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_custom_list.py +0 -0
  231. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_dangling.py +0 -0
  232. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_dataframe.py +0 -0
  233. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_declared_floors.py +0 -0
  234. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_description.py +0 -0
  235. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_dict.py +0 -0
  236. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_docs_examples.py +0 -0
  237. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_docs_typing.py +0 -0
  238. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_equals.py +0 -0
  239. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_errors.py +0 -0
  240. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_exception_context.py +0 -0
  241. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_expected_exception.py +0 -0
  242. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_expected_warning.py +0 -0
  243. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_extensions.py +0 -0
  244. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_extracting.py +0 -0
  245. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_fail.py +0 -0
  246. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_file.py +0 -0
  247. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_grouped_soft.py +0 -0
  248. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_hostile_values.py +0 -0
  249. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_http.py +0 -0
  250. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_in.py +0 -0
  251. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_inline_record.py +0 -0
  252. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_inline_snapshot.py +0 -0
  253. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_integer_arguments.py +0 -0
  254. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_json.py +0 -0
  255. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_match_result.py +0 -0
  256. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_matcher_algebra.py +0 -0
  257. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_matcher_parity.py +0 -0
  258. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_matcher_registry.py +0 -0
  259. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_namedtuple.py +0 -0
  260. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_negated_protocols.py +0 -0
  261. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_none.py +0 -0
  262. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_not.py +0 -0
  263. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_numeric_questions.py +0 -0
  264. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_operation_contract.py +0 -0
  265. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_optional_integration_contracts.py +0 -0
  266. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_overloads.py +0 -0
  267. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_pipeline.py +0 -0
  268. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_poll_protocols.py +0 -0
  269. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_property_attrs.py +0 -0
  270. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_protocol_parity.py +0 -0
  271. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_public_surface.py +0 -0
  272. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_recursive_compare_attrs.py +0 -0
  273. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_recursive_compare_pydantic.py +0 -0
  274. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_refusals.py +0 -0
  275. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_regex_groups.py +0 -0
  276. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_requirement.py +0 -0
  277. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_same_as.py +0 -0
  278. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_satisfy.py +0 -0
  279. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_snapshots.py +0 -0
  280. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_soft.py +0 -0
  281. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_soft_fail.py +0 -0
  282. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_surface_conformance.py +0 -0
  283. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_sync_eventually.py +0 -0
  284. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_traceback.py +0 -0
  285. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_type.py +0 -0
  286. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_type_expression_failures.py +0 -0
  287. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_chain_corpus.py +0 -0
  288. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_claims.py +0 -0
  289. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_completeness.py +0 -0
  290. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_conformance.py +0 -0
  291. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_from_a_wheel.py +0 -0
  292. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_http.py +0 -0
  293. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_integrations.py +0 -0
  294. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_typing_promises.py +0 -0
  295. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_unrenderable_values.py +0 -0
  296. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_vacuity_contract.py +0 -0
  297. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_verdict_corpus.py +0 -0
  298. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/test_warn.py +0 -0
  299. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_chain_corpus_baseline.json +0 -0
  300. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_http.py +0 -0
  301. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_integrations.py +0 -0
  302. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_integrations_baseline.py +0 -0
  303. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/typing_promises.py +0 -0
  304. {assertpy2-2.29.1 → assertpy2-2.30.0}/tests/verdict_corpus.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: assertpy2
3
- Version: 2.29.1
3
+ Version: 2.30.0
4
4
  Summary: Fluent, fully typed assertion library for Python: your type checker sees only the assertions that fit the value, and every failure carries a structured diff. Soft assertions, polling, inline snapshots, OpenAPI contracts.
5
5
  Project-URL: Homepage, https://github.com/Solganis/assertpy2
6
6
  Project-URL: Repository, https://github.com/Solganis/assertpy2
@@ -39,6 +39,7 @@ Provides-Extra: inline
39
39
  Requires-Dist: asttokens>=2.0.4; extra == 'inline'
40
40
  Requires-Dist: executing>=2.2; extra == 'inline'
41
41
  Provides-Extra: json
42
+ Requires-Dist: idna>=3.7; extra == 'json'
42
43
  Requires-Dist: jsonpath-ng>=1.8; extra == 'json'
43
44
  Requires-Dist: jsonschema>=4.18; extra == 'json'
44
45
  Requires-Dist: referencing>=0.28.4; extra == 'json'
@@ -73,8 +74,6 @@ Description-Content-Type: text/markdown
73
74
  <a href="https://scorecard.dev/viewer/?uri=github.com/Solganis/assertpy2"><img src="https://img.shields.io/ossf-scorecard/github.com/Solganis/assertpy2?label=OpenSSF%20Scorecard" alt="OpenSSF Scorecard"></a>
74
75
  </p>
75
76
 
76
- ---
77
-
78
77
  <h2 align="center"><a href="https://solganis.github.io/assertpy2/getting-started/quickstart/">Quick start</a></h2>
79
78
 
80
79
  ```bash
@@ -295,12 +294,14 @@ Anything else you build can too.
295
294
  - [**Structured errors**](https://solganis.github.io/assertpy2/guides/errors/#structured-errors): `AssertionFailure` carries `.actual`, `.expected` and `.diff`, and the diff renders into the message, so it shows off pytest too.
296
295
  - [**Assertions as values**](https://solganis.github.io/assertpy2/guides/errors/#asking-instead-of-asserting): `check()` runs the next assertion for its verdict instead of raising, handing back an `AssertionOutcome`.
297
296
  - [**Rich pytest diffs**](https://solganis.github.io/assertpy2/guides/errors/#rich-pytest-diffs): recursive diffs across containers, dataclasses, attrs and Pydantic models, with intra-line carets for strings.
297
+ - [**Failures that say why**](https://solganis.github.io/assertpy2/guides/errors/#some-failures-say-why-not-only-what): where one fact explains a failure, a line under the message says it. An id the payload holds as text (`7` against `"7"`), a NaN, two instances compared by identity, surrounding whitespace. A failed `contains()` or `is_in()` names the closest row, and forty rows that differ in one field are named as one place.
298
298
 
299
299
  **Plugin for pytest**
300
300
 
301
301
  Set from the command line or from `[tool.pytest.ini_options]`, not from a call.
302
302
 
303
303
  - [**Failure clustering**](https://solganis.github.io/assertpy2/guides/errors/#what-the-failures-had-in-common): forty failing tests are usually not forty problems. Where three or more differ at the same place, the run ends with a line saying where. On by default, `assertpy2_failure_clusters = "off"` turns it off.
304
+ - [**IDE comparison window**](https://solganis.github.io/assertpy2/guides/errors/#the-comparison-window-of-an-ide): a failed `is_equal_to()` or `has_<name>()` gets PyCharm's "Click to see difference" link, as a plain `assert` does, and the window shows the two values it compared. Under `ignore=` or `include=` those go without the keys left out. The plugin hands them to `pytest_assertrepr_compare`, the hook the IDE's runner listens to. On by default, `assertpy2_comparison = "off"` turns it off.
304
305
  - [**Diagnostic profiles**](https://solganis.github.io/assertpy2/guides/errors/#configuration): `assertpy2_profile` turns the guards below on in one line. `compatible` (default) leaves them off, `safe` warns, `strict` fails the tests they find. A setting you name yourself still wins.
305
306
  - [**Vacuous-assertion guard**](https://solganis.github.io/assertpy2/guides/assertions/#assertions-that-checked-nothing): `--assertpy2-vacuous` warns when a universal assertion passes over an empty collection, having checked nothing.
306
307
  - [**Dangling-assertion detector**](https://solganis.github.io/assertpy2/guides/assertions/#assertions-that-never-ran): `--assertpy2-dangling` warns when a chain builds an assertion and never runs it. `assert assert_that(x).is_positive` passes on any value, and neither ruff nor coverage sees it.
@@ -21,8 +21,6 @@
21
21
  <a href="https://scorecard.dev/viewer/?uri=github.com/Solganis/assertpy2"><img src="https://img.shields.io/ossf-scorecard/github.com/Solganis/assertpy2?label=OpenSSF%20Scorecard" alt="OpenSSF Scorecard"></a>
22
22
  </p>
23
23
 
24
- ---
25
-
26
24
  <h2 align="center"><a href="https://solganis.github.io/assertpy2/getting-started/quickstart/">Quick start</a></h2>
27
25
 
28
26
  ```bash
@@ -243,12 +241,14 @@ Anything else you build can too.
243
241
  - [**Structured errors**](https://solganis.github.io/assertpy2/guides/errors/#structured-errors): `AssertionFailure` carries `.actual`, `.expected` and `.diff`, and the diff renders into the message, so it shows off pytest too.
244
242
  - [**Assertions as values**](https://solganis.github.io/assertpy2/guides/errors/#asking-instead-of-asserting): `check()` runs the next assertion for its verdict instead of raising, handing back an `AssertionOutcome`.
245
243
  - [**Rich pytest diffs**](https://solganis.github.io/assertpy2/guides/errors/#rich-pytest-diffs): recursive diffs across containers, dataclasses, attrs and Pydantic models, with intra-line carets for strings.
244
+ - [**Failures that say why**](https://solganis.github.io/assertpy2/guides/errors/#some-failures-say-why-not-only-what): where one fact explains a failure, a line under the message says it. An id the payload holds as text (`7` against `"7"`), a NaN, two instances compared by identity, surrounding whitespace. A failed `contains()` or `is_in()` names the closest row, and forty rows that differ in one field are named as one place.
246
245
 
247
246
  **Plugin for pytest**
248
247
 
249
248
  Set from the command line or from `[tool.pytest.ini_options]`, not from a call.
250
249
 
251
250
  - [**Failure clustering**](https://solganis.github.io/assertpy2/guides/errors/#what-the-failures-had-in-common): forty failing tests are usually not forty problems. Where three or more differ at the same place, the run ends with a line saying where. On by default, `assertpy2_failure_clusters = "off"` turns it off.
251
+ - [**IDE comparison window**](https://solganis.github.io/assertpy2/guides/errors/#the-comparison-window-of-an-ide): a failed `is_equal_to()` or `has_<name>()` gets PyCharm's "Click to see difference" link, as a plain `assert` does, and the window shows the two values it compared. Under `ignore=` or `include=` those go without the keys left out. The plugin hands them to `pytest_assertrepr_compare`, the hook the IDE's runner listens to. On by default, `assertpy2_comparison = "off"` turns it off.
252
252
  - [**Diagnostic profiles**](https://solganis.github.io/assertpy2/guides/errors/#configuration): `assertpy2_profile` turns the guards below on in one line. `compatible` (default) leaves them off, `safe` warns, `strict` fails the tests they find. A setting you name yourself still wins.
253
253
  - [**Vacuous-assertion guard**](https://solganis.github.io/assertpy2/guides/assertions/#assertions-that-checked-nothing): `--assertpy2-vacuous` warns when a universal assertion passes over an empty collection, having checked nothing.
254
254
  - [**Dangling-assertion detector**](https://solganis.github.io/assertpy2/guides/assertions/#assertions-that-never-ran): `--assertpy2-dangling` warns when a chain builds an assertion and never runs it. `assert assert_that(x).is_positive` passes on any value, and neither ruff nor coverage sees it.
@@ -209,7 +209,8 @@ def canonical_steps(entry: DiffEntry) -> tuple[tuple[str, str], ...] | None:
209
209
  Indices collapse to one placeholder, and every other hop keeps its value's repr rather than its
210
210
  text, so two keys that render alike stay apart.
211
211
  """
212
- steps = entry.steps
212
+ # entering JSON text is no place of its own: what lies in it is found by the same keys from one run to the next
213
+ steps = tuple(step for step in entry.steps if step.kind != "json")
213
214
  if not steps or any(step.kind not in _COORDINATE for step in steps):
214
215
  return None
215
216
  return tuple((step.kind, _ANY_POSITION if step.kind in _POSITIONAL else stable_repr(step.value)) for step in steps)
@@ -10,6 +10,11 @@ from a payload typed `dict[str, Any]` then read as a string. A rung per asserti
10
10
 
11
11
  A name nobody declares stays open, because `__getattr__` answers it: a dynamic assertion is resolved
12
12
  from the value's own attributes and reaches this proxy too.
13
+
14
+ `val` and `value` are declared, and not only because the proxy hands the value back under them. They
15
+ hand the protocol's parameter out directly, where `not_` names it only through the protocol itself.
16
+ Measured on a protocol of two members: with `not_` alone ty takes the twin over a number for the twin
17
+ over a text, so no restriction on ``self`` was read and a text verdict asked of a number was taken.
13
18
  """
14
19
 
15
20
  from __future__ import annotations
@@ -38,7 +43,7 @@ if TYPE_CHECKING:
38
43
  from ._typing import (
39
44
  _U,
40
45
  _ArrayT_co,
41
- _CapableT,
46
+ _Capable,
42
47
  _FrameT_co,
43
48
  _Other,
44
49
  _P_co,
@@ -65,6 +70,10 @@ if TYPE_CHECKING:
65
70
 
66
71
  @property
67
72
  def not_(self) -> _CheckAnyValue[_P_co]: ...
73
+ @property
74
+ def val(self) -> _P_co: ...
75
+ @property
76
+ def value(self) -> _P_co: ...
68
77
  def __getattr__(self, name: str) -> Callable[..., AssertionOutcome]: ...
69
78
 
70
79
  @overload
@@ -97,7 +106,7 @@ if TYPE_CHECKING:
97
106
  self: _CheckAnyValue[_FrameT_co] | _CheckAnyValue[_ArrayT_co], *items: object
98
107
  ) -> AssertionOutcome: ...
99
108
  @overload
100
- def contains(self: _CheckAnyValue[_CapableT], *items: object) -> AssertionOutcome: ...
109
+ def contains(self: _CheckAnyValue[_Capable], *items: object) -> AssertionOutcome: ...
101
110
 
102
111
  def is_equal_to_ignoring_case(self: _CheckAnyValue[str], other: str) -> AssertionOutcome: ...
103
112
 
@@ -106,7 +115,7 @@ if TYPE_CHECKING:
106
115
  @overload
107
116
  def contains_ignoring_case(self: _CheckAnyValue[str], *items: str) -> AssertionOutcome: ...
108
117
  @overload
109
- def contains_ignoring_case(self: _CheckAnyValue[_CapableT], *items: str) -> AssertionOutcome: ...
118
+ def contains_ignoring_case(self: _CheckAnyValue[_Capable], *items: str) -> AssertionOutcome: ...
110
119
 
111
120
  @overload
112
121
  def starts_with(self: _CheckAnyValue[str], prefix: str) -> AssertionOutcome: ...
@@ -123,7 +132,7 @@ if TYPE_CHECKING:
123
132
  self: _CheckAnyValue[bytes] | _CheckAnyValue[bytearray], prefix: bytes | bytearray
124
133
  ) -> AssertionOutcome: ...
125
134
  @overload
126
- def starts_with(self: _CheckAnyValue[_CapableT], prefix: str) -> AssertionOutcome: ...
135
+ def starts_with(self: _CheckAnyValue[_Capable], prefix: str) -> AssertionOutcome: ...
127
136
 
128
137
  def starts_with_ignoring_case(self: _CheckAnyValue[str], prefix: str) -> AssertionOutcome: ...
129
138
 
@@ -142,7 +151,7 @@ if TYPE_CHECKING:
142
151
  self: _CheckAnyValue[bytes] | _CheckAnyValue[bytearray], suffix: bytes | bytearray
143
152
  ) -> AssertionOutcome: ...
144
153
  @overload
145
- def ends_with(self: _CheckAnyValue[_CapableT], suffix: str) -> AssertionOutcome: ...
154
+ def ends_with(self: _CheckAnyValue[_Capable], suffix: str) -> AssertionOutcome: ...
146
155
 
147
156
  def ends_with_ignoring_case(self: _CheckAnyValue[str], suffix: str) -> AssertionOutcome: ...
148
157
 
@@ -165,17 +174,17 @@ if TYPE_CHECKING:
165
174
  @overload
166
175
  def contains_any_of(self: _CheckAnyValue[str], *items: str) -> AssertionOutcome: ...
167
176
  @overload
168
- def contains_any_of(self: _CheckAnyValue[_CapableT], *items: str) -> AssertionOutcome: ...
177
+ def contains_any_of(self: _CheckAnyValue[_Capable], *items: str) -> AssertionOutcome: ...
169
178
 
170
179
  @overload
171
180
  def contains_none_of(self: _CheckAnyValue[str], *items: str) -> AssertionOutcome: ...
172
181
  @overload
173
- def contains_none_of(self: _CheckAnyValue[_CapableT], *items: str) -> AssertionOutcome: ...
182
+ def contains_none_of(self: _CheckAnyValue[_Capable], *items: str) -> AssertionOutcome: ...
174
183
 
175
184
  @overload
176
185
  def is_unicode(self: _CheckAnyValue[str]) -> AssertionOutcome: ...
177
186
  @overload
178
- def is_unicode(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
187
+ def is_unicode(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
179
188
 
180
189
  @overload
181
190
  def is_greater_than(self: _CheckAnyValue[str], other: str) -> AssertionOutcome: ...
@@ -280,7 +289,7 @@ if TYPE_CHECKING:
280
289
  self: _CheckAnyValue[_FrameT_co] | _CheckAnyValue[_ArrayT_co], *items: object
281
290
  ) -> AssertionOutcome: ...
282
291
  @overload
283
- def does_not_contain(self: _CheckAnyValue[_CapableT], *items: object) -> AssertionOutcome: ...
292
+ def does_not_contain(self: _CheckAnyValue[_Capable], *items: object) -> AssertionOutcome: ...
284
293
 
285
294
  @overload
286
295
  def contains_only(self: _CheckAnyValue[str], *items: str | Matcher[str]) -> AssertionOutcome: ...
@@ -299,7 +308,7 @@ if TYPE_CHECKING:
299
308
  self: _CheckAnyValue[_FrameT_co] | _CheckAnyValue[_ArrayT_co], *items: object
300
309
  ) -> AssertionOutcome: ...
301
310
  @overload
302
- def contains_only(self: _CheckAnyValue[_CapableT], *items: object) -> AssertionOutcome: ...
311
+ def contains_only(self: _CheckAnyValue[_Capable], *items: object) -> AssertionOutcome: ...
303
312
 
304
313
  @overload
305
314
  def contains_sequence(self: _CheckAnyValue[str], *items: str | Matcher[str]) -> AssertionOutcome: ...
@@ -312,7 +321,7 @@ if TYPE_CHECKING:
312
321
  *items: _E | Matcher[_E],
313
322
  ) -> AssertionOutcome: ...
314
323
  @overload
315
- def contains_sequence(self: _CheckAnyValue[_CapableT], *items: str | Matcher[str]) -> AssertionOutcome: ...
324
+ def contains_sequence(self: _CheckAnyValue[_Capable], *items: str | Matcher[str]) -> AssertionOutcome: ...
316
325
 
317
326
  @overload
318
327
  def contains_exactly(self: _CheckAnyValue[str], *items: str | Matcher[str]) -> AssertionOutcome: ...
@@ -325,7 +334,7 @@ if TYPE_CHECKING:
325
334
  *items: _E | Matcher[_E],
326
335
  ) -> AssertionOutcome: ...
327
336
  @overload
328
- def contains_exactly(self: _CheckAnyValue[_CapableT], *items: str | Matcher[str]) -> AssertionOutcome: ...
337
+ def contains_exactly(self: _CheckAnyValue[_Capable], *items: str | Matcher[str]) -> AssertionOutcome: ...
329
338
 
330
339
  @overload
331
340
  def contains_exactly_in_any_order(
@@ -341,7 +350,7 @@ if TYPE_CHECKING:
341
350
  ) -> AssertionOutcome: ...
342
351
  @overload
343
352
  def contains_exactly_in_any_order(
344
- self: _CheckAnyValue[_CapableT], *items: str | Matcher[str]
353
+ self: _CheckAnyValue[_Capable], *items: str | Matcher[str]
345
354
  ) -> AssertionOutcome: ...
346
355
 
347
356
  @overload
@@ -381,7 +390,7 @@ if TYPE_CHECKING:
381
390
  ) -> AssertionOutcome: ...
382
391
  @overload
383
392
  def is_sorted(
384
- self: _CheckAnyValue[_CapableT],
393
+ self: _CheckAnyValue[_Capable],
385
394
  key: Callable[[str], object] = ...,
386
395
  reverse: bool = ...,
387
396
  *,
@@ -424,7 +433,7 @@ if TYPE_CHECKING:
424
433
  ) -> AssertionOutcome: ...
425
434
  @overload
426
435
  def each(
427
- self: _CheckAnyValue[_CapableT], matcher: Matcher[Any] | Callable[[Any], object], *, allow_empty: bool = ...
436
+ self: _CheckAnyValue[_Capable], matcher: Matcher[Any] | Callable[[Any], object], *, allow_empty: bool = ...
428
437
  ) -> AssertionOutcome: ...
429
438
 
430
439
  @overload
@@ -463,7 +472,7 @@ if TYPE_CHECKING:
463
472
  ) -> AssertionOutcome: ...
464
473
  @overload
465
474
  def all_satisfy(
466
- self: _CheckAnyValue[_CapableT], matcher: Matcher[Any] | Callable[[Any], object], *, allow_empty: bool = ...
475
+ self: _CheckAnyValue[_Capable], matcher: Matcher[Any] | Callable[[Any], object], *, allow_empty: bool = ...
467
476
  ) -> AssertionOutcome: ...
468
477
 
469
478
  @overload
@@ -480,7 +489,7 @@ if TYPE_CHECKING:
480
489
  ) -> AssertionOutcome: ...
481
490
  @overload
482
491
  def any_satisfy(
483
- self: _CheckAnyValue[_CapableT], matcher: Matcher[str] | Callable[[str], object]
492
+ self: _CheckAnyValue[_Capable], matcher: Matcher[str] | Callable[[str], object]
484
493
  ) -> AssertionOutcome: ...
485
494
 
486
495
  @overload
@@ -497,7 +506,7 @@ if TYPE_CHECKING:
497
506
  ) -> AssertionOutcome: ...
498
507
  @overload
499
508
  def none_satisfy(
500
- self: _CheckAnyValue[_CapableT], matcher: Matcher[str] | Callable[[str], object]
509
+ self: _CheckAnyValue[_Capable], matcher: Matcher[str] | Callable[[str], object]
501
510
  ) -> AssertionOutcome: ...
502
511
 
503
512
  @overload
@@ -514,7 +523,7 @@ if TYPE_CHECKING:
514
523
  ) -> AssertionOutcome: ...
515
524
  @overload
516
525
  def satisfies_exactly(
517
- self: _CheckAnyValue[_CapableT], *matchers: Matcher[str] | Callable[[str], object]
526
+ self: _CheckAnyValue[_Capable], *matchers: Matcher[str] | Callable[[str], object]
518
527
  ) -> AssertionOutcome: ...
519
528
 
520
529
  @overload
@@ -531,7 +540,7 @@ if TYPE_CHECKING:
531
540
  ) -> AssertionOutcome: ...
532
541
  @overload
533
542
  def satisfies_exactly_in_any_order(
534
- self: _CheckAnyValue[_CapableT], *matchers: Matcher[str] | Callable[[str], object]
543
+ self: _CheckAnyValue[_Capable], *matchers: Matcher[str] | Callable[[str], object]
535
544
  ) -> AssertionOutcome: ...
536
545
 
537
546
  @overload
@@ -555,7 +564,7 @@ if TYPE_CHECKING:
555
564
  ) -> AssertionOutcome: ...
556
565
  @overload
557
566
  def zip_satisfies(
558
- self: _CheckAnyValue[_CapableT],
567
+ self: _CheckAnyValue[_Capable],
559
568
  other: Iterable[_Other],
560
569
  predicate: Callable[[str, _Other], object],
561
570
  *,
@@ -633,7 +642,7 @@ if TYPE_CHECKING:
633
642
  ) -> AssertionOutcome: ...
634
643
  @overload
635
644
  def is_subset_of(
636
- self: _CheckAnyValue[_CapableT], *supersets: object, allow_empty: bool = ...
645
+ self: _CheckAnyValue[_Capable], *supersets: object, allow_empty: bool = ...
637
646
  ) -> AssertionOutcome: ...
638
647
 
639
648
  @overload
@@ -646,7 +655,7 @@ if TYPE_CHECKING:
646
655
  | _CheckAnyValue[frozenset[_E]],
647
656
  ) -> AssertionOutcome: ...
648
657
  @overload
649
- def contains_duplicates(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
658
+ def contains_duplicates(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
650
659
 
651
660
  @overload
652
661
  def does_not_contain_duplicates(self: _CheckAnyValue[str]) -> AssertionOutcome: ...
@@ -658,7 +667,7 @@ if TYPE_CHECKING:
658
667
  | _CheckAnyValue[frozenset[_E]],
659
668
  ) -> AssertionOutcome: ...
660
669
  @overload
661
- def does_not_contain_duplicates(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
670
+ def does_not_contain_duplicates(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
662
671
 
663
672
  @overload
664
673
  def contains_only_once(self: _CheckAnyValue[str], *items: object) -> AssertionOutcome: ...
@@ -671,7 +680,7 @@ if TYPE_CHECKING:
671
680
  *items: object,
672
681
  ) -> AssertionOutcome: ...
673
682
  @overload
674
- def contains_only_once(self: _CheckAnyValue[_CapableT], *items: object) -> AssertionOutcome: ...
683
+ def contains_only_once(self: _CheckAnyValue[_Capable], *items: object) -> AssertionOutcome: ...
675
684
 
676
685
  @overload
677
686
  def contains_in_order(self: _CheckAnyValue[str], *items: str | Matcher[str]) -> AssertionOutcome: ...
@@ -703,7 +712,7 @@ if TYPE_CHECKING:
703
712
  other: Sized,
704
713
  ) -> AssertionOutcome: ...
705
714
  @overload
706
- def has_same_size_as(self: _CheckAnyValue[_CapableT], other: Sized) -> AssertionOutcome: ...
715
+ def has_same_size_as(self: _CheckAnyValue[_Capable], other: Sized) -> AssertionOutcome: ...
707
716
 
708
717
  @overload
709
718
  def has_size_greater_than(
@@ -720,7 +729,7 @@ if TYPE_CHECKING:
720
729
  size: SupportsIndex,
721
730
  ) -> AssertionOutcome: ...
722
731
  @overload
723
- def has_size_greater_than(self: _CheckAnyValue[_CapableT], size: SupportsIndex) -> AssertionOutcome: ...
732
+ def has_size_greater_than(self: _CheckAnyValue[_Capable], size: SupportsIndex) -> AssertionOutcome: ...
724
733
 
725
734
  @overload
726
735
  def has_size_less_than(
@@ -737,7 +746,7 @@ if TYPE_CHECKING:
737
746
  size: SupportsIndex,
738
747
  ) -> AssertionOutcome: ...
739
748
  @overload
740
- def has_size_less_than(self: _CheckAnyValue[_CapableT], size: SupportsIndex) -> AssertionOutcome: ...
749
+ def has_size_less_than(self: _CheckAnyValue[_Capable], size: SupportsIndex) -> AssertionOutcome: ...
741
750
 
742
751
  @overload
743
752
  def has_size_between(
@@ -756,7 +765,7 @@ if TYPE_CHECKING:
756
765
  ) -> AssertionOutcome: ...
757
766
  @overload
758
767
  def has_size_between(
759
- self: _CheckAnyValue[_CapableT], low: SupportsIndex, high: SupportsIndex
768
+ self: _CheckAnyValue[_Capable], low: SupportsIndex, high: SupportsIndex
760
769
  ) -> AssertionOutcome: ...
761
770
 
762
771
  @overload
@@ -773,7 +782,7 @@ if TYPE_CHECKING:
773
782
  | _CheckAnyValue[_ArrayT_co],
774
783
  ) -> AssertionOutcome: ...
775
784
  @overload
776
- def is_empty(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
785
+ def is_empty(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
777
786
 
778
787
  @overload
779
788
  def is_not_empty(
@@ -789,7 +798,7 @@ if TYPE_CHECKING:
789
798
  | _CheckAnyValue[_ArrayT_co],
790
799
  ) -> AssertionOutcome: ...
791
800
  @overload
792
- def is_not_empty(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
801
+ def is_not_empty(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
793
802
 
794
803
  @overload
795
804
  def is_positive(
@@ -844,7 +853,7 @@ if TYPE_CHECKING:
844
853
  @overload
845
854
  def is_not_between(self: _CheckAnyValue[_T], low: Any, high: Any) -> AssertionOutcome: ...
846
855
  @overload
847
- def is_not_between(self: _CheckAnyValue[_CapableT], low: _Number, high: _Number) -> AssertionOutcome: ...
856
+ def is_not_between(self: _CheckAnyValue[_Capable], low: _Number, high: _Number) -> AssertionOutcome: ...
848
857
 
849
858
  @overload
850
859
  def is_between(
@@ -861,7 +870,7 @@ if TYPE_CHECKING:
861
870
  @overload
862
871
  def is_between(self: _CheckAnyValue[_T], low: Any, high: Any) -> AssertionOutcome: ...
863
872
  @overload
864
- def is_between(self: _CheckAnyValue[_CapableT], low: _Number, high: _Number) -> AssertionOutcome: ...
873
+ def is_between(self: _CheckAnyValue[_Capable], low: _Number, high: _Number) -> AssertionOutcome: ...
865
874
 
866
875
  @overload
867
876
  def is_zero(
@@ -870,7 +879,7 @@ if TYPE_CHECKING:
870
879
  @overload
871
880
  def is_zero(self: _CheckAnyValue[SupportsFloat | SupportsIndex]) -> AssertionOutcome: ...
872
881
  @overload
873
- def is_zero(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
882
+ def is_zero(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
874
883
 
875
884
  @overload
876
885
  def is_not_zero(
@@ -879,7 +888,7 @@ if TYPE_CHECKING:
879
888
  @overload
880
889
  def is_not_zero(self: _CheckAnyValue[SupportsFloat | SupportsIndex]) -> AssertionOutcome: ...
881
890
  @overload
882
- def is_not_zero(self: _CheckAnyValue[_CapableT]) -> AssertionOutcome: ...
891
+ def is_not_zero(self: _CheckAnyValue[_Capable]) -> AssertionOutcome: ...
883
892
 
884
893
  @overload
885
894
  def is_close_to(
@@ -915,9 +924,7 @@ if TYPE_CHECKING:
915
924
  tolerance: SupportsFloat | SupportsIndex,
916
925
  ) -> AssertionOutcome: ...
917
926
  @overload
918
- def is_not_close_to(
919
- self: _CheckAnyValue[_CapableT], other: _Number, tolerance: _Number
920
- ) -> AssertionOutcome: ...
927
+ def is_not_close_to(self: _CheckAnyValue[_Capable], other: _Number, tolerance: _Number) -> AssertionOutcome: ...
921
928
 
922
929
  @overload
923
930
  def is_even(self: _CheckAnyValue[int] | _CheckAnyValue[float]) -> AssertionOutcome: ...
@@ -981,7 +988,7 @@ if TYPE_CHECKING:
981
988
  @overload
982
989
  def matches_structure(self: _CheckAnyValue[_T], spec: dict[Any, Any]) -> AssertionOutcome: ...
983
990
  @overload
984
- def matches_structure(self: _CheckAnyValue[_CapableT], spec: dict[Any, Any]) -> AssertionOutcome: ...
991
+ def matches_structure(self: _CheckAnyValue[_Capable], spec: dict[Any, Any]) -> AssertionOutcome: ...
985
992
 
986
993
  @overload
987
994
  def has_json_path(
@@ -993,7 +1000,7 @@ if TYPE_CHECKING:
993
1000
  path: str,
994
1001
  ) -> AssertionOutcome: ...
995
1002
  @overload
996
- def has_json_path(self: _CheckAnyValue[_CapableT], path: str) -> AssertionOutcome: ...
1003
+ def has_json_path(self: _CheckAnyValue[_Capable], path: str) -> AssertionOutcome: ...
997
1004
 
998
1005
  @overload
999
1006
  def does_not_have_json_path(
@@ -1005,7 +1012,7 @@ if TYPE_CHECKING:
1005
1012
  path: str,
1006
1013
  ) -> AssertionOutcome: ...
1007
1014
  @overload
1008
- def does_not_have_json_path(self: _CheckAnyValue[_CapableT], path: str) -> AssertionOutcome: ...
1015
+ def does_not_have_json_path(self: _CheckAnyValue[_Capable], path: str) -> AssertionOutcome: ...
1009
1016
 
1010
1017
  @overload
1011
1018
  def matches_json_schema(
@@ -1017,7 +1024,7 @@ if TYPE_CHECKING:
1017
1024
  schema: dict[str, Any],
1018
1025
  ) -> AssertionOutcome: ...
1019
1026
  @overload
1020
- def matches_json_schema(self: _CheckAnyValue[_CapableT], schema: dict[str, Any]) -> AssertionOutcome: ...
1027
+ def matches_json_schema(self: _CheckAnyValue[_Capable], schema: dict[str, Any]) -> AssertionOutcome: ...
1021
1028
 
1022
1029
  @overload
1023
1030
  def matches_json_schema_from_file(
@@ -1029,7 +1036,7 @@ if TYPE_CHECKING:
1029
1036
  path: str | Path,
1030
1037
  ) -> AssertionOutcome: ...
1031
1038
  @overload
1032
- def matches_json_schema_from_file(self: _CheckAnyValue[_CapableT], path: str | Path) -> AssertionOutcome: ...
1039
+ def matches_json_schema_from_file(self: _CheckAnyValue[_Capable], path: str | Path) -> AssertionOutcome: ...
1033
1040
 
1034
1041
  @overload
1035
1042
  def conforms_to_openapi(
@@ -1044,16 +1051,18 @@ if TYPE_CHECKING:
1044
1051
  *,
1045
1052
  status: str | int | None = ...,
1046
1053
  content_type: str = ...,
1054
+ strict_nullable: bool = ...,
1047
1055
  ) -> AssertionOutcome: ...
1048
1056
  @overload
1049
1057
  def conforms_to_openapi(
1050
- self: _CheckAnyValue[_CapableT],
1058
+ self: _CheckAnyValue[_Capable],
1051
1059
  spec: dict[str, Any],
1052
1060
  path: str,
1053
1061
  method: str,
1054
1062
  *,
1055
1063
  status: str | int | None = ...,
1056
1064
  content_type: str = ...,
1065
+ strict_nullable: bool = ...,
1057
1066
  ) -> AssertionOutcome: ...
1058
1067
 
1059
1068
  def is_before(self: _CheckAnyValue[datetime.datetime], other: datetime.datetime) -> AssertionOutcome: ...
@@ -1127,14 +1136,14 @@ if TYPE_CHECKING:
1127
1136
  @overload
1128
1137
  def is_frame_equal(self: _CheckAnyValue[_FrameT_co], expected: object, **options: Any) -> AssertionOutcome: ...
1129
1138
  @overload
1130
- def is_frame_equal(self: _CheckAnyValue[_CapableT], expected: object, **options: Any) -> AssertionOutcome: ...
1139
+ def is_frame_equal(self: _CheckAnyValue[_Capable], expected: object, **options: Any) -> AssertionOutcome: ...
1131
1140
 
1132
1141
  @overload
1133
1142
  def is_array_equal(
1134
1143
  self: _CheckAnyValue[_FrameT_co] | _CheckAnyValue[_ArrayT_co], expected: object, **options: Any
1135
1144
  ) -> AssertionOutcome: ...
1136
1145
  @overload
1137
- def is_array_equal(self: _CheckAnyValue[_CapableT], expected: object, **options: Any) -> AssertionOutcome: ...
1146
+ def is_array_equal(self: _CheckAnyValue[_Capable], expected: object, **options: Any) -> AssertionOutcome: ...
1138
1147
 
1139
1148
  @overload
1140
1149
  def is_array_close_to(
@@ -1148,7 +1157,7 @@ if TYPE_CHECKING:
1148
1157
  ) -> AssertionOutcome: ...
1149
1158
  @overload
1150
1159
  def is_array_close_to(
1151
- self: _CheckAnyValue[_CapableT],
1160
+ self: _CheckAnyValue[_Capable],
1152
1161
  expected: object,
1153
1162
  *,
1154
1163
  rtol: float = ...,
@@ -256,6 +256,7 @@ if TYPE_CHECKING:
256
256
  *,
257
257
  status: str | int | None = ...,
258
258
  content_type: str = ...,
259
+ strict_nullable: bool = ...,
259
260
  ) -> Self: ...
260
261
  def contains(self, *items: object) -> Self: ...
261
262
  def contains_any_of(self, *items: str) -> Self: ...
@@ -507,6 +508,7 @@ if TYPE_CHECKING:
507
508
  *,
508
509
  status: str | int | None = ...,
509
510
  content_type: str = ...,
511
+ strict_nullable: bool = ...,
510
512
  ) -> _CapableAssertion[_CapableT_co]: ...
511
513
  def contains(self, *items: object) -> _CapableAssertion[_CapableT_co]: ...
512
514
  def contains_any_of(self, *items: str) -> _CapableAssertion[_CapableT_co]: ...
@@ -32,6 +32,7 @@ if TYPE_CHECKING:
32
32
  _ArrayT_co,
33
33
  _CapableT,
34
34
  _FrameT_co,
35
+ _Holding,
35
36
  _Landed,
36
37
  _ObjectAssertion,
37
38
  _Other,
@@ -131,6 +132,7 @@ if TYPE_CHECKING:
131
132
  *,
132
133
  status: str | int | None = ...,
133
134
  content_type: str = ...,
135
+ strict_nullable: bool = ...,
134
136
  ) -> AssertionOutcome: ...
135
137
  @property
136
138
  def not_(self) -> Self: ...
@@ -278,35 +280,35 @@ if TYPE_CHECKING:
278
280
  tolerance: SupportsFloat | SupportsIndex,
279
281
  ) -> AssertionOutcome: ...
280
282
  @overload
281
- def is_not_none(self: _ObjectAssertion[str | None]) -> AssertionOutcome: ...
283
+ def is_not_none(self: _Holding[str | None]) -> AssertionOutcome: ...
282
284
  @overload
283
- def is_not_none(self: _ObjectAssertion[bool | None]) -> AssertionOutcome: ...
285
+ def is_not_none(self: _Holding[bool | None]) -> AssertionOutcome: ...
284
286
  @overload
285
- def is_not_none(self: _ObjectAssertion[int | None]) -> AssertionOutcome: ...
287
+ def is_not_none(self: _Holding[int | None]) -> AssertionOutcome: ...
286
288
  @overload
287
- def is_not_none(self: _ObjectAssertion[float | None]) -> AssertionOutcome: ...
289
+ def is_not_none(self: _Holding[float | None]) -> AssertionOutcome: ...
288
290
  @overload
289
- def is_not_none(self: _ObjectAssertion[complex | None]) -> AssertionOutcome: ...
291
+ def is_not_none(self: _Holding[complex | None]) -> AssertionOutcome: ...
290
292
  @overload
291
- def is_not_none(self: _ObjectAssertion[dict[_K, _V] | None]) -> AssertionOutcome: ...
293
+ def is_not_none(self: _Holding[dict[_K, _V] | None]) -> AssertionOutcome: ...
292
294
  @overload
293
- def is_not_none(self: _ObjectAssertion[list[_E] | tuple[_E, ...] | None]) -> AssertionOutcome: ...
295
+ def is_not_none(self: _Holding[list[_E] | tuple[_E, ...] | None]) -> AssertionOutcome: ...
294
296
  @overload
295
- def is_not_none(self: _ObjectAssertion[set[_E] | frozenset[_E] | None]) -> AssertionOutcome: ...
297
+ def is_not_none(self: _Holding[set[_E] | frozenset[_E] | None]) -> AssertionOutcome: ...
296
298
  @overload
297
- def is_not_none(self: _ObjectAssertion[datetime.datetime | None]) -> AssertionOutcome: ...
299
+ def is_not_none(self: _Holding[datetime.datetime | None]) -> AssertionOutcome: ...
298
300
  @overload
299
- def is_not_none(self: _ObjectAssertion[datetime.date | None]) -> AssertionOutcome: ...
301
+ def is_not_none(self: _Holding[datetime.date | None]) -> AssertionOutcome: ...
300
302
  @overload
301
- def is_not_none(self: _ObjectAssertion[Path | None]) -> AssertionOutcome: ...
303
+ def is_not_none(self: _Holding[Path | None]) -> AssertionOutcome: ...
302
304
  @overload
303
- def is_not_none(self: _ObjectAssertion[bytes | None]) -> AssertionOutcome: ...
305
+ def is_not_none(self: _Holding[bytes | None]) -> AssertionOutcome: ...
304
306
  @overload
305
- def is_not_none(self: _ObjectAssertion[bytearray | None]) -> AssertionOutcome: ...
307
+ def is_not_none(self: _Holding[bytearray | None]) -> AssertionOutcome: ...
306
308
  @overload
307
- def is_not_none(self: _ObjectAssertion[Callable[..., object] | None]) -> AssertionOutcome: ...
309
+ def is_not_none(self: _Holding[Callable[..., object] | None]) -> AssertionOutcome: ...
308
310
  @overload
309
- def is_not_none(self: _ObjectAssertion[_U | None]) -> AssertionOutcome: ...
311
+ def is_not_none(self: _Holding[_U | None]) -> AssertionOutcome: ...
310
312
  @overload
311
313
  def is_not_none(self) -> AssertionOutcome: ...
312
314
  @overload