Skip to content

Commit 9d42321

Browse files
authored
refactor: update PyVenvCfg to use Option types for version fields and adjust related logic (#333)
Fixes #332
1 parent 9e0ef7a commit 9d42321

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

crates/pet-core/src/pyvenv_cfg.rs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@ const PYVENV_CONFIG_FILE: &str = "pyvenv.cfg";
1919

2020
#[derive(Debug)]
2121
pub struct PyVenvCfg {
22-
pub version: String,
23-
pub version_major: u64,
24-
pub version_minor: u64,
22+
pub version: Option<String>,
23+
pub version_major: Option<u64>,
24+
pub version_minor: Option<u64>,
2525
pub prompt: Option<String>,
2626
pub file_path: PathBuf,
2727
}
2828

2929
impl PyVenvCfg {
3030
fn new(
31-
version: String,
32-
version_major: u64,
33-
version_minor: u64,
31+
version: Option<String>,
32+
version_major: Option<u64>,
33+
version_minor: Option<u64>,
3434
prompt: Option<String>,
3535
file_path: PathBuf,
3636
) -> Self {
@@ -130,13 +130,15 @@ fn parse(file: &Path) -> Option<PyVenvCfg> {
130130

131131
match (version, version_major, version_minor) {
132132
(Some(ver), Some(major), Some(minor)) => Some(PyVenvCfg::new(
133-
ver,
134-
major,
135-
minor,
133+
Some(ver),
134+
Some(major),
135+
Some(minor),
136136
prompt,
137137
file.to_path_buf(),
138138
)),
139-
_ => None,
139+
// Even without version info, return the struct - presence of pyvenv.cfg
140+
// is sufficient to identify this as a venv environment
141+
_ => Some(PyVenvCfg::new(None, None, None, prompt, file.to_path_buf())),
140142
}
141143
}
142144

@@ -275,9 +277,9 @@ mod tests {
275277
let result = PyVenvCfg::find(dir.path());
276278
assert!(result.is_some());
277279
let cfg = result.unwrap();
278-
assert_eq!(cfg.version, "3.11.4");
279-
assert_eq!(cfg.version_major, 3);
280-
assert_eq!(cfg.version_minor, 11);
280+
assert_eq!(cfg.version, Some("3.11.4".to_string()));
281+
assert_eq!(cfg.version_major, Some(3));
282+
assert_eq!(cfg.version_minor, Some(11));
281283
assert_eq!(cfg.prompt, Some("test-env".to_string()));
282284
}
283285

@@ -294,9 +296,9 @@ mod tests {
294296
let result = PyVenvCfg::find(&bin_dir);
295297
assert!(result.is_some());
296298
let cfg = result.unwrap();
297-
assert_eq!(cfg.version, "3.10.0");
298-
assert_eq!(cfg.version_major, 3);
299-
assert_eq!(cfg.version_minor, 10);
299+
assert_eq!(cfg.version, Some("3.10.0".to_string()));
300+
assert_eq!(cfg.version_major, Some(3));
301+
assert_eq!(cfg.version_minor, Some(10));
300302
}
301303

302304
#[test]
@@ -315,7 +317,13 @@ mod tests {
315317
writeln!(file, "prompt = my-env").unwrap();
316318

317319
let result = PyVenvCfg::find(dir.path());
318-
assert!(result.is_none()); // Version is required
320+
// pyvenv.cfg exists, so we should get a result even without version
321+
assert!(result.is_some());
322+
let cfg = result.unwrap();
323+
assert!(cfg.version.is_none());
324+
assert!(cfg.version_major.is_none());
325+
assert!(cfg.version_minor.is_none());
326+
assert_eq!(cfg.prompt, Some("my-env".to_string()));
319327
}
320328

321329
#[test]
@@ -328,8 +336,8 @@ mod tests {
328336
let result = PyVenvCfg::find(dir.path());
329337
assert!(result.is_some());
330338
let cfg = result.unwrap();
331-
assert_eq!(cfg.version, "3.12.1.final.0");
332-
assert_eq!(cfg.version_major, 3);
333-
assert_eq!(cfg.version_minor, 12);
339+
assert_eq!(cfg.version, Some("3.12.1.final.0".to_string()));
340+
assert_eq!(cfg.version_major, Some(3));
341+
assert_eq!(cfg.version_minor, Some(12));
334342
}
335343
}

crates/pet-python-utils/src/version.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub fn from_header_files(prefix: &Path) -> Option<String> {
1414
Headers::get_version(prefix)
1515
}
1616
pub fn from_pyvenv_cfg(prefix: &Path) -> Option<String> {
17-
PyVenvCfg::find(prefix).map(|cfg| cfg.version)
17+
PyVenvCfg::find(prefix).and_then(|cfg| cfg.version)
1818
}
1919
pub fn from_creator_for_virtual_env(prefix: &Path) -> Option<String> {
2020
if let Some(version) = Headers::get_version(prefix) {
@@ -44,7 +44,10 @@ pub fn from_creator_for_virtual_env(prefix: &Path) -> Option<String> {
4444
// Try to get the version of that environment.
4545
let sys_root = parent_dir.parent()?;
4646
let pyver = if let Some(pyvenvcfg) = PyVenvCfg::find(prefix) {
47-
Some((pyvenvcfg.version_major, pyvenvcfg.version_minor))
47+
match (pyvenvcfg.version_major, pyvenvcfg.version_minor) {
48+
(Some(major), Some(minor)) => Some((major, minor)),
49+
_ => None,
50+
}
4851
} else {
4952
None
5053
};
@@ -127,7 +130,7 @@ fn get_version_from_pyvenv_if_pyvenv_cfg_and_exe_created_same_time(
127130
"Using pyvenv.cfg to get version of virtual environment {:?}",
128131
prefix
129132
);
130-
Some(cfg.version)
133+
cfg.version
131134
} else {
132135
None
133136
}

crates/pet-venv/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn try_environment_from_venv_dir(path: &Path) -> Option<PythonEnvironment> {
3535
let cfg = PyVenvCfg::find(path)?;
3636

3737
let prefix = path.to_path_buf();
38-
let version = version::from_creator_for_virtual_env(&prefix).or(Some(cfg.version.clone()));
38+
let version = version::from_creator_for_virtual_env(&prefix).or(cfg.version.clone());
3939
let name = cfg.prompt;
4040

4141
match find_executable_or_broken(path) {

0 commit comments

Comments
 (0)