sarj-python-lint 1.7.2__tar.gz → 1.7.3__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.7.2 → sarj_python_lint-1.7.3}/PKG-INFO +1 -1
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/pyproject.toml +1 -1
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +28 -7
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +8 -8
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +1 -1
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/.gitignore +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/LICENSE +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/README.md +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_registry.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
- {sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/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.7.
|
|
3
|
+
Version: 1.7.3
|
|
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/
|
|
@@ -17,7 +17,6 @@ from sarj_python_lint.rule_base import (
|
|
|
17
17
|
Severity,
|
|
18
18
|
is_suppressed,
|
|
19
19
|
)
|
|
20
|
-
from sarj_python_lint.rules._ast_index import walk as walk_ast
|
|
21
20
|
from sarj_python_lint.rules._paths import is_test_path, is_test_support_path
|
|
22
21
|
|
|
23
22
|
|
|
@@ -66,7 +65,7 @@ class NoServiceBehaviorInSettings(Rule):
|
|
|
66
65
|
autofix=AutofixPolicy.NONE,
|
|
67
66
|
limitations=(
|
|
68
67
|
"Only direct module classes named *Settings, *Config, *Configuration, or *Options are checked.",
|
|
69
|
-
"A finding requires a typed collaborator field and an ordinary public method that calls that field; pure computations, properties, validators, serializers, factories, generated files, and tests are excluded.",
|
|
68
|
+
"A finding requires a typed collaborator field and an ordinary public method that calls that field; pure computations, properties, validators, serializers, factories, generated files, and tests are excluded. Nested scopes, containers of collaborators, class objects, and methods that rebind self are not inferred.",
|
|
70
69
|
"The rule does not require every data object to use a particular record library and does not infer behavior from a filename alone.",
|
|
71
70
|
),
|
|
72
71
|
examples=(
|
|
@@ -180,10 +179,19 @@ def _collaborator_fields(node: ast.ClassDef) -> frozenset[str]:
|
|
|
180
179
|
def _is_collaborator_annotation(annotation: ast.expr | None) -> bool:
|
|
181
180
|
if annotation is None:
|
|
182
181
|
return False
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
182
|
+
if isinstance(annotation, ast.BinOp) and isinstance(annotation.op, ast.BitOr):
|
|
183
|
+
return _is_collaborator_annotation(annotation.left) or _is_collaborator_annotation(annotation.right)
|
|
184
|
+
if isinstance(annotation, ast.Subscript):
|
|
185
|
+
wrapper = _dotted_tail(annotation.value)
|
|
186
|
+
if wrapper in {"Optional", "Union"}:
|
|
187
|
+
members = annotation.slice.elts if isinstance(annotation.slice, ast.Tuple) else [annotation.slice]
|
|
188
|
+
return any(_is_collaborator_annotation(member) for member in members)
|
|
189
|
+
if wrapper == "Annotated" and isinstance(annotation.slice, ast.Tuple) and annotation.slice.elts:
|
|
190
|
+
return _is_collaborator_annotation(annotation.slice.elts[0])
|
|
191
|
+
return _is_collaborator_annotation(annotation.value)
|
|
192
|
+
return (
|
|
193
|
+
isinstance(annotation, (ast.Name, ast.Attribute))
|
|
194
|
+
and _COLLABORATOR_RE.search(_dotted_tail(annotation) or "") is not None
|
|
187
195
|
)
|
|
188
196
|
|
|
189
197
|
|
|
@@ -198,9 +206,22 @@ def _is_behavioral_method(method: ast.FunctionDef | ast.AsyncFunctionDef) -> boo
|
|
|
198
206
|
|
|
199
207
|
|
|
200
208
|
def _calls_collaborator(method: ast.FunctionDef | ast.AsyncFunctionDef, fields: frozenset[str]) -> bool:
|
|
209
|
+
nodes: list[ast.AST] = []
|
|
210
|
+
pending: list[ast.AST] = list(method.body)
|
|
211
|
+
while pending:
|
|
212
|
+
node = pending.pop()
|
|
213
|
+
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef, ast.Lambda)):
|
|
214
|
+
continue
|
|
215
|
+
nodes.append(node)
|
|
216
|
+
pending.extend(ast.iter_child_nodes(node))
|
|
217
|
+
if any(
|
|
218
|
+
isinstance(node, ast.Name) and node.id == "self" and isinstance(node.ctx, (ast.Store, ast.Del))
|
|
219
|
+
for node in nodes
|
|
220
|
+
):
|
|
221
|
+
return False
|
|
201
222
|
return any(
|
|
202
223
|
(field := _self_field(call.func)) is not None and field in fields
|
|
203
|
-
for call in
|
|
224
|
+
for call in nodes
|
|
204
225
|
if isinstance(call, ast.Call)
|
|
205
226
|
)
|
|
206
227
|
|
|
@@ -219,14 +219,14 @@ def _is_syntax_required(owner: ast.Module | ast.ClassDef | ast.FunctionDef | ast
|
|
|
219
219
|
def _owner_keys(tree: ast.Module) -> dict[int, str]:
|
|
220
220
|
keys = {id(tree): "__doc__"}
|
|
221
221
|
|
|
222
|
-
def visit(
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
visit(tree
|
|
222
|
+
def visit(node: ast.AST, prefix: tuple[str, ...]) -> None:
|
|
223
|
+
if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)):
|
|
224
|
+
prefix = (*prefix, node.name)
|
|
225
|
+
keys[id(node)] = ".".join(prefix)
|
|
226
|
+
for child in ast.iter_child_nodes(node):
|
|
227
|
+
visit(child, prefix)
|
|
228
|
+
|
|
229
|
+
visit(tree, ())
|
|
230
230
|
return keys
|
|
231
231
|
|
|
232
232
|
|
|
@@ -55,7 +55,7 @@ class RequireExplicitPsycopgTransaction(Rule):
|
|
|
55
55
|
"Inspects literal SQL, simple local/module constants, and psycopg.sql.SQL wrappers. Dynamic SQL and unsupported SQL syntax are excluded.",
|
|
56
56
|
"A locking SELECT followed by a write on the same connection outside transaction() is reported; a single statement containing a mutation is treated as atomic. Multiple writes on a reachable local path are a warning because independent writes can be intentional.",
|
|
57
57
|
"Loops, exception handlers, match statements, comprehensions, and nested closures are not analyzed as execution paths. Manual BEGIN/commit protocols are not inferred. Tests, support fixtures, and generated files are excluded.",
|
|
58
|
-
"The rule cannot prove isolation level, database constraints, or application-level atomicity; fault-injection integration tests remain necessary.",
|
|
58
|
+
"Non-autocommit connections can already provide implicit transaction protection. A manual commit is not itself evidence of a defect or of safety in autocommit mode; document the proven connection configuration when retaining that protocol. The rule cannot prove isolation level, database constraints, or application-level atomicity; fault-injection integration tests remain necessary.",
|
|
59
59
|
),
|
|
60
60
|
examples=(
|
|
61
61
|
RuleExample(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_prose_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_resource_provenance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/excessive_commentary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/mock_without_spec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_any_mapping_types.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_comment_cruft.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_delete_statement.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_dunder_all.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_fastapi_on_event.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_offset_pagination.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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_restated_comment.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/phase_label_comment.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/prefer_library_fake.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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/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.7.2 → sarj_python_lint-1.7.3}/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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/redundant_docstring.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
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/typed_error_reasons.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.2 → sarj_python_lint-1.7.3}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|
|
File without changes
|