sarj-python-lint 1.12.0__tar.gz → 1.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/PKG-INFO +1 -1
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/pyproject.toml +1 -1
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/unused_test_factory_option.py +94 -11
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/.gitignore +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/LICENSE +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/README.md +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_registry.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/discourage_nullable_constructor_parameters.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sarj-python-lint
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.13.0
|
|
4
4
|
Summary: Custom Python lint rules — AST-based, pre-commit-friendly, hypermodern defaults
|
|
5
5
|
Project-URL: Homepage, https://code-standards.sarj.ai/rules/python/
|
|
6
6
|
Project-URL: Documentation, https://code-standards.sarj.ai/rules/python/
|
|
@@ -38,14 +38,15 @@ class UnusedTestFactoryOption(Rule):
|
|
|
38
38
|
code = "SARJ443"
|
|
39
39
|
documentation: ClassVar[RuleDocumentation | None] = RuleDocumentation(
|
|
40
40
|
default_level=Severity.WARNING,
|
|
41
|
-
summary="A private test factory exposes
|
|
41
|
+
summary="A private test factory exposes an option that visible callers never vary.",
|
|
42
42
|
rationale="Unused customization obscures the values that actually distinguish test scenarios.",
|
|
43
43
|
remediation="Keep the value in the factory's construction instead of exposing an unused option; retain it if external callers need it.",
|
|
44
44
|
category=RuleCategory.TESTING,
|
|
45
45
|
autofix=AutofixPolicy.NONE,
|
|
46
46
|
limitations=(
|
|
47
47
|
"Only module-level private _make_ and _build_ helpers with straight-line local assignments ending in a construction return are considered; control flow and standalone side effects are excluded.",
|
|
48
|
-
"
|
|
48
|
+
"Literal defaults and stable earlier module-local function defaults are considered. Callable options are reported only when every direct caller omits them; explicit literal options require at least two calls with the same effective value.",
|
|
49
|
+
"Decorators, rebinding, shadowing, callable escapes, reflection, argument unpacking, and ambiguous provider mutation or patch targets exclude the affected helper or callable option.",
|
|
49
50
|
"Cross-module callers cannot be proven absent. Shared helpers require an exact suppression; this advisory never autofixes signatures or changes default evaluation timing.",
|
|
50
51
|
),
|
|
51
52
|
examples=(
|
|
@@ -77,6 +78,36 @@ class UnusedTestFactoryOption(Rule):
|
|
|
77
78
|
expected_count=0,
|
|
78
79
|
public=True,
|
|
79
80
|
),
|
|
81
|
+
RuleExample(
|
|
82
|
+
example_id="unused-callable-option",
|
|
83
|
+
scenario="callable-default",
|
|
84
|
+
title="Use an unexercised local dependency directly",
|
|
85
|
+
outcome=ExampleOutcome.MATCH,
|
|
86
|
+
files=(
|
|
87
|
+
ExampleFile.python(
|
|
88
|
+
"tests/test_widget.py",
|
|
89
|
+
"def _read():\n return 'value'\n\ndef _make_widget(*, read=_read):\n return Widget(read=read)\n\n_make_widget()\n",
|
|
90
|
+
),
|
|
91
|
+
),
|
|
92
|
+
focus_path=PurePosixPath("tests/test_widget.py"),
|
|
93
|
+
expected_count=1,
|
|
94
|
+
public=True,
|
|
95
|
+
),
|
|
96
|
+
RuleExample(
|
|
97
|
+
example_id="exercised-callable-option",
|
|
98
|
+
scenario="callable-default",
|
|
99
|
+
title="Keep a dependency that a caller replaces",
|
|
100
|
+
outcome=ExampleOutcome.NO_MATCH,
|
|
101
|
+
files=(
|
|
102
|
+
ExampleFile.python(
|
|
103
|
+
"tests/test_widget.py",
|
|
104
|
+
"def _read():\n return 'value'\n\ndef _make_widget(*, read=_read):\n return Widget(read=read)\n\n_make_widget(read=other)\n",
|
|
105
|
+
),
|
|
106
|
+
),
|
|
107
|
+
focus_path=PurePosixPath("tests/test_widget.py"),
|
|
108
|
+
expected_count=0,
|
|
109
|
+
public=True,
|
|
110
|
+
),
|
|
80
111
|
),
|
|
81
112
|
)
|
|
82
113
|
description = documentation.summary
|
|
@@ -173,6 +204,27 @@ def _factory_findings(
|
|
|
173
204
|
),
|
|
174
205
|
)
|
|
175
206
|
)
|
|
207
|
+
for argument, default in _factory_options(function):
|
|
208
|
+
if (
|
|
209
|
+
argument.arg in supplied
|
|
210
|
+
or not isinstance(default, ast.Name)
|
|
211
|
+
or not _is_stable_local_callable(tree, function, default.id, node_index=node_index)
|
|
212
|
+
or is_suppressed(lines, argument.lineno, code)
|
|
213
|
+
):
|
|
214
|
+
continue
|
|
215
|
+
findings.append(
|
|
216
|
+
Diagnostic(
|
|
217
|
+
path=path,
|
|
218
|
+
line=argument.lineno,
|
|
219
|
+
col=argument.col_offset + 1,
|
|
220
|
+
code=code,
|
|
221
|
+
severity=Severity.WARNING,
|
|
222
|
+
message=(
|
|
223
|
+
f"No direct caller in this file supplies `{function.name}.{argument.arg}`; use the stable local "
|
|
224
|
+
f"callable `{default.id}` in the factory instead of exposing an unused option. Retain it if external callers need it."
|
|
225
|
+
),
|
|
226
|
+
)
|
|
227
|
+
)
|
|
176
228
|
return findings
|
|
177
229
|
|
|
178
230
|
|
|
@@ -258,18 +310,49 @@ def _factory_argument_is_invariant(argument: ast.arg, default: ast.Constant, bou
|
|
|
258
310
|
)
|
|
259
311
|
|
|
260
312
|
|
|
261
|
-
def
|
|
262
|
-
options: list[tuple[ast.arg, ast.Constant]] = []
|
|
313
|
+
def _factory_options(function: ast.FunctionDef) -> list[tuple[ast.arg, ast.expr]]:
|
|
263
314
|
positional = [*function.args.posonlyargs, *function.args.args]
|
|
264
315
|
defaults = [
|
|
265
316
|
*zip(positional[len(positional) - len(function.args.defaults) :], function.args.defaults, strict=True),
|
|
266
317
|
*zip(function.args.kwonlyargs, function.args.kw_defaults, strict=True),
|
|
267
318
|
]
|
|
268
319
|
used = {node.id for node in nodes(function, ast.Name) if isinstance(node.ctx, ast.Load)}
|
|
269
|
-
for argument, default in defaults
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
320
|
+
return [(argument, default) for argument, default in defaults if argument.arg in used and default is not None]
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def _literal_factory_options(function: ast.FunctionDef) -> list[tuple[ast.arg, ast.Constant]]:
|
|
324
|
+
return [
|
|
325
|
+
(argument, default)
|
|
326
|
+
for argument, default in _factory_options(function)
|
|
327
|
+
if isinstance(default, ast.Constant)
|
|
328
|
+
and (default.value is None or isinstance(default.value, (str, bytes, int, float)))
|
|
329
|
+
]
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _is_stable_local_callable(
|
|
333
|
+
tree: ast.Module,
|
|
334
|
+
factory: ast.FunctionDef,
|
|
335
|
+
name: str,
|
|
336
|
+
*,
|
|
337
|
+
node_index: NodeIndex | None = None,
|
|
338
|
+
) -> bool:
|
|
339
|
+
if not any(
|
|
340
|
+
isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))
|
|
341
|
+
and node.name == name
|
|
342
|
+
and node.lineno < factory.lineno
|
|
343
|
+
and not node.decorator_list
|
|
344
|
+
for node in tree.body
|
|
345
|
+
) or not _has_unambiguous_factory_name(tree, name, node_index=node_index):
|
|
346
|
+
return False
|
|
347
|
+
return not (
|
|
348
|
+
any(node.id == name and not isinstance(node.ctx, ast.Load) for node in nodes(tree, ast.Name, index=node_index))
|
|
349
|
+
or any(
|
|
350
|
+
not isinstance(node.ctx, ast.Load) and any(child.id == name for child in nodes(node.value, ast.Name))
|
|
351
|
+
for node in nodes(tree, ast.Attribute, index=node_index)
|
|
352
|
+
)
|
|
353
|
+
or any(
|
|
354
|
+
isinstance(node.value, str)
|
|
355
|
+
and (node.value.rsplit(".", 1)[-1] == name or factory.name in node.value.split("."))
|
|
356
|
+
for node in nodes(tree, ast.Constant, index=node_index)
|
|
357
|
+
)
|
|
358
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_ast_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_set_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/_test_composition.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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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.12.0 → sarj_python_lint-1.13.0}/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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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
|
{sarj_python_lint-1.12.0 → sarj_python_lint-1.13.0}/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.12.0 → sarj_python_lint-1.13.0}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|