sarj-python-lint 1.44.0__tar.gz → 1.44.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 (211) hide show
  1. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/pyproject.toml +1 -1
  3. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +119 -28
  4. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/.gitignore +0 -0
  5. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/LICENSE +0 -0
  6. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/README.md +0 -0
  7. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/__init__.py +0 -0
  8. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/__main__.py +0 -0
  9. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_analysis_session.py +0 -0
  10. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_file_context.py +0 -0
  11. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_filesystem.py +0 -0
  12. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_python_target.py +0 -0
  13. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  14. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_secret_names.py +0 -0
  15. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_source.py +0 -0
  16. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/_version.py +0 -0
  17. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/benchmark.py +0 -0
  18. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/interpreter_argv.py +0 -0
  19. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/json_boundary.py +0 -0
  20. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/py.typed +0 -0
  21. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/ratchet.py +0 -0
  22. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rule_base.py +0 -0
  23. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/__init__.py +0 -0
  24. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  25. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  26. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  27. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_closed_helpers.py +0 -0
  28. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_comments.py +0 -0
  29. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  30. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
  31. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  32. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  33. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_exports.py +0 -0
  34. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  35. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_first_party.py +0 -0
  36. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  37. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_imports.py +0 -0
  38. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_inert_model_annotation.py +0 -0
  39. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_local_source.py +0 -0
  40. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_logging.py +0 -0
  41. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_namespace_access.py +0 -0
  42. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
  43. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_paths.py +0 -0
  44. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_project_index.py +0 -0
  45. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  46. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_pydantic_field_contract.py +0 -0
  47. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_pytest.py +0 -0
  48. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_registry.py +0 -0
  49. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_resolved_operation_signature.py +0 -0
  50. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  51. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  52. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_sql.py +0 -0
  53. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_static_json_alias.py +0 -0
  54. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  55. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  56. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  57. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  58. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/_type_guard_symbols.py +0 -0
  59. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  60. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
  61. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  62. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  63. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  64. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  65. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py +0 -0
  66. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py +0 -0
  67. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  68. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  69. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  70. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
  71. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  72. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  73. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  74. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
  75. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  76. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  77. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  78. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_async_function_cache.py +0 -0
  79. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  80. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  81. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  82. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py +0 -0
  83. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  84. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_contradictory_type_guard.py +0 -0
  85. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  86. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  87. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  88. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  89. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  90. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  91. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  92. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  93. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  94. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  95. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
  96. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  97. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  98. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  99. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  100. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py +0 -0
  101. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  102. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  103. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  104. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  105. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_invalid_pydantic_bypass.py +0 -0
  106. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_loguru_exc_info.py +0 -0
  107. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_loguru_printf_format.py +0 -0
  108. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  109. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  110. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  111. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  112. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_partial_type_is.py +0 -0
  113. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  114. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  115. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  116. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  117. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  118. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  119. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  120. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  121. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  122. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  123. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  124. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  125. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  126. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  127. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  128. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  129. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
  130. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  131. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  132. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  133. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py +0 -0
  134. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  135. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  136. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  137. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  138. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  139. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  140. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  141. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  142. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  143. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  144. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  145. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  146. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  147. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_declarative_batch_validation.py +0 -0
  148. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_discriminated_model_union.py +0 -0
  149. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  150. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  151. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  152. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  153. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  154. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  155. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  156. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  157. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  158. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  159. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  160. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  161. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  162. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  163. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  164. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  165. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  166. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  167. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  168. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  169. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  170. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  171. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  172. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  173. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  174. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  175. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  176. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  177. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  178. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  179. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  180. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  181. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  182. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py +0 -0
  183. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  184. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  185. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  186. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py +0 -0
  187. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  188. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  189. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  190. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  191. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  192. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  193. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  194. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  195. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  196. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  197. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  198. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  199. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  200. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  201. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/stepdown.py +0 -0
  202. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  203. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  204. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  205. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/test_without_explicit_oracle.py +0 -0
  206. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  207. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  208. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  209. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  210. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  211. {sarj_python_lint-1.44.0 → sarj_python_lint-1.44.1}/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.44.0
