sarj-python-lint 1.90.1__tar.gz → 1.95.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 (314) hide show
  1. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/pyproject.toml +1 -1
  3. sarj_python_lint-1.95.0/src/sarj_python_lint/__init__.py +32 -0
  4. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/__main__.py +56 -23
  5. sarj_python_lint-1.95.0/src/sarj_python_lint/_rule_descriptors.py +1865 -0
  6. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/benchmark.py +1 -1
  7. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rule_base.py +9 -1
  8. sarj_python_lint-1.95.0/src/sarj_python_lint/rule_metadata.py +157 -0
  9. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/__init__.py +3 -0
  10. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_copy_on_write.py +217 -20
  11. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_registry.py +16 -3
  12. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/_runtime_registry.py +288 -0
  13. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/delete_route_returns_no_content.py +6 -1
  14. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +6 -1
  15. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/no_generic_json_parser.py +148 -0
  16. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/no_mutating_input_with_result.py +139 -0
  17. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/no_redundant_attribute_unpacking.py +132 -0
  18. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/no_test_comments.py +127 -0
  19. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_pytest_dependency_fixtures.py +112 -2
  20. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/prefer_pytest_fixture_contract.py +213 -0
  21. sarj_python_lint-1.95.0/src/sarj_python_lint/rules/require_constrained_api_integer.py +178 -0
  22. sarj_python_lint-1.90.1/src/sarj_python_lint/__init__.py +0 -9
  23. sarj_python_lint-1.90.1/src/sarj_python_lint/rules/__init__.py +0 -3
  24. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/.gitignore +0 -0
  25. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/LICENSE +0 -0
  26. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/README.md +0 -0
  27. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_analysis_session.py +0 -0
  28. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix.py +0 -0
  29. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_aliases.py +0 -0
  30. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_annotations.py +0 -0
  31. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_comments.py +0 -0
  32. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_declared_contracts.py +0 -0
  33. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_declared_tests.py +0 -0
  34. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_docs.py +0 -0
  35. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_enums.py +0 -0
  36. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_exhaustiveness.py +0 -0
  37. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_inert.py +0 -0
  38. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_parameters.py +0 -0
  39. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_repeated.py +0 -0
  40. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_security.py +0 -0
  41. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_sql_projection.py +0 -0
  42. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_autofix_tests.py +0 -0
  43. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_file_context.py +0 -0
  44. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_filesystem.py +0 -0
  45. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_fixes.py +0 -0
  46. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_parallel.py +0 -0
  47. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_prepared_sources.py +0 -0
  48. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_python_target.py +0 -0
  49. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  50. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_secret_names.py +0 -0
  51. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_source.py +0 -0
  52. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/_version.py +0 -0
  53. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/application_logging.py +0 -0
  54. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/autofix.py +0 -0
  55. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/cast_access.py +0 -0
  56. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/interpreter_argv.py +0 -0
  57. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/json_boundary.py +0 -0
  58. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/py.typed +0 -0
  59. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/ratchet.py +0 -0
  60. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_annotation_origins.py +0 -0
  61. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  62. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  63. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_ast_names.py +0 -0
  64. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  65. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_async_lifecycle.py +0 -0
  66. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_binding_inventory.py +0 -0
  67. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_closed_helpers.py +0 -0
  68. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_comment_narration.py +0 -0
  69. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_comments.py +0 -0
  70. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  71. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_data_union_discriminator.py +0 -0
  72. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_declared_contracts.py +0 -0
  73. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  74. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  75. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_exports.py +0 -0
  76. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  77. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_first_party.py +0 -0
  78. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  79. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_imports.py +0 -0
  80. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_inert_model_annotation.py +0 -0
  81. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_inherited_contract.py +0 -0
  82. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_local_alias_fix.py +0 -0
  83. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_local_source.py +0 -0
  84. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_logging.py +0 -0
  85. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_mapping_shape_callbacks.py +0 -0
  86. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_namespace_access.py +0 -0
  87. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_native_namespace_capability.py +0 -0
  88. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_native_object_contracts.py +0 -0
  89. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
  90. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_numeric_proof.py +0 -0
  91. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_opaque_contracts.py +0 -0
  92. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_paths.py +0 -0
  93. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_postgres.py +0 -0
  94. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_project_index.py +0 -0
  95. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  96. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_pydantic_field_contract.py +0 -0
  97. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_pytest.py +0 -0
  98. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_resolved_operation_signature.py +0 -0
  99. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  100. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_route_shapes.py +0 -0
  101. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_runtime_bindings.py +0 -0
  102. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_service_http_callbacks.py +0 -0
  103. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  104. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_sql.py +0 -0
  105. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_sql_aggregate_identity.py +0 -0
  106. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_sql_explain.py +0 -0
  107. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_sql_policy_source.py +0 -0
  108. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_static_json_alias.py +0 -0
  109. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_store_sql.py +0 -0
  110. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_store_writes.py +0 -0
  111. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  112. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  113. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  114. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  115. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_transactional_sql.py +0 -0
  116. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/_type_guard_symbols.py +0 -0
  117. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  118. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/async_executor_shutdown.py +0 -0
  119. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
  120. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/async_subprocess_cancellation_cleanup.py +0 -0
  121. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/cancel_owned_task_without_join.py +0 -0
  122. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  123. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  124. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  125. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  126. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py +0 -0
  127. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py +0 -0
  128. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/duplicate_pytest_fixture_params.py +0 -0
  129. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  130. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/failed_probe_zero_threshold.py +0 -0
  131. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  132. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  133. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  134. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  135. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  136. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
  137. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/nan_hidden_by_builtin_min.py +0 -0
  138. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  139. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  140. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  141. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_async_client_in_constructor.py +0 -0
  142. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_async_function_cache.py +0 -0
  143. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  144. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_blanket_suppression.py +0 -0
  145. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  146. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  147. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py +0 -0
  148. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  149. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_contradictory_type_guard.py +0 -0
  150. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  151. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  152. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_create_verb_in_post_path.py +0 -0
  153. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_custom_control_flow_exception.py +0 -0
  154. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  155. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_defaulted_environment_setting.py +0 -0
  156. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  157. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_discarded_tagged_outcome.py +0 -0
  158. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_discarded_validation_result.py +0 -0
  159. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_dual_shape_model_field_reader.py +0 -0
  160. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  161. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  162. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_duplicate_field_validator_body.py +0 -0
  163. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_exception_text_in_500_detail.py +0 -0
  164. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  165. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  166. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  167. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  168. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
  169. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  170. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_folded_bad_request_not_found.py +0 -0
  171. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  172. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  173. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_hasattr.py +0 -0
  174. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  175. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py +0 -0
  176. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  177. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  178. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  179. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  180. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_invalid_pydantic_bypass.py +0 -0
  181. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_invalid_pydantic_validator_return.py +0 -0
  182. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_loguru_exc_info.py +0 -0
  183. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_loguru_printf_format.py +0 -0
  184. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  185. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_mutating_container_transform.py +0 -0
  186. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  187. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  188. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  189. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_partial_type_is.py +0 -0
  190. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  191. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  192. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  193. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  194. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  195. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_recording_store.py +0 -0
  196. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  197. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_redundant_local_alias.py +0 -0
  198. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  199. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_redundant_sql_alias.py +0 -0
  200. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  201. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  202. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  203. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  204. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  205. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  206. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  207. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_shallow_record_type_guard.py +0 -0
  208. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_slash_collection_root_under_prefix.py +0 -0
  209. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  210. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  211. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
  212. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  213. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  214. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  215. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py +0 -0
  216. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  217. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  218. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  219. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  220. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  221. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  222. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/no_work_verb_get_route.py +0 -0
  223. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  224. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  225. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  226. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_application_model_joins.py +0 -0
  227. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  228. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_bulk_upsert.py +0 -0
  229. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  230. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  231. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  232. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_declarative_batch_validation.py +0 -0
  233. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_direct_import_module.py +0 -0
  234. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_discriminated_model_union.py +0 -0
  235. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  236. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_grouped_settings.py +0 -0
  237. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  238. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  239. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  240. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  241. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  242. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  243. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  244. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  245. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  246. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  247. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  248. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  249. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  250. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  251. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_optional_composite.py +0 -0
  252. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  253. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_precise_object_contract.py +0 -0
  254. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_psycopg_executemany.py +0 -0
  255. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  256. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_pydantic_model_assertion.py +0 -0
  257. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  258. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  259. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  260. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_runtime_validation.py +0 -0
  261. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  262. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  263. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  264. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  265. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  266. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_typed_cli.py +0 -0
  267. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_typed_mapping_get.py +0 -0
  268. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_typed_settings_field.py +0 -0
  269. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  270. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  271. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  272. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  273. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  274. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  275. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/pytest_fixture_returns_closed_resource.py +0 -0
  276. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  277. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  278. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  279. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py +0 -0
  280. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  281. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  282. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  283. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py +0 -0
  284. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_exp_on_jwt_decode.py +0 -0
  285. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  286. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  287. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  288. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  289. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  290. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  291. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  292. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  293. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  294. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  295. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_pydantic_for_mapping_shape.py +0 -0
  296. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  297. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  298. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  299. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  300. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/stepdown.py +0 -0
  301. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/store_field_update_reuses_upsert.py +0 -0
  302. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  303. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/store_insert_requires_explicit_conflict_policy.py +0 -0
  304. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  305. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/store_mutation_command_fanout.py +0 -0
  306. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  307. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/test_without_explicit_oracle.py +0 -0
  308. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  309. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  310. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  311. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  312. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  313. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/src/sarj_python_lint/rules/unused_test_factory_option.py +0 -0
  314. {sarj_python_lint-1.90.1 → sarj_python_lint-1.95.0}/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.90.1
