summaryrefslogtreecommitdiff
path: root/src/python.rs
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-04-13 08:39:17 +0000
committerLars Wirzenius <liw@liw.fi>2021-04-13 08:39:17 +0000
commit50258196ee8832ca8d9f02e73babb431248ed025 (patch)
tree3b39dba244bd13a39abaca5b22d4574983323f3c /src/python.rs
parenta7cbaaa9be2dfc5e4fcdaf342dba98c923a99ab4 (diff)
parent297521aab3d48f12b09d1b3071c1e13ed7cafdb4 (diff)
downloadbumper-rs-50258196ee8832ca8d9f02e73babb431248ed025.tar.gz
Merge branch 'python' into 'main'
Python support Closes #2 See merge request larswirzenius/bumper!17
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()
+}