Skip to content

Commit 3b80a61

Browse files
committed
Provide build info as json string
Docs.rs will provide build as json from following URL: `https://docs.rs/crate/<CRATE_NAME>/<CRATE_VERSION>/builds.json`. A get request to this URL will return a list of build attempts. First object in this list will always contain latest build attempt. This object will contain following fields: Example output of `https://docs.rs/crate/rand/0.3.15/builds.json`: ```json [ { "build_status":true, "build_time":"2016-12-29T10:10:49Z", "build_time_relative":"Dec 29, 2016", "cratesfyi_version":"cratesfyi 0.2.3 (eea831c 2016-12-29)", "id":1, "output":null, "rustc_version":"rustc 1.15.0-nightly (71c06a56a 2016-12-18)" } ] ``` `build_status` is `true` if docs.rs successfully built documentation of a crate and `false` if docs.rs failed to build or a crate doesn't have any documentation. This list will contain zero elements if requested crate doesn't exists in docs.rs. Fixes: #87 Ref: rust-lang/crates.io#459 Ref: rust-lang/crates.io#506
1 parent aa5b2d2 commit 3b80a61

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

src/web/builds.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ impl ToJson for Build {
3939
self.cratesfyi_version.to_json());
4040
m.insert("build_status".to_owned(), self.build_status.to_json());
4141
m.insert("build_time".to_owned(),
42+
format!("{}", time::at(self.build_time).rfc3339()).to_json());
43+
m.insert("build_time_relative".to_owned(),
4244
duration_to_str(self.build_time).to_json());
4345
m.insert("output".to_owned(), self.output.to_json());
4446
m.to_json()
@@ -106,14 +108,37 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
106108
build_list.push(build);
107109
}
108110

109-
let builds_page = BuildsPage {
110-
metadata: MetaData::from_crate(&conn, &name, &version),
111-
builds: build_list,
112-
build_details: build_details,
113-
};
111+
if req.url.path.join("/").ends_with(".json") {
112+
use iron::status;
113+
use iron::headers::{Expires,
114+
HttpDate,
115+
CacheControl,
116+
CacheDirective,
117+
ContentType,
118+
AccessControlAllowOrigin};
119+
120+
// Remove build output from build list for json output
121+
for build in build_list.as_mut_slice() {
122+
build.output = None;
123+
}
114124

115-
Page::new(builds_page)
116-
.set_true("show_package_navigation")
117-
.set_true("package_navigation_builds_tab")
118-
.to_resp("builds")
125+
let mut resp = Response::with((status::Ok, build_list.to_json().to_string()));
126+
resp.headers.set(ContentType("application/json".parse().unwrap()));
127+
resp.headers.set(Expires(HttpDate(time::now())));
128+
resp.headers.set(CacheControl(vec![CacheDirective::NoCache,
129+
CacheDirective::NoStore,
130+
CacheDirective::MustRevalidate]));
131+
resp.headers.set(AccessControlAllowOrigin::Any);
132+
Ok(resp)
133+
} else {
134+
let builds_page = BuildsPage {
135+
metadata: MetaData::from_crate(&conn, &name, &version),
136+
builds: build_list,
137+
build_details: build_details,
138+
};
139+
Page::new(builds_page)
140+
.set_true("show_package_navigation")
141+
.set_true("package_navigation_builds_tab")
142+
.to_resp("builds")
143+
}
119144
}

src/web/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ impl CratesfyiHandler {
116116
router.get("/crate/:name/:version", crate_details::crate_details_handler);
117117
router.get("/crate/:name/:version/", crate_details::crate_details_handler);
118118
router.get("/crate/:name/:version/builds", builds::build_list_handler);
119+
router.get("/crate/:name/:version/builds.json", builds::build_list_handler);
119120
router.get("/crate/:name/:version/builds/:id", builds::build_list_handler);
120121
router.get("/crate/:name/:version/source/", source::source_browser_handler);
121122
router.get("/crate/:name/:version/source/*", source::source_browser_handler);

templates/builds.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ $ cratesfyi ...
3030
<div class="pure-u-1 pure-u-sm-1-24 build"><i class="fa fa-{{#if build_status }}check{{else}}close{{/if}}"></i></div>
3131
<div class="pure-u-1 pure-u-sm-10-24">{{rustc_version}}</div>
3232
<div class="pure-u-1 pure-u-sm-10-24">{{cratesfyi_version}}</div>
33-
<div class="pure-u-1 pure-u-sm-3-24 date">{{build_time}}</div>
33+
<div class="pure-u-1 pure-u-sm-3-24 date">{{build_time_relative}}</div>
3434
</div>
3535
</a>
3636
</li>

0 commit comments

Comments
 (0)