3
+ Version: 1.95.0
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.90.1"
3
+ version = "1.95.0"
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" }]
@@ -0,0 +1,32 @@
1
+ from typing import TYPE_CHECKING as _TYPE_CHECKING
2
+
3
+ from sarj_python_lint._fixes import apply_fixes as apply_fixes, python_source_hash as python_source_hash
4
+ from sarj_python_lint._ratchet_cli import run_ratchet as run_ratchet
5
+ from sarj_python_lint._source import python_source_encoding as python_source_encoding
6
+ from sarj_python_lint._version import __version__ as __version__
7
+ from sarj_python_lint.application_logging import (
8
+ ApplicationLoggingUse as ApplicationLoggingUse,
9
+ application_logging_uses as application_logging_uses,
10
+ )
11
+
12
+
13
+ if _TYPE_CHECKING:
14
+ from sarj_python_lint._analysis_session import AnalysisSession as AnalysisSession
15
+
16
+
17
+ def __getattr__(name: str) -> object:
18
+ if name not in {"AnalysisSession", "__all__"}:
19
+ msg = f"module 'sarj_python_lint' has no attribute {name!r}"
20
+ raise AttributeError(msg)
21
+ from sarj_python_lint._analysis_session import AnalysisSession as _AnalysisSession # ruff: ignore[import-outside-top-level] -- lightweight metadata imports do not need semantic rules.
22
+
23
+ globals()["AnalysisSession"] = _AnalysisSession
24
+ if name == "__all__":
25
+ # Star imports previously exposed the complete post-session public namespace.
26
+ # Discover it on demand instead of freezing a narrower list of exports.
27
+ return tuple(public for public in globals() if not public.startswith("_"))
28
+ return _AnalysisSession
29
+
30
+
31
+ def __dir__() -> list[str]:
32
+ return sorted(set(globals()).union({"AnalysisSession"}))
@@ -15,24 +15,41 @@ from sarj_rule_contracts import RuleId
15
15
  import typer
