ruff/crates
Micha Reiser 03f08283ad
[red-knot] Fallback to `requires-python` if no `python-version` is specified (#16028)
## Summary

Add support for the `project.requires-python` field in `pyproject.toml`
files.

Fall back to the resolved lower bound of `project.requires-python` if
the `environment.python-version` field is `None` (or more accurately,
initialize `environment.python-version with `requires-python`'s lower
bound if left unspecified).

## UX design

There are two options on how we can handle the fallback to
`requires-python`'s lower bound:

1. Store the resolved lower bound in `environment.python-version` if
that field is `None` (Implemented in this PR)
2. Store the `requires-python` constraint separately. 

There's no observed difference unless a user-level configuration (or any
other inherited configuration is used). Let's discuss it on the given
example


**User configuration**

```toml
[environment]
python-version = "3.10"
```

**Project configuration (`pyproject.toml`)**

```toml
[project]
name = "test"
requires-python = ">= 3.12"

[tool.knot]
# No environment table
```

The resolved version for 1. is 3.12 because the `requires-python`
constraint precedence takes precedence over the `python-version` in the
user configuration. 2. resolves to 3.10 because all `python-version`
constraints take precedence before falling back to `requires-python`.

Ruff implements 1. It's also the easier to implement and it does seem
intuitive to me that the more local `requires-python` constraint takes
precedence.


## Test plan

Added CLI and unit tests.
2025-02-12 11:47:59 +00:00
..
red_knot Delete left-over `verbosity.rs (#16081) 2025-02-10 16:06:05 +00:00
red_knot_project [red-knot] Fallback to `requires-python` if no `python-version` is specified (#16028) 2025-02-12 11:47:59 +00:00
red_knot_python_semantic [red-knot] Document 'public type of undeclared symbols' behavior (#16096) 2025-02-12 08:52:11 +01:00
red_knot_server add diagnostic `Span` (couples `File` and `TextRange`) (#16101) 2025-02-11 14:55:12 -05:00
red_knot_test add diagnostic `Span` (couples `File` and `TextRange`) (#16101) 2025-02-11 14:55:12 -05:00
red_knot_vendored Sync vendored typeshed stubs (#15864) 2025-02-01 01:01:58 +00:00
red_knot_wasm Add `user_configuration_directory` to `System` (#16020) 2025-02-10 15:50:55 +01:00
ruff Bump version to 0.9.6 (#16074) 2025-02-10 18:14:04 +05:30
ruff_annotate_snippets Fix docstring in ruff_annotate_snippets (#15748) 2025-01-26 22:25:29 -05:00
ruff_benchmark add diagnostic `Span` (couples `File` and `TextRange`) (#16101) 2025-02-11 14:55:12 -05:00
ruff_cache Fix cache key collisions for paths with separators (#12159) 2024-07-03 07:36:46 -05:00
ruff_db add diagnostic `Span` (couples `File` and `TextRange`) (#16101) 2025-02-11 14:55:12 -05:00
ruff_dev Add knot.toml schema (#15735) 2025-02-07 10:59:40 +01:00
ruff_diagnostics Show errors for attempted fixes only when passed `--verbose` (#15237) 2025-01-03 08:50:13 -06:00
ruff_formatter Upgrade Rust toolchain to 1.84.0 (#15408) 2025-01-11 09:51:58 +01:00
ruff_graph [red-knot] Resolve `Options` to `Settings` (#16000) 2025-02-10 15:28:45 +01:00
ruff_index Transition to salsa coarse-grained tracked structs (#15763) 2025-02-11 11:38:50 +01:00
ruff_linter [`pylint`] Correct ordering of arguments in fix for `if-stmt-min-max` (`PLR1730`) (#16080) 2025-02-12 10:27:46 +01:00
ruff_macros Add knot.toml schema (#15735) 2025-02-07 10:59:40 +01:00
ruff_notebook Update Rust crate rand to 0.9.0 (#15899) 2025-02-03 12:25:57 +01:00
ruff_python_ast Transition to salsa coarse-grained tracked structs (#15763) 2025-02-11 11:38:50 +01:00
ruff_python_ast_integration_tests Update insta snapshots (#14366) 2024-11-15 19:31:15 +01:00
ruff_python_codegen Preserve triple quotes and prefixes for strings (#15818) 2025-02-04 08:41:06 -05:00
ruff_python_formatter Workaround Even Better TOML crash related to `allOf` (#15992) 2025-02-06 16:00:50 +01:00
ruff_python_index Extract `LineIndex` independent methods from `Locator` (#13938) 2024-10-28 07:53:41 +00:00
ruff_python_literal Preserve triple quotes and prefixes for strings (#15818) 2025-02-04 08:41:06 -05:00
ruff_python_parser Simplify the `StringFlags` trait (#15944) 2025-02-04 18:14:28 +00:00
ruff_python_resolver Update insta snapshots (#14366) 2024-11-15 19:31:15 +01:00
ruff_python_semantic [`pylint`] Also report when the object isn't a literal (`PLE1310`) (#15985) 2025-02-10 09:31:27 +01:00
ruff_python_stdlib Revert "Add all PEP-585 names to UP006 rule" (#15250) 2025-01-04 12:23:53 +01:00
ruff_python_trivia [red-knot] Hand-written MDTest parser (#15926) 2025-02-04 14:01:53 +01:00
ruff_python_trivia_integration_tests Update insta snapshots (#14366) 2024-11-15 19:31:15 +01:00
ruff_server Root exclusions in the server to project root (#16043) 2025-02-10 04:57:14 +00:00
ruff_source_file [`pyupgrade`] Do not report when a UTF-8 comment is followed by a non-UTF-8 one (`UP009`) (#14728) 2024-12-11 10:30:41 +00:00
ruff_text_size [`ruff`] `itertools.starmap(..., zip(...))` (`RUF058`) (#15483) 2025-01-16 15:18:12 +01:00
ruff_wasm Bump version to 0.9.6 (#16074) 2025-02-10 18:14:04 +05:30
ruff_workspace Root exclusions in the server to project root (#16043) 2025-02-10 04:57:14 +00:00