summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-04-13 10:46:37 +0300
committerLars Wirzenius <liw@liw.fi>2021-04-13 11:30:12 +0300
commitecdbc0b100cc50adffb1262ab485837d5dd2f709 (patch)
treef24f0c74a0ba8e5b85ab2e46f009e9ff4be9a66f /src
parenta7cbaaa9be2dfc5e4fcdaf342dba98c923a99ab4 (diff)
downloadbumper-rs-ecdbc0b100cc50adffb1262ab485837d5dd2f709.tar.gz
feat: support Python projects
Diffstat (limited to 'src')
-rw-r--r--src/errors.rs6
-rw-r--r--src/lib.rs1
-rw-r--r--src/project.rs7
-rw-r--r--src/python.rs45
4 files changed, 59 insertions, 0 deletions
diff --git a/src/errors.rs b/src/errors.rs
index bd09eba..97ed8d8 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -49,4 +49,10 @@ pub enum BumperError {
#[error("cargo failed in {0}: {1}")]
Cargo(PathBuf, String),
+
+ #[error("can't find any version.py files in Python project at {0}")]
+ NoVersionPy(PathBuf),
+
+ #[error("couldn't write Python version to {0}: {1}")]
+ PythonWrite(PathBuf, std::io::Error),
}
diff --git a/src/lib.rs b/src/lib.rs
index 51ddd5f..e0c0fca 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -2,4 +2,5 @@ pub mod debian;
pub mod errors;
pub mod git;
pub mod project;
+pub mod python;
pub mod rust;
diff --git a/src/project.rs b/src/project.rs
index 9f45363..e67fefc 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -1,11 +1,13 @@
use crate::debian::Debian;
use crate::errors::BumperError;
+use crate::python::Python;
use crate::rust::Rust;
use std::path::Path;
pub enum ProjectKind {
Rust(Rust),
Debian(Debian),
+ Python(Python),
}
impl ProjectKind {
@@ -21,6 +23,10 @@ impl ProjectKind {
kinds.push(ProjectKind::Debian(p));
}
+ if let Ok(p) = Python::new(dirname) {
+ kinds.push(ProjectKind::Python(p));
+ }
+
if kinds.is_empty() {
Err(BumperError::UnknownProjectKind(dirname.to_path_buf()))
} else {
@@ -32,6 +38,7 @@ impl ProjectKind {
match self {
Self::Rust(ref mut rust) => rust.set_version(version)?,
Self::Debian(ref mut debian) => debian.set_version(version)?,
+ Self::Python(ref mut python) => python.set_version(version)?,
}
Ok(())
}
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()
+}