Skip to content

Commit 5389b57

Browse files
authored
Merge pull request #1291 from syphar/better-release-activity
remove update-release-activity background job and calculate the release-activity on the fly
2 parents cdc7a53 + a288174 commit 5389b57

File tree

6 files changed

+93
-120
lines changed

6 files changed

+93
-120
lines changed

src/bin/cratesfyi.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,6 @@ enum DatabaseSubcommand {
392392
prefix: String,
393393
},
394394

395-
/// Updates monthly release activity chart
396-
UpdateReleaseActivity,
397-
398395
/// Remove documentation from the database
399396
Delete {
400397
#[structopt(subcommand)]
@@ -451,12 +448,6 @@ impl DatabaseSubcommand {
451448
.context("Failed to add directory into database")?;
452449
}
453450

454-
// FIXME: This is actually util command not database
455-
Self::UpdateReleaseActivity => {
456-
docs_rs::utils::update_release_activity(&mut *ctx.conn()?)
457-
.context("Failed to update release activity")?
458-
}
459-
460451
Self::Delete {
461452
command: DeleteSubcommand::Version { name, version },
462453
} => db::delete_version(&mut *ctx.conn()?, &*ctx.storage()?, &name, &version)

src/utils/daemon.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
//! This daemon will start web server, track new packages and build them
44
55
use crate::{
6-
utils::{queue_builder, update_release_activity, GithubUpdater},
6+
utils::{queue_builder, GithubUpdater},
77
Context, DocBuilder, RustwideBuilder,
88
};
9-
use chrono::{Timelike, Utc};
109
use failure::Error;
1110
use log::{debug, error, info};
1211
use std::thread;
@@ -78,21 +77,6 @@ pub fn start_daemon(context: &dyn Context, enable_registry_watcher: bool) -> Res
7877
})
7978
.unwrap();
8079

