Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 28 additions & 20 deletions crates/pet-core/src/pyvenv_cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,
pub version_major: Option<u64>,
pub version_minor: Option<u64>,
pub prompt: Option<String>,
pub file_path: PathBuf,
}

impl PyVenvCfg {
fn new(
version: String,
version_major: u64,
version_minor: u64,
version: Option<String>,
version_major: Option<u64>,
version_minor: Option<u64>,
prompt: Option<String>,
file_path: PathBuf,
) -> Self {
Expand Down Expand Up @@ -130,13 +130,15 @@ fn parse(file: &Path) -> Option<PyVenvCfg> {

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())),
}
}

Expand Down Expand Up @@ -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()));
}

Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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));
}
}
9 changes: 6 additions & 3 deletions crates/pet-python-utils/src/version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ pub fn from_header_files(prefix: &Path) -> Option<String> {
Headers::get_version(prefix)
}
pub fn from_pyvenv_cfg(prefix: &Path) -> Option<String> {
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<String> {
if let Some(version) = Headers::get_version(prefix) {
Expand Down Expand Up @@ -44,7 +44,10 @@ pub fn from_creator_for_virtual_env(prefix: &Path) -> Option<String> {
// 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
};
Expand Down Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion crates/pet-venv/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ pub fn try_environment_from_venv_dir(path: &Path) -> Option<PythonEnvironment> {
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) {
Expand Down
Loading