sarj-python-lint 0.84.0__tar.gz → 0.84.2__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 (137) hide show
  1. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/PKG-INFO +1 -1
  2. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/pyproject.toml +1 -1
  3. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/__main__.py +8 -1
  4. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +1 -1
  5. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +1 -1
  6. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +1 -1
  7. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +1 -1
  8. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_offset_pagination.py +1 -1
  9. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +1 -1
  10. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +1 -1
  11. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_repeated_string_literal.py +2 -2
  12. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_repeated_test_body.py +1 -1
  13. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +1 -1
  14. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_tautological_expect.py +1 -1
  15. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_vague_suppression_description.py +1 -1
  16. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/phase_label_comment.py +1 -1
  17. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_class_row.py +1 -1
  18. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_match_assert_never.py +2 -2
  19. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +2 -2
  20. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +1 -1
  21. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/redundant_class_docstring.py +1 -1
  22. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/redundant_module_docstring.py +1 -1
  23. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +1 -1
  24. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/restated_test_docstring.py +2 -2
  25. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/trailing_value_narration.py +1 -1
  26. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +1 -1
  27. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/unused_mock_setup.py +1 -1
  28. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/.gitignore +0 -0
  29. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/LICENSE +0 -0
  30. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/README.md +0 -0
  31. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/__init__.py +0 -0
  32. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_analysis_session.py +0 -0
  33. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_filesystem.py +0 -0
  34. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_python_target.py +0 -0
  35. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  36. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_secret_names.py +0 -0
  37. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/_version.py +0 -0
  38. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/py.typed +0 -0
  39. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/ratchet.py +0 -0
  40. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rule_base.py +0 -0
  41. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/__init__.py +0 -0
  42. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  43. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_comments.py +0 -0
  44. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  45. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  46. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_first_party.py +0 -0
  47. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  48. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_imports.py +0 -0
  49. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_logging.py +0 -0
  50. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_paths.py +0 -0
  51. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_project_index.py +0 -0
  52. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  53. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_pytest.py +0 -0
  54. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_registry.py +0 -0
  55. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_sql.py +0 -0
  56. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  57. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  58. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  59. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  60. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  61. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  62. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
  63. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  64. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  65. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  66. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  67. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  68. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  69. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  70. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  71. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_deleted_only_override_parameter.py +0 -0
  72. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  73. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  74. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  75. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  76. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  77. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  78. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  79. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  80. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  81. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  82. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  83. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  84. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  85. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  86. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  87. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  88. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  89. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  90. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  91. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  92. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  93. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  94. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  95. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_vague_annotations.py +0 -0
  96. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  97. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  98. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  99. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  100. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  101. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  102. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  103. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  104. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  105. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  106. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  107. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  108. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  109. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  110. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  111. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  112. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  113. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  114. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  115. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  116. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  117. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  118. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  119. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  120. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  121. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/pydantic_at_boundaries.py +0 -0
  122. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  123. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  124. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  125. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  126. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  127. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  128. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  129. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  130. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  131. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/require_typed_http_test_response.py +0 -0
  132. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/stepdown.py +0 -0
  133. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  134. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  135. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  136. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  137. {sarj_python_lint-0.84.0 → sarj_python_lint-0.84.2}/src/sarj_python_lint/rules/unused_test_factory_option.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sarj-python-lint
3
- Version: 0.84.0
3
+ Version: 0.84.2
4
4
  Summary: Custom Python lint rules — AST-based, pre-commit-friendly, hypermodern defaults
5
5
  Project-URL: Homepage, https://code-standards.sarj.ai/rules/python/
6
6
  Project-URL: Documentation, https://code-standards.sarj.ai/rules/python/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sarj-python-lint"
3
- version = "0.84.0"
3
+ version = "0.84.2"
4
4
  description = "Custom Python lint rules — AST-based, pre-commit-friendly, hypermodern defaults"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "sarj-ai" }]
