diff options
author | Kornel <kornel@geekhood.net> | 2020-02-22 10:40:44 +0000 |
---|---|---|
committer | Kornel <kornel@geekhood.net> | 2020-02-22 10:42:48 +0000 |
commit | 16f4af9eb1935263ac78ce9b3e609fa1b1e45038 (patch) | |
tree | 4024a4476e6cb06fbb7bd3f4df5f9a46a92005f9 /kitchen_sink/src | |
parent | e205b77278eb4aba35eb63563afcaf0afb2c6a2e (diff) |
Rev deps dl
Diffstat (limited to 'kitchen_sink/src')
-rw-r--r-- | kitchen_sink/src/lib_kitchen_sink.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index d55b389..f9aaac9 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -291,6 +291,37 @@ impl KitchenSink { Ok(summed_days) } + // Monthly downloads, sampled from last few days or weeks + pub fn recent_downloads_by_version(&self, k: &RichCrateVersion) -> CResult<HashMap<MiniVer, u32>> { + let now = Utc::today(); + let curr_year = now.year() as u16; + let curr_year_data = self.yearly.get_crate_year(k.name(), curr_year)?.unwrap_or_default(); + + let mut out = HashMap::new(); + let mut total = 0; + let mut days = 0; + let mut end_day = now.ordinal0() as usize; // we'll have garbage data in january… + loop { + let start_day = end_day.saturating_sub(4); + days += end_day - start_day; + + for (ver, dl) in &curr_year_data { + let cnt = out.entry(ver).or_insert(0); + for d in dl.0[start_day..end_day].iter().copied() { + *cnt += d; + total += d; + } + } + if start_day == 0 || total > 10000 || days >= 30 { + break; + } + end_day = start_day; + } + Ok(out.into_iter().map(|(k,v)| + (k.clone(), (v as usize * 30 / days) as u32) + ).collect()) + } + /// Gets cratesio download data, but not from the API, but from our local copy pub fn weekly_downloads(&self, k: &RichCrate, num_weeks: u16) -> CResult<Vec<DownloadWeek>> { let mut res = Vec::with_capacity(num_weeks.into()); |