16
16
 
17
17
  from sarj_python_lint import __version__
18
- from sarj_python_lint._analysis_session import AnalysisSession
19
- from sarj_python_lint._file_context import PythonFileContext
20
18
  from sarj_python_lint._filesystem import atomic_write_text
21
19
  from sarj_python_lint._prepared_sources import PreparedSourceInputs
22
20
  from sarj_python_lint._source import read_python_source
23
21
  from sarj_python_lint.json_boundary import is_object_mapping, parse_json
24
- from sarj_python_lint.rule_base import Diagnostic, ProjectRule, Rule, Severity, is_suppressed
25
- from sarj_python_lint.rules import REGISTRY
26
- from sarj_python_lint.rules._paths import clear_path_caches
27
- from sarj_python_lint.rules._project_index import ProjectIndexSet
22
+ from sarj_python_lint.rule_base import Diagnostic, DiagnosticSubject, ProjectRule, Rule, Severity, is_suppressed
28
23
  from sarj_python_lint.suppression_policy import PROTECTED_SUPPRESSION_CODES
29
24
 
30
25
 
31
26
  if TYPE_CHECKING:
32
- from collections.abc import Sequence
27
+ from collections.abc import Mapping, Sequence
33
28
 
34
29
  from sarj_rule_contracts import SourceCatalog
35
30
 
