Skip to content

Commit

Permalink
Development Tools
Browse files Browse the repository at this point in the history
  • Loading branch information
AndyGauge committed May 9, 2018
1 parent 203b063 commit 66a4653
Show file tree
Hide file tree
Showing 29 changed files with 1,129 additions and 959 deletions.
7 changes: 6 additions & 1 deletion src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,14 @@
- [Data Structures](data_structures.md)
- [Constants](data_structures/constant.md)
- [Custom](data_structures/custom.md)
- [Development Tools](development_tools.md)
- [Debugging](development_tools/debugging.md)
- [Log Messages](development_tools/debugging/log.md)
- [Configure Logging](development_tools/debugging/config_log.md)
- [Versioning](development_tools/versioning.md)
- [Build Time Tooling](development_tools/build_tools.md)
- [Basics](basics.md)
- [Encoding](encoding.md)
- [Networking](net.md)
- [Application development](app.md)
- [Logging](logging.md)
- [Build Time Tooling](build_tools.md)
258 changes: 5 additions & 253 deletions src/app.md
Original file line number Diff line number Diff line change
Expand Up @@ -358,263 +358,15 @@ fn run() -> Result<()> {
# quick_main!(run);
```

[ex-semver-increment]: #ex-semver-increment
<a name="ex-semver-increment"></a>
## Parse and increment a version string.
{{#include development_tools/versioning/semver-increment.md}}

[![semver-badge]][semver] [![cat-config-badge]][cat-config]
{{#include development_tools/versioning/semver-complex.md}}

Constructs a [`semver::Version`] from a string literal using [`Version::parse`], then increments it by patch, minor, and major version number one by one.
{{#include development_tools/versioning/semver-prerelease.md}}

Note that in accordance with the [Semantic Versioning Specification], incrementing the minor version number resets the patch version number to 0 and incrementing the major version number resets both the minor and patch version numbers to 0.
{{#include development_tools/versioning/semver-latest.md}}

```rust
# #[macro_use]
# extern crate error_chain;
extern crate semver;

use semver::Version;
#
# error_chain! {
# foreign_links {
# SemVer(semver::SemVerError);
# }
# }

fn run() -> Result<()> {
let mut parsed_version = Version::parse("0.2.6")?;

assert_eq!(
parsed_version,
Version {
major: 0,
minor: 2,
patch: 6,
pre: vec![],
build: vec![],
}
);

parsed_version.increment_patch();
assert_eq!(parsed_version.to_string(), "0.2.7");
println!("New patch release: v{}", parsed_version);

parsed_version.increment_minor();
assert_eq!(parsed_version.to_string(), "0.3.0");
println!("New minor release: v{}", parsed_version);

parsed_version.increment_major();
assert_eq!(parsed_version.to_string(), "1.0.0");
println!("New major release: v{}", parsed_version);

Ok(())
}
#
# quick_main!(run);
```

[ex-semver-complex]: #ex-semver-complex
<a name="ex-semver-complex"></a>
## Parse a complex version string.

[![semver-badge]][semver] [![cat-config-badge]][cat-config]

Constructs a [`semver::Version`] from a complex version string using [`Version::parse`]. The string
contains pre-release and build metadata as defined in the [Semantic Versioning Specification].

Note that, in accordance with the Specification, build metadata is parsed but not considered when
comparing versions. In other words, two versions may be equal even if their build strings differ.

```rust
# #[macro_use]
# extern crate error_chain;
extern crate semver;

use semver::{Identifier, Version};
#
# error_chain! {
# foreign_links {
# SemVer(semver::SemVerError);
# }
# }

fn run() -> Result<()> {
let version_str = "1.0.49-125+g72ee7853";
let parsed_version = Version::parse(version_str)?;

assert_eq!(
parsed_version,
Version {
major: 1,
minor: 0,
patch: 49,
pre: vec![Identifier::Numeric(125)],
build: vec![],
}
);
assert_eq!(
parsed_version.build,
vec![Identifier::AlphaNumeric(String::from("g72ee7853"))]
);

let serialized_version = parsed_version.to_string();
assert_eq!(&serialized_version, version_str);

Ok(())
}
#
# quick_main!(run);
```

[ex-semver-prerelease]: #ex-semver-prerelease
<a name="ex-semver-prerelease"></a>
## Check if given version is pre-release.

[![semver-badge]][semver] [![cat-config-badge]][cat-config]

Given two versions, we assert (by using [`is_prerelease`]) that one is pre-release and that the other is not.

```rust
# #[macro_use]
# extern crate error_chain;
extern crate semver;

use semver::Version;
#
# error_chain! {
# foreign_links {
# SemVer(semver::SemVerError);
# }
# }

fn run() -> Result<()> {
let version_1 = Version::parse("1.0.0-alpha")?;
let version_2 = Version::parse("1.0.0")?;

assert!(version_1.is_prerelease());
assert!(!version_2.is_prerelease());

Ok(())
}
#
# quick_main!(run);
```

[ex-semver-latest]: #ex-semver-latest
<a name="ex-semver-latest"></a>
## Find the latest version satisfying given range
[![semver-badge]][semver] [![cat-config-badge]][cat-config]

Given a list of version &strs, finds the latest [`semver::Version`] that satisfying a given [`semver::VersionReq`] using [`VersionReq::matches`].

```rust
# #[macro_use]
# extern crate error_chain;
extern crate semver;

use semver::{Version, VersionReq};
#
# error_chain! {
# foreign_links {
# SemVer(semver::SemVerError);
# SemVerReq(semver::ReqParseError);
# }
# }

fn find_max_matching_version<'a, I>(version_req_str: &str, iterable: I) -> Result<Option<Version>>
where
I: IntoIterator<Item = &'a str>,
{
let vreq = VersionReq::parse(version_req_str)?;

Ok(
iterable
.into_iter()
.filter_map(|s| Version::parse(s).ok())
.filter(|s| vreq.matches(s))
.max(),
)
}

fn run() -> Result<()> {
assert_eq!(
find_max_matching_version("<= 1.0.0", vec!["0.9.0", "1.0.0", "1.0.1"])?,
Some(Version::parse("1.0.0")?)
);

// Shows Semver precedence for pre-release tags
assert_eq!(
find_max_matching_version(
">1.2.3-alpha.3",
vec![
"1.2.3-alpha.3",
"1.2.3-alpha.4",
"1.2.3-alpha.10",
"1.2.3-beta.4",
"3.4.5-alpha.9",
]
)?,
Some(Version::parse("1.2.3-beta.4")?)
);

Ok(())
}
#
# quick_main!(run);
```

[ex-semver-command]: #ex-semver-command
<a name="ex-semver-command"></a>
## Check external command version for compatibility
[![semver-badge]][semver] [![cat-text-processing-badge]][cat-text-processing] [![cat-os-badge]][cat-os]

Runs `git --version` using [`Command`], then parses the version number into a [`semver::Version`]
using [`Version::parse`]. A [`semver::VersionReq`] is used to compare the parsed version to a
minimum version requirement.

```rust,no_run
# #[macro_use]
# extern crate error_chain;
extern crate semver;
use std::process::Command;
use semver::{Version, VersionReq};
#
# error_chain! {
# foreign_links {
# Io(std::io::Error);
# Utf8(std::string::FromUtf8Error);
# SemVer(semver::SemVerError);
# SemVerReq(semver::ReqParseError);
# }
# }
fn run() -> Result<()> {
let version_constraint = "> 1.12.0";
let version_test = VersionReq::parse(version_constraint)?;
let output = Command::new("git").arg("--version").output()?;
if !output.status.success() {
bail!("Command executed with failing error code");
}
let stdout = String::from_utf8(output.stdout)?;
// `git --version` output: "git version x.y.z"
let version = stdout.split(" ").last().ok_or_else(|| {
"Invalid command output"
})?;
let parsed_version = Version::parse(version)?;
if !version_test.matches(&parsed_version) {
bail!("Command version lower than minimum supported version (found {}, need {})",
parsed_version, version_constraint);
}
Ok(())
}
#
# quick_main!(run);
```
{{#include development_tools/versioning/semver-command.md}}

{{#include links.md}}

Expand Down
2 changes: 0 additions & 2 deletions src/basics.md
Original file line number Diff line number Diff line change
Expand Up @@ -689,8 +689,6 @@ fn run() -> Result<()> {

{{#include cryptography/encryption/pbkdf2.md}}


[ex-bitflags]: #ex-bitflags
{{#include data_structures/custom/bitfield.md}}

[ex-random-file-access]: #ex-random-file-access
Expand Down
Loading

0 comments on commit 66a4653

Please sign in to comment.