[ty] Default to latest supported python version (#17938)

This commit is contained in:
Micha Reiser 2025-05-08 16:58:35 +02:00 committed by GitHub
parent 5eb215e8e5
commit 067a8ac574
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 85 additions and 6 deletions

View file

@ -136,7 +136,7 @@ mod tests {
} }
fn python_version(&self) -> ruff_python_ast::PythonVersion { fn python_version(&self) -> ruff_python_ast::PythonVersion {
ruff_python_ast::PythonVersion::latest() ruff_python_ast::PythonVersion::latest_ty()
} }
} }

View file

@ -59,6 +59,10 @@ impl PythonVersion {
Self::PY313 Self::PY313
} }
pub const fn latest_ty() -> Self {
Self::PY313
}
pub const fn as_tuple(self) -> (u8, u8) { pub const fn as_tuple(self) -> (u8, u8) {
(self.major, self.minor) (self.major, self.minor)
} }

View file

@ -1,6 +1,7 @@
use anyhow::Context; use anyhow::Context;
use insta::internals::SettingsBindDropGuard; use insta::internals::SettingsBindDropGuard;
use insta_cmd::{assert_cmd_snapshot, get_cargo_bin}; use insta_cmd::{assert_cmd_snapshot, get_cargo_bin};
use ruff_python_ast::PythonVersion;
use std::fmt::Write; use std::fmt::Write;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::Command; use std::process::Command;
@ -1263,6 +1264,80 @@ fn can_handle_large_binop_expressions() -> anyhow::Result<()> {
Ok(()) Ok(())
} }
#[test]
fn defaults_to_a_new_python_version() -> anyhow::Result<()> {
let case = TestCase::with_files([
(
"ty.toml",
&*format!(
r#"
[environment]
python-version = "{}"
python-platform = "linux"
"#,
PythonVersion::default()
),
),
(
"main.py",
r#"
import os
os.grantpt(1) # only available on unix, Python 3.13 or newer
"#,
),
])?;
assert_cmd_snapshot!(case.command(), @r"
success: false
exit_code: 1
----- stdout -----
error: lint:unresolved-attribute: Type `<module 'os'>` has no attribute `grantpt`
--> main.py:4:1
|
2 | import os
3 |
4 | os.grantpt(1) # only available on unix, Python 3.13 or newer
| ^^^^^^^^^^
|
info: `lint:unresolved-attribute` is enabled by default
Found 1 diagnostic
----- stderr -----
");
// Use default (which should be latest supported)
let case = TestCase::with_files([
(
"ty.toml",
r#"
[environment]
python-platform = "linux"
"#,
),
(
"main.py",
r#"
import os
os.grantpt(1) # only available on unix, Python 3.13 or newer
"#,
),
])?;
assert_cmd_snapshot!(case.command(), @r"
success: true
exit_code: 0
----- stdout -----
All checks passed!
----- stderr -----
");
Ok(())
}
struct TestCase { struct TestCase {
_temp_dir: TempDir, _temp_dir: TempDir,
_settings_scope: SettingsBindDropGuard, _settings_scope: SettingsBindDropGuard,

View file

@ -191,7 +191,7 @@ mod tests {
Program::from_settings( Program::from_settings(
&db, &db,
ProgramSettings { ProgramSettings {
python_version: PythonVersion::latest(), python_version: PythonVersion::latest_ty(),
python_platform: PythonPlatform::default(), python_platform: PythonPlatform::default(),
search_paths: SearchPathSettings { search_paths: SearchPathSettings {
extra_paths: vec![], extra_paths: vec![],

View file

@ -227,7 +227,7 @@ mod tests {
Program::from_settings( Program::from_settings(
&db, &db,
ProgramSettings { ProgramSettings {
python_version: PythonVersion::latest(), python_version: PythonVersion::latest_ty(),
python_platform: PythonPlatform::default(), python_platform: PythonPlatform::default(),
search_paths: SearchPathSettings { search_paths: SearchPathSettings {
extra_paths: vec![], extra_paths: vec![],

View file

@ -61,7 +61,7 @@ impl Options {
.environment .environment
.as_ref() .as_ref()
.and_then(|env| env.python_version.as_deref().copied()) .and_then(|env| env.python_version.as_deref().copied())
.unwrap_or_default(); .unwrap_or(PythonVersion::latest_ty());
let python_platform = self let python_platform = self
.environment .environment
.as_ref() .as_ref()

View file

@ -103,7 +103,7 @@ impl Project {
let major = let major =
u8::try_from(major).map_err(|_| ResolveRequiresPythonError::TooLargeMajor(major))?; u8::try_from(major).map_err(|_| ResolveRequiresPythonError::TooLargeMajor(major))?;
let minor = let minor =
u8::try_from(minor).map_err(|_| ResolveRequiresPythonError::TooLargeMajor(minor))?; u8::try_from(minor).map_err(|_| ResolveRequiresPythonError::TooLargeMinor(minor))?;
Ok(Some( Ok(Some(
requires_python requires_python

View file

@ -2734,7 +2734,7 @@ mod tests {
Program::get(&db) Program::get(&db)
.set_python_version(&mut db) .set_python_version(&mut db)
.to(PythonVersion::latest()); .to(PythonVersion::latest_ty());
for class in KnownClass::iter() { for class in KnownClass::iter() {
assert_ne!( assert_ne!(