31
+ from sarj_python_lint._analysis_session import AnalysisSession
32
+ from sarj_python_lint._file_context import PythonFileContext
33
+ from sarj_python_lint.rules import REGISTRY as REGISTRY # ruff: ignore[runtime-import-in-type-checking-block] -- the lazy compatibility export has this type; eager loading would import every rule during help/version.
34
+
35
+
36
+ def _rule_registry() -> Mapping[str, type[Rule]]:
37
+ try:
38
+ return REGISTRY
39
+ except NameError:
40
+ from sarj_python_lint.rules import REGISTRY as _REGISTRY # ruff: ignore[import-outside-top-level] -- ordinary operations load the canonical owner; legacy module overrides take precedence.
41
+
42
+ return _REGISTRY
43
+
44
+
45
+ def __getattr__(name: str) -> object:
46
+ if name == "REGISTRY":
47
+ from sarj_python_lint.rules._registry import REGISTRY as _REGISTRY # ruff: ignore[import-outside-top-level] -- preserve the published export independently of temporary facade overrides.
48
+
49
+ return _REGISTRY
50
+ msg = f"module {__name__!r} has no attribute {name!r}"
51
+ raise AttributeError(msg)
52
+
36
53
 
37
54
  SKIP_DIR_NAMES = frozenset(
38
55
  {
@@ -95,25 +112,34 @@ def _python_files(p: Path) -> list[Path]:
95
112
 
96
113
 
97
114
  def _canonical_rule_ids(rule_names: Sequence[str]) -> list[RuleId]:
98
- aliases = {
99
- alias: rule_id
100
- for rule_id, cls in REGISTRY.items()
101
- if (documentation := cls.documentation) is not None
102
- for alias in documentation.aliases
103
- }
104
- return list(dict.fromkeys(RuleId(name if name in REGISTRY else aliases.get(name, name)) for name in rule_names))
115
+ from sarj_python_lint.rules._runtime_registry import canonical_aliases # ruff: ignore[import-outside-top-level] -- class-free alias data is needed only by rule selection.
116
+
117
+ registry = _rule_registry()
118
+ aliases = canonical_aliases(registry)
119
+ if aliases is None:
120
+ aliases = {
121
+ alias: rule_id
122
+ for rule_id, cls in registry.items()
123
+ if (documentation := cls.documentation) is not None
124
+ for alias in documentation.aliases
125
+ }
126
+ return list(dict.fromkeys(RuleId(name if name in registry else aliases.get(name, name)) for name in rule_names))
105
127
 
106
128
 
107
129
  def _check(
108
130
  rule_names: Sequence[str], paths: list[Path], *, jobs: int = 1, sources: SourceCatalog | None = None
109
131
  ) -> list[Diagnostic]:
132
+ from sarj_python_lint._analysis_session import AnalysisSession # ruff: ignore[import-outside-top-level] -- construct semantic state only for analysis.
133
+ from sarj_python_lint.rules._paths import clear_path_caches # ruff: ignore[import-outside-top-level] -- analysis owns semantic cache lifetime.
134
+
135
+ registry = _rule_registry()
110
136
  rule_ids = _canonical_rule_ids(rule_names)
111
- unknown = [rid for rid in rule_ids if rid not in REGISTRY]
137
+ unknown = [rid for rid in rule_ids if rid not in registry]
112
138
  if unknown:
113
139
  sys.stderr.write(f"unknown rule(s): {', '.join(unknown)}\n")
114
- sys.stderr.write(f"available: {', '.join(sorted(REGISTRY))}\n")
140
+ sys.stderr.write(f"available: {', '.join(sorted(registry))}\n")
115
141
  raise SystemExit(2)
116
- rules = [REGISTRY[rid]() for rid in rule_ids]
142
+ rules = [registry[rid]() for rid in rule_ids]
117
143
  source_inputs = None if sources is None else PreparedSourceInputs(sources)
118
144
  session = AnalysisSession() if source_inputs is None else AnalysisSession(source_inputs=source_inputs)
119
145
  for rule in rules:
@@ -160,6 +186,8 @@ def _prepare_project(
160
186
  project_rules = [rule for rule in rules if isinstance(rule, ProjectRule)]
161
187
  if not project_rules:
162
188
  return
189
+ from sarj_python_lint.rules._project_index import ProjectIndexSet # ruff: ignore[import-outside-top-level] -- project rules own project indexing.
190
+
163
191
  indexes = (
164
192
  ProjectIndexSet.build(expanded, loaded, facts=session.first_party)
165
193
  if source_inputs is None
@@ -192,6 +220,8 @@ def _parallel_diagnostics(
192
220
  def check_source(
193
221
  rules: list[Rule], p: Path, source: str, *, session: AnalysisSession | None = None
194
222
  ) -> list[Diagnostic]:
223
+ from sarj_python_lint._file_context import PythonFileContext # ruff: ignore[import-outside-top-level] -- source checks own native AST context construction.
224
+
195
225
  context = PythonFileContext(p, source, session)
196
226
  if rules and context.tree is None:
197
227
  msg = f"selected Python source could not be parsed: {p}"
@@ -233,6 +263,7 @@ _DIAGNOSTIC_PRECEDENCE = MappingProxyType(
233
263
  "SARJ086": frozenset({"SARJ420"}),
234
264
  "SARJ087": frozenset({"SARJ420"}),
235
265
  "SARJ088": frozenset({"SARJ050", "SARJ085", "SARJ420"}),
266
+ "SARJ089": frozenset({"SARJ551"}),
236
267
  "SARJ092": frozenset({"SARJ086", "SARJ087", "SARJ420"}),
237
268
  "SARJ093": frozenset({"SARJ034"}),
238
269
  # Visible FastAPI operations have a route-aware contract diagnostic.
@@ -251,7 +282,7 @@ _DIAGNOSTIC_PRECEDENCE = MappingProxyType(
251
282
  "SARJ447": frozenset({"SARJ008"}),
252
283
  "SARJ450": frozenset({"SARJ521", "SARJ535"}),
253
284
  "SARJ521": frozenset({"SARJ535"}),
254
- "SARJ457": frozenset({"SARJ045"}),
285
+ "SARJ457": frozenset({"SARJ045", "SARJ526"}),
255
286
  "SARJ465": frozenset({"SARJ071"}),
256
287
  "SARJ491": frozenset({"SARJ400"}),
257
288
  }
@@ -286,7 +317,7 @@ class _DiagnosticOwners:
286
317
  def presence(self, diags: list[Diagnostic]) -> dict[tuple[Path, int, int], dict[str, set[Severity]]]:
287
318
  present: dict[tuple[Path, int, int], dict[str, set[Severity]]] = {}
288
319
  for diagnostic in diags:
289
- if diagnostic.code == "SARJ094" and not diagnostic.message.startswith("[return]"):
320
+ if diagnostic.code == "SARJ094" and diagnostic.subject is not DiagnosticSubject.RETURN:
290
321
  continue
291
322
  location = self.location(diagnostic)
292
323
  by_code = present.setdefault((diagnostic.path, location.line, location.column), {})
@@ -471,10 +502,11 @@ class _Result:
471
502
 
472
503
 
473
504
  def _explain(wanted: str) -> int:
505
+ registry = _rule_registry()
474
506
  key = wanted.strip()
475
- cls = REGISTRY.get(key) or next((c for c in REGISTRY.values() if c.code.upper() == key.upper()), None)
507
+ cls = registry.get(key) or next((c for c in registry.values() if c.code.upper() == key.upper()), None)
476
508
  if cls is None:
477
- sys.stderr.write(f"unknown rule: {wanted}\navailable: {', '.join(sorted(REGISTRY))}\n")
509
+ sys.stderr.write(f"unknown rule: {wanted}\navailable: {', '.join(sorted(registry))}\n")
478
510
  return 2
479
511
  sys.stdout.write(f"{cls.code} {cls.id}\n{cls.description}\nexamples: {cls.examples_url()}\n")
480
512
  return 0
@@ -608,7 +640,7 @@ def _root(
608
640
 
609
641
  @app.command("list-rules", help="List available rule IDs.")
610
642
  def _list_rules() -> None:
611
- for rid, cls in sorted(REGISTRY.items()):
643
+ for rid, cls in sorted(_rule_registry().items()):
612
644
  inst = cls()
613
645
  sys.stdout.write(f"{inst.code:8} {rid:40} {inst.description}\n")
614
646
 
@@ -640,8 +672,9 @@ def _check_command(
640
672
  if fix:
641
673
  from sarj_python_lint.autofix import fix_paths # ruff: ignore[import-outside-top-level] -- load mutation support only for an explicit fix request.
642
674
 
675
+ registry = _rule_registry()
643
676
  canonical = _canonical_rule_ids(rule)
644
- unknown = [rule_id for rule_id in canonical if rule_id not in REGISTRY]
677
+ unknown = [rule_id for rule_id in canonical if rule_id not in registry]
645
678
  if unknown:
646
679
  context.ensure_object(_Result).code = _run_check(rule, files, baseline, update_baseline, jobs=jobs)
647
680
  return