Skip to main content

rusty_stack/installers/common/
managed_python_build_tools.rs

1//! Rusty-owned Python tooling and import-time dependencies.
2//!
3//! Component installers consume these commands but never resolve or mutate their
4//! own dependency graph. Every package is exact-pinned and installed without
5//! dependency resolution so the managed ROCm environment remains authoritative.
6
7/// Exact Python distributions owned by the Rusty environment.
8///
9/// Keep this order stable: command construction and audit logs intentionally
10/// preserve it.
11pub const MANAGED_PYTHON_PACKAGES: [(&str, &str); 11] = [
12    ("setuptools", "81.0.0"),
13    ("cmake", "4.4.4"),
14    ("scikit-build-core", "1.1.1"),
15    ("pathspec", "1.1.1"),
16    ("wheel", "0.48.0"),
17    ("ninja", "1.13.2"),
18    ("imageio", "2.38.1"),
19    ("diffusers", "0.33.1"),
20    ("remote-pdb", "2.1.0"),
21    ("ftfy", "6.3.1"),
22    ("wcwidth", "0.2.13"),
23];
24
25/// A command targeting the Python interpreter selected by Rusty.
26#[derive(Debug, Clone, PartialEq, Eq)]
27pub struct ManagedPythonCommand {
28    /// Selected Python executable.
29    pub program: String,
30    /// Arguments passed directly to the executable.
31    pub args: Vec<String>,
32}
33
34/// Build the exact, resolver-free install command for Rusty-owned Python packages.
35///
36/// The selected managed prefix is PEP 668 protected, so its existing pip call
37/// pattern requires `--break-system-packages`. `--no-deps` is mandatory:
38/// these pins are the complete centrally owned set and component dependency
39/// resolution must never replace ROCm stack packages.
40pub fn managed_python_install_command(python_bin: impl Into<String>) -> ManagedPythonCommand {
41    let mut args = [
42        "-m",
43        "pip",
44        "install",
45        "--break-system-packages",
46        "--no-cache-dir",
47        "--no-deps",
48    ]
49    .into_iter()
50    .map(str::to_string)
51    .collect::<Vec<_>>();
52    args.extend(
53        MANAGED_PYTHON_PACKAGES
54            .iter()
55            .map(|(name, version)| format!("{name}=={version}")),
56    );
57
58    ManagedPythonCommand {
59        program: python_bin.into(),
60        args,
61    }
62}
63
64/// Build a read-only command that verifies every Rusty-owned package version.
65pub fn managed_python_verify_command(python_bin: impl Into<String>) -> ManagedPythonCommand {
66    let expected = MANAGED_PYTHON_PACKAGES
67        .iter()
68        .map(|(name, version)| format!("    {name:?}: {version:?},"))
69        .collect::<Vec<_>>()
70        .join("\n");
71    let script = format!(
72        r#"import importlib.metadata
73
74expected_versions = {{
75{expected}
76}}
77problems = []
78for package, expected_version in expected_versions.items():
79    try:
80        actual = importlib.metadata.version(package)
81    except importlib.metadata.PackageNotFoundError:
82        problems.append(f"{{package}}: missing (expected {{expected_version}})")
83        continue
84    if actual != expected_version:
85        problems.append(f"{{package}}: {{actual}} (expected {{expected_version}})")
86
87if problems:
88    raise SystemExit("Rusty managed Python package mismatch:\\n" + "\\n".join(problems))
89print("Rusty managed Python package versions verified")
90"#
91    );
92
93    ManagedPythonCommand {
94        program: python_bin.into(),
95        args: vec!["-c".to_string(), script],
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    use super::{
102        managed_python_install_command, managed_python_verify_command, MANAGED_PYTHON_PACKAGES,
103    };
104
105    const EXPECTED_PACKAGES: [(&str, &str); 11] = [
106        ("setuptools", "81.0.0"),
107        ("cmake", "4.4.4"),
108        ("scikit-build-core", "1.1.1"),
109        ("pathspec", "1.1.1"),
110        ("wheel", "0.48.0"),
111        ("ninja", "1.13.2"),
112        ("imageio", "2.38.1"),
113        ("diffusers", "0.33.1"),
114        ("remote-pdb", "2.1.0"),
115        ("ftfy", "6.3.1"),
116        ("wcwidth", "0.2.13"),
117    ];
118
119    #[test]
120    fn install_uses_selected_python_and_exact_argument_order() {
121        let command = managed_python_install_command("/managed/python3");
122        let mut expected_args = vec![
123            "-m".to_string(),
124            "pip".to_string(),
125            "install".to_string(),
126            "--break-system-packages".to_string(),
127            "--no-cache-dir".to_string(),
128            "--no-deps".to_string(),
129        ];
130        expected_args.extend(
131            EXPECTED_PACKAGES
132                .iter()
133                .map(|(name, version)| format!("{name}=={version}")),
134        );
135
136        assert_eq!(command.program, "/managed/python3");
137        assert_eq!(command.args, expected_args);
138    }
139
140    #[test]
141    fn managed_packages_are_exact_and_resolver_safe() {
142        assert_eq!(MANAGED_PYTHON_PACKAGES, EXPECTED_PACKAGES);
143
144        let command = managed_python_install_command("selected-python");
145        let package_args = &command.args[6..];
146        assert_eq!(package_args.len(), EXPECTED_PACKAGES.len());
147        assert!(package_args.iter().all(|package| {
148            let mut pieces = package.split("==");
149            matches!(
150                (pieces.next(), pieces.next(), pieces.next()),
151                (Some(name), Some(version), None) if !name.is_empty() && !version.is_empty()
152            )
153        }));
154
155        let rendered = command.args.join(" ").to_ascii_lowercase();
156        for forbidden in [
157            "--upgrade",
158            "--index-url",
159            "--extra-index-url",
160            "nvidia",
161            "cuda",
162            "cu11",
163            "cu12",
164        ] {
165            assert!(
166                !rendered.contains(forbidden),
167                "managed install command contains forbidden token {forbidden}: {rendered}"
168            );
169        }
170        assert!(command.args.iter().any(|arg| arg == "--no-deps"));
171    }
172
173    #[test]
174    fn verification_is_read_only_and_checks_every_exact_version() {
175        let command = managed_python_verify_command("/managed/python3");
176        assert_eq!(command.program, "/managed/python3");
177        assert_eq!(command.args.first().map(String::as_str), Some("-c"));
178        assert_eq!(command.args.len(), 2);
179
180        let script = &command.args[1];
181        for (name, version) in EXPECTED_PACKAGES {
182            assert!(script.contains(&format!("{name:?}: {version:?}")));
183        }
184        for forbidden in ["subprocess", "pip install", "--upgrade", "--index-url"] {
185            assert!(
186                !script.to_ascii_lowercase().contains(forbidden),
187                "verification command must be read-only: found {forbidden}"
188            );
189        }
190        assert!(script.contains("importlib.metadata"));
191        assert!(script.contains("actual != expected_version"));
192    }
193}