Update informer for CLI applications written in Rust 🦀
It checks for a new version on Crates.io and GitHub 🚀
The idea is actually not new, as GitHub has been doing for a long time in its CLI application.
There is also a popular JavaScript library.
Add update-informer
to Cargo.toml
:
toml
[dependencies]
update-informer = "0.2.0"
To check for a new version on Crates.io, use the UpdateInformer::check_version
function.
This function takes the project name and current version as well as check interval:
```rust use update_informer::{registry::Crates, Check, UpdateInformer};
let informer = UpdateInformer::new(Crates, "repo", "0.1.0", Duration::fromsecs(60 * 60 * 24)); if let Ok(Some(version)) = informer.checkversion() { println!("New version is available: {}", version); } ```
Also, you can take the name and version of the project from Cargo using environment variables:
```rust use update_informer::{registry::Crates, Check, UpdateInformer};
let name = env!("CARGOPKGNAME"); let version = env!("CARGOPKGVERSION"); UpdateInformer::new(Crates, name, version, Duration::fromsecs(60 * 60 * 24)).checkversion(); ```
Note that the first check will start only after the interval has expired:
```rust use update_informer::{registry::Crates, Check, UpdateInformer};
const EVERYHOUR: Duration = Duration::fromsecs(60 * 60);
let informer = UpdateInformer::new(Crates, "repo", "0.1.0", EVERYHOUR); informer.checkversion(); // The check will start only after an hour ```
To check for a new version on GitHub (note that the project name must contain the owner):
```rust use update_informer::{registry::GitHub, Check, UpdateInformer};
let informer = UpdateInformer::new(GitHub, "owner/repo", "0.1.0", Duration::fromsecs(60 * 60 * 24)); informer.checkversion(); ```
A real example of using update_informer
with colored crate:
```rust use colored::*; use std::time::Duration; use update_informer::{registry::Crates, Check, UpdateInformer};
fn main() { let pkgname = env!("CARGOPKGNAME"); let currentversion = env!("CARGOPKGVERSION"); let interval = Duration::from_secs(60 * 60 * 24);
let informer = UpdateInformer::new(Crates, pkg_name, current_version, interval);
if let Ok(Some(version)) = informer.check_version() {
let msg = format!(
"A new release of {pkg_name} is available: v{current_version} -> {new_version}",
pkg_name = pkg_name.italic().cyan(),
current_version = current_version,
new_version = version.to_string().green()
);
let release_url = format!(
"https://github.com/{pkg_name}/{pkg_name}/releases/tag/{version}",
pkg_name = pkg_name,
version = version
)
.yellow();
println!("\n{msg}\n{url}", msg = msg, url = release_url);
}
} ```
The result will look like:
In order not to check for updates in tests, you can use the FakeUpdateInformer::check_version
function, which returns the desired version.
Example of usage in unit tests:
```rust use update_informer::{registry::Crates, Check, FakeUpdateInformer, UpdateInformer};
let name = "repo"; let version = "0.1.0"; let interval = Duration::from_secs(60 * 60 * 24);
let informer = UpdateInformer::new(Crates, name, version, interval);
let informer = FakeUpdateInformer::new(Crates, name, version, interval, "1.0.0");
if let Ok(Some(version)) = informer.check_version() { println!("New version is available: {}", version); } ```
To use the FakeUpdateInformer::check_version
function in integration tests, you must first add the feature flag to Cargo.toml
:
toml
[features]
stub_check_version = []
Then use this feature flag in your code and integration tests:
```rust
let informer = UpdateInformer::new(Crates, name, version, interval);
let informer = FakeUpdateInformer::new(Crates, name, version, interval, "1.0.0");
informer.check_version(); ```