3
+ Version: 1.44.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.44.0"
3
+ version = "1.44.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" }]
@@ -31,7 +31,16 @@ _FUNC_NODES = (ast.FunctionDef, ast.AsyncFunctionDef)
31
31
 
32
32
  class _FixtureDecorators(NamedTuple):
33
33
  names: frozenset[str]
34
- roots: frozenset[str]
34
+ roots: dict[str, str]
35
+ modified: frozenset[str]
36
+
37
+
38
+ class _FixtureFunction(NamedTuple):
39
+ node: ast.FunctionDef | ast.AsyncFunctionDef
40
+ owner: ast.ClassDef | None
41
+
42
+
43
+ _NO_FIXTURE_DECORATORS = _FixtureDecorators(frozenset(), {}, frozenset())
35
44
 
36
45
 
37
46
  class _TupleResult(NamedTuple):
@@ -58,6 +67,8 @@ class PytestFixtureReturnsBareTuple(Rule):
58
67
  category=RuleCategory.TESTING,
59
68
  limitations=(
60
69
  "Only pytest and pytest-asyncio fixtures in test paths are analyzed.",
70
+ "Decorator identity follows direct absolute imports and preceding module/class bindings; dynamic provider aliases and plugin registration are not inferred.",
71
+ "Explicit writes to a proven provider's fixture attribute invalidate later module imports, including through executed class bodies; arbitrary call effects and assignment aliases are not inferred.",
61
72
  "Factory closures, single-field tuples, starred tuple literals, and variadic tuple annotations are allowed.",
62
73
  "Homogeneous variadic tuple annotations are treated as sequences and excluded; fixed domain tuple protocols require an exact suppression.",
63
74
  ),
@@ -142,9 +153,12 @@ class PytestFixtureReturnsBareTuple(Rule):
142
153
 
143
154
  def _bare_tuple_results(tree: ast.Module) -> list[_TupleResult]:
144
155
  hits: list[_TupleResult] = []
145
- for node in _discoverable_functions(tree):
146
- fixture_names = _fixture_decorator_names(tree, before_line=node.lineno)
147
- if not _is_fixture(node, fixture_names):
156
+ for node, owner in _discoverable_functions(tree):
157
+ if not node.decorator_list:
158
+ continue
159
+ fixture_names = _fixture_decorator_names(tree, before_line=node.lineno, owner=owner)
160
+ fixture_name = _fixture_name(node, fixture_names)
161
+ if fixture_name is None:
148
162
  continue
149
163
  aliases = _type_aliases(tree, before_line=node.lineno)
150
164
  has_yield = _has_own_yield(node)
@@ -160,7 +174,7 @@ def _bare_tuple_results(tree: ast.Module) -> list[_TupleResult]:
160
174
  hits.append(
161
175
  _TupleResult(
162
176
  first.expression,
163
- node.name,
177
+ fixture_name,
164
178
  tuple(sorted({result.field_counts[0] for result in results})),
165
179
  )
166
180
  )
@@ -176,31 +190,80 @@ def _bare_tuple_results(tree: ast.Module) -> list[_TupleResult]:
176
190
  )
177
191
  >= _MIN_FIELDS
178
192
  ):
179
- hits.append(_TupleResult(node.returns, node.name, (arity,)))
193
+ hits.append(_TupleResult(node.returns, fixture_name, (arity,)))
180
194
  return hits
181
195
 
182
196
 
183
- def _discoverable_functions(tree: ast.Module) -> tuple[ast.FunctionDef | ast.AsyncFunctionDef, ...]:
184
- functions: list[ast.FunctionDef | ast.AsyncFunctionDef] = []
197
+ def _discoverable_functions(tree: ast.Module) -> tuple[_FixtureFunction, ...]:
198
+ functions: list[_FixtureFunction] = []
185
199
  for statement in tree.body:
