sarj-python-lint 1.45.2__tar.gz → 1.45.4__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 (213) hide show
  1. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/pyproject.toml +1 -1
  3. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_ast_index.py +5 -6
  4. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_tautological_expect.py +12 -5
  5. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/.gitignore +0 -0
  6. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/LICENSE +0 -0
  7. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/README.md +0 -0
  8. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/__init__.py +0 -0
  9. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/__main__.py +0 -0
  10. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_analysis_session.py +0 -0
  11. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_file_context.py +0 -0
  12. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_filesystem.py +0 -0
  13. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_python_target.py +0 -0
  14. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  15. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_secret_names.py +0 -0
  16. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_source.py +0 -0
  17. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/_version.py +0 -0
  18. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/benchmark.py +0 -0
  19. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/interpreter_argv.py +0 -0
  20. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/json_boundary.py +0 -0
  21. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/py.typed +0 -0
  22. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/ratchet.py +0 -0
  23. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rule_base.py +0 -0
  24. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/__init__.py +0 -0
  25. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  26. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  27. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_closed_helpers.py +0 -0
  28. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_comments.py +0 -0
  29. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  30. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
  31. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  32. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  33. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_exports.py +0 -0
  34. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  35. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_first_party.py +0 -0
  36. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  37. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_imports.py +0 -0
  38. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_inert_model_annotation.py +0 -0
  39. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_inherited_contract.py +0 -0
  40. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_local_source.py +0 -0
  41. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_logging.py +0 -0
  42. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_namespace_access.py +0 -0
  43. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
  44. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_paths.py +0 -0
  45. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_project_index.py +0 -0
  46. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  47. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_pydantic_field_contract.py +0 -0
  48. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_pytest.py +0 -0
  49. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_registry.py +0 -0
  50. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_resolved_operation_signature.py +0 -0
  51. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  52. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  53. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_sql.py +0 -0
  54. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_static_json_alias.py +0 -0
  55. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  56. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  57. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  58. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  59. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/_type_guard_symbols.py +0 -0
  60. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  61. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
  62. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  63. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  64. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  65. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  66. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py +0 -0
  67. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py +0 -0
  68. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  69. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  70. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  71. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
  72. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  73. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  74. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  75. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
  76. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  77. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  78. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  79. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_async_function_cache.py +0 -0
  80. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  81. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  82. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  83. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py +0 -0
  84. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  85. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_contradictory_type_guard.py +0 -0
  86. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  87. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  88. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  89. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  90. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  91. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  92. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  93. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  94. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  95. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  96. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
  97. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  98. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  99. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  100. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  101. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py +0 -0
  102. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  103. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  104. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  105. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  106. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_invalid_pydantic_bypass.py +0 -0
  107. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_loguru_exc_info.py +0 -0
  108. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_loguru_printf_format.py +0 -0
  109. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  110. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  111. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  112. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  113. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_partial_type_is.py +0 -0
  114. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  115. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  116. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  117. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  118. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  119. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  120. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  121. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  122. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  123. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  124. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  125. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  126. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  127. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  128. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_shallow_record_type_guard.py +0 -0
  129. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  130. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  131. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  132. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  133. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  134. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py +0 -0
  135. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  136. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  137. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  138. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  139. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  140. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  141. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  142. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  143. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  144. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  145. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  146. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  147. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  148. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_declarative_batch_validation.py +0 -0
  149. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_discriminated_model_union.py +0 -0
  150. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  151. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  152. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  153. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  154. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  155. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  156. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  157. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  158. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  159. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  160. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  161. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  162. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  163. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  164. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  165. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  166. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  167. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  168. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  169. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  170. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  171. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  172. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  173. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  174. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  175. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  176. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  177. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  178. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  179. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  180. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  181. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  182. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  183. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  184. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py +0 -0
  185. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  186. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  187. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  188. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py +0 -0
  189. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  190. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  191. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  192. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  193. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  194. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  195. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  196. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  197. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  198. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  199. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  200. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  201. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  202. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  203. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/stepdown.py +0 -0
  204. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  205. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  206. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  207. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/test_without_explicit_oracle.py +0 -0
  208. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  209. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  210. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  211. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  212. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  213. {sarj_python_lint-1.45.2 → sarj_python_lint-1.45.4}/src/sarj_python_lint/rules/unused_test_factory_option.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sarj-python-lint
3
- Version: 1.45.2
3
+ Version: 1.45.4
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.45.2"
3
+ version = "1.45.4"
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" }]
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import ast
6
+ from collections import deque
6
7
  from types import MappingProxyType
7
8
  from typing import TYPE_CHECKING, TypeIs, final
8
9
 
@@ -57,12 +58,10 @@ def walk(node: ast.AST, *, index: NodeIndex | None = None) -> Iterator[ast.AST]:
57
58
  if index is not None and index.tree is node:
58
59
  yield from index.query((ast.AST,))
59
60
  return
