Skip to content

Commit 61dd2d6

Browse files
committed
Properly sideload keywords in crates#show
The data is sent properly in this endpoint, but they aren't actually associated with the crate as the ids aren't present. This appears to be the only endpoint where these are sideloaded. I've added a test for this, but haven't visually verified the fix (as I don't have everything set up to run the backend locally), so this should be tested on staging before deployment. Fixes #271
1 parent 119e80b commit 61dd2d6

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)