sarj-python-lint 1.14.0__tar.gz → 1.14.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/PKG-INFO +1 -1
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/pyproject.toml +1 -1
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +48 -8
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/.gitignore +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/LICENSE +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/README.md +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_registry.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/discourage_nullable_constructor_parameters.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
- {sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/unused_test_factory_option.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sarj-python-lint
|
|
3
|
-
Version: 1.14.
|
|
3
|
+
Version: 1.14.1
|
|
4
4
|
Summary: Custom Python lint rules — AST-based, pre-commit-friendly, hypermodern defaults
|
|
5
5
|
Project-URL: Homepage, https://code-standards.sarj.ai/rules/python/
|
|
6
6
|
Project-URL: Documentation, https://code-standards.sarj.ai/rules/python/
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import ast
|
|
4
|
+
from collections import Counter
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from pathlib import PurePosixPath
|
|
6
7
|
from typing import TYPE_CHECKING, ClassVar, final, override
|
|
@@ -48,7 +49,7 @@ _FALLBACK_VALUES = 2
|
|
|
48
49
|
@dataclass(frozen=True, slots=True)
|
|
49
50
|
class _ScopeUsage:
|
|
50
51
|
parents: dict[ast.AST, ast.AST]
|
|
51
|
-
|
|
52
|
+
calls: dict[str, list[ast.Call]]
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
@final
|
|
@@ -66,6 +67,7 @@ class NoNullableDependencyFallback(Rule):
|
|
|
66
67
|
limitations=(
|
|
67
68
|
"Warns for None-defaulted function parameters with a fallback used as a callable or a proven application-settings fallback; genuine absent state is allowed.",
|
|
68
69
|
"Constructors remain owned by SARJ095 and SARJ468. Decorated functions, tests, generated code, nested scope captures, non-callable object fallbacks, and interprocedural forwarding are excluded.",
|
|
70
|
+
"Callable use through a local assignment, annotation or None guard requires at most one body binding for that name and a call after the binding statement completes. Rebinding, deletion, imports, definitions, pattern or exception captures, global/nonlocal declarations and nested-scope bindings conservatively exclude that inference; direct inline calls and proven settings fallbacks remain independent.",
|
|
69
71
|
"No autofix: removing explicit None acceptance changes the callable contract, and moving a fallback can change initialization timing or error handling.",
|
|
70
72
|
),
|
|
71
73
|
examples=(
|
|
@@ -163,6 +165,8 @@ def _hidden_dependencies(
|
|
|
163
165
|
guard = _guarded_fallback(statement, candidates)
|
|
164
166
|
bindings = LocalBindingCollector()
|
|
165
167
|
bindings.visit(statement)
|
|
168
|
+
bindings.names.update(name for node in _scope_nodes(statement) for name in _binding_names(node))
|
|
169
|
+
bindings.names.update(node.target.id for node in ast.walk(statement) if isinstance(node, ast.NamedExpr))
|
|
166
170
|
# Branch/loop bindings are conservatively local; do not infer data flow.
|
|
167
171
|
if not isinstance(statement, (ast.Assign, ast.AnnAssign)) and guard is None:
|
|
168
172
|
candidates.difference_update(bindings.names)
|
|
@@ -177,7 +181,7 @@ def _hidden_dependencies(
|
|
|
177
181
|
)
|
|
178
182
|
if guard is not None:
|
|
179
183
|
name, value = guard
|
|
180
|
-
if name
|
|
184
|
+
if _called_after(name, statement, usage) or _is_settings_fallback(value, resolver, shadowed):
|
|
181
185
|
hidden.add(name)
|
|
182
186
|
candidates.difference_update(bindings.names)
|
|
183
187
|
return hidden
|
|
@@ -186,8 +190,41 @@ def _hidden_dependencies(
|
|
|
186
190
|
def _scope_usage(function: ast.FunctionDef | ast.AsyncFunctionDef) -> _ScopeUsage:
|
|
187
191
|
nodes = [node for statement in function.body for node in _scope_nodes(statement)]
|
|
188
192
|
parents = {child: node for node in nodes for child in ast.iter_child_nodes(node)}
|
|
189
|
-
|
|
190
|
-
|
|
193
|
+
bindings = Counter(
|
|
194
|
+
name for statement in function.body for node in ast.walk(statement) for name in _binding_names(node)
|
|
195
|
+
)
|
|
196
|
+
calls: dict[str, list[ast.Call]] = {}
|
|
197
|
+
for node in nodes:
|
|
198
|
+
if isinstance(node, ast.Call) and isinstance(node.func, ast.Name) and bindings[node.func.id] <= 1:
|
|
199
|
+
calls.setdefault(node.func.id, []).append(node)
|
|
200
|
+
return _ScopeUsage(parents=parents, calls=calls)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _called_after(name: str, binding: ast.stmt, usage: _ScopeUsage) -> bool:
|
|
204
|
+
end = (binding.end_lineno or binding.lineno, binding.end_col_offset or binding.col_offset)
|
|
205
|
+
return any((call.lineno, call.col_offset) > end for call in usage.calls.get(name, ()))
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _binding_names(node: ast.AST) -> Iterator[str]:
|
|
209
|
+
match node:
|
|
210
|
+
case (
|
|
211
|
+
ast.Name(id=name, ctx=(ast.Store() | ast.Del()))
|
|
212
|
+
| ast.arg(arg=name)
|
|
213
|
+
| ast.FunctionDef(name=name)
|
|
214
|
+
| ast.AsyncFunctionDef(name=name)
|
|
215
|
+
| ast.ClassDef(name=name)
|
|
216
|
+
| ast.ExceptHandler(name=str() as name)
|
|
217
|
+
| ast.MatchAs(name=str() as name)
|
|
218
|
+
| ast.MatchStar(name=str() as name)
|
|
219
|
+
| ast.MatchMapping(rest=str() as name)
|
|
220
|
+
):
|
|
221
|
+
yield name
|
|
222
|
+
case ast.alias(name=imported, asname=alias):
|
|
223
|
+
yield alias or imported.partition(".")[0]
|
|
224
|
+
case ast.Global(names=names) | ast.Nonlocal(names=names):
|
|
225
|
+
yield from names
|
|
226
|
+
case _:
|
|
227
|
+
return
|
|
191
228
|
|
|
192
229
|
|
|
193
230
|
def _expression_dependencies(
|
|
@@ -270,7 +307,10 @@ def _used_as_dependency(node: ast.AST, usage: _ScopeUsage) -> bool:
|
|
|
270
307
|
parent = usage.parents.get(node)
|
|
271
308
|
if isinstance(parent, ast.Call) and parent.func is node:
|
|
272
309
|
return True
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
310
|
+
match parent:
|
|
311
|
+
case (
|
|
312
|
+
ast.Assign(targets=[ast.Name(id=name)], value=value) | ast.AnnAssign(target=ast.Name(id=name), value=value)
|
|
313
|
+
) if value is node:
|
|
314
|
+
return _called_after(name, parent, usage)
|
|
315
|
+
case _:
|
|
316
|
+
return False
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_ast_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/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.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_set_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/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
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.14.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/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.0 → sarj_python_lint-1.14.1}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|
|
File without changes
|