sarj-python-lint 1.27.4__tar.gz → 1.27.5__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.
Files changed (187) hide show
  1. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/PKG-INFO +1 -1
  2. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/pyproject.toml +1 -1
  3. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/interpreter_argv.py +48 -14
  4. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/.gitignore +0 -0
  5. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/LICENSE +0 -0
  6. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/README.md +0 -0
  7. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/__init__.py +0 -0
  8. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/__main__.py +0 -0
  9. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_analysis_session.py +0 -0
  10. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_file_context.py +0 -0
  11. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_filesystem.py +0 -0
  12. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_python_target.py +0 -0
  13. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_ratchet_cli.py +0 -0
  14. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_secret_names.py +0 -0
  15. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_source.py +0 -0
  16. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/_version.py +0 -0
  17. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/benchmark.py +0 -0
  18. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/json_boundary.py +0 -0
  19. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/py.typed +0 -0
  20. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/ratchet.py +0 -0
  21. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rule_base.py +0 -0
  22. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/__init__.py +0 -0
  23. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_annotation_semantics.py +0 -0
  24. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_ast_index.py +0 -0
  25. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_ast_position.py +0 -0
  26. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_comments.py +0 -0
  27. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_contract_annotation.py +0 -0
  28. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_copy_on_write.py +0 -0
  29. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_dict_key_views.py +0 -0
  30. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_docstrings.py +0 -0
  31. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_fastapi.py +0 -0
  32. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_first_party.py +0 -0
  33. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_fixed_record.py +0 -0
  34. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_imports.py +0 -0
  35. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_local_source.py +0 -0
  36. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_logging.py +0 -0
  37. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_nominal_project.py +0 -0
  38. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_paths.py +0 -0
  39. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_project_index.py +0 -0
  40. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_prose_budget.py +0 -0
  41. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_pytest.py +0 -0
  42. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_registry.py +0 -0
  43. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_resource_provenance.py +0 -0
  44. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_set_fields.py +0 -0
  45. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_sql.py +0 -0
  46. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_suppression_comments.py +0 -0
  47. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_test_assertions.py +0 -0
  48. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_test_composition.py +0 -0
  49. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/_test_provenance.py +0 -0
  50. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py +0 -0
  51. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py +0 -0
  52. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py +0 -0
  53. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py +0 -0
  54. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/docstring_args_restate_signature.py +0 -0
  55. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/docstring_returns_restate_signature.py +0 -0
  56. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/excessive_commentary.py +0 -0
  57. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/fakes_in_shared_location.py +0 -0
  58. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/fastapi_class_router_contract.py +0 -0
  59. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py +0 -0
  60. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/iac_source_coupled_test.py +0 -0
  61. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/invalid_pydantic_field_default.py +0 -0
  62. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/mock_without_spec.py +0 -0
  63. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/named_record_at_boundaries.py +0 -0
  64. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/negative_only_http_status_assertion.py +0 -0
  65. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py +0 -0
  66. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_any_mapping_types.py +0 -0
  67. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_before_validator_input_mutation.py +0 -0
  68. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_broad_keyword_capture.py +0 -0
  69. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_comment_cruft.py +0 -0
  70. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_conftest_test_module_import.py +0 -0
  71. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_copied_inherited_docstring.py +0 -0
  72. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py +0 -0
  73. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_database_programmability.py +0 -0
  74. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_delete_statement.py +0 -0
  75. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_dunder_all.py +0 -0
  76. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py +0 -0
  77. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py +0 -0
  78. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_fastapi_on_event.py +0 -0
  79. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py +0 -0
  80. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_first_party_private_import.py +0 -0
  81. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py +0 -0
  82. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py +0 -0
  83. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py +0 -0
  84. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_generic_single_export_module.py +0 -0
  85. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py +0 -0
  86. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_injected_module_loader.py +0 -0
  87. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_input_model_mutation.py +0 -0
  88. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_interpreter_source_arguments.py +0 -0
  89. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py +0 -0
  90. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py +0 -0
  91. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py +0 -0
  92. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py +0 -0
  93. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_offset_pagination.py +0 -0
  94. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py +0 -0
  95. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py +0 -0
  96. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_random_uuid_in_sql.py +0 -0
  97. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_raw_connection_in_tests.py +0 -0
  98. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py +0 -0
  99. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_redundant_literal_description.py +0 -0
  100. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py +0 -0
  101. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_repeated_string_literal.py +0 -0
  102. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_repeated_test_body.py +0 -0
  103. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_restated_comment.py +0 -0
  104. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_secret_in_log.py +0 -0
  105. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_select_star.py +0 -0
  106. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_service_behavior_in_settings.py +0 -0
  107. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_shallow_container_type_guard.py +0 -0
  108. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_string_concat_in_loop.py +0 -0
  109. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py +0 -0
  110. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_tautological_expect.py +0 -0
  111. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_test_method_grafting.py +0 -0
  112. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_typed_doc_sections.py +0 -0
  113. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_unique_violation_message_match.py +0 -0
  114. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_unnecessary_docstring.py +0 -0
  115. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_unused_copy_result.py +0 -0
  116. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py +0 -0
  117. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_unused_value_marker.py +0 -0
  118. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_vague_suppression_description.py +0 -0
  119. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py +0 -0
  120. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py +0 -0
  121. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/over_mocked_test.py +0 -0
  122. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/phase_label_comment.py +0 -0
  123. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py +0 -0
  124. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_class_row.py +0 -0
  125. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_collection_comprehension.py +0 -0
  126. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py +0 -0
  127. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_fstring_over_concat.py +0 -0
  128. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_immutable_module_constant.py +0 -0
  129. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py +0 -0
  130. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_library_fake.py +0 -0
  131. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_match_assert_never.py +0 -0
  132. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py +0 -0
  133. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_match_type_dispatch.py +0 -0
  134. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_match_value_dispatch.py +0 -0
  135. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_module_level_constant.py +0 -0
  136. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py +0 -0
  137. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py +0 -0
  138. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py +0 -0
  139. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_native_string_check.py +0 -0
  140. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_nominal_id_types.py +0 -0
  141. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_non_nullable_collection.py +0 -0
  142. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_or_pattern.py +0 -0
  143. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_pydantic_json_value.py +0 -0
  144. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py +0 -0
  145. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_regex_fullmatch.py +0 -0
  146. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py +0 -0
  147. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_self_documenting_constant.py +0 -0
  148. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_self_type_annotation.py +0 -0
  149. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_set_isdisjoint.py +0 -0
  150. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_str_enum.py +0 -0
  151. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py +0 -0
  152. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py +0 -0
  153. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py +0 -0
  154. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_walrus_regex_match.py +0 -0
  155. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py +0 -0
  156. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/production_derived_test_cases.py +0 -0
  157. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py +0 -0
  158. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/redundant_class_docstring.py +0 -0
  159. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/redundant_docstring.py +0 -0
  160. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/redundant_module_docstring.py +0 -0
  161. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py +0 -0
  162. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/repeated_static_call_cases.py +0 -0
  163. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/repeated_test_composition.py +0 -0
  164. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_explicit_contract_implementation.py +0 -0
  165. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py +0 -0
  166. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_explicit_service_contract.py +0 -0
  167. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_injectable_retry_sleep.py +0 -0
  168. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py +0 -0
  169. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py +0 -0
  170. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_port_for_service.py +0 -0
  171. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_precise_factory_signature.py +0 -0
  172. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_public_dependency_contract.py +0 -0
  173. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_pydantic_for_external_json.py +0 -0
  174. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py +0 -0
  175. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py +0 -0
  176. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/restated_test_docstring.py +0 -0
  177. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py +0 -0
  178. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/stepdown.py +0 -0
  179. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py +0 -0
  180. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py +0 -0
  181. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/subprocess_kill_without_reap.py +0 -0
  182. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py +0 -0
  183. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/trailing_value_narration.py +0 -0
  184. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/typed_error_reasons.py +0 -0
  185. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py +0 -0
  186. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/src/sarj_python_lint/rules/unused_mock_setup.py +0 -0
  187. {sarj_python_lint-1.27.4 → sarj_python_lint-1.27.5}/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.27.4
