use crate::errors::BumperError; use glob::glob; use log::{debug, info}; use std::path::{Path, PathBuf}; pub struct Python { version_pys: Vec, } impl Python { pub fn new(dirname: &Path) -> Result { debug!("considering {} as a Python project", dirname.display()); let setup_py = dirname.join("setup.py"); if setup_py.exists() { let files = find_version_py_files(dirname); if files.is_empty() { debug!("no version.py files in {}", dirname.display()); Err(BumperError::NoVersionPy(dirname.to_path_buf())) } else { info!("Looks like a Python project: {}", dirname.display()); Ok(Self { version_pys: files }) } } else { debug!("{} does not exist", setup_py.display()); Err(BumperError::UnknownProjectKind(dirname.to_path_buf())) } } pub fn set_version(&mut self, version: &str) -> Result<(), BumperError> { for filename in self.version_pys.iter() { info!("writing Python version to {}", filename.display()); std::fs::write(filename, format!("__version__ = \"{}\"\n", version)) .map_err(|err| BumperError::PythonWrite(filename.to_path_buf(), err))?; } Ok(()) } } fn find_version_py_files(dirname: &Path) -> Vec { glob(&dirname.join("*/version.py").display().to_string()) .expect("glob pattern error") .filter(|x| x.is_ok()) .map(|x| x.unwrap()) .collect() }