sarj-python-lint 1.7.5__tar.gz → 1.7.7__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.5 → sarj_python_lint-1.7.7}/PKG-INFO +1 -1
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/pyproject.toml +1 -1
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_registry.py +2 -0
- sarj_python_lint-1.7.7/src/sarj_python_lint/rules/discourage_nullable_constructor_parameters.py +122 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +2 -1
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/.gitignore +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/LICENSE +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/README.md +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/__init__.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/__main__.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_analysis_session.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_file_context.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_filesystem.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_python_target.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_ratchet_cli.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_secret_names.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/_version.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/benchmark.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/json_boundary.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/py.typed +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/ratchet.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rule_base.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/__init__.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_ast_index.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_ast_position.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_comments.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_docstrings.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_fastapi.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_first_party.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_imports.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_logging.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_paths.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_project_index.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_pytest.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_set_fields.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_sql.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_test_composition.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_select_star.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/stepdown.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
- {sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.7
|
|
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/
|
|
@@ -9,6 +9,7 @@ from sarj_python_lint.rules.complex_postgres_query_requires_architecture_review
|
|
|
9
9
|
ComplexPostgresQueryRequiresArchitectureReview,
|
|
10
10
|
)
|
|
11
11
|
from sarj_python_lint.rules.defect_xfail_requires_explicit_strict import DefectXfailRequiresExplicitStrict
|
|
12
|
+
from sarj_python_lint.rules.discourage_nullable_constructor_parameters import DiscourageNullableConstructorParameters
|
|
12
13
|
from sarj_python_lint.rules.docstring_args_restate_signature import (
|
|
13
14
|
DocstringArgsRestateSignature,
|
|
14
15
|
)
|
|
@@ -192,6 +193,7 @@ if TYPE_CHECKING:
|
|
|
192
193
|
REGISTRY: Mapping[str, type[Rule]] = MappingProxyType(
|
|
193
194
|
{
|
|
194
195
|
RequireExplicitContractImplementation.id: RequireExplicitContractImplementation,
|
|
196
|
+
DiscourageNullableConstructorParameters.id: DiscourageNullableConstructorParameters,
|
|
195
197
|
RequirePublicDependencyContract.id: RequirePublicDependencyContract,
|
|
196
198
|
RequireExplicitServiceContract.id: RequireExplicitServiceContract,
|
|
197
199
|
AsyncCleanupRegisteredSynchronously.id: AsyncCleanupRegisteredSynchronously,
|
sarj_python_lint-1.7.7/src/sarj_python_lint/rules/discourage_nullable_constructor_parameters.py
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
from pathlib import PurePosixPath
|
|
5
|
+
from typing import TYPE_CHECKING, ClassVar, final, override
|
|
6
|
+
|
|
7
|
+
from sarj_python_lint.rule_base import (
|
|
8
|
+
AutofixPolicy,
|
|
9
|
+
Diagnostic,
|
|
10
|
+
ExampleFile,
|
|
11
|
+
ExampleOutcome,
|
|
12
|
+
Rule,
|
|
13
|
+
RuleCategory,
|
|
14
|
+
RuleDocumentation,
|
|
15
|
+
RuleExample,
|
|
16
|
+
Severity,
|
|
17
|
+
)
|
|
18
|
+
from sarj_python_lint.rules._paths import is_test_path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from sarj_python_lint._file_context import PythonFileContext
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@final
|
|
26
|
+
class DiscourageNullableConstructorParameters(Rule):
|
|
27
|
+
id = "discourage-nullable-constructor-parameters"
|
|
28
|
+
code = "SARJ468"
|
|
29
|
+
documentation: ClassVar[RuleDocumentation | None] = RuleDocumentation(
|
|
30
|
+
default_level=Severity.WARNING,
|
|
31
|
+
summary="Avoid nullable constructor parameters when a non-nullable interface can express the choice.",
|
|
32
|
+
rationale=(
|
|
33
|
+
"Nullable constructor parameters allow partially configured objects and force callers and implementations "
|
|
34
|
+
"to handle an absent value. Required nullable parameters still permit this state."
|
|
35
|
+
),
|
|
36
|
+
remediation="Prefer a non-nullable dependency or a separate constructor for the absent case; suppress deliberate nullable values with a reason.",
|
|
37
|
+
category=RuleCategory.ARCHITECTURE,
|
|
38
|
+
autofix=AutofixPolicy.NONE,
|
|
39
|
+
limitations=(
|
|
40
|
+
"Only explicitly annotated `__init__` parameters using PEP 604 unions containing None are checked.",
|
|
41
|
+
"Tests and generated files are excluded; genuinely absent domain values may justify a suppression.",
|
|
42
|
+
),
|
|
43
|
+
examples=(
|
|
44
|
+
RuleExample(
|
|
45
|
+
example_id="nullable-dependency",
|
|
46
|
+
title="Constructor permits a missing dependency",
|
|
47
|
+
outcome=ExampleOutcome.MATCH,
|
|
48
|
+
files=(
|
|
49
|
+
ExampleFile.python(
|
|
50
|
+
"app/service.py",
|
|
51
|
+
"class Service:\n def __init__(self, store: Store | None = None) -> None:\n"
|
|
52
|
+
" self.store = store\n",
|
|
53
|
+
),
|
|
54
|
+
),
|
|
55
|
+
focus_path=PurePosixPath("app/service.py"),
|
|
56
|
+
expected_count=1,
|
|
57
|
+
public=True,
|
|
58
|
+
),
|
|
59
|
+
RuleExample(
|
|
60
|
+
example_id="non-nullable-dependency",
|
|
61
|
+
title="Constructor requires a usable dependency",
|
|
62
|
+
outcome=ExampleOutcome.NO_MATCH,
|
|
63
|
+
files=(
|
|
64
|
+
ExampleFile.python(
|
|
65
|
+
"app/service.py",
|
|
66
|
+
"class Service:\n def __init__(self, store: Store) -> None:\n self.store = store\n",
|
|
67
|
+
),
|
|
68
|
+
),
|
|
69
|
+
focus_path=PurePosixPath("app/service.py"),
|
|
70
|
+
expected_count=0,
|
|
71
|
+
public=True,
|
|
72
|
+
),
|
|
73
|
+
),
|
|
74
|
+
)
|
|
75
|
+
description = documentation.summary
|
|
76
|
+
|
|
77
|
+
@override
|
|
78
|
+
def check_context(self, context: PythonFileContext) -> list[Diagnostic]:
|
|
79
|
+
if context.generated or context.tree is None or is_test_path(context.path):
|
|
80
|
+
return []
|
|
81
|
+
findings: list[Diagnostic] = []
|
|
82
|
+
for node in ast.walk(context.tree):
|
|
83
|
+
if not isinstance(node, ast.ClassDef):
|
|
84
|
+
continue
|
|
85
|
+
for method in node.body:
|
|
86
|
+
if not isinstance(method, ast.FunctionDef | ast.AsyncFunctionDef) or method.name != "__init__":
|
|
87
|
+
continue
|
|
88
|
+
positional = method.args.posonlyargs + method.args.args
|
|
89
|
+
for parameter in (*positional, *method.args.kwonlyargs):
|
|
90
|
+
self._append_if_nullable(context, parameter, findings)
|
|
91
|
+
return findings
|
|
92
|
+
|
|
93
|
+
def _append_if_nullable(
|
|
94
|
+
self,
|
|
95
|
+
context: PythonFileContext,
|
|
96
|
+
parameter: ast.arg,
|
|
97
|
+
findings: list[Diagnostic],
|
|
98
|
+
) -> None:
|
|
99
|
+
if parameter.annotation is None or not _is_nullable_union(parameter.annotation):
|
|
100
|
+
return
|
|
101
|
+
findings.append(
|
|
102
|
+
Diagnostic(
|
|
103
|
+
path=context.path,
|
|
104
|
+
line=parameter.lineno,
|
|
105
|
+
col=parameter.col_offset + 1,
|
|
106
|
+
code=self.code,
|
|
107
|
+
severity=Severity.WARNING,
|
|
108
|
+
message=f"Constructor parameter `{parameter.arg}` accepts None; prefer a non-nullable interface.",
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _is_nullable_union(annotation: ast.expr) -> bool:
|
|
114
|
+
if not isinstance(annotation, ast.BinOp) or not isinstance(annotation.op, ast.BitOr):
|
|
115
|
+
return False
|
|
116
|
+
return _is_none_union_member(annotation.left) or _is_none_union_member(annotation.right)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _is_none_union_member(annotation: ast.expr) -> bool:
|
|
120
|
+
if isinstance(annotation, ast.BinOp) and isinstance(annotation.op, ast.BitOr):
|
|
121
|
+
return _is_none_union_member(annotation.left) or _is_none_union_member(annotation.right)
|
|
122
|
+
return isinstance(annotation, ast.Constant) and annotation.value is None
|
|
@@ -52,7 +52,7 @@ class PreferSetIsdisjoint(ProjectRule):
|
|
|
52
52
|
id = "prefer-set-isdisjoint"
|
|
53
53
|
code = "SARJ431"
|
|
54
54
|
documentation: ClassVar[RuleDocumentation | None] = RuleDocumentation(
|
|
55
|
-
default_level=Severity.
|
|
55
|
+
default_level=Severity.ERROR,
|
|
56
56
|
summary="Prefer `set.isdisjoint` when a built-in set intersection is used only as a boolean predicate.",
|
|
57
57
|
rationale="`isdisjoint` names the overlap predicate directly and avoids allocating an intersection that is immediately discarded.",
|
|
58
58
|
remediation="Use `left.isdisjoint(right)` and negate it when the condition requires overlap.",
|
|
@@ -70,6 +70,7 @@ class PreferSetIsdisjoint(ProjectRule):
|
|
|
70
70
|
title="A declared set field is used only for an overlap test",
|
|
71
71
|
outcome=ExampleOutcome.MATCH,
|
|
72
72
|
files=(
|
|
73
|
+
ExampleFile(PurePosixPath("pyproject.toml"), '[project]\nname = "example"\nversion = "0.1.0"\n'),
|
|
73
74
|
ExampleFile.python(
|
|
74
75
|
"app/policy.py",
|
|
75
76
|
"class AccessCase:\n tags: frozenset[str]\n\ndef accepts(case: AccessCase):\n if case.tags & {'read', 'write'}:\n allow()\n",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_ast_position.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_contract_annotation.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_dict_key_views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_first_party.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_fixed_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_nominal_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_project_index.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_prose_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/_test_assertions.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_any_mapping_types.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_delete_statement.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_dunder_all.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_restated_comment.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/no_secret_in_log.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/over_mocked_test.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/phase_label_comment.py
RENAMED
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/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.5 → sarj_python_lint-1.7.7}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/typed_error_reasons.py
RENAMED
|
File without changes
|
|
File without changes
|
{sarj_python_lint-1.7.5 → sarj_python_lint-1.7.7}/src/sarj_python_lint/rules/unused_mock_setup.py
RENAMED
|
File without changes
|
|
File without changes
|