sarj-python-lint 1.27.1__tar.gz → 1.27.2__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.
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/PKG-INFO +1 -1
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/pyproject.toml +1 -1
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +49 -14
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/.gitignore +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/LICENSE +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/README.md +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_source.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/interpreter_argv.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_local_source.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_registry.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
- {sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/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.27.
|
|
3
|
+
Version: 1.27.2
|
|
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/
|
|
@@ -29,7 +29,7 @@ _POLICIES: Final = frozenset(
|
|
|
29
29
|
)
|
|
30
30
|
_WAIT_MODULES: Final = frozenset({"tenacity", "tenacity.wait"})
|
|
31
31
|
_WALL_CLOCK_SLEEPS: Final = frozenset(
|
|
32
|
-
{"asyncio.sleep", "anyio.sleep", "trio.sleep", "time.sleep", "tenacity.nap.sleep"}
|
|
32
|
+
{"asyncio.sleep", "anyio.sleep", "trio.sleep", "time.sleep", "tenacity.sleep", "tenacity.nap.sleep"}
|
|
33
33
|
)
|
|
34
34
|
_MESSAGE: Final = (
|
|
35
35
|
"this tenacity policy waits between attempts on the wall clock without a sleep= seam; pass an injected sleep "
|
|
@@ -58,8 +58,8 @@ class RequireInjectableRetrySleep(Rule):
|
|
|
58
58
|
autofix=AutofixPolicy.NONE,
|
|
59
59
|
limitations=(
|
|
60
60
|
"Only calls to tenacity.retry, tenacity.Retrying, and tenacity.AsyncRetrying resolved through imports are inspected; bare @retry, positional arguments, and **kwargs expansion abstain.",
|
|
61
|
-
"A wait is reported only when it is built inline from tenacity wait_* calls, optionally combined with +; wait_none()
|
|
62
|
-
"Any sleep= argument other than a wall-clock sleep imported from asyncio, anyio, trio, time, or tenacity.nap counts as a seam; the rule does not prove that tests replace it.",
|
|
61
|
+
"A wait is reported only when it is built inline from tenacity wait_* calls, optionally combined with +; wait_none(), literal-zero wait_fixed and wait_random calls, and known zero-only wait_combine or wait_chain calls do not wait. A wait read from a name, attribute, or other call is treated as injected.",
|
|
62
|
+
"Any sleep= argument other than a wall-clock sleep imported from asyncio, anyio, trio, time, tenacity, or tenacity.nap counts as a seam; the rule does not prove that tests replace it.",
|
|
63
63
|
"The backoff library has no sleep parameter, so its decorators are not inspected. Test modules, test directories, conftest.py, test-support paths, and generated files are excluded.",
|
|
64
64
|
),
|
|
65
65
|
examples=(
|
|
@@ -143,20 +143,55 @@ def _waits_without_seam(call: ast.Call, imports: ImportIndex) -> bool:
|
|
|
143
143
|
def _wait_strategy(node: ast.expr, imports: ImportIndex) -> bool | None:
|
|
144
144
|
match node:
|
|
145
145
|
case ast.BinOp(left=left, op=ast.Add(), right=right):
|
|
146
|
-
|
|
147
|
-
return None if None in parts else any(parts)
|
|
146
|
+
return _combined_waits((left, right), imports)
|
|
148
147
|
case ast.Call(func=func, args=args, keywords=keywords):
|
|
149
148
|
module, _, strategy = (imports.resolved_qualified_name(func) or "").rpartition(".")
|
|
150
149
|
if module not in _WAIT_MODULES or not strategy.startswith("wait_"):
|
|
151
150
|
return None
|
|
152
|
-
|
|
153
|
-
case "wait_none", [], []:
|
|
154
|
-
return False
|
|
155
|
-
case "wait_fixed", [ast.Constant(value=0)], []:
|
|
156
|
-
return False
|
|
157
|
-
case "wait_fixed", [], [ast.keyword(arg="wait", value=ast.Constant(value=0))]:
|
|
158
|
-
return False
|
|
159
|
-
case _:
|
|
160
|
-
return True
|
|
151
|
+
return _wait_constructor(strategy, args, keywords, imports)
|
|
161
152
|
case _:
|
|
162
153
|
return None
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _wait_constructor(
|
|
157
|
+
strategy: str, args: list[ast.expr], keywords: list[ast.keyword], imports: ImportIndex
|
|
158
|
+
) -> bool | None:
|
|
159
|
+
match strategy, args, keywords:
|
|
160
|
+
case "wait_none", [], []:
|
|
161
|
+
return False
|
|
162
|
+
case ("wait_fixed", [value], []) | ("wait_fixed", [], [ast.keyword(arg="wait", value=value)]):
|
|
163
|
+
return not _literal_zero(value)
|
|
164
|
+
case "wait_random", _, _:
|
|
165
|
+
return _random_waits(args, keywords)
|
|
166
|
+
case "wait_combine" | "wait_chain", _, _:
|
|
167
|
+
if keywords or any(isinstance(argument, ast.Starred) for argument in args):
|
|
168
|
+
return None
|
|
169
|
+
if strategy == "wait_chain" and not args:
|
|
170
|
+
return None
|
|
171
|
+
return _combined_waits(tuple(args), imports)
|
|
172
|
+
case _:
|
|
173
|
+
return True
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _combined_waits(nodes: tuple[ast.expr, ...], imports: ImportIndex) -> bool | None:
|
|
177
|
+
parts = tuple(_wait_strategy(node, imports) for node in nodes)
|
|
178
|
+
return None if None in parts else any(parts)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _random_waits(args: list[ast.expr], keywords: list[ast.keyword]) -> bool | None:
|
|
182
|
+
names = ("min", "max")
|
|
183
|
+
if len(args) > len(names) or any(isinstance(argument, ast.Starred) for argument in args):
|
|
184
|
+
return None
|
|
185
|
+
values = dict(zip(names, args, strict=False))
|
|
186
|
+
for keyword in keywords:
|
|
187
|
+
if keyword.arg not in names or keyword.arg in values:
|
|
188
|
+
return None
|
|
189
|
+
values[keyword.arg] = keyword.value
|
|
190
|
+
return not (("min" not in values or _literal_zero(values["min"])) and _literal_zero(values.get("max")))
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _literal_zero(node: ast.expr | None) -> bool:
|
|
194
|
+
if isinstance(node, ast.UnaryOp) and isinstance(node.op, (ast.UAdd, ast.USub)):
|
|
195
|
+
operand = node.operand
|
|
196
|
+
return isinstance(operand, ast.Constant) and isinstance(operand.value, (int, float)) and operand.value == 0
|
|
197
|
+
return isinstance(node, ast.Constant) and node.value == 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/_analysis_session.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/interpreter_argv.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_ast_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_copy_on_write.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_local_source.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_prose_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_set_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_composition.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/_test_provenance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/mock_without_spec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_comment_cruft.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_dunder_all.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/no_select_star.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_class_row.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_or_pattern.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/prefer_str_enum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.27.1 → sarj_python_lint-1.27.2}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|
|
File without changes
|