sarj-python-lint 1.29.0__tar.gz → 1.29.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 (198) hide show
  1. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/pyproject.toml +1 -1
  3. sarj_python_lint-1.29.1/src/sarj_python_lint/rules/_exports.py +27 -0
  4. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_pytest.py +16 -0
  5. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +2 -12
  6. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +2 -24
  7. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +2 -12
  8. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_generic_single_export_module.py +2 -23
  9. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/.gitignore +0 -0
  10. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/LICENSE +0 -0
  11. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/README.md +0 -0
  12. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/__init__.py +0 -0
  13. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/__main__.py +0 -0
  14. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_analysis_session.py +0 -0
  15. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_file_context.py +0 -0
  16. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_filesystem.py +0 -0
  17. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_python_target.py +0 -0
  18. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  19. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_secret_names.py +0 -0
  20. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_source.py +0 -0
  21. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/_version.py +0 -0
  22. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/benchmark.py +0 -0
  23. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/interpreter_argv.py +0 -0
  24. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/json_boundary.py +0 -0
  25. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/py.typed +0 -0
  26. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/ratchet.py +0 -0
  27. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rule_base.py +0 -0
  28. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/__init__.py +0 -0
  29. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  30. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  31. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  32. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_closed_helpers.py +0 -0
  33. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_comments.py +0 -0
  34. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  35. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
  36. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  37. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  38. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  39. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_first_party.py +0 -0
  40. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  41. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_imports.py +0 -0
  42. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_local_source.py +0 -0
  43. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_logging.py +0 -0
  44. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_namespace_access.py +0 -0
  45. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
  46. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_paths.py +0 -0
  47. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_project_index.py +0 -0
  48. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  49. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_pydantic_field_contract.py +0 -0
  50. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_registry.py +0 -0
  51. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  52. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  53. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_sql.py +0 -0
  54. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  55. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  56. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  57. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  58. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  59. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  60. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  61. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  62. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  63. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py +0 -0
  64. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py +0 -0
  65. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  66. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  67. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  68. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
  69. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  70. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  71. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  72. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
  73. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  74. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  75. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  76. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  77. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  78. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  79. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py +0 -0
  80. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  81. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  82. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  83. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  84. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  85. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  86. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  87. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  88. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  89. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  90. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  91. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  92. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  93. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py +0 -0
  94. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  95. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  96. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  97. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  98. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  99. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  100. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  101. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  102. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  103. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  104. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  105. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  106. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  107. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  108. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  109. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  110. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  111. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  112. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  113. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  114. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  115. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  116. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  117. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  118. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
  119. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  120. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  121. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  122. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py +0 -0
  123. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  124. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  125. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  126. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  127. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  128. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  129. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  130. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  131. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  132. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  133. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  134. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  135. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  136. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  137. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  138. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  139. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  140. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  141. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  142. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  143. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  144. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  145. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  146. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  147. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  148. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  149. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  150. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  151. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  152. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  153. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  154. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  155. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  156. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  157. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  158. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  159. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  160. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  161. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  162. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  163. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  164. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  165. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  166. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  167. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  168. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  169. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  170. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py +0 -0
  171. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  172. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  173. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  174. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py +0 -0
  175. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  176. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  177. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  178. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  179. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  180. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  181. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  182. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  183. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  184. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  185. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  186. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  187. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  188. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  189. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/stepdown.py +0 -0
  190. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  191. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  192. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  193. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  194. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  195. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  196. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  197. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.1}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  198. {sarj_python_lint-1.29.0 → sarj_python_lint-1.29.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.29.0
3
+ Version: 1.29.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.29.0"
3
+ version = "1.29.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" }]
@@ -0,0 +1,27 @@
1
+ from __future__ import annotations
2
+
3
+ import ast
4
+
5
+ from sarj_python_lint.rules._ast_index import walk
6
+
7
+
8
+ def mentions_dunder_all(node: ast.AST) -> bool:
9
+ for child in walk(node):
10
+ match child:
11
+ case ast.Name(id="__all__"):
12
+ return True
13
+ case ast.alias() if (child.asname or child.name).split(".")[0] == "__all__":
14
+ return True
15
+ case ast.FunctionDef() | ast.AsyncFunctionDef() | ast.ClassDef() if child.name == "__all__":
16
+ return True
17
+ case ast.arg(arg="__all__") | ast.ExceptHandler(name="__all__"):
18
+ return True
19
+ case ast.MatchAs() | ast.MatchStar() if child.name == "__all__":
20
+ return True
21
+ case ast.MatchMapping(rest="__all__"):
22
+ return True
23
+ case ast.Global() | ast.Nonlocal() if "__all__" in child.names:
24
+ return True
25
+ case _:
26
+ pass
27
+ return False
@@ -1,10 +1,26 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import ast
4
+ from typing import TYPE_CHECKING
4
5
 
