use anyhow::Result; use assert_cmd::prelude::*; use assert_fs::prelude::*; use crate::common::{TestContext, uv_snapshot}; /// `cache clean` should remove all packages. #[test] fn clean_all() -> Result<()> { let context = TestContext::new("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("typing-extensions\niniconfig")?; // Install a requirement, to populate the cache. context .pip_sync() .arg("requirements.txt") .assert() .success(); uv_snapshot!(context.with_filtered_counts().filters(), context.clean().arg("--verbose"), @r" success: true exit_code: 0 ----- stdout ----- ----- stderr ----- DEBUG uv [VERSION] ([COMMIT] DATE) DEBUG Acquired lock for `[CACHE_DIR]/` Clearing cache at: [CACHE_DIR]/ DEBUG Released lock at `[CACHE_DIR]/.lock` Removed [N] files ([SIZE]) "); Ok(()) } /// `cache clean iniconfig` should remove a single package (`iniconfig`). #[test] fn clean_package_pypi() -> Result<()> { let context = TestContext::new("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio\niniconfig")?; // Install a requirement, to populate the cache. context .pip_sync() .arg("requirements.txt") .assert() .success(); // Assert that the `.rkyv` file is created for `iniconfig`. let rkyv = context .cache_dir .child("simple-v18") .child("pypi") .child("iniconfig.rkyv"); assert!( rkyv.exists(), "Expected the `.rkyv` file to exist for `iniconfig`" ); let filters: Vec<_> = context .filters() .into_iter() .chain([ // The cache entry does not have a stable key, so we filter it out. ( r"\[CACHE_DIR\](\\|\/)(.+)(\\|\/).*", "[CACHE_DIR]/$2/[ENTRY]", ), // The file count varies by operating system, so we filter it out. ("Removed \\d+ files?", "Removed [N] files"), ]) .collect(); uv_snapshot!(&filters, context.clean().arg("--verbose").arg("iniconfig"), @r" success: true exit_code: 0 ----- stdout ----- ----- stderr ----- DEBUG uv [VERSION] ([COMMIT] DATE) DEBUG Acquired lock for `[CACHE_DIR]/` DEBUG Removing dangling cache entry: [CACHE_DIR]/archive-v0/[ENTRY] Removed [N] files ([SIZE]) DEBUG Released lock at `[CACHE_DIR]/.lock` "); // Assert that the `.rkyv` file is removed for `iniconfig`. assert!( !rkyv.exists(), "Expected the `.rkyv` file to be removed for `iniconfig`" ); // Running `uv cache prune` should have no effect. uv_snapshot!(&filters, context.prune().arg("--verbose"), @r" success: true exit_code: 0 ----- stdout ----- ----- stderr ----- DEBUG uv [VERSION] ([COMMIT] DATE) DEBUG Acquired lock for `[CACHE_DIR]/` Pruning cache at: [CACHE_DIR]/ No unused entries found DEBUG Released lock at `[CACHE_DIR]/.lock` "); Ok(()) } /// `cache clean iniconfig` should remove a single package (`iniconfig`). #[test] fn clean_package_index() -> Result<()> { let context = TestContext::new("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio\niniconfig")?; // Install a requirement, to populate the cache. context .pip_sync() .arg("requirements.txt") .arg("--index-url") .arg("https://test.pypi.org/simple") .assert() .success(); // Assert that the `.rkyv` file is created for `iniconfig`. let rkyv = context .cache_dir .child("simple-v18") .child("index") .child("e8208120cae3ba69") .child("iniconfig.rkyv"); assert!( rkyv.exists(), "Expected the `.rkyv` file to exist for `iniconfig`" ); let filters: Vec<_> = context .filters() .into_iter() .chain([ // The cache entry does not have a stable key, so we filter it out. ( r"\[CACHE_DIR\](\\|\/)(.+)(\\|\/).*", "[CACHE_DIR]/$2/[ENTRY]", ), // The file count varies by operating system, so we filter it out. ("Removed \\d+ files?", "Removed [N] files"), ]) .collect(); uv_snapshot!(&filters, context.clean().arg("--verbose").arg("iniconfig"), @r" success: true exit_code: 0 ----- stdout ----- ----- stderr ----- DEBUG uv [VERSION] ([COMMIT] DATE) DEBUG Acquired lock for `[CACHE_DIR]/` DEBUG Removing dangling cache entry: [CACHE_DIR]/archive-v0/[ENTRY] Removed [N] files ([SIZE]) DEBUG Released lock at `[CACHE_DIR]/.lock` "); // Assert that the `.rkyv` file is removed for `iniconfig`. assert!( !rkyv.exists(), "Expected the `.rkyv` file to be removed for `iniconfig`" ); Ok(()) }