60
- queue: list[ast.AST] = [node]
61
- i = 0
62
- while i < len(queue):
63
- current = queue[i]
64
- i += 1
65
- queue += children(current)
61
+ queue = deque((node,))
62
+ while queue:
63
+ current = queue.popleft()
64
+ queue.extend(children(current))
66
65
  yield current
67
66
 
68
67
 
@@ -34,6 +34,7 @@ _FAIL = "fail"
34
34
  # Enough of the operand to identify it in the message without pasting a screenful.
35
35
  _OPERAND_PREVIEW_CHARS = 40
36
36
  _UNKNOWN = object()
37
+ _DEFERRED_TRUTHY = object()
37
38
 
38
39
 
39
40
  class NoTautologicalExpect(Rule):
@@ -53,9 +54,10 @@ class NoTautologicalExpect(Rule):
53
54
  category=RuleCategory.TESTING,
54
55
  aliases=("no-tautological-expect",),
55
56
  limitations=(
56
- "Detection covers truthy scalar constants, definitely non-empty list/set/dict displays, and directly asserted generator expressions or lambdas.",
57
+ "Detection covers truthy scalar constants, definitely non-empty list/set/dict displays, and directly asserted or locally bound generator expressions and lambdas.",
57
58
  "Generator consumption, lambda invocation, comprehensions, and runtime iterator/callable values are not inferred; empty universal-quantification contracts remain valid.",
58
59
  "Test-local immutable scalar bindings and their aliases are tracked only through straight-line assignments; calls, control flow, mutable values, and global/nonlocal writes invalidate tracking.",
60
+ "Locally created generator/lambda objects and aliases are tracked for truthiness only; their creation clears earlier setup facts, and comparisons, consumption, invocation, and runtime-created iterators/callables are not inferred.",
59
61
  "Pure Boolean conditions, compatible numeric/string/bytes ordering and chained comparisons over known scalar setup are evaluated; proven-true pure assertions retain bindings because their messages do not execute.",
60
62
  "Ruff owns asserted strings and tuples, literal comparisons and identity, and unittest-style assertion methods.",
61
63
  "Generated files, always-failing assertions, deliberate match-arm success markers, and runtime-value comparisons are excluded.",
@@ -69,7 +71,7 @@ class NoTautologicalExpect(Rule):
69
71
  files=(
70
72
  ExampleFile.python(
71
73
  "tests/test_service.py",
72
- "def test_values(rows):\n assert (row.is_valid for row in rows)\n",
74
+ "def test_values(rows):\n checks = (row.is_valid for row in rows)\n assert checks\n",
73
75
  ),
74
76
  ),
75
77
  focus_path=PurePosixPath("tests/test_service.py"),
@@ -84,7 +86,7 @@ class NoTautologicalExpect(Rule):
84
86
  files=(
85
87
  ExampleFile.python(
86
88
  "tests/test_service.py",
87
- "def test_values(rows):\n assert all(row.is_valid for row in rows)\n",
89
+ "def test_values(rows):\n checks = (row.is_valid for row in rows)\n assert all(checks)\n",
88
90
  ),
89
91
  ),
90
92
  focus_path=PurePosixPath("tests/test_service.py"),
@@ -202,7 +204,7 @@ def _function_bound_tautologies(function: ast.FunctionDef | ast.AsyncFunctionDef
202
204
  isinstance(node, ast.Name) and node.id in bindings for node in ast.walk(statement.test)
203
205
  )
204
206
  if references_setup:
205
- found.append(_Tautology(statement, "the condition follows only from unchanged scalar setup"))
207
+ found.append(_Tautology(statement, "the condition follows only from unchanged test-local setup"))
206
208
  continue
207
209
  bindings.clear()
208
210
  return found
@@ -213,6 +215,11 @@ def _record_scalar_assignment(statement: ast.stmt, bindings: dict[str, object])
213
215
  case (
214
216
  ast.Assign(targets=[ast.Name(id=name)], value=value) | ast.AnnAssign(target=ast.Name(id=name), value=value)
215
217
  ) if value is not None:
218
+ if isinstance(value, (ast.GeneratorExp, ast.Lambda)):
219
+ # Outer iterables and defaults execute now and can write earlier bindings.
220
+ bindings.clear()
221
+ bindings[name] = _DEFERRED_TRUTHY
222
+ return True
216
223
  scalar = _scalar_value(value, bindings)
217
224
  if scalar is not _UNKNOWN:
218
225
  bindings[name] = scalar
@@ -258,7 +265,7 @@ def _scalar_condition(node: ast.expr, bindings: dict[str, object]) -> bool | Non
258
265
 
259
266
 
260
267
  def _scalar_relation(left: object, right: object, op: ast.cmpop) -> bool | None:
261
- if left is _UNKNOWN or right is _UNKNOWN:
268
+ if left is _UNKNOWN or right is _UNKNOWN or left is _DEFERRED_TRUTHY or right is _DEFERRED_TRUTHY:
262
269
  return None
263
270
  match op:
264
271
  case ast.Eq():