sarj-python-lint 1.107.0__tar.gz → 1.108.1__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 (318) hide show
  1. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/pyproject.toml +1 -1
  3. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/__main__.py +1 -1
  4. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_nominal_project.py +7 -1
  5. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +4 -1
  6. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/named_record_at_boundaries.py +1 -1
  7. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_str_enum.py +9 -2
  8. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_typed_mapping_get.py +41 -8
  9. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/.gitignore +0 -0
  10. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/LICENSE +0 -0
  11. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/README.md +0 -0
  12. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/__init__.py +0 -0
  13. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_analysis_session.py +0 -0
  14. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix.py +0 -0
  15. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_aliases.py +0 -0
  16. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_annotations.py +0 -0
  17. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_comments.py +0 -0
  18. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_declared_contracts.py +0 -0
  19. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_declared_tests.py +0 -0
  20. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_docs.py +0 -0
  21. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_enums.py +0 -0
  22. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_exhaustiveness.py +0 -0
  23. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_inert.py +0 -0
  24. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_parameters.py +0 -0
  25. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_repeated.py +0 -0
  26. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_security.py +0 -0
  27. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_sql_projection.py +0 -0
  28. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_autofix_tests.py +0 -0
  29. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_file_context.py +0 -0
  30. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_filesystem.py +0 -0
  31. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_fixes.py +0 -0
  32. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_parallel.py +0 -0
  33. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_prepared_sources.py +0 -0
  34. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_python_target.py +0 -0
  35. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  36. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_rule_descriptors.py +0 -0
  37. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_secret_names.py +0 -0
  38. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_source.py +0 -0
  39. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/_version.py +0 -0
  40. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/application_logging.py +0 -0
  41. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/autofix.py +0 -0
  42. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/benchmark.py +0 -0
  43. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/cast_access.py +0 -0
  44. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/interpreter_argv.py +0 -0
  45. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/json_boundary.py +0 -0
  46. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/py.typed +0 -0
  47. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/ratchet.py +0 -0
  48. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rule_base.py +0 -0
  49. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rule_metadata.py +0 -0
  50. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/__init__.py +0 -0
  51. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_annotation_origins.py +0 -0
  52. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  53. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  54. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_ast_names.py +0 -0
  55. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  56. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_async_lifecycle.py +0 -0
  57. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_binding_inventory.py +0 -0
  58. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_closed_helpers.py +0 -0
  59. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_comment_narration.py +0 -0
  60. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_comments.py +0 -0
  61. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  62. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
  63. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_data_union_discriminator.py +0 -0
  64. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_declared_contracts.py +0 -0
  65. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  66. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  67. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_exports.py +0 -0
  68. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  69. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_first_party.py +0 -0
  70. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  71. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_imports.py +0 -0
  72. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_inert_model_annotation.py +0 -0
  73. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_inherited_contract.py +0 -0
  74. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_local_alias_fix.py +0 -0
  75. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_local_source.py +0 -0
  76. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_logging.py +0 -0
  77. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_mapping_shape_callbacks.py +0 -0
  78. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_namespace_access.py +0 -0
  79. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_native_namespace_capability.py +0 -0
  80. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_native_object_contracts.py +0 -0
  81. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_numeric_proof.py +0 -0
  82. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_opaque_contracts.py +0 -0
  83. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_paths.py +0 -0
  84. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_postgres.py +0 -0
  85. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_postgres_ctas.py +0 -0
  86. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_project_index.py +0 -0
  87. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  88. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_pydantic_field_contract.py +0 -0
  89. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_pytest.py +0 -0
  90. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_registry.py +0 -0
  91. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_resolved_operation_signature.py +0 -0
  92. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  93. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_route_shapes.py +0 -0
  94. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_runtime_bindings.py +0 -0
  95. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_runtime_names.py +0 -0
  96. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_runtime_registry.py +0 -0
  97. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_service_http_callbacks.py +0 -0
  98. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  99. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_sql.py +0 -0
  100. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_sql_aggregate_identity.py +0 -0
  101. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_sql_explain.py +0 -0
  102. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_sql_policy_source.py +0 -0
  103. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_static_json_alias.py +0 -0
  104. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_store_sql.py +0 -0
  105. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_store_writes.py +0 -0
  106. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  107. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  108. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  109. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  110. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_transactional_sql.py +0 -0
  111. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/_type_guard_symbols.py +0 -0
  112. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  113. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/async_executor_shutdown.py +0 -0
  114. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
  115. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/async_subprocess_cancellation_cleanup.py +0 -0
  116. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/cancel_owned_task_without_join.py +0 -0
  117. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  118. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  119. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/delete_route_returns_no_content.py +0 -0
  120. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  121. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  122. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py +0 -0
  123. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py +0 -0
  124. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/duplicate_pytest_fixture_params.py +0 -0
  125. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  126. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/failed_probe_zero_threshold.py +0 -0
  127. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  128. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  129. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  130. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  131. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  132. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/nan_hidden_by_builtin_min.py +0 -0
  133. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  134. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  135. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  136. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_async_client_in_constructor.py +0 -0
  137. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_async_function_cache.py +0 -0
  138. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  139. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_blanket_suppression.py +0 -0
  140. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  141. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  142. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py +0 -0
  143. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  144. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_contradictory_type_guard.py +0 -0
  145. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  146. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  147. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_create_verb_in_post_path.py +0 -0
  148. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_custom_control_flow_exception.py +0 -0
  149. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  150. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_defaulted_environment_setting.py +0 -0
  151. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  152. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_discarded_tagged_outcome.py +0 -0
  153. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_discarded_validation_result.py +0 -0
  154. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_dual_shape_model_field_reader.py +0 -0
  155. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  156. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  157. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_duplicate_field_validator_body.py +0 -0
  158. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_dynamic_builtins.py +0 -0
  159. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_exception_text_in_500_detail.py +0 -0
  160. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  161. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  162. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  163. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  164. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
  165. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  166. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_folded_bad_request_not_found.py +0 -0
  167. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  168. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_generic_json_parser.py +0 -0
  169. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  170. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_hasattr.py +0 -0
  171. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  172. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py +0 -0
  173. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  174. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  175. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  176. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  177. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_invalid_pydantic_bypass.py +0 -0
  178. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_invalid_pydantic_validator_return.py +0 -0
  179. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_loguru_exc_info.py +0 -0
  180. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_loguru_printf_format.py +0 -0
  181. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  182. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_mutating_container_transform.py +0 -0
  183. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_mutating_input_with_result.py +0 -0
  184. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  185. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  186. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  187. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_partial_type_is.py +0 -0
  188. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  189. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  190. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  191. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  192. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  193. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_recording_store.py +0 -0
  194. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_redundant_attribute_unpacking.py +0 -0
  195. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  196. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_redundant_local_alias.py +0 -0
  197. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  198. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_redundant_sql_alias.py +0 -0
  199. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  200. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  201. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  202. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  203. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  204. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  205. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  206. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_shallow_record_type_guard.py +0 -0
  207. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_shared_mutable_default.py +0 -0
  208. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_slash_collection_root_under_prefix.py +0 -0
  209. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  210. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  211. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_sys_path_mutation.py +0 -0
  212. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
  213. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_test_comments.py +0 -0
  214. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  215. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  216. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  217. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py +0 -0
  218. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  219. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  220. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  221. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  222. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  223. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  224. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/no_work_verb_get_route.py +0 -0
  225. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  226. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  227. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  228. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_application_model_joins.py +0 -0
  229. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  230. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_bulk_upsert.py +0 -0
  231. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  232. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  233. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  234. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_declarative_batch_validation.py +0 -0
  235. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_direct_import_module.py +0 -0
  236. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_discriminated_model_union.py +0 -0
  237. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  238. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_grouped_settings.py +0 -0
  239. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  240. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  241. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  242. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  243. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  244. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  245. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  246. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  247. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  248. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  249. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  250. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  251. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  252. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  253. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_optional_composite.py +0 -0
  254. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  255. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_precise_object_contract.py +0 -0
  256. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_psycopg_executemany.py +0 -0
  257. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  258. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_pydantic_model_assertion.py +0 -0
  259. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_pytest_dependency_fixtures.py +0 -0
  260. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_pytest_fixture_contract.py +0 -0
  261. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  262. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  263. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  264. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_runtime_validation.py +0 -0
  265. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  266. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  267. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  268. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  269. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_typed_cli.py +0 -0
  270. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_typed_settings_field.py +0 -0
  271. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  272. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  273. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  274. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  275. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  276. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  277. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/pytest_fixture_returns_closed_resource.py +0 -0
  278. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  279. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  280. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  281. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py +0 -0
  282. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  283. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  284. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  285. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py +0 -0
  286. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_constrained_api_integer.py +0 -0
  287. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_exp_on_jwt_decode.py +0 -0
  288. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  289. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  290. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  291. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  292. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  293. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  294. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  295. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  296. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  297. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  298. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_pydantic_for_mapping_shape.py +0 -0
  299. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  300. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  301. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  302. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/service_singleton_delegates_to_bulk.py +0 -0
  303. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  304. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/stepdown.py +0 -0
  305. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/store_field_update_reuses_upsert.py +0 -0
  306. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  307. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/store_insert_requires_explicit_conflict_policy.py +0 -0
  308. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  309. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/store_mutation_command_fanout.py +0 -0
  310. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  311. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/test_without_explicit_oracle.py +0 -0
  312. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  313. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  314. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  315. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  316. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  317. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/rules/unused_test_factory_option.py +0 -0
  318. {sarj_python_lint-1.107.0 → sarj_python_lint-1.108.1}/src/sarj_python_lint/suppression_policy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sarj-python-lint
3
- Version: 1.107.0
3
+ Version: 1.108.1
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 = "1.107.0"
3
+ version = "1.108.1"
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" }]
@@ -103,7 +103,7 @@ def _python_files(p: Path) -> list[Path]:
103
103
  for directory, directories, filenames in p.walk():
104
104
  directories[:] = [name for name in directories if name not in SKIP_DIR_NAMES]
105
105
  for name in filenames:
106
- if not fnmatch(name, "*.py"):
106
+ if not fnmatch(name, "*.py") and not fnmatch(name, "*.pyi"):
107
107
  continue
108
108
  child = directory / name
109
109
  if child.is_file():
@@ -19,6 +19,8 @@ from sarj_python_lint.rules._paths import is_generated
19
19
 
20
20
 
21
21
  if TYPE_CHECKING:
22
+ from typing import Never
23
+
22
24
  from sarj_python_lint.rules._first_party import FirstPartyFacts
23
25
 
24
26
 
@@ -239,10 +241,14 @@ def _patterns(value: object) -> tuple[str, ...] | None:
239
241
  return tuple(item for item in value if isinstance(item, str))
240
242
 
241
243
 
244
+ def _raise_walk_error(error: OSError) -> Never:
245
+ raise error
246
+
247
+
242
248
  def _files(root: Path, pattern: str) -> list[Path]:
