barad-dur 0.18.0

The all-seeing repository analyzer
Documentation
use anyhow::Result;
use chrono::{DateTime, Utc};

pub fn fetch_dates(
    name: &str,
    version: &str,
) -> Result<(Option<DateTime<Utc>>, String, DateTime<Utc>)> {
    let url = format!("https://pypi.org/pypi/{}/json", name);
    let client = super::client::http().ok_or_else(|| anyhow::anyhow!("HTTP client unavailable"))?;
    let body: serde_json::Value = client.get(&url).send()?.json()?;
    let releases = body["releases"]
        .as_object()
        .ok_or_else(|| anyhow::anyhow!("no releases"))?;

    let current_published = releases
        .get(version)
        .and_then(|v| v.as_array())
        .and_then(|arr| arr.first())
        .and_then(|f| f["upload_time_iso_8601"].as_str())
        .and_then(|s| s.parse().ok());

    let latest_version = body["info"]["version"].as_str().unwrap_or("").to_string();
    let latest_published = releases
        .get(&latest_version)
        .and_then(|v| v.as_array())
        .and_then(|arr| arr.first())
        .and_then(|f| f["upload_time_iso_8601"].as_str())
        .and_then(|s| s.parse().ok())
        .ok_or_else(|| anyhow::anyhow!("no latest date"))?;

    Ok((current_published, latest_version, latest_published))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    #[ignore = "network"]
    fn fetch_requests_dates() {
        let (current, latest_ver, _) = fetch_dates("requests", "2.28.0").unwrap();
        assert!(current.is_some());
        assert!(!latest_ver.is_empty());
    }
}