186
200
  if isinstance(statement, _FUNC_NODES):
187
- functions.append(statement)
201
+ functions.append(_FixtureFunction(statement, None))
188
202
  elif isinstance(statement, ast.ClassDef):
189
- functions.extend(member for member in statement.body if isinstance(member, _FUNC_NODES))
203
+ functions.extend(
204
+ _FixtureFunction(member, statement) for member in statement.body if isinstance(member, _FUNC_NODES)
205
+ )
190
206
  return tuple(functions)
191
207
 
192
208
 
193
- def _fixture_decorator_names(tree: ast.Module, *, before_line: int) -> _FixtureDecorators:
194
- names: set[str] = set()
195
- roots: set[str] = set()
196
- for statement in tree.body:
209
+ def _fixture_decorator_names(tree: ast.Module, *, before_line: int, owner: ast.ClassDef | None) -> _FixtureDecorators:
210
+ module = _decorators_before(tree.body, before_line=owner.lineno if owner else before_line)
211
+ return module if owner is None else _decorators_before(owner.body, before_line=before_line, inherited=module)
212
+
213
+
214
+ def _decorators_before(
215
+ statements: list[ast.stmt],
216
+ *,
217
+ before_line: int,
218
+ inherited: _FixtureDecorators = _NO_FIXTURE_DECORATORS,
219
+ ) -> _FixtureDecorators:
220
+ names = set(inherited.names)
221
+ roots = dict(inherited.roots)
222
+ modified = set(inherited.modified)
223
+ for statement in statements:
197
224
  if statement.lineno >= before_line:
198
225
  break
226
+ modified.update(
227
+ _provider_modifications(statement, _FixtureDecorators(frozenset(names), roots, frozenset(modified)))
228
+ )
199
229
  rebound = _bound_names(statement)
200
230
  names.difference_update(rebound)
201
- roots.difference_update(rebound)
202
- _collect_fixture_imports(statement, names, roots)
203
- return _FixtureDecorators(frozenset(names), frozenset(roots))
231
+ roots = {name: provider for name, provider in roots.items() if name not in rebound and provider not in modified}
232
+ if isinstance(statement, ast.Delete):
233
+ # Deleting a class binding restores lookup in the module namespace.
234
+ names.update(rebound & inherited.names)
235
+ roots.update(
236
+ (name, provider)
237
+ for name, provider in inherited.roots.items()
238
+ if name in rebound and provider not in modified
239
+ )
240
+ _collect_fixture_imports(statement, names, roots, modified)
241
+ return _FixtureDecorators(frozenset(names), roots, frozenset(modified))
242
+
243
+
244
+ def _provider_modifications(statement: ast.stmt, state: _FixtureDecorators) -> frozenset[str]:
245
+ if isinstance(statement, ast.ClassDef):
246
+ # Class bodies execute immediately; their local bindings stay local, but
247
+ # writes through imported provider modules affect subsequent decorators.
248
+ return _decorators_before(
249
+ statement.body,
250
+ before_line=(statement.end_lineno or statement.lineno) + 1,
251
+ inherited=state,
252
+ ).modified
253
+ return frozenset(state.roots[name] for name in _replaced_fixture_attributes(statement) if name in state.roots)
254
+
255
+
256
+ def _replaced_fixture_attributes(statement: ast.stmt) -> set[str]:
257
+ if isinstance(statement, (*_FUNC_NODES, ast.ClassDef)):
258
+ return set()
259
+ return {
260
+ node.value.id
261
+ for node in walk_ast(statement)
262
+ if isinstance(node, ast.Attribute)
263
+ and node.attr == _FIXTURE
264
+ and isinstance(node.value, ast.Name)
265
+ and isinstance(node.ctx, (ast.Store, ast.Del))
266
+ }
204
267
 
205
268
 
