sarj-python-lint 1.14.1__tar.gz → 1.14.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.14.1 → sarj_python_lint-1.14.2}/PKG-INFO +1 -1
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/pyproject.toml +1 -1
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_registry.py +2 -0
- sarj_python_lint-1.14.2/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +168 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/.gitignore +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/LICENSE +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/README.md +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/discourage_nullable_constructor_parameters.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
- {sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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.14.
|
|
3
|
+
Version: 1.14.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/
|
|
@@ -88,6 +88,7 @@ from sarj_python_lint.rules.no_unique_violation_message_match import (
|
|
|
88
88
|
NoUniqueViolationMessageMatch,
|
|
89
89
|
)
|
|
90
90
|
from sarj_python_lint.rules.no_unnecessary_docstring import NoUnnecessaryDocstring
|
|
91
|
+
from sarj_python_lint.rules.no_unused_underscored_keyword_parameter import NoUnusedUnderscoredKeywordParameter
|
|
91
92
|
from sarj_python_lint.rules.no_unused_value_marker import NoUnusedValueMarker
|
|
92
93
|
from sarj_python_lint.rules.no_vague_suppression_description import (
|
|
93
94
|
NoVagueSuppressionDescription,
|
|
@@ -306,6 +307,7 @@ REGISTRY: Mapping[str, type[Rule]] = MappingProxyType(
|
|
|
306
307
|
NoTypedDocSections.id: NoTypedDocSections,
|
|
307
308
|
NoUnnecessaryDocstring.id: NoUnnecessaryDocstring,
|
|
308
309
|
NoUnusedValueMarker.id: NoUnusedValueMarker,
|
|
310
|
+
NoUnusedUnderscoredKeywordParameter.id: NoUnusedUnderscoredKeywordParameter,
|
|
309
311
|
PreferNominalIdTypes.id: PreferNominalIdTypes,
|
|
310
312
|
NoAnyMappingTypes.id: NoAnyMappingTypes,
|
|
311
313
|
NoUniqueViolationMessageMatch.id: NoUniqueViolationMessageMatch,
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
from itertools import chain
|
|
5
|
+
from pathlib import PurePosixPath
|
|
6
|
+
from typing import TYPE_CHECKING, ClassVar, final, override
|
|
7
|
+
|
|
8
|
+
from sarj_python_lint.rule_base import (
|
|
9
|
+
AutofixPolicy,
|
|
10
|
+
Diagnostic,
|
|
11
|
+
ExampleFile,
|
|
12
|
+
ExampleOutcome,
|
|
13
|
+
Rule,
|
|
14
|
+
RuleCategory,
|
|
15
|
+
RuleDocumentation,
|
|
16
|
+
RuleExample,
|
|
17
|
+
Severity,
|
|
18
|
+
is_suppressed,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from sarj_python_lint._file_context import PythonFileContext
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@final
|
|
27
|
+
class NoUnusedUnderscoredKeywordParameter(Rule):
|
|
28
|
+
id = "no-unused-underscored-keyword-parameter"
|
|
29
|
+
code = "SARJ475"
|
|
30
|
+
documentation: ClassVar[RuleDocumentation | None] = RuleDocumentation(
|
|
31
|
+
default_level=Severity.WARNING,
|
|
32
|
+
summary="Remove unused underscore-prefixed keyword-only parameters instead of hiding them from lint.",
|
|
33
|
+
rationale=(
|
|
34
|
+
"A keyword-only parameter requires callers to use its declared name. Prefixing an unused input with an "
|
|
35
|
+
"underscore silences unused-argument lint while retaining an input whose value has no effect. Removing "
|
|
36
|
+
"the dead input and its callers keeps the callable's interface honest."
|
|
37
|
+
),
|
|
38
|
+
remediation=(
|
|
39
|
+
"Remove the unused keyword-only parameter and update callers together. If an external contract requires "
|
|
40
|
+
"the input, preserve its required spelling and use a narrow, reasoned unused-argument suppression."
|
|
41
|
+
),
|
|
42
|
+
category=RuleCategory.MAINTAINABILITY,
|
|
43
|
+
autofix=AutofixPolicy.NONE,
|
|
44
|
+
limitations=(
|
|
45
|
+
"Only underscore-prefixed keyword-only declarations are checked; positional and variadic callback slots are excluded.",
|
|
46
|
+
"Decorated functions other than unshadowed builtin staticmethod/classmethod, inherited methods, and intentional stubs are excluded.",
|
|
47
|
+
"Any reference within the body counts as use, including nested scopes; shadowing and reassignment can produce false negatives.",
|
|
48
|
+
"Functions accessing locals, vars, eval, or exec through recognized builtin bindings are excluded.",
|
|
49
|
+
"Call sites, lambda parameters, unknown dynamic reflection, and cross-module callback contracts are not resolved.",
|
|
50
|
+
"Generated and vendored files are excluded; test source is checked.",
|
|
51
|
+
),
|
|
52
|
+
examples=(
|
|
53
|
+
RuleExample(
|
|
54
|
+
example_id="discarded-keyword-input",
|
|
55
|
+
title="An ignored keyword input is kept just to silence unused-argument lint",
|
|
56
|
+
outcome=ExampleOutcome.MATCH,
|
|
57
|
+
files=(ExampleFile.python("app/sink.py", "def emit(*, _email=None):\n return 'ready'\n"),),
|
|
58
|
+
focus_path=PurePosixPath("app/sink.py"),
|
|
59
|
+
expected_count=1,
|
|
60
|
+
public=True,
|
|
61
|
+
),
|
|
62
|
+
RuleExample(
|
|
63
|
+
example_id="removed-keyword-input",
|
|
64
|
+
title="The callable exposes only inputs it uses",
|
|
65
|
+
outcome=ExampleOutcome.NO_MATCH,
|
|
66
|
+
files=(ExampleFile.python("app/sink.py", "def emit():\n return 'ready'\n"),),
|
|
67
|
+
focus_path=PurePosixPath("app/sink.py"),
|
|
68
|
+
expected_count=0,
|
|
69
|
+
public=True,
|
|
70
|
+
),
|
|
71
|
+
),
|
|
72
|
+
)
|
|
73
|
+
description = documentation.summary
|
|
74
|
+
|
|
75
|
+
@override
|
|
76
|
+
def check_context(self, context: PythonFileContext) -> list[Diagnostic]:
|
|
77
|
+
if context.generated or "_" not in context.source or context.tree is None:
|
|
78
|
+
return []
|
|
79
|
+
findings: list[Diagnostic] = []
|
|
80
|
+
for function in context.nodes(ast.FunctionDef, ast.AsyncFunctionDef):
|
|
81
|
+
for argument in _unused_parameters(context, function):
|
|
82
|
+
if is_suppressed(context.source_lines, argument.lineno, self.code):
|
|
83
|
+
continue
|
|
84
|
+
findings.append(
|
|
85
|
+
Diagnostic(
|
|
86
|
+
path=context.path,
|
|
87
|
+
line=argument.lineno,
|
|
88
|
+
col=argument.col_offset + 1,
|
|
89
|
+
code=self.code,
|
|
90
|
+
severity=Severity.WARNING,
|
|
91
|
+
message=(
|
|
92
|
+
f"keyword-only parameter `{argument.arg}` is never referenced; remove the unused input "
|
|
93
|
+
"and its callers instead of hiding it from unused-argument lint"
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
return sorted(findings, key=lambda item: (item.line, item.col))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _unused_parameters(
|
|
101
|
+
context: PythonFileContext, function: ast.FunctionDef | ast.AsyncFunctionDef
|
|
102
|
+
) -> tuple[ast.arg, ...]:
|
|
103
|
+
candidates = [argument for argument in function.args.kwonlyargs if argument.arg.startswith("_")]
|
|
104
|
+
if not candidates or _has_contract(context, function) or _is_stub(function):
|
|
105
|
+
return ()
|
|
106
|
+
body = list(chain.from_iterable(ast.walk(statement) for statement in function.body))
|
|
107
|
+
if _reads_dynamic_locals(context, body):
|
|
108
|
+
return ()
|
|
109
|
+
references = {node.id for node in body if isinstance(node, ast.Name)}
|
|
110
|
+
return tuple(argument for argument in candidates if argument.arg not in references)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _has_contract(context: PythonFileContext, function: ast.FunctionDef | ast.AsyncFunctionDef) -> bool:
|
|
114
|
+
parent = context.parents.get(function)
|
|
115
|
+
while parent is not None and not isinstance(
|
|
116
|
+
parent, ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef | ast.Module
|
|
117
|
+
):
|
|
118
|
+
parent = context.parents.get(parent)
|
|
119
|
+
if isinstance(parent, ast.ClassDef) and parent.bases:
|
|
120
|
+
return True
|
|
121
|
+
return any(
|
|
122
|
+
not (
|
|
123
|
+
isinstance(decorator, ast.Name)
|
|
124
|
+
and decorator.id in {"staticmethod", "classmethod"}
|
|
125
|
+
and context.imports.builtin_is_unshadowed(decorator.id)
|
|
126
|
+
)
|
|
127
|
+
for decorator in function.decorator_list
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _is_stub(function: ast.FunctionDef | ast.AsyncFunctionDef) -> bool:
|
|
132
|
+
body = function.body
|
|
133
|
+
if (
|
|
134
|
+
body
|
|
135
|
+
and isinstance(body[0], ast.Expr)
|
|
136
|
+
and isinstance(body[0].value, ast.Constant)
|
|
137
|
+
and isinstance(body[0].value.value, str)
|
|
138
|
+
):
|
|
139
|
+
body = body[1:]
|
|
140
|
+
if len(body) != 1:
|
|
141
|
+
return False
|
|
142
|
+
match body[0]:
|
|
143
|
+
case ast.Pass() | ast.Return(value=None) | ast.Return(value=ast.Constant(value=None)):
|
|
144
|
+
return True
|
|
145
|
+
case ast.Expr(value=ast.Constant(value=value)):
|
|
146
|
+
return value is Ellipsis
|
|
147
|
+
case ast.Raise(exc=exception):
|
|
148
|
+
if isinstance(exception, ast.Call):
|
|
149
|
+
exception = exception.func
|
|
150
|
+
return isinstance(exception, ast.Name) and exception.id == "NotImplementedError"
|
|
151
|
+
case _:
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _reads_dynamic_locals(context: PythonFileContext, body: list[ast.AST]) -> bool:
|
|
156
|
+
return any(
|
|
157
|
+
isinstance(node, ast.expr)
|
|
158
|
+
and (
|
|
159
|
+
(
|
|
160
|
+
isinstance(node, ast.Name)
|
|
161
|
+
and node.id in {"locals", "vars", "eval", "exec"}
|
|
162
|
+
and context.module_imports.builtin_is_unshadowed(node.id)
|
|
163
|
+
)
|
|
164
|
+
or context.module_imports.resolved_symbol(node, sources=frozenset({"builtins"}))
|
|
165
|
+
in {"locals", "vars", "eval", "exec"}
|
|
166
|
+
)
|
|
167
|
+
for node in body
|
|
168
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_ast_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_prose_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_set_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/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.14.1 → sarj_python_lint-1.14.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
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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.14.1 → sarj_python_lint-1.14.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
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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
|
{sarj_python_lint-1.14.1 → sarj_python_lint-1.14.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.14.1 → sarj_python_lint-1.14.2}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|
|
File without changes
|