Skip to content

Commit c2cf848

Browse files
Merge pull request #5 from theseus-rs/github-version-handling
GitHub version handling
2 parents a6e93f8 + 819a1e7 commit c2cf848

File tree

5 files changed

+109
-20
lines changed

5 files changed

+109
-20
lines changed

.github/workflows/build.yml

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
name: Build & Test
22

3-
env:
4-
CARGO_TERM_COLOR: always
5-
RUSTFLAGS: "-D warnings"
6-
RUST_LOG: "info"
7-
RUST_LOG_SPAN_EVENTS: full
8-
93
on:
104
workflow_call:
115
inputs:
@@ -45,13 +39,47 @@ jobs:
4539
- name: Install Rust
4640
uses: dtolnay/rust-toolchain@master
4741
with:
42+
components: 'llvm-tools-preview'
4843
toolchain: stable
4944

45+
- name: Install grcov
46+
uses: taiki-e/install-action@main
47+
with:
48+
tool: grcov
49+
5050
- name: Enable caching
5151
uses: Swatinem/rust-cache@v2
5252

5353
- name: Tests
5454
env:
55+
CARGO_TERM_COLOR: always
5556
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
57+
LLVM_PROFILE_FILE: postgresql-%p-%m.profraw
58+
RUST_LOG: "info"
59+
RUST_LOG_SPAN_EVENTS: full
60+
RUSTFLAGS: -Cinstrument-coverage
61+
RUSTDOCFLAGS: -Cinstrument-coverage
5662
run: |
5763
cargo test --workspace --all-features
64+
65+
- name: Produce coverage info
66+
if: ${{ startsWith(matrix.os, 'ubuntu-') }}
67+
run: |
68+
grcov $(find . -name "postgresql-*.profraw" -print) \
69+
-s . \
70+
--branch \
71+
--ignore-not-existing \
72+
--ignore='target/*' \
73+
--ignore='benches/*' \
74+
--ignore='/*' \
75+
--binary-path ./target/debug/ \
76+
--excl-line='#\[derive' \
77+
-t lcov \
78+
-o lcov.info
79+
80+
- name: Upload to codecov.io
81+
if: ${{ startsWith(matrix.os, 'ubuntu-') }}
82+
uses: codecov/codecov-action@v3
83+
with:
84+
files: lcov.info
85+
fail_ci_if_error: true

postgresql_archive/src/archive.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::io::{copy, BufReader, Cursor};
1616
use std::path::Path;
1717
use std::str::FromStr;
1818
use tar::Archive;
19-
use tracing::{debug, info};
19+
use tracing::{debug, info, warn};
2020

2121
const GITHUB_API_VERSION_HEADER: &str = "X-GitHub-Api-Version";
2222
const GITHUB_API_VERSION: &str = "2022-11-28";
@@ -98,7 +98,14 @@ async fn get_release(version: &Version) -> Result<Release> {
9898
}
9999

