Skip to content

Commit 847fac8

Browse files
committed
Merge pull request #272 from sgrif/sg-sideload-keywords-in-crates-show
Properly sideload keywords in crates#show
2 parents 119e80b + 61dd2d6 commit 847fac8

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

src/krate.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub struct EncodableCrate {
5959
pub name: String,
6060
pub updated_at: String,
6161
pub versions: Option<Vec<i32>>,
62+
pub keywords: Option<Vec<String>>,
6263
pub created_at: String,
6364
pub downloads: i32,
6465
pub max_version: String,
@@ -231,7 +232,11 @@ impl Crate {
231232
parts.next().is_none()
232233
}
233234

234-
pub fn encodable(self, versions: Option<Vec<i32>>) -> EncodableCrate {
235+
pub fn encodable(
236+
self,
237+
versions: Option<Vec<i32>>,
238+
keywords: Option<&[Keyword]>,
239+
) -> EncodableCrate {
235240
let Crate {
236241
name, created_at, updated_at, downloads, max_version, description,
237242
homepage, documentation, license, repository,
@@ -241,13 +246,15 @@ impl Crate {
241246
Some(..) => None,
242247
None => Some(format!("/api/v1/crates/{}/versions", name)),
243248
};
249+
let keyword_ids = keywords.map(|kws| kws.iter().map(|kw| kw.keyword.clone()).collect());
244250
EncodableCrate {
245251
id: name.clone(),
246252
name: name.clone(),
247253
updated_at: ::encode_time(updated_at),
248254
created_at: ::encode_time(created_at),
249255
downloads: downloads,
250256
versions: versions,
257+
keywords: keyword_ids,
251258
max_version: max_version.to_string(),
252259
documentation: documentation,
253260
homepage: homepage,
@@ -548,7 +555,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
548555
let mut crates = Vec::new();
549556
for row in try!(stmt.query(&args)).iter() {
550557
let krate: Crate = Model::from_row(&row);
551-
crates.push(krate.encodable(None));
558+
crates.push(krate.encodable(None, None));
552559
}
553560

554561
// Query for the total count of crates
@@ -583,7 +590,7 @@ pub fn summary(req: &mut Request) -> CargoResult<Response> {
583590
let rows = try!(stmt.query(&[]));
584591
Ok(rows.iter().map(|r| {
585592
let krate: Crate = Model::from_row(&r);
586-
krate.encodable(None)
593+
krate.encodable(None, None)
587594
}).collect::<Vec<EncodableCrate>>())
588595
};
589596
let new_crates = try!(tx.prepare("SELECT * FROM crates \
@@ -628,7 +635,7 @@ pub fn show(req: &mut Request) -> CargoResult<Response> {
628635
keywords: Vec<EncodableKeyword>,
629636
}
630637
Ok(req.json(&R {
631-
krate: krate.clone().encodable(Some(ids)),
638+
krate: krate.clone().encodable(Some(ids), Some(&kws)),
632639
versions: versions.into_iter().map(|v| {
633640
v.encodable(&krate.name)
634641
}).collect(),
@@ -750,7 +757,7 @@ pub fn new(req: &mut Request) -> CargoResult<Response> {
750757

751758
#[derive(RustcEncodable)]
752759
struct R { krate: EncodableCrate }
753-
Ok(req.json(&R { krate: krate.encodable(None) }))
760+
Ok(req.json(&R { krate: krate.encodable(None, None) }))
754761
}
755762

756763
fn parse_new_headers(req: &mut Request) -> CargoResult<(upload::NewCrate, User)> {

src/tests/krate.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use semver;
1111
use cargo_registry::db::RequestTransaction;
1212
use cargo_registry::dependency::EncodableDependency;
1313
use cargo_registry::download::EncodableVersionDownload;
14-
use cargo_registry::keyword::Keyword;
14+
use cargo_registry::keyword::{Keyword, EncodableKeyword};
1515
use cargo_registry::krate::{Crate, EncodableCrate};
1616
use cargo_registry::upload as u;
1717
use cargo_registry::user::EncodableUser;
@@ -28,7 +28,7 @@ struct GitCrate { name: String, vers: String, deps: Vec<String>, cksum: String }
2828
#[derive(RustcDecodable)]
2929
struct GoodCrate { krate: EncodableCrate }
3030
#[derive(RustcDecodable)]
31-
struct CrateResponse { krate: EncodableCrate, versions: Vec<EncodableVersion> }
31+
struct CrateResponse { krate: EncodableCrate, versions: Vec<EncodableVersion>, keywords: Vec<EncodableKeyword> }
3232
#[derive(RustcDecodable)]
3333
struct Deps { dependencies: Vec<EncodableDependency> }
3434
#[derive(RustcDecodable)]
@@ -136,7 +136,8 @@ fn show() {
136136
krate.description = Some(format!("description"));
137137
krate.documentation = Some(format!("https://example.com"));
138138
krate.homepage = Some(format!("http://example.com"));
139-
::mock_crate(&mut req, krate.clone());
139+
let (krate, _) = ::mock_crate(&mut req, krate.clone());
140+
Keyword::update_crate(tx(&req), &krate, &["kw1".into()]).unwrap();
140141

141142
let mut response = ok_resp!(middle.call(&mut req));
142143
let json: CrateResponse = ::json(&mut response);
@@ -145,6 +146,7 @@ fn show() {
145146
assert_eq!(json.krate.description, krate.description);
146147
assert_eq!(json.krate.homepage, krate.homepage);
147148
assert_eq!(json.krate.documentation, krate.documentation);
149+
assert_eq!(json.krate.keywords, Some(vec!["kw1".into()]));
148150
let versions = json.krate.versions.as_ref().unwrap();
149151
assert_eq!(versions.len(), 1);
150152
assert_eq!(json.versions.len(), 1);
@@ -154,6 +156,8 @@ fn show() {
154156
let suffix = "/api/v1/crates/foo/1.0.0/download";
155157
assert!(json.versions[0].dl_path.ends_with(suffix),
156158
"bad suffix {}", json.versions[0].dl_path);
159+
assert_eq!(1, json.keywords.len());
160+
assert_eq!("kw1".to_string(), json.keywords[0].id);
157161
}
158162

159163
#[test]

src/user/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ pub fn updates(req: &mut Request) -> CargoResult<Response> {
311311
}
312312

313313
// Encode everything!
314-
let crates = crates.into_iter().map(|c| c.encodable(None)).collect();
314+
let crates = crates.into_iter().map(|c| c.encodable(None, None)).collect();
315315
let versions = versions.into_iter().map(|v| {
316316
let id = v.crate_id;
317317
v.encodable(&map[&id])

0 commit comments

Comments
 (0)