Compare commits

..

No commits in common. "HEAD" and "v0.2.0" have entirely different histories.
HEAD ... v0.2.0

6 changed files with 53 additions and 196 deletions

View file

@ -1,48 +0,0 @@
name: "Check, lint and test using Cargo"
on:
- pull_request
- push
- workflow_dispatch
jobs:
check_lint:
name: Check, lint and test
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Install stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt, clippy
- name: Use sparse Cargo index for crates.io
run: echo -e '[registries.crates-io]\nprotocol = "sparse"' >> /root/.cargo/config.toml
- name: Run cargo check
uses: https://github.com/actions-rs/cargo@v1
with:
command: check
- name: Run cargo clippy
uses: https://github.com/actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
- name: Run cargo fmt
uses: https://github.com/actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
- name: Run cargo test
uses: https://github.com/actions-rs/cargo@v1
with:
command: test
args: --all-features

View file

@ -1,75 +0,0 @@
name: "Release"
on:
push:
tags:
- "v*"
jobs:
release:
name: "Release"
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Determine the version of the release
run: |
VERSION=${GITHUB_REF_NAME#v}
echo "Releasing version: $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Get the release notes from the changelog
run: |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
RELEASE_NOTES=$(sed -n -e "/^## \[$VERSION\]/,/^## \[/{//"'!'"p;}" CHANGELOG.md | sed -e '1d;$d')
echo "Release notes:"
echo
echo "$RELEASE_NOTES"
echo "RELEASE_NOTES<<$EOF" >> "$GITHUB_ENV"
echo "$RELEASE_NOTES" >> "$GITHUB_ENV"
echo "$EOF" >> "$GITHUB_ENV"
- name: Install Go
uses: actions/setup-go@v4
with:
go-version: '>=1.20.1'
- name: Release to Gitea
uses: actions/release-action@main
with:
# This is available by default.
api_key: '${{ secrets.RELEASE_TOKEN }}'
files: FIXME
title: 'Release ${{ env.VERSION }}'
body: '${{ env.RELEASE_NOTES }}'
release-crate:
name: "Release crate"
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Rust stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Register the Gitea crate registry with Cargo
run: echo -e '[registries.luon]\nindex = "https://git.luon.net/paul/_cargo-index.git"' >> /root/.cargo/config.toml
- name: Run cargo publish
uses: https://github.com/actions-rs/cargo@v1
env:
# This needs to be provided for the repository; no login necessary as a result.
CARGO_REGISTRIES_LUON_TOKEN: '${{ secrets.CARGO_TOKEN }}'
with:
command: publish
args: --registry luon

View file

@ -7,24 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.2.2] - 2024-04-03
### Changed
* Bumped dependency on `derive_builder` crate
## [0.2.1] - 2023-03-11
### Changed
* Bumped dependency on `derive_builder` crate
* Use `assert_eq` for float tests; drop dev depend on `float_eq` crate
### Fixed
* Fix doclinks in README
* Fix docs.rs metadata section name in `Cargo.toml`
## [0.2.0] - 2022-10-01 ## [0.2.0] - 2022-10-01
### Added ### Added
@ -48,8 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Fix some small errors in the documentation * Fix some small errors in the documentation
[Unreleased]: https://git.luon.net/paul/geo-uri-rs/compare/v0.2.2...HEAD [Unreleased]: https://git.luon.net/paul/geo-uri-rs/compare/v0.2.0...HEAD
[0.2.2]: https://git.luon.net/paul/geo-uri-rs/compare/v0.2.1..v0.2.2
[0.2.1]: https://git.luon.net/paul/geo-uri-rs/compare/v0.2.0..v0.2.1
[0.2.0]: https://git.luon.net/paul/geo-uri-rs/compare/v0.1.1..v0.2.0 [0.2.0]: https://git.luon.net/paul/geo-uri-rs/compare/v0.1.1..v0.2.0
[0.1.1]: https://git.luon.net/paul/geo-uri-rs/commits/tag/v0.1.1 [0.1.1]: https://git.luon.net/paul/geo-uri-rs/commits/tag/v0.1.1

View file

@ -1,6 +1,6 @@
[package] [package]
name = "geo-uri" name = "geo-uri"
version = "0.2.2" version = "0.2.0"
authors = ["Paul van Tilburg <paul@luon.net>"] authors = ["Paul van Tilburg <paul@luon.net>"]
edition = "2021" edition = "2021"
rust-version = "1.60.0" rust-version = "1.60.0"
@ -10,9 +10,8 @@ repository = "https://git.luon.net/paul/geo-uri-rs"
license = "MIT" license = "MIT"
keywords = ["geolocation", "uri", "parser", "rfc5870"] keywords = ["geolocation", "uri", "parser", "rfc5870"]
categories = ["parser-implementations", "web-programming", "encoding"] categories = ["parser-implementations", "web-programming", "encoding"]
include = ["CHANGELOG.md", "LICENSE", "README.md", "src/*.rs"]
[package.metadata."docs.rs"] [package.metadata.docs.rs]
all-features = true all-features = true
rustdoc-args = ["--cfg", "docsrs"] rustdoc-args = ["--cfg", "docsrs"]
@ -21,10 +20,11 @@ url = ["dep:url"]
serde = ["dep:serde"] serde = ["dep:serde"]
[dependencies] [dependencies]
derive_builder = "0.20.0" derive_builder = "0.11.2"
serde = { version = "1.0.145", optional = true } serde = { version = "1.0.145", optional = true }
thiserror = "1.0.35" thiserror = "1.0.35"
url = { version = "2.3.1", optional = true } url = { version = "2.3.1", optional = true }
[dev-dependencies] [dev-dependencies]
float_eq = "1.0.0"
serde_test = "1.0.145" serde_test = "1.0.145"

View file