@@ -209,7 +209,7 @@ def _suppressed_diagnostics(
209
209
 
210
210
 
211
211
  def _suppressed_codes(codes: dict[str, set[Severity]]) -> set[tuple[str, Severity]]:
212
- return {
212
+ suppressed = {
213
213
  (generic, generic_severity)
214
214
  for specific, generics in _DIAGNOSTIC_PRECEDENCE.items()
215
215
  if specific in codes
@@ -217,6 +217,13 @@ def _suppressed_codes(codes: dict[str, set[Severity]]) -> set[tuple[str, Severit
217
217
  for generic_severity in codes.get(generic, set())
218
218
  if generic_severity is Severity.WARNING or Severity.ERROR in codes[specific]
219
219
  }
220
+ # The promoted signature-restatement rules now block. Keep their errors and
221
+ # drop only the lower-severity typed-docstring twin at the same owner.
222
+ if Severity.WARNING in codes.get("SARJ092", set()) and any(
223
+ Severity.ERROR in codes.get(generic, set()) for generic in ("SARJ086", "SARJ087")
224
+ ):
225
+ suppressed.add(("SARJ092", Severity.WARNING))
226
+ return suppressed
220
227
 
221
228
 
222
229
  def _function_signature_owner_locations(source: str) -> dict[int, _OwnerLocation]:
@@ -129,7 +129,7 @@ class DefectXfailRequiresExplicitStrict(Rule):
129
129
  "fixed its XPASS may not fail the suite. Add literal `strict=True`; if only some "
130
130
  "parameter cases fail, move the marker to those `pytest.param` cases first."
131
131
  ),
132
- severity=Severity.WARNING,
132
+ severity=Severity.ERROR,
133
133
  )
134
134
  for node in _rotting_bug_pins(tree, imports)
135
135
  ]
@@ -181,7 +181,7 @@ class DocstringArgsRestateSignature(Rule):
181
181
  f"`{node.name}` has an Args section whose entries only repeat matching parameter names or types; "
182
182
  "remove that section or document a constraint not evident from the signature."
183
183
  ),
184
- severity=Severity.WARNING,
184
+ severity=Severity.ERROR,
185
185
  )
186
186
  )
187
187
 
@@ -252,7 +252,7 @@ class DocstringReturnsRestateSignature(Rule):
252
252
  f"`{node.name}` {section.name} section only repeats its callable name or annotated result type; "
253
253
  "remove that section or document result semantics not expressed by the signature."
254
254
  ),
255
- severity=Severity.WARNING,
255
+ severity=Severity.ERROR,
256
256
  )
257
257
  )
258
258
 
@@ -158,7 +158,7 @@ class NoCopiedInheritedDocstring(Rule):
158
158
  f"Docstring has the same cleaned content as {parent.name}.{name}'s. Remove it only if no "
159
159
  "consumer requires the override's direct `__doc__`; otherwise retain it with a narrow rationale."
160
160
  ),
161
- severity=Severity.WARNING,
161
+ severity=Severity.ERROR,
162
162
  )
163
163
  )
164
164
 
@@ -128,7 +128,7 @@ class NoOffsetPagination(Rule):
128
128
  line=node.lineno,
129
129
  col=node.col_offset + 1,
130
130
  code=self.code,
131
- severity=Severity.WARNING,
131
+ severity=Severity.ERROR,
132
132
  message=(
133
133
  "Dynamic OFFSET pagination may scan skipped rows and drift under writes; use a stable unique "
134
134
  "keyset cursor, or document why bounded/random page access requires OFFSET."
@@ -157,7 +157,7 @@ class NoPositionalPsycopgRowEscape(Rule):
157
157
  line=cursor.call.lineno,
158
158
  col=cursor.call.col_offset + 1,
159
159
  code=self.code,
160
- severity=Severity.WARNING,
160
+ severity=Severity.ERROR,
161
161
  message=(
162
162
  "this positional Psycopg record escapes unchanged; return a named `class_row(Model)` "
163
163
  "record, use `scalar_row` for a scalar, or transform the tuple locally"
@@ -148,7 +148,7 @@ class NoPsycopgExecutionOutsideInjectedOwner(Rule):
148
148
  line=call.lineno,
149
149
  col=call.col_offset + 1,
150
150
  code=self.code,
151
- severity=Severity.WARNING,
151
+ severity=Severity.ERROR,
152
152
  message=(
153
153
  "Psycopg execution is outside a constructor-injected persistence owner; route it through the "
154
154
  "owning store, repository, or transaction API"
@@ -187,7 +187,7 @@ class NoRepeatedStringLiteral(Rule):
187
187
  f"structured string literal {_preview(value)} duplicates module constant "
188
188
  f"`{constant_name}` — reuse the canonical constant so the copies cannot drift."
189
189
  ),
190
- severity=Severity.WARNING,
190
+ severity=Severity.ERROR,
191
191
  )
192
192
  for node in function_nodes
193
193
  )