81-
// update release activity everyday at 23:55
82-
let pool = context.pool()?;
83-
cron(
84-
"release activity updater",
85-
Duration::from_secs(60),
86-
move || {
87-
let now = Utc::now();
88-
if now.hour() == 23 && now.minute() == 55 {
89-
info!("Updating release activity");
90-
update_release_activity(&mut *pool.get()?)?;
91-
}
92-
Ok(())
93-
},
94-
)?;
95-
9680
if let Some(github_updater) = GithubUpdater::new(config, context.pool()?)? {
9781
cron(
9882
"github stats updater",

src/utils/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub use self::github_updater::GithubUpdater;
77
pub(crate) use self::html::rewrite_lol;
88
pub use self::queue::{get_crate_priority, remove_crate_priority, set_crate_priority};
99
pub use self::queue_builder::queue_builder;
10-
pub use self::release_activity_updater::update_release_activity;
1110
pub(crate) use self::rustc_version::parse_rustc_version;
1211

1312
#[cfg(test)]
@@ -23,6 +22,5 @@ mod html;
2322
mod pubsubhubbub;
2423
mod queue;
2524
mod queue_builder;
26-
mod release_activity_updater;
2725
mod rustc_version;
2826
pub(crate) mod sized_buffer;

src/utils/release_activity_updater.rs

Lines changed: 0 additions & 70 deletions
This file was deleted.

src/web/releases.rs

Lines changed: 89 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
web::{error::Nope, match_version, page::WebPage, redirect_base},
88
BuildQueue, Config,
99
};
10-
use chrono::{DateTime, Utc};
10+
use chrono::{DateTime, NaiveDate, Utc};
1111
use iron::{
1212
headers::{ContentType, Expires, HttpDate},
1313
mime::{Mime, SubLevel, TopLevel},
@@ -17,7 +17,6 @@ use iron::{
1717
use postgres::Client;
1818
use router::Router;
1919
use serde::Serialize;
20-
use serde_json::Value;
2120

2221
/// Number of release in home page
2322
const RELEASES_IN_HOME: i64 = 15;
@@ -659,7 +658,9 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
659658
#[derive(Debug, Clone, PartialEq, Serialize)]
660659
struct ReleaseActivity {
661660
description: &'static str,
662-
activity_data: Value,
661+
dates: Vec<String>,
662+
counts: Vec<i64>,
663+
failures: Vec<i64>,
663664
}
664665

665666
impl_webpage! {
@@ -668,20 +669,58 @@ impl_webpage! {
668669

669670
pub fn activity_handler(req: &mut Request) -> IronResult<Response> {
670671
let mut conn = extension!(req, Pool).get()?;
671-
let activity_data: Value = ctry!(
672+
673+
let data: Vec<(NaiveDate, i64, i64)> = ctry!(
672674
req,
673675
conn.query(
674-
"SELECT value FROM config WHERE name = 'release_activity'",
675-
&[]
676-
),
676+
"
677+
WITH dates AS (
678+
-- we need this series so that days in the statistic that don't have any releases are included
679+
SELECT generate_series(
680+
CURRENT_DATE - INTERVAL '30 days',
681+
CURRENT_DATE - INTERVAL '1 day',
682+
'1 day'::interval
683+
)::date AS date_
684+
),
685+
release_stats AS (
686+
SELECT
687+
release_time::date AS date_,
688+
COUNT(*) AS counts,
689+
SUM(CAST((is_library = TRUE AND build_status = FALSE) AS INT)) AS failures
690+
FROM
691+
releases
692+
WHERE
693+
release_time >= CURRENT_DATE - INTERVAL '30 days' AND
694+
release_time < CURRENT_DATE
695+
GROUP BY
696+
release_time::date
697+
)
698+
SELECT
699+
dates.date_ AS date,
700+
COALESCE(rs.counts, 0) AS counts,
701+
COALESCE(rs.failures, 0) AS failures
702+
FROM
703+
dates
704+
LEFT OUTER JOIN Release_stats AS rs ON dates.date_ = rs.date_
705+
706+
ORDER BY
707+
dates.date_
708+
",
709+
&[],
710+
)
677711
)
678-
.iter()
679-
.next()
680-
.map_or(Value::Null, |row| row.get("value"));
712+
.into_iter()
713+
.map(|row| (row.get(0), row.get(1), row.get(2)))
714+
.collect();
681715

682716
ReleaseActivity {
683717
description: "Monthly release activity",
684-
activity_data,
718+
dates: data
719+
.iter()
720+
.map(|&d| d.0.format("%d %b").to_string())
721+
.collect(),
722+
counts: data.iter().map(|&d| d.1).collect(),
723+
failures: data.iter().map(|&d| d.2).collect(),
685724
}
686725
.into_response(req)
687726
}
@@ -716,7 +755,7 @@ pub fn build_queue_handler(req: &mut Request) -> IronResult<Response> {
716755
mod tests {
717756
use super::*;
718757
use crate::test::{assert_redirect, assert_success, wrapper, TestFrontend};
719-
use chrono::TimeZone;
758+
use chrono::{Duration, TimeZone};
720759
use failure::Error;
721760
use kuchiki::traits::TendrilSink;
722761
use std::collections::HashSet;
@@ -1305,7 +1344,44 @@ mod tests {
13051344
fn release_activity() {
13061345
wrapper(|env| {
13071346
let web = env.frontend();
1308-
assert_success("/releases/activity", web)?;
1347+
1348+
let empty_data = format!("data: [{}]", vec!["0"; 30].join(","));
1349+
1350+
// no data / only zeros without releases
1351+
let response = web.get("/releases/activity/").send()?;
1352+
assert!(response.status().is_success());
1353+
assert_eq!(response.text().unwrap().matches(&empty_data).count(), 2);
1354+
1355+
env.fake_release().name("some_random_crate").create()?;
1356+
env.fake_release()
1357+
.name("some_random_crate_that_failed")
1358+
.build_result_failed()
1359+
.create()?;
1360+
1361+
// same when the release is on the current day, since we ignore today.
1362+
let response = web.get("/releases/activity/").send()?;
1363+
assert!(response.status().is_success());
1364+
assert_eq!(response.text().unwrap().matches(&empty_data).count(), 2);
1365+
1366+
env.fake_release()
1367+
.name("some_random_crate_yesterday")
1368+
.release_time(Utc::now() - Duration::days(1))
1369+
.create()?;
1370+
env.fake_release()
1371+
.name("some_random_crate_that_failed_yesterday")
1372+
.build_result_failed()
1373+
.release_time(Utc::now() - Duration::days(1))
1374+
.create()?;
1375+
1376+
// with releases yesterday we get the data we want
1377+
let response = web.get("/releases/activity/").send()?;
1378+
assert!(response.status().is_success());
1379+
let text = response.text().unwrap();
1380+
// counts contain both releases
1381+
assert!(text.contains(&format!("data: [{},2]", vec!["0"; 29].join(","))));
1382+
// failures only one
1383+
assert!(text.contains(&format!("data: [{},1]", vec!["0"; 29].join(","))));
1384+
13091385
Ok(())
13101386
})
13111387
}

templates/releases/activity.html

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,21 @@
2828
new Chart(ctx, {
2929
type: "line",
3030
data: {
31-
labels: [
32-
{% if activity_data.dates -%}
33-
{%- for date in activity_data.dates -%}
34-
{{ "'" ~ date ~ "'," }}
35-
{%- endfor -%}
36-
{%- endif %}
37-
],
31+
labels: {{ dates | json_encode() | safe }},
3832
datasets: [
3933
{
4034
label: "Releases",
4135
borderColor: "#4d76ae",
4236
backgroundColor: "#4d76ae",
4337
fill: false,
44-
data: [{{ activity_data.counts | default(value=[]) | join(sep=", ") }}],
38+
data: {{ counts | json_encode() | safe }},
4539
},
4640
{
4741
label: "Build Failures",
4842
borderColor: "#434348",
4943
backgroundColor: "#434348",
5044
fill: false,
51-
data: [{{ activity_data.failures | default(value=[]) | join(sep=", ") }}],
45+
data: {{ failures | json_encode() | safe }},
5246
},
5347
]
5448
},

0 commit comments

Comments
 (0)