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/errors.rs | 6 ++++++ src/lib.rs | 1 + src/project.rs | 7 +++++++ src/python.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 src/python.rs (limited to 'src') 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, +} + +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