100100
for release in response_releases {
101-
let release_version = Version::from_str(&release.tag_name)?;
101+
let release_version = match Version::from_str(&release.tag_name) {
102+
Ok(release_version) => release_version,
103+
Err(_) => {
104+
warn!("Failed to parse release version {}", release.tag_name);
105+
continue;
106+
}
107+
};
108+
102109
if version.matches(&release_version) {
103110
match &result {
104111
Some(result_release) => {

postgresql_archive/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@
3434
//!
3535
//! ### Synchronous API
3636
//! ```no_run
37+
//! #[cfg(feature = "blocking")] {
3738
//! use postgresql_archive::LATEST;
3839
//! use postgresql_archive::blocking::{extract, get_archive};
3940
//!
4041
//! let (archive_version, archive, hash) = get_archive(&LATEST).unwrap();
4142
//! let out_dir = std::env::temp_dir();
4243
//! let result = extract(&archive, &out_dir).unwrap();
44+
//! }
4345
//! ```
4446
//!
4547
//! ## Feature flags

postgresql_archive/src/version.rs

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
use crate::error::ArchiveError::InvalidVersion;
55
use crate::error::{ArchiveError, Result};
6+
use serde::{Deserialize, Serialize};
67
use std::fmt;
78
use std::str::FromStr;
89

@@ -124,6 +125,25 @@ impl FromStr for Version {
124125
}
125126
}
126127

128+
impl<'de> Deserialize<'de> for Version {
129+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
130+
where
131+
D: serde::Deserializer<'de>,
132+
{
133+
let version = String::deserialize(deserializer)?;
134+
Version::from_str(&version).map_err(serde::de::Error::custom)
135+
}
136+
}
137+
138+
impl Serialize for Version {
139+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
140+
where
141+
S: serde::Serializer,
142+
{
143+
self.to_string().serialize(serializer)
144+
}
145+
}
146+
127147
#[cfg(test)]
128148
mod tests {
129149
use super::*;
@@ -134,7 +154,7 @@ mod tests {
134154
//
135155

136156
#[test]
137-
fn matches_all() {
157+
fn test_matches_all() {
138158
assert!(&Version::new(1, None, None).matches(&Version::new(1, None, None)));
139159
assert!(!&Version::new(1, None, None).matches(&Version::new(2, None, None)));
140160

@@ -156,23 +176,23 @@ mod tests {
156176
//
157177

158178
#[test]
159-
fn version_display() -> Result<()> {
179+
fn test_version_display() -> Result<()> {
160180
let version_str = "1.2.3";
161181
let version = Version::from_str(version_str)?;
162182
assert_eq!(version_str, version.to_string());
163183
Ok(())
164184
}
165185

166186
#[test]
167-
fn version_display_major() -> Result<()> {
187+
fn test_version_display_major() -> Result<()> {
168188
let version_str = "1";
169189
let version = Version::from_str(version_str)?;
170190
assert_eq!(version_str, version.to_string());
171191
Ok(())
172192
}
173193

174194
#[test]
175-
fn version_display_major_minor() -> Result<()> {
195+
fn test_version_display_major_minor() -> Result<()> {
176196
let version_str = "1.2";
177197
let version = Version::from_str(version_str)?;
178198
assert_eq!(version_str, version.to_string());
@@ -184,7 +204,7 @@ mod tests {
184204
//
185205

186206
#[test]
187-
fn version_from_str() -> Result<()> {
207+
fn test_version_from_str() -> Result<()> {
188208
let version = Version::from_str("1.2.3")?;
189209
assert_eq!(version.major, 1u64);
190210
assert_eq!(version.minor, Some(2));
@@ -193,7 +213,7 @@ mod tests {
193213
}
194214

195215
#[test]
196-
fn version_from_str_major() -> Result<()> {
216+
fn test_version_from_str_major() -> Result<()> {
197217
let version = Version::from_str("1")?;
198218
assert_eq!(version.major, 1);
199219
assert_eq!(version.minor, None);
@@ -202,7 +222,7 @@ mod tests {
202222
}
203223

204224
#[test]
205-
fn version_from_str_major_minor() -> Result<()> {
225+
fn test_version_from_str_major_minor() -> Result<()> {
206226
let version = Version::from_str("1.2")?;
207227
assert_eq!(version.major, 1);
208228
assert_eq!(version.minor, Some(2));
@@ -211,27 +231,57 @@ mod tests {
211231
}
212232

213233
#[test]
214-
fn version_from_str_error_missing_major() {
234+
fn test_version_from_str_error_missing_major() {
215235
assert!(Version::from_str("").is_err());
216236
}
217237

218238
#[test]
219-
fn version_from_str_error_invalid_major() {
239+
fn test_version_from_str_error_invalid_major() {
220240
assert!(Version::from_str("a").is_err());
221241
}
222242

223243
#[test]
224-
fn version_from_str_error_invalid_minor() {
244+
fn test_version_from_str_error_invalid_minor() {
225245
assert!(Version::from_str("1.a").is_err());
226246
}
227247

228248
#[test]
229-
fn version_from_str_error_invalid_release() {
249+
fn test_version_from_str_error_invalid_release() {
230250
assert!(Version::from_str("1.2.a").is_err());
231251
}
232252

233253
#[test]
234-
fn version_from_str_error_too_many_parts() {
254+
fn test_version_from_str_error_too_many_parts() {
235255
assert!(Version::from_str("1.2.3.4").is_err());
236256
}
257+
258+
//
259+
// Deserialize tests
260+
//
261+
262+
#[test]
263+
fn test_version_deserialize() -> anyhow::Result<()> {
264+
let version = serde_json::from_str::<Version>("\"1.2.3\"")?;
265+
assert_eq!(version.major, 1u64);
266+
assert_eq!(version.minor, Some(2));
267+
assert_eq!(version.release, Some(3));
268+
Ok(())
269+
}
270+
271+
#[test]
272+
fn test_version_deserialize_parse_error() {
273+
assert!(serde_json::from_str::<Version>("\"foo\"").is_err())
274+
}
275+
276+
//
277+
// Serialize tests
278+
//
279+
280+
#[test]
281+
fn test_version_serialize() -> anyhow::Result<()> {
282+
let version = Version::new(1, Some(2), Some(3));
283+
let version_str = serde_json::to_string(&version)?;
284+
assert_eq!(version_str, "\"1.2.3\"");
285+
Ok(())
286+
}
237287
}

postgresql_embedded/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
//!
4343
//! ### Synchronous API
4444
//! ```no_run
45+
//! #[cfg(feature = "blocking")] {
4546
//! use postgresql_embedded::blocking::PostgreSQL;
4647
//!
4748
//! let mut postgresql = PostgreSQL::default();
@@ -54,6 +55,7 @@
5455
//! postgresql.drop_database(database_name).unwrap();
5556
//!
5657
//! postgresql.stop().unwrap();
58+
//! }
5759
//! ```
5860
//!
5961
//! ## Information

0 commit comments

Comments
 (0)