@ -24,7 +24,7 @@ $ cargo add geo-uri
Use either the [`TryFrom`](std::convert::TryFrom) trait or the Use either the [`TryFrom`](std::convert::TryFrom) trait or the
[`parse`](str::parse) method on strings to parse a geo URI string into a [`parse`](str::parse) method on strings to parse a geo URI string into a
[`GeoUri`](GeoUri) struct: [`GeoUri`] struct:
```rust ```rust
use geo_uri::GeoUri; use geo_uri::GeoUri;
@ -56,8 +56,8 @@ assert_eq!(geo_uri.uncertainty(), None);
### Generating ### Generating
Use the [`GeoUriBuilder`](GeoUriBuilder) to construct a [`GeoUri`](GeoUri) Use the [`GeoUriBuilder`] to construct a [`GeoUri`] struct.
struct. Then, use either the [`ToString`](std::string::ToString) or Then, use either the [`ToString`](std::string::ToString) or
[`Display`](std::fmt::Display) trait to generate a geo URI string: [`Display`](std::fmt::Display) trait to generate a geo URI string:
```rust ```rust
@ -80,8 +80,8 @@ assert_eq!(
); );
``` ```
It is also possible to construct a [`GeoUri`](GeoUri) struct from coordinate It is also possible to construct a [`GeoUri`] struct from coordinate tuples
tuples using the [`TryFrom`](std::convert::TryFrom) trait: using the [`TryFrom`](std::convert::TryFrom) trait:
```rust ```rust
use geo_uri::GeoUri; use geo_uri::GeoUri;
@ -115,14 +115,13 @@ let geo_url = Url::from(geo_uri);
assert_eq!(url, geo_url); assert_eq!(url, geo_url);
``` ```
Note that it is always possible to transform a [`GeoUri`](GeoUri) into an Note that it is always possible to transform a [`GeoUri`] into an [`Url`], but
[`Url`](https://docs.rs/url/2/url/struct.Url.html), but not always the other not always the other way around! This is because the format of the coordinates
way around! This is because the format of the coordinates and parameters after and parameters after the URI scheme "geo:" may be invalid!
the URI scheme "geo:" may be invalid!
### Feature: `serde` ### Feature: `serde`
If you enable the `serde` feature, [`GeoUri`](GeoUri) will implement If you enable the `serde` feature, [`GeoUri`] will implement
[`serde::Serialize`](https://docs.rs/serde/1/serde/trait.Serialize.html) and [`serde::Serialize`](https://docs.rs/serde/1/serde/trait.Serialize.html) and
[`serde::Deserialize`](https://docs.rs/serde/1/serde/trait.Deserialize.html). [`serde::Deserialize`](https://docs.rs/serde/1/serde/trait.Deserialize.html).
See the [serde](https://serde.rs) documentation for more information. See the [serde](https://serde.rs) documentation for more information.

View file

@ -624,6 +624,7 @@ impl GeoUriBuilder {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use float_eq::assert_float_eq;
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde_test::{assert_de_tokens_error, assert_tokens, Token}; use serde_test::{assert_de_tokens_error, assert_tokens, Token};
@ -661,8 +662,8 @@ mod tests {
builder.longitude(5.134); builder.longitude(5.134);
let geo_uri = builder.build()?; let geo_uri = builder.build()?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
@ -690,8 +691,8 @@ mod tests {
#[test] #[test]
fn geo_uri_parse() -> Result<(), Error> { fn geo_uri_parse() -> Result<(), Error> {
let geo_uri = GeoUri::parse("geo:52.107,5.134")?; let geo_uri = GeoUri::parse("geo:52.107,5.134")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
@ -726,9 +727,9 @@ mod tests {
assert!(matches!(geo_uri, Err(Error::InvalidCoord(_)))); assert!(matches!(geo_uri, Err(Error::InvalidCoord(_))));
let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6")?; let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
let geo_uri = GeoUri::parse("geo:52.107,5.34,3.6;u="); let geo_uri = GeoUri::parse("geo:52.107,5.34,3.6;u=");
@ -744,24 +745,24 @@ mod tests {
assert!(matches!(geo_uri, Err(Error::OutOfRangeUncertainty))); assert!(matches!(geo_uri, Err(Error::OutOfRangeUncertainty)));
let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;u=25000")?; let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;u=25000")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, Some(25_000.0)); assert_eq!(geo_uri.uncertainty, Some(25_000.0));
let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;crs=wgs84;u=25000")?; let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;crs=wgs84;u=25000")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, Some(25_000.0)); assert_eq!(geo_uri.uncertainty, Some(25_000.0));
let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;CRS=wgs84;U=25000")?; let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;CRS=wgs84;U=25000")?;
assert_eq!(geo_uri.uncertainty, Some(25_000.0)); assert_eq!(geo_uri.uncertainty, Some(25_000.0));
let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;crs=wgs84;u=25000;foo=bar")?; let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6;crs=wgs84;u=25000;foo=bar")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, Some(25_000.0)); assert_eq!(geo_uri.uncertainty, Some(25_000.0));
let geo_uri = GeoUri::parse("geo:52.107,5.34,3.6;crs=foo"); let geo_uri = GeoUri::parse("geo:52.107,5.34,3.6;crs=foo");
@ -772,21 +773,21 @@ mod tests {
// Examples from RFC 5870 (sections 1, 6.1, 6.2 and 9.4)! // Examples from RFC 5870 (sections 1, 6.1, 6.2 and 9.4)!
let geo_uri = GeoUri::parse("geo:13.4125,103.8667")?; let geo_uri = GeoUri::parse("geo:13.4125,103.8667")?;
assert_eq!(geo_uri.latitude, 13.4125); assert_float_eq!(geo_uri.latitude, 13.4125, abs <= 0.0001);
assert_eq!(geo_uri.longitude, 103.8667); assert_float_eq!(geo_uri.longitude, 103.8667, abs <= 0.0001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
let geo_uri = GeoUri::parse("geo:48.2010,16.3695,183")?; let geo_uri = GeoUri::parse("geo:48.2010,16.3695,183")?;
assert_eq!(geo_uri.latitude, 48.2010); assert_float_eq!(geo_uri.latitude, 48.2010, abs <= 0.0001);
assert_eq!(geo_uri.longitude, 16.3695); assert_float_eq!(geo_uri.longitude, 16.3695, abs <= 0.0001);
assert_eq!(geo_uri.altitude.unwrap(), 183.0); assert_float_eq!(geo_uri.altitude.unwrap(), 183.0, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
let geo_uri = GeoUri::parse("geo:48.198634,16.371648;crs=wgs84;u=40")?; let geo_uri = GeoUri::parse("geo:48.198634,16.371648;crs=wgs84;u=40")?;
assert_eq!(geo_uri.crs, CoordRefSystem::Wgs84); assert_eq!(geo_uri.crs, CoordRefSystem::Wgs84);
assert_eq!(geo_uri.latitude, 48.198634); assert_float_eq!(geo_uri.latitude, 48.198634, abs <= 0.000001);
assert_eq!(geo_uri.longitude, 16.371648); assert_float_eq!(geo_uri.longitude, 16.371648, abs <= 0.000001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, Some(40.0)); assert_eq!(geo_uri.uncertainty, Some(40.0));
@ -895,8 +896,8 @@ mod tests {
#[test] #[test]
fn geo_uri_from_str() -> Result<(), Error> { fn geo_uri_from_str() -> Result<(), Error> {
let geo_uri = GeoUri::from_str("geo:52.107,5.134")?; let geo_uri = GeoUri::from_str("geo:52.107,5.134")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
@ -929,15 +930,15 @@ mod tests {
fn geo_uri_try_from() -> Result<(), Error> { fn geo_uri_try_from() -> Result<(), Error> {
// &str // &str
let geo_uri = GeoUri::try_from("geo:52.107,5.134")?; let geo_uri = GeoUri::try_from("geo:52.107,5.134")?;
assert_eq!(geo_uri.latitude, 52.107); assert_float_eq!(geo_uri.latitude, 52.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
// (f64, f64) // (f64, f64)
let geo_uri = GeoUri::try_from((51.107, 5.134))?; let geo_uri = GeoUri::try_from((51.107, 5.134))?;
assert_eq!(geo_uri.latitude, 51.107); assert_float_eq!(geo_uri.latitude, 51.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude, None); assert_eq!(geo_uri.altitude, None);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
@ -952,9 +953,9 @@ mod tests {
// (f64, f64, f64) // (f64, f64, f64)
let geo_uri = GeoUri::try_from((51.107, 5.134, 3.6))?; let geo_uri = GeoUri::try_from((51.107, 5.134, 3.6))?;
assert_eq!(geo_uri.latitude, 51.107); assert_float_eq!(geo_uri.latitude, 51.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, None); assert_eq!(geo_uri.uncertainty, None);
assert_eq!( assert_eq!(
@ -975,15 +976,15 @@ mod tests {
// Url // Url
let url = Url::parse("geo:51.107,5.134,3.6;crs=wgs84;u=1000;foo=bar").expect("valid URL"); let url = Url::parse("geo:51.107,5.134,3.6;crs=wgs84;u=1000;foo=bar").expect("valid URL");
let geo_uri = GeoUri::try_from(&url)?; let geo_uri = GeoUri::try_from(&url)?;
assert_eq!(geo_uri.latitude, 51.107); assert_float_eq!(geo_uri.latitude, 51.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, Some(1000.0)); assert_eq!(geo_uri.uncertainty, Some(1000.0));
let geo_uri = GeoUri::try_from(url)?; let geo_uri = GeoUri::try_from(url)?;
assert_eq!(geo_uri.latitude, 51.107); assert_float_eq!(geo_uri.latitude, 51.107, abs <= 0.001);
assert_eq!(geo_uri.longitude, 5.134); assert_float_eq!(geo_uri.longitude, 5.134, abs <= 0.001);
assert_eq!(geo_uri.altitude.unwrap(), 3.6); assert_float_eq!(geo_uri.altitude.unwrap(), 3.6, abs <= 0.1);
assert_eq!(geo_uri.uncertainty, Some(1000.0)); assert_eq!(geo_uri.uncertainty, Some(1000.0));
Ok(()) Ok(())