3
+ Version: 1.27.5
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,6 @@
1
1
  [project]
2
2
  name = "sarj-python-lint"
3
- version = "1.27.4"
3
+ version = "1.27.5"
4
4
  description = "Custom Python lint rules — AST-based, pre-commit-friendly, hypermodern defaults"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "sarj-ai" }]
@@ -29,6 +29,7 @@ class ParsedOption:
29
29
  invocation: InterpreterInvocation | None = None
30
30
  consumed: int = 1
31
31
  stdin_mode: bool = False
32
+ command_mode: bool = False
32
33
 
33
34
 
34
35
  _SHELLS = frozenset({"sh", "bash", "dash", "zsh", "ksh"})
@@ -112,6 +113,7 @@ _WRAPPER_VALUES = MappingProxyType(
112
113
  }
113
114
  ),
114
115
  "timeout": frozenset({"-s", "--signal", "-k", "--kill-after"}),
116
+ "dumb-init": frozenset(),
115
117
  }
116
118
  )
117
119
  _MAX_WRAPPERS = 8
@@ -136,6 +138,8 @@ def unwrap_command(
136
138
  continue
137
139
  if command not in _WRAPPER_VALUES or (allowed_wrappers is not None and command not in allowed_wrappers):
138
140
  return current
141
+ # dumb-init uses execvp; its child cannot be a shell builtin.
142
+ allow_shell_builtins = allow_shell_builtins and command != "dumb-init"
139
143
  current = current[_value_wrapper_index(current, command) :]
140
144
  msg = "command wrapper nesting exceeds analysis bound"
141
145
  raise UnprovableCommandError(msg)
@@ -160,6 +164,8 @@ def _command_wrapper_index(arguments: Sequence[str], command: str) -> int:
160
164
  def _value_wrapper_index(arguments: Sequence[str], command: str) -> int:
161
165
  if command == "env":
162
166
  return _env_wrapper_index(arguments)
167
+ if command == "dumb-init":
168
+ return _dumb_init_wrapper_index(arguments)
163
169
  index = 1
164
170
  while index < len(arguments):
165
171
  argument = arguments[index]
@@ -173,6 +179,24 @@ def _value_wrapper_index(arguments: Sequence[str], command: str) -> int:
173
179
  return index + int(command == "timeout")
174
180
 
175
181
 
182
+ def _dumb_init_wrapper_index(arguments: Sequence[str]) -> int:
183
+ index = 1
184
+ while index < len(arguments):
185
+ argument = arguments[index]
186
+ if argument in {"-h", "--help", "-V", "--version"}:
187
+ return len(arguments)
188
+ if argument == "--":
189
+ index += 1
190
+ break
191
+ if not argument.startswith("-") or argument == "-":
192
+ break
193
+ if argument not in {"-c", "--single-child", "-v", "--verbose"}:
194
+ msg = "unsupported dumb-init wrapper option"
195
+ raise UnprovableCommandError(msg)
196
+ index += 1
197
+ return index
198
+
199
+
176
200
  def _env_wrapper_index(arguments: Sequence[str]) -> int:
177
201
  index = 1
178
202
  while index < len(arguments) and arguments[index].startswith("-"):
@@ -237,7 +261,7 @@ def classify_interpreter(argv: Sequence[str]) -> InterpreterInvocation:
237
261
  return _python(arguments[1:])
238
262
  if executable in _SHELLS:
239
263
  return _short_options(
240
- arguments[1:], source="c", values=frozenset({"o", "O"}), shell_mode=True, bash_mode=executable == "bash"
264
+ arguments[1:], source="c", values=frozenset({"o", "O"}), shell_mode=True, shell_name=executable
241
265
  )
242
266
  if executable in {"node", "nodejs"}:
243
267
  return _node(arguments[1:])
@@ -342,13 +366,21 @@ def _ruby_long_option(argument: str, following: str | None) -> ParsedOption:
342
366
 
343
367
 
344
368
  def _short_options(
345
- arguments: Sequence[str], *, source: str, values: frozenset[str], shell_mode: bool = False, bash_mode: bool = False
369
+ arguments: Sequence[str], *, source: str, values: frozenset[str], shell_mode: bool = False, shell_name: str = ""
346
370
  ) -> InterpreterInvocation:
347
371
  index = 0
348
372
  stdin_mode = False
373
+ command_mode = False
349
374
  short_seen = False
375
+ bash_mode = shell_name == "bash"
376
+ validated_shell = shell_name in {"bash", "sh", "dash"}
350
377
  while index < len(arguments):
351
378
  boundary = _external_boundary(arguments, index, plus_options=True)
379
+ if boundary is not None and command_mode:
380
+ index += int(arguments[index] in {"-", "--"})
381
+ if index >= len(arguments):
382
+ return InterpreterInvocation("unknown")
383
+ return InterpreterInvocation("shell", arguments[index], tuple(arguments[index + 2 :]))
352
384
  if boundary is not None:
353
385
  return InterpreterInvocation("stdin") if stdin_mode else boundary
354
386
  argument = arguments[index]
@@ -357,13 +389,14 @@ def _short_options(
357
389
  else:
358
390
  short_seen = True
359
391
  parsed = _short_option(
360
- arguments, index, source=source, values=values, shell_mode=shell_mode, bash_mode=bash_mode
392
+ arguments, index, source=source, values=values, shell_mode=shell_mode, validated_shell=validated_shell
361
393
  )
362
394
  if parsed.invocation is not None:
363
395
  return parsed.invocation
364
396
  stdin_mode = stdin_mode or parsed.stdin_mode
397
+ command_mode = command_mode or parsed.command_mode
365
398
  index += parsed.consumed
366
- return InterpreterInvocation("stdin")
399
+ return InterpreterInvocation("unknown" if command_mode else "stdin")
367
400
 
368
401
 
369
402
  def _long_option(
@@ -395,18 +428,23 @@ def _short_option(
395
428
  source: str,
396
429
  values: frozenset[str],
397
430
  shell_mode: bool,
398
- bash_mode: bool = False,
431
+ validated_shell: bool = False,
399
432
  ) -> ParsedOption:
400
- if bash_mode:
433
+ if validated_shell:
401
434
  return _shell_short_option(arguments, index, values)
402
435
  argument = arguments[index]
403
436
  for cursor, flag in enumerate(argument[1:], 1):
404
437
  if flag in source:
405
- attached = "" if shell_mode else argument[cursor + 1 :]
438
+ if shell_mode:
439
+ if not values.isdisjoint(argument[cursor + 1 :]):
440
+ return ParsedOption(InterpreterInvocation("unknown"))
441
+ return ParsedOption(command_mode=True)
442
+ attached = argument[cursor + 1 :]
406
443
  operand = attached or _following_operand(arguments, index)
407
- forwarded = tuple(arguments[index + 3 :]) if shell_mode else ()
408
- return ParsedOption(InterpreterInvocation("shell" if shell_mode else "inline", operand, forwarded))
444
+ return ParsedOption(InterpreterInvocation("inline", operand))
409
445
  if flag in values:
446
+ if shell_mode and (flag == "O" or argument[cursor + 1 :] == "c"):
447
+ return ParsedOption(InterpreterInvocation("unknown"))
410
448
  return ParsedOption(consumed=1 + int(cursor + 1 == len(argument)))
411
449
  return ParsedOption()
412
450
 
@@ -424,11 +462,7 @@ def _shell_short_option(arguments: Sequence[str], index: int, values: frozenset[
424
462
  if flag == "O" or operand not in _SHELL_NAMED_OPTIONS:
425
463
  return ParsedOption(InterpreterInvocation("unknown"))
426
464
  consumed += 1
427
- if "c" in flags:
428
- operand = _following_operand(arguments, index + consumed - 1)
429
- forwarded = tuple(arguments[index + consumed + 2 :])
430
- return ParsedOption(InterpreterInvocation("shell", operand, forwarded))
431
- return ParsedOption(consumed=consumed, stdin_mode="s" in flags)
465
+ return ParsedOption(consumed=consumed, stdin_mode="s" in flags, command_mode="c" in flags)
432
466
 
433
467
 
434
468
  def _node(arguments: Sequence[str]) -> InterpreterInvocation: