diff --git a/crates/pet-core/src/pyvenv_cfg.rs b/crates/pet-core/src/pyvenv_cfg.rs index 42616158..d63d7d93 100644 --- a/crates/pet-core/src/pyvenv_cfg.rs +++ b/crates/pet-core/src/pyvenv_cfg.rs @@ -19,18 +19,18 @@ const PYVENV_CONFIG_FILE: &str = "pyvenv.cfg"; #[derive(Debug)] pub struct PyVenvCfg { - pub version: String, - pub version_major: u64, - pub version_minor: u64, + pub version: Option, + pub version_major: Option, + pub version_minor: Option, pub prompt: Option, pub file_path: PathBuf, } impl PyVenvCfg { fn new( - version: String, - version_major: u64, - version_minor: u64, + version: Option, + version_major: Option, + version_minor: Option, prompt: Option, file_path: PathBuf, ) -> Self { @@ -130,13 +130,15 @@ fn parse(file: &Path) -> Option { match (version, version_major, version_minor) { (Some(ver), Some(major), Some(minor)) => Some(PyVenvCfg::new( - ver, - major, - minor, + Some(ver), + Some(major), + Some(minor), prompt, file.to_path_buf(), )), - _ => None, + // Even without version info, return the struct - presence of pyvenv.cfg + // is sufficient to identify this as a venv environment + _ => Some(PyVenvCfg::new(None, None, None, prompt, file.to_path_buf())), } } @@ -275,9 +277,9 @@ mod tests { let result = PyVenvCfg::find(dir.path()); assert!(result.is_some()); let cfg = result.unwrap(); - assert_eq!(cfg.version, "3.11.4"); - assert_eq!(cfg.version_major, 3); - assert_eq!(cfg.version_minor, 11); + assert_eq!(cfg.version, Some("3.11.4".to_string())); + assert_eq!(cfg.version_major, Some(3)); + assert_eq!(cfg.version_minor, Some(11)); assert_eq!(cfg.prompt, Some("test-env".to_string())); } @@ -294,9 +296,9 @@ mod tests { let result = PyVenvCfg::find(&bin_dir); assert!(result.is_some()); let cfg = result.unwrap(); - assert_eq!(cfg.version, "3.10.0"); - assert_eq!(cfg.version_major, 3); - assert_eq!(cfg.version_minor, 10); + assert_eq!(cfg.version, Some("3.10.0".to_string())); + assert_eq!(cfg.version_major, Some(3)); + assert_eq!(cfg.version_minor, Some(10)); } #[test] @@ -315,7 +317,13 @@ mod tests { writeln!(file, "prompt = my-env").unwrap(); let result = PyVenvCfg::find(dir.path()); - assert!(result.is_none()); // Version is required + // pyvenv.cfg exists, so we should get a result even without version + assert!(result.is_some()); + let cfg = result.unwrap(); + assert!(cfg.version.is_none()); + assert!(cfg.version_major.is_none()); + assert!(cfg.version_minor.is_none()); + assert_eq!(cfg.prompt, Some("my-env".to_string())); } #[test] @@ -328,8 +336,8 @@ mod tests { let result = PyVenvCfg::find(dir.path()); assert!(result.is_some()); let cfg = result.unwrap(); - assert_eq!(cfg.version, "3.12.1.final.0"); - assert_eq!(cfg.version_major, 3); - assert_eq!(cfg.version_minor, 12); + assert_eq!(cfg.version, Some("3.12.1.final.0".to_string())); + assert_eq!(cfg.version_major, Some(3)); + assert_eq!(cfg.version_minor, Some(12)); } } diff --git a/crates/pet-python-utils/src/version.rs b/crates/pet-python-utils/src/version.rs index 2187e9b8..8084005b 100644 --- a/crates/pet-python-utils/src/version.rs +++ b/crates/pet-python-utils/src/version.rs @@ -14,7 +14,7 @@ pub fn from_header_files(prefix: &Path) -> Option { Headers::get_version(prefix) } pub fn from_pyvenv_cfg(prefix: &Path) -> Option { - PyVenvCfg::find(prefix).map(|cfg| cfg.version) + PyVenvCfg::find(prefix).and_then(|cfg| cfg.version) } pub fn from_creator_for_virtual_env(prefix: &Path) -> Option { if let Some(version) = Headers::get_version(prefix) { @@ -44,7 +44,10 @@ pub fn from_creator_for_virtual_env(prefix: &Path) -> Option { // Try to get the version of that environment. let sys_root = parent_dir.parent()?; let pyver = if let Some(pyvenvcfg) = PyVenvCfg::find(prefix) { - Some((pyvenvcfg.version_major, pyvenvcfg.version_minor)) + match (pyvenvcfg.version_major, pyvenvcfg.version_minor) { + (Some(major), Some(minor)) => Some((major, minor)), + _ => None, + } } else { None }; @@ -127,7 +130,7 @@ fn get_version_from_pyvenv_if_pyvenv_cfg_and_exe_created_same_time( "Using pyvenv.cfg to get version of virtual environment {:?}", prefix ); - Some(cfg.version) + cfg.version } else { None } diff --git a/crates/pet-venv/src/lib.rs b/crates/pet-venv/src/lib.rs index 772d2d9a..902aea13 100644 --- a/crates/pet-venv/src/lib.rs +++ b/crates/pet-venv/src/lib.rs @@ -35,7 +35,7 @@ pub fn try_environment_from_venv_dir(path: &Path) -> Option { let cfg = PyVenvCfg::find(path)?; let prefix = path.to_path_buf(); - let version = version::from_creator_for_virtual_env(&prefix).or(Some(cfg.version.clone())); + let version = version::from_creator_for_virtual_env(&prefix).or(cfg.version.clone()); let name = cfg.prompt; match find_executable_or_broken(path) {