243
249
  found: list[Path] = []
244
250
  try:
245
- for count, (directory, directories, filenames) in enumerate(root.walk()):
251
+ for count, (directory, directories, filenames) in enumerate(root.walk(on_error=_raise_walk_error)):
246
252
  if count >= _MAX_DIRECTORIES or len(found) >= _MAX_FILES:
247
253
  # A partial inventory cannot establish uniqueness.
248
254
  return []
@@ -256,11 +256,14 @@ class FastapiExplicitOpenapiContract(Rule):
256
256
  tree = context.tree
257
257
  if tree is None:
258
258
  return []
259
+ functions = context.nodes(ast.FunctionDef, ast.AsyncFunctionDef)
260
+ if not any(function.decorator_list for function in functions):
261
+ return []
259
262
  index = context.fastapi
260
263
  scopes = _function_scopes(tree)
261
264
  findings: list[_Finding] = []
262
265
  declared: list[tuple[int, Route]] = []
263
- for function in context.nodes(ast.FunctionDef, ast.AsyncFunctionDef):
266
+ for function in functions:
264
267
  all_routes = index.routes(function)
265
268
  declared.extend((scopes[id(function)], route) for route in all_routes)
266
269
  routes = tuple(route for route in all_routes if not route.is_hidden)
@@ -251,7 +251,7 @@ def _resolve_annotation(node: ast.expr | None) -> ast.expr | None:
251
251
  if isinstance(node, ast.Constant) and isinstance(node.value, str):
252
252
  try:
253
253
  return ast.parse(node.value.strip(), mode="eval").body
254
- except SyntaxError:
254
+ except SyntaxError, UnicodeError:
255
255
  return None
256
256
  return node
257
257
 
@@ -419,7 +419,7 @@ class PreferStrEnum(Rule):
419
419
  if tree is None:
420
420
  return []
421
421
  signals = context.symbol_source
422
- class_choice_signal = "str" in signals and any(name in signals.lower() for name in CHOICES_ATTR_NAMES)
422
+ class_choice_signal = _has_class_choice_signal(signals)
423
423
  wrapper_signal = any(symbol in signals for symbol in ("Annotated", "Optional", "Union"))
424
424
  imports = context.imports if class_choice_signal or "assert_never" in signals or wrapper_signal else None
425
425
  rejection_imports = _assert_never_imports(context, imports)
@@ -694,9 +694,16 @@ class PreferStrEnum(Rule):
694
694
  return diags
695
695
 
696
696
 
697
+ def _has_class_choice_signal(source: str) -> bool:
698
+ # Decoded string annotations can spell str through escapes or adjacent literals.
699
+ return ("str" in source or '"' in source or "'" in source) and any(
700
+ name in source.lower() for name in CHOICES_ATTR_NAMES
701
+ )
702
+
703
+
697
704
  def _has_str_enum_signal(source: str) -> bool:
698
705
  has_string_literal = '"' in source or "'" in source
699
- if "str" in source and any(name in source.lower() for name in CHOICES_ATTR_NAMES):
706
+ if _has_class_choice_signal(source):
700
707
  return True
