1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use {
crate::py_packaging::distribution::{DistributionFlavor, PythonDistributionRecord},
itertools::Itertools,
};
pub use crate::default_python_distributions::PYTHON_DISTRIBUTIONS;
pub const DEFAULT_PYTHON_VERSION: &str = "3.10";
pub struct PythonDistributionCollection {
pub(crate) dists: Vec<PythonDistributionRecord>,
}
impl PythonDistributionCollection {
pub fn find_distribution(
&self,
target_triple: &str,
flavor: &DistributionFlavor,
python_major_minor_version: Option<&str>,
) -> Option<PythonDistributionRecord> {
let python_major_minor_version =
python_major_minor_version.unwrap_or(DEFAULT_PYTHON_VERSION);
self.dists
.iter()
.filter(|dist| dist.python_major_minor_version == python_major_minor_version)
.filter(|dist| dist.target_triple == target_triple)
.filter(|dist| match flavor {
DistributionFlavor::Standalone => true,
DistributionFlavor::StandaloneStatic => !dist.supports_prebuilt_extension_modules,
DistributionFlavor::StandaloneDynamic => dist.supports_prebuilt_extension_modules,
})
.cloned()
.next()
}
#[allow(unused)]
pub fn iter(&self) -> impl Iterator<Item = &PythonDistributionRecord> {
self.dists.iter()
}
#[allow(unused)]
pub fn all_target_triples(&self) -> impl Iterator<Item = &str> {
self.dists
.iter()
.map(|dist| dist.target_triple.as_str())
.sorted()
.dedup()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_target_triples() {
assert_eq!(
PYTHON_DISTRIBUTIONS
.all_target_triples()
.collect::<Vec<_>>(),
vec![
"aarch64-apple-darwin",
"aarch64-unknown-linux-gnu",
"i686-pc-windows-msvc",
"x86_64-apple-darwin",
"x86_64-pc-windows-msvc",
"x86_64-unknown-linux-gnu",
"x86_64-unknown-linux-musl",
"x86_64_v2-unknown-linux-gnu",
"x86_64_v2-unknown-linux-musl",
"x86_64_v3-unknown-linux-gnu",
"x86_64_v3-unknown-linux-musl",
]
);
}
}