@@ -209,7 +209,7 @@ class NoRepeatedStringLiteral(Rule):
209
209
  f"callable scopes (first use at line {first.lineno}) — reuse a named binding "
210
210
  "when they share ownership, or suppress with an independent-ownership rationale."
211
211
  ),
212
- severity=Severity.WARNING,
212
+ severity=Severity.ERROR,
213
213
  )
214
214
  for node in repeats
215
215
  )
@@ -204,7 +204,7 @@ class NoRepeatedTestBody(Rule):
204
204
  col=group[1].node.col_offset + 1,
205
205
  code=self.code,
206
206
  message=_message(group),
207
- severity=Severity.WARNING,
207
+ severity=Severity.ERROR,
208
208
  )
209
209
  for group in groups
210
210
  ]
@@ -141,7 +141,7 @@ class NoServiceBehaviorInSettings(Rule):
141
141
  line=node.lineno,
142
142
  col=node.col_offset + 1,
143
143
  code=self.code,
144
- severity=Severity.WARNING,
144
+ severity=Severity.ERROR,
145
145
  message=(
146
146
  f"`{node.name}` is named as passive data but {methods} calls an injected collaborator — "
147
147
  "move orchestration to a service/coordinator and keep settings or configuration data-only."
@@ -102,7 +102,7 @@ class NoTautologicalExpect(Rule):
102
102
  col=node.col_offset + 1,
103
103
  code=self.code,
104
104
  message=_message(node, reason),
105
- severity=Severity.WARNING,
105
+ severity=Severity.ERROR,
106
106
  )
107
107
  for node, reason in _tautologies(tree, exempt)
108
108
  ]
@@ -123,7 +123,7 @@ class NoVagueSuppressionDescription(Rule):
123
123
  message=(
124
124
  f'Suppression reason "{vague_reason}" is generic; name the concrete mismatch or safety invariant.'
125
125
  ),
126
- severity=Severity.WARNING,
126
+ severity=Severity.ERROR,
127
127
  column_encoding=ColumnEncoding.CODEPOINTS,
128
128
  )
129
129
  )
@@ -112,7 +112,7 @@ class TestPhaseLabelComment(Rule):
112
112
  f"Bare test phase comment {body.strip()!r} narrates structure; delete it or replace it "
113
113
  "with non-obvious rationale."
114
114
  ),
115
- severity=Severity.WARNING,
115
+ severity=Severity.ERROR,
116
116
  column_encoding=ColumnEncoding.CODEPOINTS,
117
117
  )
118
118
  for line, col, body in standalone
@@ -123,7 +123,7 @@ class PreferClassRow(Rule):
123
123
  line=cursor.factory.lineno,
124
124
  col=cursor.factory.col_offset + 1,
125
125
  code=self.code,
126
- severity=Severity.WARNING,
126
+ severity=Severity.ERROR,
127
127
  message=(
128
128
  f"this dict row is immediately converted to `{model}`; use `class_row({model})` to "
129
129
  "construct it during fetch"
@@ -128,7 +128,7 @@ class PreferMatchAssertNever(Rule):
128
128
  line=wildcard.pattern.lineno,
129
129
  col=wildcard.pattern.col_offset + 1,
130
130
  code=self.code,
131
- severity=Severity.WARNING,
131
+ severity=Severity.ERROR,
132
132
  message=(
133
133
  f"typed `{enum_name}` match has a no-op catch-all — an unhandled member "
134
134
  "is silently ignored; bind it and call `assert_never`, or raise."
@@ -146,7 +146,7 @@ class PreferMatchAssertNever(Rule):
146
146
  line=node.lineno,
147
147
  col=node.col_offset + 1,
148
148
  code=self.code,
149
- severity=Severity.WARNING,
149
+ severity=Severity.ERROR,
150
150
  message=(
151
151
  f"typed `{enum_name}` if/elif dispatch has a no-op `else` — an unhandled "
152
152
  "member is silently ignored; prefer match/case with `assert_never`, or raise."
@@ -345,7 +345,7 @@ class PreferSelfDocumentingConstant(Rule):
345
345
  f"`{name}` contains bare HTTP status integers; use `http.HTTPStatus` members, "
346
346
  "or their `.value` at an exact-integer boundary. Keep non-obvious rationale."
347
347
  ),
348
- Severity.WARNING,
348
+ Severity.ERROR,
349
349
  )
350
350
  )
351
351
  continue
@@ -371,7 +371,7 @@ class PreferSelfDocumentingConstant(Rule):
371
371
  f"`{name}` relies on its comment to identify {unit.label}; encode the unit in "
372
372
  f"the constant name{alternative}.{compatibility} Keep non-obvious rationale."
373
373
  ),
374
- Severity.WARNING,
374
+ Severity.ERROR,
375
375
  )
376
376
  )
377
377
 
@@ -121,7 +121,7 @@ class PreferStructOverNamedtuple(Rule):
121
121
  "static `collections.namedtuple` fields have no type declarations — prefer a class-based "
122
122
  "`typing.NamedTuple`; change tuple semantics only after reviewing callers"
123
123
  ),
124
- severity=Severity.WARNING,
124
+ severity=Severity.ERROR,
125
125
  )
126
126
 
127
127
 
@@ -107,7 +107,7 @@ class RedundantClassDocstring(Rule):
107
107
  col=expr.col_offset + 1,
108
108
  code=self.code,
109
109
  message=self.description,
110
- severity=Severity.WARNING,
110
+ severity=Severity.ERROR,
111
111
  )
112
112
  )
113
113
  return sorted(diags, key=lambda d: d.line)
@@ -126,7 +126,7 @@ class RedundantModuleDocstring(Rule):
126
126
  col=expression.col_offset + 1,
127
127
  code=self.code,
128
128
  message=self.description,
129
- severity=Severity.WARNING,
129
+ severity=Severity.ERROR,
130
130
  )
131
131
  ]
132
132
 
@@ -181,7 +181,7 @@ def _settings_split_findings(
181
181
  line=field.annotation.lineno,
182
182
  col=field.annotation.col_offset + 1,
183
183
  code=code,
184
- severity=Severity.WARNING,
184
+ severity=Severity.ERROR,
185
185
  message=(
186
186
  f"Complex setting `{field_name}` is unconditionally split by `{function.name}` but "
187
187
  "environment sources may JSON-decode it first; if the input contract is raw text, "
@@ -333,7 +333,7 @@ class RestatedTestDocstring(Rule):
333
333
  col=expr.col_offset + 1,
334
334
  code=self.code,
335
335
  message=_MESSAGE,
336
- severity=Severity.WARNING,
336
+ severity=Severity.ERROR,
337
337
  )
338
338
  )
339
339
 
@@ -369,7 +369,7 @@ class RestatedTestDocstring(Rule):
369
369
  col=expr.col_offset + 1,
370
370
  code=self.code,
371
371
  message=_MESSAGE,
372
- severity=Severity.WARNING,
372
+ severity=Severity.ERROR,
373
373
  )
374
374
  )
375
375
 
@@ -234,7 +234,7 @@ class TrailingValueNarration(Rule):
234
234
  f"Trailing numeric-unit label {body.strip()!r} can drift; encode or reconcile the "
235
235
  "unit in the assigned name or value type, then remove the comment."
236
236
  ),
237
- severity=Severity.WARNING,
237
+ severity=Severity.ERROR,
238
238
  column_encoding=ColumnEncoding.CODEPOINTS,
239
239
  )
240
240
  )
@@ -479,7 +479,7 @@ def _test_randomness_findings(
479
479
  line=call.lineno,
480
480
  col=call.col_offset + 1,
481
481
  code=code,
482
- severity=Severity.WARNING,
482
+ severity=Severity.ERROR,
483
483
  message=(
484
484
  "a standard-library PRNG sample runs in a potentially repeated test region without a "
485
485
  "dominating deterministic seed; use an isolated `random.Random(seed)`, inject a "
@@ -155,7 +155,7 @@ class UnusedMockSetup(Rule):
155
155
  line=position[0],
156
156
  col=position[1],
157
157
  code=self.code,
158
- severity=Severity.WARNING,
158
+ severity=Severity.ERROR,
159
159
  message=finding.message,
160
160
  )
161
161
  )