206
269
  def _bound_names(statement: ast.stmt) -> set[str]:
@@ -210,7 +273,12 @@ def _bound_names(statement: ast.stmt) -> set[str]:
210
273
  case ast.FunctionDef() | ast.AsyncFunctionDef() | ast.ClassDef():
211
274
  return {statement.name}
212
275
  case ast.Delete(targets=targets):
213
- return {node.id for target in targets for node in walk_ast(target) if isinstance(node, ast.Name)}
276
+ return {
277
+ node.id
278
+ for target in targets
279
+ for node in walk_ast(target)
280
+ if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Del)
281
+ }
214
282
  case _:
215
283
  return {
216
284
  node.id
@@ -219,14 +287,26 @@ def _bound_names(statement: ast.stmt) -> set[str]:
219
287
  }
220
288
 
221
289
 
222
- def _is_fixture(
290
+ def _fixture_name(
223
291
  node: ast.FunctionDef | ast.AsyncFunctionDef,
224
292
  fixture_imports: _FixtureDecorators,
225
- ) -> bool:
226
- return any(_names_fixture(dec, fixture_imports.names, fixture_imports.roots) for dec in node.decorator_list)
293
+ ) -> str | None:
294
+ for decorator in node.decorator_list:
295
+ if not _names_fixture(decorator, fixture_imports.names, fixture_imports.roots):
296
+ continue
297
+ if isinstance(decorator, ast.Call):
298
+ for keyword in decorator.keywords:
299
+ if (
300
+ keyword.arg == "name"
301
+ and isinstance(keyword.value, ast.Constant)
302
+ and isinstance(keyword.value.value, str)
303
+ ):
304
+ return keyword.value.value or node.name
305
+ return node.name
306
+ return None
227
307
 
228
308
 
229
- def _names_fixture(dec: ast.expr, fixture_names: frozenset[str], fixture_roots: frozenset[str]) -> bool:
309
+ def _names_fixture(dec: ast.expr, fixture_names: frozenset[str], fixture_roots: dict[str, str]) -> bool:
230
310
  # `@pytest.fixture`, `@pytest.fixture(scope=...)`, `@fixture`, `@pytest_asyncio.fixture`.
231
311
  target = dec.func if isinstance(dec, ast.Call) else dec
232
312
  if isinstance(target, ast.Attribute):
@@ -458,15 +538,26 @@ def _bare_tuple_arity(value: ast.expr) -> int:
458
538
  return len(value.elts)
459
539
 
460
540
 
461
- def _collect_fixture_imports(statement: ast.stmt, names: set[str], roots: set[str]) -> None:
541
+ def _collect_fixture_imports(statement: ast.stmt, names: set[str], roots: dict[str, str], modified: set[str]) -> None:
462
542
  if isinstance(statement, ast.Import):
463
543
  for alias in statement.names:
464
- if alias.name in {"pytest", "pytest_asyncio"}:
465
- roots.add(alias.asname or alias.name)
466
- elif isinstance(statement, ast.ImportFrom) and statement.module in {"pytest", "pytest_asyncio"}:
544
+ local = alias.asname or alias.name.split(".")[0]
545
+ roots.pop(local, None)
546
+ names.discard(local)
547
+ if alias.name in {"pytest", "pytest_asyncio"} and alias.name not in modified:
548
+ roots[local] = alias.name
549
+ elif isinstance(statement, ast.ImportFrom):
467
550
  for alias in statement.names:
468
- if alias.name == "fixture":
469
- names.add(alias.asname or alias.name)
551
+ local = alias.asname or alias.name
552
+ roots.pop(local, None)
553
+ names.discard(local)
554
+ if (
555
+ statement.level == 0
556
+ and statement.module in {"pytest", "pytest_asyncio"}
557
+ and statement.module not in modified
558
+ and alias.name == "fixture"
559
+ ):
560
+ names.add(local)
470
561
 
471
562
 
472
563
  def _string_tuple_arity(