5
6
  from sarj_python_lint.rules._ast_index import walk
6
7
 
7
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Iterator
11
+
12
+
13
+ def collected_tests(statements: list[ast.stmt]) -> Iterator[ast.FunctionDef | ast.AsyncFunctionDef]:
14
+ for statement in statements:
15
+ match statement:
16
+ case ast.FunctionDef() | ast.AsyncFunctionDef() if statement.name.startswith("test"):
17
+ yield statement
18
+ case ast.ClassDef() if statement.name.startswith("Test"):
19
+ yield from collected_tests(statement.body)
20
+ case _:
21
+ pass
22
+
23
+
8
24
  # The pytest-benchmark fixture: the test measures time, it does not verify.
9
25
  _BENCHMARK = "benchmark"
10
26
 
@@ -20,6 +20,7 @@ from sarj_python_lint.rule_base import (
20
20
  )
21
21
  from sarj_python_lint.rules._ast_index import walk as walk_ast
22
22
  from sarj_python_lint.rules._imports import ImportIndex
23
+ from sarj_python_lint.rules._pytest import collected_tests
23
24
 
24
25
 
25
26
  if TYPE_CHECKING:
@@ -224,24 +225,13 @@ class AsyncMockCallWithoutAwaitAssertion(Rule):
224
225
  severity=Severity.WARNING,
225
226
  message="AsyncMock call assertions do not prove awaiting; keep this assertion and add an await assertion",
226
227
  )
227
- for test in _collected_tests(tree.body)
228
+ for test in collected_tests(tree.body)
228
229
  if not _is_pytest_fixture(test, imports)
229
230
  for call in _uncovered_calls(_test_imports(imports, test), test, writes)
230
231
  if not is_suppressed(lines, call.lineno, self.code)
231
232
  ]
232
233
 
233
234
 
234
- def _collected_tests(statements: list[ast.stmt]) -> Iterator[_TestFunction]:
235
- for statement in statements:
236
- match statement:
237
- case ast.FunctionDef() | ast.AsyncFunctionDef() if statement.name.startswith("test"):
238
- yield statement
239
- case ast.ClassDef() if statement.name.startswith("Test"):
240
- yield from _collected_tests(statement.body)
241
- case _:
242
- pass
243
-
244
-
245
235
  def _is_pytest_fixture(test: _TestFunction, imports: ImportIndex) -> bool:
246
236
  return any(
247
237
  imports.resolved_qualified_name(decorator.func if isinstance(decorator, ast.Call) else decorator)
@@ -14,7 +14,7 @@ from sarj_python_lint.rule_base import (
14
14
  RuleDocumentation,
15
15
  RuleExample,
16
16
  )
17
- from sarj_python_lint.rules._ast_index import walk as walk_ast
17
+ from sarj_python_lint.rules._exports import mentions_dunder_all
18
18
 
19
19
 
20
20
  if TYPE_CHECKING:
@@ -140,7 +140,7 @@ def _has_other_dunder_all_rebindings(tree: ast.Module, declaration: ast.stmt) ->
140
140
  continue
141
141
  if _is_supported_dunder_all_growth(statement):
142
142
  continue
143
- if _mentions_dunder_all(statement):
143
+ if mentions_dunder_all(statement):
144
144
  return True
145
145
  return False
146
146
 
@@ -155,28 +155,6 @@ def _is_supported_dunder_all_growth(statement: ast.stmt) -> bool:
155
155
  return False
156
156
 
157
157
 
158
- def _mentions_dunder_all(node: ast.AST) -> bool:
159
- for child in walk_ast(node):
160
- match child:
161
- case ast.Name(id="__all__"):
162
- return True
163
- case ast.alias() if (child.asname or child.name).split(".")[0] == "__all__":
164
- return True
165
- case ast.FunctionDef() | ast.AsyncFunctionDef() | ast.ClassDef() if child.name == "__all__":
166
- return True
167
- case ast.arg(arg="__all__") | ast.ExceptHandler(name="__all__"):
168
- return True
169
- case ast.MatchAs() | ast.MatchStar() if child.name == "__all__":
170
- return True
171
- case ast.MatchMapping(rest="__all__"):
172
- return True
173
- case ast.Global() | ast.Nonlocal() if "__all__" in child.names:
174
- return True
175
- case _:
176
- pass
177
- return False
178
-
179
-
180
158
  def _literal_elements(statement: ast.stmt) -> list[_LiteralElement] | None:
181
159
  value: ast.expr | None
182
160
  match statement:
@@ -17,6 +17,7 @@ from sarj_python_lint.rule_base import (
17
17
  RuleExample,
18
18
  Severity,
19
19
  )
20
+ from sarj_python_lint.rules._pytest import collected_tests
20
21
 
21
22
 
22
23
  if TYPE_CHECKING:
@@ -144,7 +145,7 @@ class NoFixedSleepBeforeAssert(Rule):
144
145
  imports = context.imports
145
146
  diagnostics = [
146
147
  Diagnostic(path=path, line=statement.lineno, col=statement.col_offset + 1, code=self.code, message=_MESSAGE)
147
- for test in _collected_tests(tree.body)
148
+ for test in collected_tests(tree.body)
148
149
  for statement, following in _adjacent_statements(test.body)
149
150
  if isinstance(following, ast.Assert) and _is_fixed_sleep(statement, test, imports)
150
151
  ]
@@ -155,17 +156,6 @@ def _is_collected_test_module(path: Path) -> bool:
155
156
  return path.suffix == ".py" and (path.stem.startswith("test_") or path.stem.endswith("_test"))
156
157
 
157
158
 
158
- def _collected_tests(statements: list[ast.stmt]) -> Iterator[_TestFunction]:
159
- for statement in statements:
160
- match statement:
161
- case ast.FunctionDef() | ast.AsyncFunctionDef() if statement.name.startswith("test"):
162
- yield statement
163
- case ast.ClassDef() if statement.name.startswith("Test"):
164
- yield from _collected_tests(statement.body)
165
- case _:
166
- pass
167
-
168
-
169
159
  def _adjacent_statements(block: list[ast.stmt]) -> Iterator[tuple[ast.stmt, ast.stmt]]:
170
160
  yield from pairwise(block)
171
161
  for statement in block:
@@ -15,6 +15,7 @@ from sarj_python_lint.rule_base import (
15
15
  RuleExample,
16
16
  )
17
17
  from sarj_python_lint.rules._ast_index import walk as walk_ast
18
+ from sarj_python_lint.rules._exports import mentions_dunder_all
18
19
 
19
20
 
20
21
  if TYPE_CHECKING:
@@ -145,7 +146,7 @@ def _has_additional_public_export(tree: ast.Module, primary_name: str) -> bool:
145
146
 
146
147
 
147
148
  def _dunder_all_matches_primary(tree: ast.Module, primary_name: str) -> bool:
148
- owners = [statement for statement in tree.body if _mentions_dunder_all(statement)]
149
+ owners = [statement for statement in tree.body if mentions_dunder_all(statement)]
149
150
  if not owners:
150
151
  return True
151
152
  if len(owners) != 1:
@@ -163,28 +164,6 @@ def _dunder_all_matches_primary(tree: ast.Module, primary_name: str) -> bool:
163
164
  return isinstance(entry, ast.Constant) and entry.value == primary_name
164
165
 
165
166
 
166
- def _mentions_dunder_all(node: ast.AST) -> bool:
167
- for child in walk_ast(node):
168
- match child:
169
- case ast.Name(id="__all__"):
170
- return True
171
- case ast.alias() if (child.asname or child.name).split(".")[0] == "__all__":
172
- return True
173
- case ast.FunctionDef() | ast.AsyncFunctionDef() | ast.ClassDef() if child.name == "__all__":
174
- return True
175
- case ast.arg(arg="__all__") | ast.ExceptHandler(name="__all__"):
176
- return True
177
- case ast.MatchAs() | ast.MatchStar() if child.name == "__all__":
178
- return True
179
- case ast.MatchMapping(rest="__all__"):
180
- return True
181
- case ast.Global() | ast.Nonlocal() if "__all__" in child.names:
182
- return True
183
- case _:
184
- pass
185
- return False
186
-
187
-
188
167
  def _annotation_name(node: ast.expr) -> str:
189
168
  match node:
190
169
  case ast.Name(id=name) | ast.Attribute(attr=name):