701
708
  has_rejection = "raise" in source or "assert_never" in source
702
709
  return (
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import ast
4
4
  from dataclasses import dataclass
5
- from pathlib import PurePosixPath
5
+ from pathlib import Path, PurePosixPath
6
6
  from typing import TYPE_CHECKING, final, override
7
7
 
8
8
  from sarj_python_lint.rule_base import (
@@ -22,8 +22,6 @@ from sarj_python_lint.rules.require_pydantic_for_mapping_shape import MappingSha
22
22
 
23
23
 
24
24
  if TYPE_CHECKING:
25
- from pathlib import Path
26
-
27
25
  from sarj_python_lint._file_context import PythonFileContext
28
26
 
29
27
  _UNTYPED = frozenset(
@@ -39,6 +37,7 @@ _UNTYPED = frozenset(
39
37
  )
40
38
  _JSON_PARSERS = frozenset({"json.load", "json.loads"})
41
39
  _MAX_DEPTH = 32
40
+ _MAX_RETURN_PROOFS = 512
42
41
  _BAD = "def service_name(state: dict[str, object]):\n return state.get('name')\n"
43
42
  _GOOD = "from typing import TypedDict\nclass State(TypedDict):\n name: str\ndef service_name(state: State) -> str | None:\n return state.get('name')\n"
44
43
 
@@ -195,11 +194,49 @@ class _ImportLocation:
195
194
  name: str
196
195
 
197
196
 
197
+ @dataclass(frozen=True, slots=True, kw_only=True)
198
+ class _ReturnProofKey:
199
+ owner_path: Path
200
+ definition: ast.FunctionDef | ast.AsyncFunctionDef
201
+ seen: frozenset[ast.AST]
202
+
203
+
198
204
  class _ReturnContracts:
199
205
  def __init__(self, facts: MappingShapeFacts) -> None:
200
206
  self.owners = {facts.context.path: facts}
201
207
  # Return lookups must leave other rules enough budget to resolve their validators.
202
208
  self.local_source = LocalSourceFacts(source_inputs=facts.context.session.source_inputs)
209
+ self._return_proofs: dict[_ReturnProofKey, bool] = {}
210
+ self._return_nodes: dict[Path, dict[ast.FunctionDef | ast.AsyncFunctionDef, tuple[ast.Return, ...]]] = {}
211
+
212
+ def returned_mapping(
213
+ self, owner: MappingShapeFacts, function: ast.FunctionDef | ast.AsyncFunctionDef, seen: frozenset[ast.AST]
214
+ ) -> bool:
215
+ key = _ReturnProofKey(owner_path=owner.context.path, definition=function, seen=seen)
216
+ cached = self._return_proofs.get(key)
217
+ if cached is not None:
218
+ return cached
219
+ returned = self.return_nodes(owner, function)
220
+ result = bool(returned) and all(
221
+ node.value is not None and _untyped_receiver(node.value, owner, self, seen=seen | {function})
222
+ for node in returned
223
+ )
224
+ if len(self._return_proofs) < _MAX_RETURN_PROOFS:
225
+ self._return_proofs[key] = result
226
+ return result
227
+
228
+ def return_nodes(
229
+ self, owner: MappingShapeFacts, function: ast.FunctionDef | ast.AsyncFunctionDef
230
+ ) -> tuple[ast.Return, ...]:
231
+ path = owner.context.path
232
+ if path not in self._return_nodes:
233
+ grouped: dict[ast.FunctionDef | ast.AsyncFunctionDef, list[ast.Return]] = {}
234
+ for node in owner.context.nodes(ast.Return):
235
+ scope = owner.provenance.scope(node)
236
+ if isinstance(scope, ast.FunctionDef | ast.AsyncFunctionDef):
237
+ grouped.setdefault(scope, []).append(node)
238
+ self._return_nodes[path] = {scope: tuple(nodes) for scope, nodes in grouped.items()}
239
+ return self._return_nodes[path].get(function, ())
203
240
 
204
241
  def function(
205
242
  self, expression: ast.expr, facts: MappingShapeFacts, seen: frozenset[ast.AST]
@@ -343,11 +380,7 @@ def _returned_mapping(
343
380
  return owner.annotation(function.returns, function.returns, mapping=True) or _erased_annotation(
344
381
  function.returns, owner
345
382
  )
346
- returned = [node for node in owner.context.nodes(ast.Return) if owner.provenance.scope(node) is function]
347
- return bool(returned) and all(
348
- node.value is not None and _untyped_receiver(node.value, owner, contracts, seen=seen | {function})
349
- for node in returned
350
- )
383
+ return contracts.returned_mapping(owner, function, seen)
351
384
 
352
385
 
353
386
  def _name_receiver(