Compare commits
10 Commits
Author | SHA1 | Date |
---|---|---|
Paul van Tilburg | ba1b27fd66 | |
Paul van Tilburg | 94c29cad71 | |
Paul van Tilburg | 8e5a1ef305 | |
Paul van Tilburg | 6c39cac26e | |
Paul van Tilburg | f1ee03d96c | |
Paul van Tilburg | 98f60cba89 | |
Paul van Tilburg | 45ee951601 | |
Paul van Tilburg | f4e7c82b53 | |
Paul van Tilburg | a29d7f3535 | |
Paul van Tilburg | c86f001fee |
20
CHANGELOG.md
20
CHANGELOG.md
|
@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.2.12] - 2024-05-09
|
||||
|
||||
### Security
|
||||
|
||||
* Updated dependencies, fixes security advisiories:
|
||||
* [RUSTSEC-2024-0019](https://rustsec.org/advisories/RUSTSEC-2024-0019)
|
||||
* [RUSTSEC-2024-0332](https://rustsec.org/advisories/RUSTSEC-2024-0332)
|
||||
|
||||
### Changed
|
||||
|
||||
* Update dependency on `cached`, `chrono-tz`, `image` and `reqwest`
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fix tests; reduce required accuracy for geocoded coordinates again and
|
||||
don't run background map updates during tests
|
||||
|
||||
## [0.2.11] - 2024-02-27
|
||||
|
||||
### Security
|
||||
|
@ -172,7 +189,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
Initial release.
|
||||
|
||||
[Unreleased]: https://git.luon.net/paul/sinoptik/compare/v0.2.11...HEAD
|
||||
[Unreleased]: https://git.luon.net/paul/sinoptik/compare/v0.2.12...HEAD
|
||||
[0.2.12]: https://git.luon.net/paul/sinoptik/compare/v0.2.11...v0.2.12
|
||||
[0.2.11]: https://git.luon.net/paul/sinoptik/compare/v0.2.10...v0.2.11
|
||||
[0.2.10]: https://git.luon.net/paul/sinoptik/compare/v0.2.9...v0.2.10
|
||||
[0.2.9]: https://git.luon.net/paul/sinoptik/compare/v0.2.8...v0.2.9
|
||||
|
|
File diff suppressed because it is too large
Load Diff
10
Cargo.toml
10
Cargo.toml
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "sinoptik"
|
||||
version = "0.2.11"
|
||||
version = "0.2.12"
|
||||
authors = [
|
||||
"Admar Schoonen <admar@luon.net",
|
||||
"Paul van Tilburg <paul@luon.net>"
|
||||
|
@ -12,13 +12,13 @@ repository = "https://git.luon.net/paul/sinoptik"
|
|||
license = "MIT"
|
||||
|
||||
[dependencies]
|
||||
cached = { version = "0.46.0", features = ["async"] }
|
||||
cached = { version = "0.51.3", features = ["async"] }
|
||||
chrono = "0.4.19"
|
||||
chrono-tz = "0.8.1"
|
||||
chrono-tz = "0.9.0"
|
||||
csv = "1.1.6"
|
||||
geocoding = "0.4.0"
|
||||
image = "0.24.1"
|
||||
reqwest = { version = "0.11.9", features = ["json"] }
|
||||
image = { version = "0.25.1", default-features = false, features = ["png"]}
|
||||
reqwest = { version = "0.12.4", features = ["json"] }
|
||||
rocket = { version = "0.5.0-rc.3", features = ["json"] }
|
||||
thiserror = "1.0.31"
|
||||
|
||||
|
|
32
src/lib.rs
32
src/lib.rs
|
@ -54,11 +54,11 @@ pub(crate) enum Error {
|
|||
|
||||
/// Failed to merge AQI & pollen items.
|
||||
#[error("Failed to merge AQI & pollen items: {0}")]
|
||||
Merge(#[from] self::providers::combined::MergeError),
|
||||
Merge(#[from] providers::combined::MergeError),
|
||||
|
||||
/// Failed to retrieve or sample the maps.
|
||||
#[error("Failed to retrieve or sample the maps: {0}")]
|
||||
Maps(#[from] self::maps::Error),
|
||||
Maps(#[from] maps::Error),
|
||||
|
||||
/// No geocoded position could be found.
|
||||
#[error("No geocoded position could be found")]
|
||||
|
@ -185,10 +185,8 @@ async fn version() -> Result<Json<VersionInfo>> {
|
|||
Ok(Json(VersionInfo::new()))
|
||||
}
|
||||
|
||||
/// Sets up Rocket.
|
||||
fn rocket(maps_handle: MapsHandle) -> Rocket<Build> {
|
||||
let maps_refresher = maps::run(Arc::clone(&maps_handle));
|
||||
|
||||
/// Sets up Rocket without fairings.
|
||||
fn rocket_core(maps_handle: MapsHandle) -> Rocket<Build> {
|
||||
rocket::build()
|
||||
.mount(
|
||||
"/",
|
||||
|
@ -201,6 +199,14 @@ fn rocket(maps_handle: MapsHandle) -> Rocket<Build> {
|
|||
],
|
||||
)
|
||||
.manage(maps_handle)
|
||||
}
|
||||
|
||||
/// Sets up Rocket.
|
||||
fn rocket(maps_handle: MapsHandle) -> Rocket<Build> {
|
||||
let rocket = rocket_core(Arc::clone(&maps_handle));
|
||||
let maps_refresher = maps::run(maps_handle);
|
||||
|
||||
rocket
|
||||
.attach(AdHoc::on_liftoff("Maps refresher", |_| {
|
||||
Box::pin(async move {
|
||||
// We don't care about the join handle nor error results?
|
||||
|
@ -263,8 +269,8 @@ mod tests {
|
|||
let response = client.get("/forecast?address=eindhoven").dispatch();
|
||||
assert_eq!(response.status(), Status::Ok);
|
||||
let json = response.into_json::<JsonValue>().expect("Not valid JSON");
|
||||
assert_float_absolute_eq!(json["lat"].as_f64().unwrap(), 51.448557, 1e-5);
|
||||
assert_float_absolute_eq!(json["lon"].as_f64().unwrap(), 5.450123, 1e-5);
|
||||
assert_float_absolute_eq!(json["lat"].as_f64().unwrap(), 51.448557, 1e-1);
|
||||
assert_float_absolute_eq!(json["lon"].as_f64().unwrap(), 5.450123, 1e-1);
|
||||
assert_matches!(json["time"], JsonValue::Number(_));
|
||||
assert_matches!(json.get("AQI"), None);
|
||||
assert_matches!(json.get("NO2"), None);
|
||||
|
@ -281,8 +287,8 @@ mod tests {
|
|||
.dispatch();
|
||||
assert_eq!(response.status(), Status::Ok);
|
||||
let json = response.into_json::<JsonValue>().expect("Not valid JSON");
|
||||
assert_float_absolute_eq!(json["lat"].as_f64().unwrap(), 51.448557, 1e-5);
|
||||
assert_float_absolute_eq!(json["lon"].as_f64().unwrap(), 5.450123, 1e-5);
|
||||
assert_float_absolute_eq!(json["lat"].as_f64().unwrap(), 51.448557, 1e-1);
|
||||
assert_float_absolute_eq!(json["lon"].as_f64().unwrap(), 5.450123, 1e-1);
|
||||
assert_matches!(json["time"], JsonValue::Number(_));
|
||||
assert_matches!(json.get("AQI"), Some(JsonValue::Array(_)));
|
||||
assert_matches!(json.get("NO2"), Some(JsonValue::Array(_)));
|
||||
|
@ -338,7 +344,8 @@ mod tests {
|
|||
fn map_address() {
|
||||
let maps_handle = Arc::new(Mutex::new(Maps::new()));
|
||||
let maps_handle_clone = Arc::clone(&maps_handle);
|
||||
let client = Client::tracked(rocket(maps_handle)).expect("Not a valid Rocket instance");
|
||||
let client =
|
||||
Client::tracked(rocket_core(maps_handle)).expect("Not a valid Rocket instance");
|
||||
|
||||
// No maps available yet.
|
||||
let response = client
|
||||
|
@ -373,7 +380,8 @@ mod tests {
|
|||
fn map_geo() {
|
||||
let maps_handle = Arc::new(Mutex::new(Maps::new()));
|
||||
let maps_handle_clone = Arc::clone(&maps_handle);
|
||||
let client = Client::tracked(rocket(maps_handle)).expect("Not a valid Rocket instance");
|
||||
let client =
|
||||
Client::tracked(rocket_core(maps_handle)).expect("Not a valid Rocket instance");
|
||||
|
||||
// No maps available yet.
|
||||
let response = client.get("/map?lat=51.4&lon=5.5&metric=pollen").dispatch();
|
||||
|
|
|
@ -45,7 +45,7 @@ pub(crate) enum Error {
|
|||
|
||||
/// Failed to join a task.
|
||||
#[error("Failed to join a task: {0}")]
|
||||
Join(#[from] rocket::tokio::task::JoinError),
|
||||
Join(#[from] tokio::task::JoinError),
|
||||
|
||||
/// Did not find any known (map key) colors in samples.
|
||||
#[error("Did not find any known colors in samples")]
|
||||
|
@ -393,7 +393,7 @@ fn sample<I: GenericImageView<Pixel = Rgba<u8>>>(
|
|||
.expect("Maximum color is always a map key color") as u8;
|
||||
|
||||
samples.push(Sample { time, score });
|
||||
time += chrono::Duration::seconds(interval);
|
||||
time += Duration::seconds(interval);
|
||||
offset += width;
|
||||
}
|
||||
|
||||
|
@ -575,10 +575,7 @@ pub(crate) async fn mark_map(
|
|||
|
||||
// Encode the image as PNG image data.
|
||||
let mut image_data = Cursor::new(Vec::new());
|
||||
match image.write_to(
|
||||
&mut image_data,
|
||||
image::ImageOutputFormat::from(image::ImageFormat::Png),
|
||||
) {
|
||||
match image.write_to(&mut image_data, ImageFormat::Png) {
|
||||
Ok(()) => Ok(image_data.into_inner()),
|
||||
Err(err) => Err(crate::Error::from(Error::from(err))),
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue