From 7c01d34cdd9bdf1a21223a69ae6bad40d64b2150 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 24 Apr 2024 09:52:27 -0400 Subject: [PATCH] Allow comments in .python-version (#1038) ## Summary `pyenv` allows comments in `.python-version` files, so Rye will now skip commented-out lines. Note that not _all_ tools support this. For example, [`mise`](https://github.com/jdx/mise) does not. Closes #1032. --- rye/src/platform.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/rye/src/platform.rs b/rye/src/platform.rs index 38887f2367..ed663f9066 100644 --- a/rye/src/platform.rs +++ b/rye/src/platform.rs @@ -217,8 +217,7 @@ pub fn get_python_version_request_from_pyenv_pin(root: &Path) -> Option Option Option { + // Skip empty lines and comments. + let ver = contents.lines().find(|line| { + let trimmed = line.trim(); + !(trimmed.is_empty() || trimmed.starts_with('#')) + })?; + + // Parse the version. + let ver = ver.parse().ok()?; + + Some(ver) +} + /// Returns the most recent cpython release. pub fn get_latest_cpython_version() -> Result { latest_available_python_version(&PythonVersionRequest { @@ -278,3 +291,22 @@ pub fn write_credentials(doc: &toml_edit::DocumentMut) -> Result<(), Error> { pub fn get_credentials_filepath() -> Result { Ok(get_app_dir().join("credentials")) } + +#[cfg(test)] +mod test { + + #[test] + fn test_read_python_version() { + // Parse a simple version. + let ver = super::read_python_version("3.8.1\n"); + assert_eq!(ver, Some("3.8.1".parse().unwrap())); + + // Skip empty lines. + let ver = super::read_python_version("\n\n3.8.1\n"); + assert_eq!(ver, Some("3.8.1".parse().unwrap())); + + // Skip comments. + let ver = super::read_python_version("# comment\n3.8.1\n"); + assert_eq!(ver, Some("3.8.1".parse().unwrap())); + } +}