diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 294c101..a684603 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,20 +1,64 @@ +name: Continuous Integration on: [push, pull_request] jobs: - build: + rustfmt: + name: Formatting check runs-on: ubuntu-latest - container: - image: rust:1 steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - run: rustup component add rustfmt - - run: cargo test - - run: cargo fmt --all -- --check + - uses: actions/checkout@master + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + components: rustfmt + - name: Run cargo fmt + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check - - name: Publish crate - if: github.ref == 'refs/heads/master' - run: cargo publish - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CRATESIO_TOKEN }} + clippy: + name: Analyzing code with Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + components: clippy + - name: Run cargo clippy + uses: actions-rs/cargo@v1 + with: + command: clippy + args: --workspace --all-features --all-targets -- -D warnings + + tests: + name: Tests + runs-on: ${{ matrix.os }} + strategy: + matrix: + build: [stable, beta] + include: + - build: stable + os: ubuntu-latest + rust: stable + - build: beta + os: ubuntu-latest + rust: beta + steps: + - uses: actions/checkout@master + - name: Install Rust ${{ matrix.rust }} + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + profile: minimal + override: true + - name: Run tests with all features + uses: actions-rs/cargo@v1 + with: + command: test + args: --workspace --all-features --all-targets --verbose diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..e692d26 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,27 @@ +name: Publish on crates.io +on: + release: + types: [published] + +jobs: + publish: + name: Publish + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + - name: Cargo login + uses: actions-rs/cargo@v1 + with: + command: login + args: -- ${{ secrets.CARGO_TOKEN }} + - name: Publish osm_boundaries_utils + uses: actions-rs/cargo@v1 + with: + command: publish + args: --all-features diff --git a/Cargo.toml b/Cargo.toml index e853fc9..35b7532 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,4 @@ readme = "README.md" log = "0.4" osmpbfreader = "0.16" geo-types = "^0.7" -geo = "0.18" +geo = "0.23" diff --git a/src/boundaries.rs b/src/boundaries.rs index 4b6690e..b50816a 100644 --- a/src/boundaries.rs +++ b/src/boundaries.rs @@ -1,6 +1,7 @@ extern crate osmpbfreader; -use geo_types::{Coordinate, LineString, MultiPolygon, Point, Polygon}; +use geo::Coord; +use geo_types::{LineString, MultiPolygon, Point, Polygon}; use std::borrow::Borrow; use std::collections::BTreeMap; @@ -185,7 +186,7 @@ pub fn build_boundary_parts>( let mut append_ring = |nodes: &[osmpbfreader::Node]| { let poly_geom = nodes .iter() - .map(|n| Coordinate { + .map(|n| Coord { x: n.lon(), y: n.lat(), }) @@ -259,7 +260,7 @@ pub fn build_boundary_parts>( if !added_part { use geo::haversine_distance::HaversineDistance; let p = |n: &osmpbfreader::Node| { - Point(Coordinate { + Point(Coord { x: n.lon(), y: n.lat(), }) @@ -272,7 +273,7 @@ pub fn build_boundary_parts>( warn!( "boundary: relation/{} ({}): unclosed polygon, dist({:?}, {:?}) = {}", relation.id.0, - relation.tags.get("name").map_or("", |s| &s), + relation.tags.get("name").map_or("", |s| s), added_nodes.first().unwrap().id, added_nodes.last().unwrap().id, distance @@ -327,7 +328,7 @@ fn test_build_boundary_not_closed() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - assert!(build_boundary(&relation, &builder.objects).is_none()); + assert!(build_boundary(relation, &builder.objects).is_none()); } else { unreachable!() } @@ -350,7 +351,7 @@ fn test_build_boundary_closed() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -376,7 +377,7 @@ fn test_build_boundary_closed_reverse() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -399,7 +400,7 @@ fn test_build_one_boundary_closed() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -431,14 +432,14 @@ fn test_build_two_opposite_clockwise_boundaries() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 2); let centroid = multipolygon.centroid(); let centroid = centroid.unwrap(); - assert!(centroid.lng().abs() < f64::EPSILON); - assert!(centroid.lat().abs() < f64::EPSILON); + assert!(centroid.x().abs() < f64::EPSILON); + assert!(centroid.y().abs() < f64::EPSILON); } else { unreachable!() } @@ -464,7 +465,7 @@ fn test_build_two_boundaries_closed() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 2); @@ -496,7 +497,7 @@ fn test_build_one_donut_boundary() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -536,7 +537,7 @@ fn test_build_two_boundaries_with_one_hole() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 2); @@ -576,7 +577,7 @@ fn test_build_one_boundary_with_two_holes() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -624,7 +625,7 @@ fn test_build_two_boundaries_with_two_holes() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 2); @@ -663,7 +664,7 @@ fn test_build_inner_touching_outer_at_one_point() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 1); @@ -705,7 +706,7 @@ fn test_build_two_touching_rings() { .relation_id .into(); if let osmpbfreader::OsmObj::Relation(ref relation) = builder.objects[&rel_id] { - let multipolygon = build_boundary(&relation, &builder.objects); + let multipolygon = build_boundary(relation, &builder.objects); assert!(multipolygon.is_some()); let multipolygon = multipolygon.unwrap(); assert_eq!(multipolygon.0.len(), 2); diff --git a/src/osm_builder.rs b/src/osm_builder.rs index 962c9cc..9aa883e 100644 --- a/src/osm_builder.rs +++ b/src/osm_builder.rs @@ -47,6 +47,7 @@ impl<'a> Relation<'a> { } } +#[derive(Default)] pub struct OsmBuilder { node_id: i64, way_id: i64, @@ -55,18 +56,6 @@ pub struct OsmBuilder { named_nodes: BTreeMap, } -impl Default for OsmBuilder { - fn default() -> Self { - Self { - node_id: 0, - way_id: 0, - relation_id: 0, - objects: BTreeMap::new(), - named_nodes: BTreeMap::new(), - } - } -} - impl OsmBuilder { pub fn new() -> OsmBuilder { Self::default() @@ -110,8 +99,8 @@ impl OsmBuilder { let id = osmpbfreader::NodeId(self.node_id); let n = osmpbfreader::Node { id, - decimicro_lat: (coord.lat() * 1e7) as i32, - decimicro_lon: (coord.lng() * 1e7) as i32, + decimicro_lat: (coord.y() * 1e7) as i32, + decimicro_lon: (coord.x() * 1e7) as i32, tags: osmpbfreader::Tags::new(), }; self.node_id += 1;