Skip to content

Commit 36223e7

Browse files
committed
Add atom feed for recent releases
1 parent c6d5502 commit 36223e7

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

src/web/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ impl CratesfyiHandler {
9797
page::Page::new(false).title("About Docs.rs").to_resp("about")
9898
});
9999
router.get("/releases", releases::releases_handler);
100+
router.get("/releases/feed", releases::releases_feed_handler);
100101
router.get("/releases/recent/:page", releases::releases_handler);
101102
router.get("/releases/stars", releases::stars_handler);
102103
router.get("/releases/stars/:page", releases::stars_handler);

src/web/releases.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ use postgres::Connection;
1818
const RELEASES_IN_HOME: i64 = 15;
1919
/// Releases in /releases page
2020
const RELEASES_IN_RELEASES: i64 = 30;
21+
/// Releases in recent releases feed
22+
const RELEASES_IN_FEED: i64 = 150;
2123

2224

2325
pub struct Release {
@@ -56,6 +58,8 @@ impl ToJson for Release {
5658
m.insert("rustdoc_status".to_string(), self.rustdoc_status.to_json());
5759
m.insert("release_time".to_string(),
5860
duration_to_str(self.release_time).to_json());
61+
m.insert("release_time_rfc3339".to_string(),
62+
format!("{}", time::at(self.release_time).rfc3339()).to_json());
5963
m.insert("stars".to_string(), self.stars.to_json());
6064
m.to_json()
6165
}
@@ -284,6 +288,15 @@ pub fn home_page(req: &mut Request) -> IronResult<Response> {
284288
}
285289

286290

291+
pub fn releases_feed_handler(req: &mut Request) -> IronResult<Response> {
292+
let conn = extension!(req, Pool);
293+
let packages = get_releases(conn, 1, RELEASES_IN_FEED, Order::ReleaseTime);
294+
let mut resp = ctry!(Page::new(packages).to_resp("releases_feed"));
295+
resp.headers.set(::iron::headers::ContentType("application/atom+xml".parse().unwrap()));
296+
Ok(resp)
297+
}
298+
299+
287300
pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
288301
// page number of releases
289302
let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1);

templates/releases.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<div class="recent-releases-container">
3030
{{#if varsb.show_search_form}}
3131
<div class="release">
32-
<strong>Recent Releases</strong>
32+
<a href="/releases"><strong>Recent Releases</strong></a> <a href="/releases/feed" title="Atom feed"><i class="fa fa-rss-square"></i></a>
3333
</div>
3434
{{/if}}
3535

templates/releases_feed.hbs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<feed xmlns="http://www.w3.org/2005/Atom">
3+
<title>Docs.rs</title>
4+
<subtitle>Recent Rust crates</subtitle>
5+
<link href="https://docs.rs/releases/feed" rel="self" />
6+
<link href="https://docs.rs/" />
7+
<id>urn:docs-rs:{{cratesfyi_version_safe}}</id>
8+
<updated>{{content[0].release_time_rfc3339}}</updated>
9+
{{#each content}}
10+
<entry>
11+
<title>{{name}}-{{version}}</title>
12+
<link href="https://docs.rs{{#if rustdoc_status}}/{{name}}/{{version}}/{{target_name}}/{{else}}/crate/{{name}}/{{version}}{{/if}}" />
13+
<id>urn:docs-rs:{{name}}:{{version}}</id>
14+
<updated>{{release_time_rfc3339}}</updated>
15+
<summary>{{#if description}}{{description}}{{else}}-{{/if}}</summary>
16+
<author><name>docs.rs</name></author>
17+
</entry>
18+
{{/each}}
19+
</feed>

0 commit comments

Comments
 (0)