From 00e4cad33c8f76e78d2fd89152078150f04c4bd6 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Wed, 18 Sep 2024 14:51:27 +0200 Subject: [PATCH 1/7] chore: add prj_tox function --- src/main.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main.rs b/src/main.rs index a55fd8c..cbb1107 100644 --- a/src/main.rs +++ b/src/main.rs @@ -741,6 +741,32 @@ assignees: {} } } +// Project tox +fn prj_tox(name: &str, venv: bool) { + // Create tox ini + let confirm = prompt_confirm("Do you want to configure tox?", false, "None"); + if confirm { + let mut pip = std::process::Command::new("pip3"); + // Activate venv + if venv { + pip.env("PATH", "venv/bin"); + } + let output = pip + .arg("install") + .arg("--timeout=10") + .arg("--retries=1") + .arg("tox") + .current_dir(&name) + .output() + .expect("pip should be installed"); + // Check if command exit successfully + if !output.status.success() { + eprintln!("error: tox installation failed"); + return; + } + } +} + // Main program fn main() { // Print welcome screen and version @@ -767,6 +793,8 @@ fn main() { } // Write pyproject.toml prj_toml(&name, &deps); + // Tox + prj_tox(&name, venv); // Finish scaffolding process println!("Project `{name}` created") } From 418b1ffb3c77bc6cad2dc95787407d3ea8deaef0 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Thu, 19 Sep 2024 13:30:15 +0200 Subject: [PATCH 2/7] chore: add tox.ini file into prj_tox function --- src/main.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main.rs b/src/main.rs index cbb1107..4414e0e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -764,6 +764,23 @@ fn prj_tox(name: &str, venv: bool) { eprintln!("error: tox installation failed"); return; } + // Write tox.ini + let tox_ini_content = "[tox] +envlist = py310, py311, py312 +isolated_build = True + +[testenv] +labels = test, core +deps = pytest +commands = pytest tests" + .to_string(); + let tox_ini = make_file(format!("{name}/tox.ini").as_str(), tox_ini_content); + match tox_ini { + Err(e) => { + eprintln!("error: {}", e); + } + Ok(_) => (), + } } } From 7bb5d7edd11645e735f674138bdc2e0423ef9a23 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Thu, 19 Sep 2024 15:35:14 +0200 Subject: [PATCH 3/7] chore: change single match statements with if let --- src/main.rs | 192 +++++++++++++++++----------------------------------- 1 file changed, 63 insertions(+), 129 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4414e0e..aad1d67 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,12 +26,11 @@ fn check_tool(tool: &str) { // Function for creating folders and parents fn make_dirs(dir: &str) -> std::io::Result<()> { let result = create_dir_all(dir); - match result { - Err(e) => { - eprintln!("error: {}", e); - exit(2); - } - Ok(_) => Ok(()), + if let Err(e) = result { + eprintln!("error: {}", e); + exit(2); + } else { + Ok(()) } } @@ -39,12 +38,11 @@ fn make_dirs(dir: &str) -> std::io::Result<()> { fn make_file(file: &str, content: String) -> std::io::Result<()> { let mut file = File::create(file)?; let result = file.write_all(&content.as_bytes()); - match result { - Err(e) => { - eprintln!("error: {}", e); - exit(3); - } - Ok(_) => Ok(()), + if let Err(e) = result { + eprintln!("error: {}", e); + exit(3); + } else { + Ok(()) } } @@ -95,12 +93,9 @@ fn prj_name() -> String { let project = format!("{root}/{package}"); // Make directories structure let dir_ret = make_dirs(format!("{project}").as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - exit(4); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); + exit(4); } // Make file structures let file_ret = make_file( @@ -114,12 +109,9 @@ fn prj_name() -> String { " .to_string(), ); - match file_ret { - Err(e) => { - eprintln!("error: {}", e); - exit(4); - } - Ok(_) => (), + if let Err(e) = file_ret { + eprintln!("error: {}", e); + exit(4); } name } @@ -177,12 +169,11 @@ docs/_build/ /site" .to_string(), ); - let ret = match file_ret { - Err(e) => { - eprintln!("error: {}", e); - exit(5); - } - Ok(_) => true, + let ret = if let Err(e) = file_ret { + eprintln!("error: {}", e); + exit(5); + } else { + true }; return ret; } @@ -195,12 +186,9 @@ fn prj_test(name: &str) { if confirm { // Make directories structure let dir_ret = make_dirs(format!("{name}/tests").as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - exit(6); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); + exit(6); } // Make file structures let init_file = make_file( @@ -213,12 +201,9 @@ fn prj_test(name: &str) { " .to_string(), ); - match init_file { - Err(e) => { - eprintln!("error: {}", e); - exit(6); - } - Ok(_) => (), + if let Err(e) = init_file { + eprintln!("error: {}", e); + exit(6); } let project_name = name.to_lowercase(); let all_module = make_file( @@ -248,12 +233,9 @@ if __name__ == '__main__': ) .to_string(), ); - match all_module { - Err(e) => { - eprintln!("error: {}", e); - exit(6); - } - Ok(_) => (), + if let Err(e) = all_module { + eprintln!("error: {}", e); + exit(6); } } } @@ -347,12 +329,9 @@ changelog = '' ); // Write pyproject.toml let pyproject = make_file(format!("{name}/pyproject.toml").as_str(), content); - match pyproject { - Err(e) => { - eprintln!("error: {}", e); - exit(7); - } - Ok(_) => (), + if let Err(e) = pyproject { + eprintln!("error: {}", e); + exit(7); } } @@ -388,19 +367,13 @@ script: - pytest tests" ), ); - match travis { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = travis { + eprintln!("error: {}", e); } } else if ci.as_str() == "CircleCI" { let dir_ret = make_dirs(format!("{name}/.circleci").as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); } let circle = make_file( format!("{name}/.circleci/config.yml").as_str(), @@ -431,11 +404,8 @@ jobs: " ), ); - match circle { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = circle { + eprintln!("error: {}", e); } } } @@ -480,18 +450,12 @@ fn prj_remote(name: &str) { remote.to_lowercase() ); let dir_ret = make_dirs(issue_folder.as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); } let dir_ret = make_dirs(merge_folder.as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); } let feature_content = format!( "## Description @@ -512,11 +476,8 @@ Additional context format!("{issue_folder}/feature.md").as_str(), feature_content, ); - match feature_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = feature_issue { + eprintln!("error: {}", e); } let bug_content = format!( "## Description of problem @@ -542,11 +503,8 @@ Additional context name.to_lowercase() ); let bug_issue = make_file(format!("{issue_folder}/bug.md").as_str(), bug_content); - match bug_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = bug_issue { + eprintln!("error: {}", e); } let merge_content = format!( "## What does this MR do and why? @@ -566,40 +524,28 @@ Numbered steps to set up and validate the change are strongly suggested. name.to_lowercase() ); let merge_issue = make_file(format!("{merge_folder}/merge.md").as_str(), merge_content); - match merge_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = merge_issue { + eprintln!("error: {}", e); } // Github } else if remote.as_str() == "Github" { let issue_folder = format!("{}/.{}/ISSUE_TEMPLATE", name, remote.to_lowercase()); let merge_folder = format!("{}/.{}/PULL_REQUEST_TEMPLATE", name, remote.to_lowercase()); let dir_ret = make_dirs(issue_folder.as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); } let dir_ret = make_dirs(merge_folder.as_str()); - match dir_ret { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = dir_ret { + eprintln!("error: {}", e); } let config_content = "blank_issues_enabled: false\n".to_string(); let config_file = make_file( format!("{issue_folder}/config.yml").as_str(), config_content, ); - match config_file { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = config_file { + eprintln!("error: {}", e); } let feature_content = format!( "name: Feature Request @@ -642,11 +588,8 @@ body: format!("{issue_folder}/feature.yml").as_str(), feature_content, ); - match feature_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = feature_issue { + eprintln!("error: {}", e); } let bug_content = format!( "name: Bug Report @@ -700,11 +643,8 @@ body: name.to_lowercase() ); let bug_issue = make_file(format!("{issue_folder}/bug.yml").as_str(), bug_content); - match bug_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = bug_issue { + eprintln!("error: {}", e); } let merge_content = format!( "# Title of Pull Request @@ -731,11 +671,8 @@ assignees: {} format!("{merge_folder}/pull_request_template.md").as_str(), merge_content, ); - match merge_issue { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = merge_issue { + eprintln!("error: {}", e); } } } @@ -775,11 +712,8 @@ deps = pytest commands = pytest tests" .to_string(); let tox_ini = make_file(format!("{name}/tox.ini").as_str(), tox_ini_content); - match tox_ini { - Err(e) => { - eprintln!("error: {}", e); - } - Ok(_) => (), + if let Err(e) = tox_ini { + eprintln!("error: {}", e); } } } From ca2794bf981ff77fe309fd5950a8c82260786637 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Fri, 20 Sep 2024 12:29:12 +0200 Subject: [PATCH 4/7] chore: add prj_docs function --- src/main.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main.rs b/src/main.rs index aad1d67..324103d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -718,6 +718,30 @@ commands = pytest tests" } } +fn prj_docs(name: &str, venv: bool) { + let options = vec!["None", "Sphinx", "MKDocs"]; + let docs = prompt_select("Select document generator:", options, "None"); + if docs.as_str() == "Sphinx" { + let mut pip = std::process::Command::new("pip3"); + // Activate venv + if venv { + pip.env("PATH", "venv/bin"); + } + let output = pip + .arg("install") + .arg("--timeout=10") + .arg("--retries=1") + .arg("sphinx") + .current_dir(&name) + .output() + .expect("pip should be installed"); + // Check if command exit successfully + if !output.status.success() { + eprintln!("error: sphinx installation failed"); + } + } +} + // Main program fn main() { // Print welcome screen and version @@ -746,6 +770,8 @@ fn main() { prj_toml(&name, &deps); // Tox prj_tox(&name, venv); + // Documentation + prj_docs(&name, venv); // Finish scaffolding process println!("Project `{name}` created") } From fd12ece5ba936932cced10ddcd4681c802d5c1a2 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Sat, 21 Sep 2024 09:50:20 +0200 Subject: [PATCH 5/7] chore: add Sphinx installation into prj_docs function --- src/main.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main.rs b/src/main.rs index 324103d..7f62517 100644 --- a/src/main.rs +++ b/src/main.rs @@ -721,7 +721,15 @@ commands = pytest tests" fn prj_docs(name: &str, venv: bool) { let options = vec!["None", "Sphinx", "MKDocs"]; let docs = prompt_select("Select document generator:", options, "None"); + let docs_home = format!("{name}/docs"); if docs.as_str() == "Sphinx" { + // Create docs folder + let docs = make_dirs(format!("{docs_home}").as_str()); + if let Err(e) = docs { + eprintln!("error: {}", e); + exit(4); + } + // Install sphinx let mut pip = std::process::Command::new("pip3"); // Activate venv if venv { @@ -736,6 +744,31 @@ fn prj_docs(name: &str, venv: bool) { .output() .expect("pip should be installed"); // Check if command exit successfully + if !output.status.success() { + eprintln!("error: sphinx installation failed"); + return; + } + // Start documentation; + let sphinx_bin = format!("../venv/bin/sphinx-quickstart"); + let mut sphinx_quickstart = std::process::Command::new(sphinx_bin); + // Activate venv + if venv { + sphinx_quickstart.env("PATH", "venv/bin"); + } + let output = sphinx_quickstart + .arg("--quiet") + .arg("--sep") + .arg(format!("--project={}", name.to_lowercase())) + .arg("--author=''") + .arg("-v='0.0.1'") + .arg("--ext-autodoc") + .arg("--ext-doctest") + .arg("--ext-viewcode") + .arg("--makefile") + .current_dir(docs_home) + .output() + .expect("sphinx-quickstart should be installed"); + // Check if command exit successfully if !output.status.success() { eprintln!("error: sphinx installation failed"); } From e7b5c9bd5206ad842fc56277ed38012f6dccd3f8 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Sun, 22 Sep 2024 10:34:04 +0200 Subject: [PATCH 6/7] chore: add MKDocs installation into prj_docs function --- src/main.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7f62517..311f3be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -722,13 +722,13 @@ fn prj_docs(name: &str, venv: bool) { let options = vec!["None", "Sphinx", "MKDocs"]; let docs = prompt_select("Select document generator:", options, "None"); let docs_home = format!("{name}/docs"); + // Create docs folder + let docs_folder = make_dirs(format!("{docs_home}").as_str()); + if let Err(e) = docs_folder { + eprintln!("error: {}", e); + exit(4); + } if docs.as_str() == "Sphinx" { - // Create docs folder - let docs = make_dirs(format!("{docs_home}").as_str()); - if let Err(e) = docs { - eprintln!("error: {}", e); - exit(4); - } // Install sphinx let mut pip = std::process::Command::new("pip3"); // Activate venv @@ -770,7 +770,45 @@ fn prj_docs(name: &str, venv: bool) { .expect("sphinx-quickstart should be installed"); // Check if command exit successfully if !output.status.success() { - eprintln!("error: sphinx installation failed"); + eprintln!("error: sphinx documentation creation failed"); + } + } else if docs.as_str() == "MKDocs" { + // Install mkdocs + let mut pip = std::process::Command::new("pip3"); + // Activate venv + if venv { + pip.env("PATH", "venv/bin"); + } + let output = pip + .arg("install") + .arg("--timeout=10") + .arg("--retries=1") + .arg("mkdocs") + .current_dir(&name) + .output() + .expect("pip should be installed"); + // Check if command exit successfully + if !output.status.success() { + eprintln!("error: mkdocs installation failed"); + return; + } + // Start documentation; + let mkdocs_bin = format!("venv/bin/mkdocs"); + let mut mkdocs_new = std::process::Command::new(mkdocs_bin); + // Activate venv + if venv { + mkdocs_new.env("PATH", "venv/bin"); + } + let output = mkdocs_new + .arg("new") + .arg("--quiet") + .arg(".") + .current_dir(&name) + .output() + .expect("mkdocs should be installed"); + // Check if command exit successfully + if !output.status.success() { + eprintln!("error: mkdocs documentation creation failed"); } } } From 23c233d513abcc9a009cd4454e55fd4ed7f833f8 Mon Sep 17 00:00:00 2001 From: Matteo Guadrini Date: Mon, 23 Sep 2024 11:54:24 +0200 Subject: [PATCH 7/7] chore: prepare tox and docs files --- CHANGES.md | 5 ++++ Cargo.toml | 2 +- README.md | 83 +++++++++++++++++++---------------------------------- src/main.rs | 2 +- 4 files changed, 37 insertions(+), 55 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6c9747f..72a5166 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Release notes +## 0.0.8 +Sep 23, 2024 +- Add **prj_tox** function +- Add **prj_docs** function + ## 0.0.7 Sep 17, 2024 - Add **prj_remote** function diff --git a/Cargo.toml b/Cargo.toml index ed1cfe1..9d0fb15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "psp" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = ["matteoguadrini "] description = "PSP (Python Scaffolding Projects)" diff --git a/README.md b/README.md index 841776a..ed42a64 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ # **psp** (Python Scaffolding Projects) -`psp` is a blazing fast command line utility to scaffold your Python project, written in Rust. +`psp` is a blazing fast command line utility to scaffold your _Python_ project, written in Rust. + +> [!NOTE] +> This project is WIP: beta + +![Demo](https://i.ibb.co/KcZtw58/psp008.gif) ```console psp # Press Enter -Welcome to PSP (Python Scaffolding Projects): 0.0.7 +Welcome to PSP (Python Scaffolding Projects): 0.0.8 > Name of Python project: test > Do you want to start git repository? Yes > Do you want unit test files? Yes @@ -13,17 +18,28 @@ Welcome to PSP (Python Scaffolding Projects): 0.0.7 > Select CI provider: CircleCI > Select git remote provider: Github > Username of Github: MatteoGuadrini +> Do you want to configure tox? Yes +> Select document generator: Sphinx Project `test` created ``` The result is: ```console -tree test --filelimit=8 -a +tree test --filelimit=10 -a test # project folder ├── pyproject.toml # python package configuration file ├── .circleci # CI folder │   └── config.yml # CI configuration file +├── docs # documentation folder: Sphinx/MKDocs +│   ├── build +│   ├── make.bat +│   ├── Makefile +│   └── source +│   ├── conf.py +│   ├── index.rst +│   ├── _static +│   └── _templates ├── .git # git folder │   ├── branches │   ├── config @@ -51,60 +67,20 @@ test # project folder ├── tests # tests package for modules │   ├── __init__.py │   └── test_test.py # test module "test_" +├── tox.ini # Tox configuration files └── venv # virtual environment - ├── bin [12 entries exceeds filelimit, not opening dir] + ├── bin [33 entries exceeds filelimit, not opening dir] ├── include │   └── python3.12 ├── lib │   └── python3.12 - │   └── site-packages - │   ├── numpy [46 entries exceeds filelimit, not opening dir] - │   ├── numpy-2.1.0.dist-info - │   │   ├── entry_points.txt - │   │   ├── INSTALLER - │   │   ├── LICENSE.txt - │   │   ├── METADATA - │   │   ├── RECORD - │   │   ├── REQUESTED - │   │   └── WHEEL - │   ├── numpy.libs - │   │   ├── libgfortran-040039e1-0352e75f.so.5.0.0 - │   │   ├── libquadmath-96973f99-934c22de.so.0.0.0 - │   │   └── libscipy_openblas64_-ff651d7f.so - │   ├── pip - │   │   ├── __init__.py - │   │   ├── _internal [23 entries exceeds filelimit, not opening dir] - │   │   ├── __main__.py - │   │   ├── __pip-runner__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-312.pyc - │   │   │   ├── __main__.cpython-312.pyc - │   │   │   └── __pip-runner__.cpython-312.pyc - │   │   ├── py.typed - │   │   └── _vendor [27 entries exceeds filelimit, not opening dir] - │   ├── pip-23.3.2.dist-info [9 entries exceeds filelimit, not opening dir] - │   ├── scipy [28 entries exceeds filelimit, not opening dir] - │   ├── scipy-1.14.1.dist-info - │   │   ├── INSTALLER - │   │   ├── LICENSE.txt - │   │   ├── METADATA - │   │   ├── RECORD - │   │   ├── REQUESTED - │   │   └── WHEEL - │   └── scipy.libs - │   ├── libgfortran-040039e1-0352e75f.so.5.0.0 - │   ├── libgfortran-040039e1.so.5.0.0 - │   ├── libquadmath-96973f99-934c22de.so.0.0.0 - │   ├── libquadmath-96973f99.so.0.0.0 - │   └── libscipy_openblas-c128ec02.so + │   └── site-packages [68 entries exceeds filelimit, not opening dir] ├── lib64 -> lib └── pyvenv.cfg -36 directories, 43 files +30 directories, 20 files ``` -> This project is WIP: beta - ## Prerequisites `psp` has three prerequisetes installed on own machine: @@ -121,13 +97,13 @@ To install compiled file into your machine, download it: For all users: ```console sudo -i -curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.7/psp_linux > /usr/bin/psp +curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.8/psp_linux > /usr/bin/psp chmod +x /usr/bin/psp ``` For current user: ```console -curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.7/psp_linux > $HOME/.local/bin/psp +curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.8/psp_linux > $HOME/.local/bin/psp chmod +x $HOME/.local/bin/psp ``` @@ -135,7 +111,7 @@ chmod +x $HOME/.local/bin/psp ```console sudo su - -curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.7/psp_macos > /usr/bin/psp +curl -L https://github.com/MatteoGuadrini/psp/releases/download/v0.0.8/psp_macos > /usr/bin/psp chmod +x /usr/bin/psp ``` @@ -156,10 +132,11 @@ cd psp && cargo build && sudo cp -var target/release/psp /usr/bin/psp - [x] Prepare pyproject.toml - [x] Prepare CI configuration files - [x] Prepare Github/Gitlab files -- [ ] Prepare tox environment -- [ ] Prepare docs folder for sphinx/mkdocs documentation +- [x] Prepare tox environment +- [x] Prepare docs folder for sphinx/mkdocs documentation - [ ] Prepare README, LICENSE, CONTRIBUTING, CODE_OF_CONDUCT and CHANGES files -- [ ] Add _quick_ argument for rapid configuration +- [ ] Add build and deploy dependencies to distribute package +- [ ] Add _quick_, _nodocs_ and _full_ argument for rapid configuration ## Open source _psp_ is an open source project. Any contribute, It's welcome. diff --git a/src/main.rs b/src/main.rs index 311f3be..ec86440 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use std::{ }; // Constants -const VERSION: &str = "0.0.7"; +const VERSION: &str = "0.0.8"; // Utility functions