From ecdbc0b100cc50adffb1262ab485837d5dd2f709 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 13 Apr 2021 10:46:37 +0300 Subject: feat: support Python projects --- src/python.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/python.rs (limited to 'src/python.rs') diff --git a/src/python.rs b/src/python.rs new file mode 100644 index 0000000..2b851f8 --- /dev/null +++ b/src/python.rs @@ -0,0 +1,45 @@ +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() +} -- cgit v1.2.1