summaryrefslogtreecommitdiff
path: root/src/python.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/python.rs')
-rw-r--r--src/python.rs45
1 files changed, 45 insertions, 0 deletions
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<PathBuf>,
+}
+
+impl Python {
+ pub fn new(dirname: &Path) -> Result<Self, BumperError> {
+ 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<PathBuf> {
+ glob(&dirname.join("*/version.py").display().to_string())
+ .expect("glob pattern error")
+ .filter(|x| x.is_ok())
+ .map(|x| x.unwrap())
+ .collect()
+}