summaryrefslogtreecommitdiffstats
path: root/kitchen_sink/src
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2020-02-22 10:40:44 +0000
committerKornel <kornel@geekhood.net>2020-02-22 10:42:48 +0000
commit16f4af9eb1935263ac78ce9b3e609fa1b1e45038 (patch)
tree4024a4476e6cb06fbb7bd3f4df5f9a46a92005f9 /kitchen_sink/src
parente205b77278eb4aba35eb63563afcaf0afb2c6a2e (diff)
Rev deps dl
Diffstat (limited to 'kitchen_sink/src')
-rw-r--r--kitchen_sink/src/lib_kitchen_sink.rs31
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());