From c56e87b86653a9b778014dea87171a73f2a98ce2 Mon Sep 17 00:00:00 2001 From: Robert Masen Date: Fri, 23 Nov 2018 21:17:36 -0600 Subject: [PATCH 1/9] loosen search --- src/controllers/krate/search.rs | 187 +++++++++++++++++++++++++++++++- src/models/krate.rs | 17 +++ 2 files changed, 203 insertions(+), 1 deletion(-) diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index 941d34cb86a..cdd274e451c 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -37,6 +37,12 @@ pub fn search(req: &mut dyn Request) -> CargoResult { let conn = req.db_conn()?; let (offset, limit) = req.pagination(10, 100)?; let params = req.query(); + //extract the search param for loose searching + let search_q = if let Some(q) = params.get("q") { + format!("%{}%", q) + } else { + String::new() + }; let sort = params .get("sort") .map(|s| &**s) @@ -56,7 +62,7 @@ pub fn search(req: &mut dyn Request) -> CargoResult { let q = plainto_tsquery(q_string); query = query.filter( q.matches(crates::textsearchable_index_col) - .or(Crate::with_name(q_string)), + .or(Crate::like_name(&search_q)), ); query = query.select(( @@ -206,3 +212,182 @@ pub fn search(req: &mut dyn Request) -> CargoResult { meta: Meta { total }, })) } +pub fn loose_search(req: &mut dyn Request) -> CargoResult { + use diesel::sql_types::Bool; + + let conn = req.db_conn()?; + let (offset, limit) = req.pagination(10, 100)?; + let params = req.query(); + let sort = params + .get("sort") + .map(|s| &**s) + .unwrap_or("recent-downloads"); + + let loose_q = if let Some(q_string) = params.get("q") { + format!("%{}%", q_string) + } else { + String::new() + }; + let mut query = crates::table + .left_join(recent_crate_downloads::table) + .select(( + ALL_COLUMNS, + false.into_sql::(), + recent_crate_downloads::downloads.nullable(), + )).into_boxed(); + if let Some(q_string) = params.get("q") { + if !q_string.is_empty() { + let sort = params.get("sort").map(|s| &**s).unwrap_or("relevance"); + let q = plainto_tsquery(q_string); + query = query.filter( + q.matches(crates::textsearchable_index_col) + .or(Crate::like_name(&loose_q)), + ); + + query = query.select(( + ALL_COLUMNS, + Crate::with_name(q_string), + recent_crate_downloads::downloads.nullable(), + )); + query = query.order(Crate::with_name(q_string).desc()); + + if sort == "relevance" { + let rank = ts_rank_cd(crates::textsearchable_index_col, q); + query = query.then_order_by(rank.desc()) + } + } + } + + if let Some(cat) = params.get("category") { + query = query.filter( + crates::id.eq_any( + crates_categories::table + .select(crates_categories::crate_id) + .inner_join(categories::table) + .filter( + categories::slug + .eq(cat) + .or(categories::slug.like(format!("{}::%", cat))), + ), + ), + ); + } + + if let Some(kw) = params.get("keyword") { + query = query.filter( + crates::id.eq_any( + crates_keywords::table + .select(crates_keywords::crate_id) + .inner_join(keywords::table) + .filter(::lower(keywords::keyword).eq(::lower(kw))), + ), + ); + } else if let Some(letter) = params.get("letter") { + let pattern = format!( + "{}%", + letter + .chars() + .next() + .unwrap() + .to_lowercase() + .collect::() + ); + query = query.filter(canon_crate_name(crates::name).like(pattern)); + } else if let Some(user_id) = params.get("user_id").and_then(|s| s.parse::().ok()) { + query = query.filter( + crates::id.eq_any( + crate_owners::table + .select(crate_owners::crate_id) + .filter(crate_owners::owner_id.eq(user_id)) + .filter(crate_owners::deleted.eq(false)) + .filter(crate_owners::owner_kind.eq(OwnerKind::User as i32)), + ), + ); + } else if let Some(team_id) = params.get("team_id").and_then(|s| s.parse::().ok()) { + query = query.filter( + crates::id.eq_any( + crate_owners::table + .select(crate_owners::crate_id) + .filter(crate_owners::owner_id.eq(team_id)) + .filter(crate_owners::deleted.eq(false)) + .filter(crate_owners::owner_kind.eq(OwnerKind::Team as i32)), + ), + ); + } else if params.get("following").is_some() { + query = query.filter( + crates::id.eq_any( + follows::table + .select(follows::crate_id) + .filter(follows::user_id.eq(req.user()?.id)), + ), + ); + } + + if sort == "downloads" { + query = query.then_order_by(crates::downloads.desc()) + } else if sort == "recent-downloads" { + query = query.then_order_by(recent_crate_downloads::downloads.desc().nulls_last()) + } else if sort == "recent-updates" { + query = query.order(crates::updated_at.desc()); + } else { + query = query.then_order_by(crates::name.asc()) + } + println!("{:?}", diesel::debug_query(&query)); + // The database query returns a tuple within a tuple, with the root + // tuple containing 3 items. + let data = query + .paginate(limit, offset) + .load::<((Crate, bool, Option), i64)>(&*conn)?; + let total = data.first().map(|&(_, t)| t).unwrap_or(0); + let perfect_matches = data.iter().map(|&((_, b, _), _)| b).collect::>(); + let recent_downloads = data + .iter() + .map(|&((_, _, s), _)| s.unwrap_or(0)) + .collect::>(); + let crates = data.into_iter().map(|((c, _, _), _)| c).collect::>(); + + let versions = crates + .versions() + .load::(&*conn)? + .grouped_by(&crates) + .into_iter() + .map(|versions| Version::max(versions.into_iter().map(|v| v.num))); + + let badges = CrateBadge::belonging_to(&crates) + .select((badges::crate_id, badges::all_columns)) + .load::(&conn)? + .grouped_by(&crates) + .into_iter() + .map(|badges| badges.into_iter().map(|cb| cb.badge).collect()); + + let crates = versions + .zip(crates) + .zip(perfect_matches) + .zip(recent_downloads) + .zip(badges) + .map( + |((((max_version, krate), perfect_match), recent_downloads), badges)| { + krate.minimal_encodable( + &max_version, + Some(badges), + perfect_match, + Some(recent_downloads), + ) + }, + ).collect(); + + #[derive(Serialize)] + struct R { + crates: Vec, + meta: Meta, + } + #[derive(Serialize)] + struct Meta { + total: i64, + } + + Ok(req.json(&R { + crates, + meta: Meta { total }, + })) +} diff --git a/src/models/krate.rs b/src/models/krate.rs index 48248207589..c18b060e638 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -90,6 +90,8 @@ pub const MAX_NAME_LENGTH: usize = 64; type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; +/// The result of a loose search +type LikeName<'a> = diesel::dsl::Like, CanonCrateName<&'a str>>; type ByName<'a> = diesel::dsl::Filter>; type ByExactName<'a> = diesel::dsl::Filter>; @@ -237,6 +239,21 @@ impl<'a> NewCrate<'a> { } impl Crate { + /// SQL filter with the `like` binary operator + /// ```sql + /// SELECT * + /// FROM crates + /// WHERE name like $1 + /// ``` + pub fn like_name(name: &str) -> LikeName<'_> { + canon_crate_name(crates::name).like(canon_crate_name(name)) + } + /// SQL filter with the = binary operator + /// ```sql + /// SELECT * + /// FROM crates + /// WHERE name = $1 + /// ``` pub fn with_name(name: &str) -> WithName<'_> { canon_crate_name(crates::name).eq(canon_crate_name(name)) } From 810ac620eca5881b46576311a6b2e50be84fede4 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 24 Jan 2019 18:10:51 -0600 Subject: [PATCH 2/9] remove dead function --- src/controllers/krate/search.rs | 183 +------------------------------- 1 file changed, 2 insertions(+), 181 deletions(-) diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index cdd274e451c..db30e5dbc0d 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -71,7 +71,7 @@ pub fn search(req: &mut dyn Request) -> CargoResult { recent_crate_downloads::downloads.nullable(), )); query = query.order(Crate::with_name(q_string).desc()); - + if sort == "relevance" { let rank = ts_rank_cd(crates::textsearchable_index_col, q); query = query.then_order_by(rank.desc()) @@ -211,183 +211,4 @@ pub fn search(req: &mut dyn Request) -> CargoResult { crates, meta: Meta { total }, })) -} -pub fn loose_search(req: &mut dyn Request) -> CargoResult { - use diesel::sql_types::Bool; - - let conn = req.db_conn()?; - let (offset, limit) = req.pagination(10, 100)?; - let params = req.query(); - let sort = params - .get("sort") - .map(|s| &**s) - .unwrap_or("recent-downloads"); - - let loose_q = if let Some(q_string) = params.get("q") { - format!("%{}%", q_string) - } else { - String::new() - }; - let mut query = crates::table - .left_join(recent_crate_downloads::table) - .select(( - ALL_COLUMNS, - false.into_sql::(), - recent_crate_downloads::downloads.nullable(), - )).into_boxed(); - if let Some(q_string) = params.get("q") { - if !q_string.is_empty() { - let sort = params.get("sort").map(|s| &**s).unwrap_or("relevance"); - let q = plainto_tsquery(q_string); - query = query.filter( - q.matches(crates::textsearchable_index_col) - .or(Crate::like_name(&loose_q)), - ); - - query = query.select(( - ALL_COLUMNS, - Crate::with_name(q_string), - recent_crate_downloads::downloads.nullable(), - )); - query = query.order(Crate::with_name(q_string).desc()); - - if sort == "relevance" { - let rank = ts_rank_cd(crates::textsearchable_index_col, q); - query = query.then_order_by(rank.desc()) - } - } - } - - if let Some(cat) = params.get("category") { - query = query.filter( - crates::id.eq_any( - crates_categories::table - .select(crates_categories::crate_id) - .inner_join(categories::table) - .filter( - categories::slug - .eq(cat) - .or(categories::slug.like(format!("{}::%", cat))), - ), - ), - ); - } - - if let Some(kw) = params.get("keyword") { - query = query.filter( - crates::id.eq_any( - crates_keywords::table - .select(crates_keywords::crate_id) - .inner_join(keywords::table) - .filter(::lower(keywords::keyword).eq(::lower(kw))), - ), - ); - } else if let Some(letter) = params.get("letter") { - let pattern = format!( - "{}%", - letter - .chars() - .next() - .unwrap() - .to_lowercase() - .collect::() - ); - query = query.filter(canon_crate_name(crates::name).like(pattern)); - } else if let Some(user_id) = params.get("user_id").and_then(|s| s.parse::().ok()) { - query = query.filter( - crates::id.eq_any( - crate_owners::table - .select(crate_owners::crate_id) - .filter(crate_owners::owner_id.eq(user_id)) - .filter(crate_owners::deleted.eq(false)) - .filter(crate_owners::owner_kind.eq(OwnerKind::User as i32)), - ), - ); - } else if let Some(team_id) = params.get("team_id").and_then(|s| s.parse::().ok()) { - query = query.filter( - crates::id.eq_any( - crate_owners::table - .select(crate_owners::crate_id) - .filter(crate_owners::owner_id.eq(team_id)) - .filter(crate_owners::deleted.eq(false)) - .filter(crate_owners::owner_kind.eq(OwnerKind::Team as i32)), - ), - ); - } else if params.get("following").is_some() { - query = query.filter( - crates::id.eq_any( - follows::table - .select(follows::crate_id) - .filter(follows::user_id.eq(req.user()?.id)), - ), - ); - } - - if sort == "downloads" { - query = query.then_order_by(crates::downloads.desc()) - } else if sort == "recent-downloads" { - query = query.then_order_by(recent_crate_downloads::downloads.desc().nulls_last()) - } else if sort == "recent-updates" { - query = query.order(crates::updated_at.desc()); - } else { - query = query.then_order_by(crates::name.asc()) - } - println!("{:?}", diesel::debug_query(&query)); - // The database query returns a tuple within a tuple, with the root - // tuple containing 3 items. - let data = query - .paginate(limit, offset) - .load::<((Crate, bool, Option), i64)>(&*conn)?; - let total = data.first().map(|&(_, t)| t).unwrap_or(0); - let perfect_matches = data.iter().map(|&((_, b, _), _)| b).collect::>(); - let recent_downloads = data - .iter() - .map(|&((_, _, s), _)| s.unwrap_or(0)) - .collect::>(); - let crates = data.into_iter().map(|((c, _, _), _)| c).collect::>(); - - let versions = crates - .versions() - .load::(&*conn)? - .grouped_by(&crates) - .into_iter() - .map(|versions| Version::max(versions.into_iter().map(|v| v.num))); - - let badges = CrateBadge::belonging_to(&crates) - .select((badges::crate_id, badges::all_columns)) - .load::(&conn)? - .grouped_by(&crates) - .into_iter() - .map(|badges| badges.into_iter().map(|cb| cb.badge).collect()); - - let crates = versions - .zip(crates) - .zip(perfect_matches) - .zip(recent_downloads) - .zip(badges) - .map( - |((((max_version, krate), perfect_match), recent_downloads), badges)| { - krate.minimal_encodable( - &max_version, - Some(badges), - perfect_match, - Some(recent_downloads), - ) - }, - ).collect(); - - #[derive(Serialize)] - struct R { - crates: Vec, - meta: Meta, - } - #[derive(Serialize)] - struct Meta { - total: i64, - } - - Ok(req.json(&R { - crates, - meta: Meta { total }, - })) -} +} \ No newline at end of file From 3fc3355e82a8165f9d3a80f411969be72e855c35 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 24 Jan 2019 18:11:01 -0600 Subject: [PATCH 3/9] like => ilike --- src/models/krate.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/models/krate.rs b/src/models/krate.rs index c18b060e638..408d0358a94 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -91,7 +91,7 @@ type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; /// The result of a loose search -type LikeName<'a> = diesel::dsl::Like, CanonCrateName<&'a str>>; +type LikeName<'a> = diesel::pg::expression::helper_types::ILike, CanonCrateName<&'a str>>; type ByName<'a> = diesel::dsl::Filter>; type ByExactName<'a> = diesel::dsl::Filter>; @@ -246,7 +246,7 @@ impl Crate { /// WHERE name like $1 /// ``` pub fn like_name(name: &str) -> LikeName<'_> { - canon_crate_name(crates::name).like(canon_crate_name(name)) + canon_crate_name(crates::name).ilike(canon_crate_name(name)) } /// SQL filter with the = binary operator /// ```sql From 8f9d96650ce21f3094b3b4c4852b2ea25fdde088 Mon Sep 17 00:00:00 2001 From: rfm Date: Fri, 25 Jan 2019 14:39:53 -0600 Subject: [PATCH 4/9] add loose search order test --- src/tests/krate.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/tests/krate.rs b/src/tests/krate.rs index f89fcf4421d..a316e47964c 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -414,6 +414,67 @@ fn exact_match_on_queries_with_sort() { assert_eq!(json.crates[3].name, "other_sort"); } +#[test] +fn loose_search_order() { + let (app, anon, user) = TestApp::init().with_user(); + let user = user.as_model(); + + let ordered = app.db(|conn| { + // exact match should be first + let one = CrateBuilder::new("temp", user.id) + .readme("readme") + .description("description") + .keyword("kw1") + .expect_build(conn); + // file shouldn't match at all + CrateBuilder::new("file", user.id) + .readme("readme") + .description("description") + .keyword("kw1") + .expect_build(conn); + // temp_udp should match second + let two = CrateBuilder::new("temp_utp", user.id) + .readme("readme") + .description("description") + .keyword("kw1") + .expect_build(conn); + // evalrs should match 3rd because of readme + let three = CrateBuilder::new("evalrs", user.id) + .readme(r#"$ echo 'println!("Hello World!")' | evalrs + Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.daiPxHtjV2VR) + Finished debug [unoptimized + debuginfo] target(s) in 0.51 secs + Running `target\debug\evalrs_temp.exe` +Hello World!"#) + .description("description") + .keyword("kw1") + .expect_build(conn); + // tempfile should appear 4th + let four = CrateBuilder::new("tempfile", user.id) + .readme("readme") + .description("description") + .keyword("kw1") + .expect_build(conn); + // mkstemp should appear 5th + let five = CrateBuilder::new("mkstemp", user.id) + .readme("readme") + .description("description") + .keyword("kw1") + .expect_build(conn); + vec![one, two, three, four, five] + }); + let search_temp = anon.search("q=temp"); + assert_eq!(search_temp.meta.total, 5); + assert_eq!(search_temp.crates.len(), 5); + for (lhs, rhs) in search_temp.crates.iter().zip(ordered) { + assert_eq!(lhs.name, rhs.name); + } + let search_file = anon.search("q=file"); + assert_eq!(search_file.meta.total, 2); + assert_eq!(search_file.crates.len(), 2); + assert_eq!(&search_file.crates[0].name, "file"); + assert_eq!(&search_file.crates[1].name, "tempfile"); +} + #[test] fn show() { let (app, anon, user) = TestApp::init().with_user(); From 15bc5d19f5a6b268d3705c556b8b0b4d2eaf77ea Mon Sep 17 00:00:00 2001 From: rfm Date: Fri, 25 Jan 2019 15:20:26 -0600 Subject: [PATCH 5/9] cargo fmt --- src/bin/delete-crate.rs | 3 +- src/bin/delete-version.rs | 3 +- src/bin/on_call/mod.rs | 3 +- src/bin/populate.rs | 3 +- src/bin/render-readmes.rs | 15 +- src/bin/transfer-crates.rs | 3 +- src/bin/update-downloads.rs | 27 +- src/boot/categories.rs | 6 +- src/controllers/crate_owner_invitation.rs | 3 +- src/controllers/krate/downloads.rs | 3 +- src/controllers/krate/metadata.rs | 3 +- src/controllers/krate/publish.rs | 6 +- src/controllers/krate/search.rs | 10 +- src/controllers/user/me.rs | 3 +- src/controllers/user/other.rs | 3 +- src/controllers/user/session.rs | 3 +- src/email.rs | 3 +- src/git.rs | 3 +- src/github.rs | 3 +- src/models/badge.rs | 6 +- src/models/category.rs | 21 +- src/models/dependency.rs | 3 +- src/models/keyword.rs | 3 +- src/models/krate.rs | 27 +- src/models/token.rs | 36 ++- src/models/user.rs | 19 +- src/render.rs | 25 +- src/router.rs | 15 +- src/tests/all.rs | 10 +- src/tests/builders.rs | 9 +- src/tests/category.rs | 6 +- src/tests/krate.rs | 297 +++++++++------------- src/tests/owners.rs | 113 ++++---- src/tests/record.rs | 14 +- src/tests/team.rs | 240 ++++++++--------- src/tests/token.rs | 3 +- src/tests/user.rs | 164 +++++------- src/views/mod.rs | 72 +++--- 38 files changed, 553 insertions(+), 636 deletions(-) diff --git a/src/bin/delete-crate.rs b/src/bin/delete-crate.rs index ed1d33f631b..e215607bc1b 100644 --- a/src/bin/delete-crate.rs +++ b/src/bin/delete-crate.rs @@ -23,7 +23,8 @@ fn main() { conn.transaction::<_, diesel::result::Error, _>(|| { delete(&conn); Ok(()) - }).unwrap() + }) + .unwrap() } fn delete(conn: &PgConnection) { diff --git a/src/bin/delete-version.rs b/src/bin/delete-version.rs index 935ab2fd5e7..ec6ac74f828 100644 --- a/src/bin/delete-version.rs +++ b/src/bin/delete-version.rs @@ -23,7 +23,8 @@ fn main() { conn.transaction::<_, diesel::result::Error, _>(|| { delete(&conn); Ok(()) - }).unwrap() + }) + .unwrap() } fn delete(conn: &PgConnection) { diff --git a/src/bin/on_call/mod.rs b/src/bin/on_call/mod.rs index 62c605319c7..c120ca2d819 100644 --- a/src/bin/on_call/mod.rs +++ b/src/bin/on_call/mod.rs @@ -39,7 +39,8 @@ impl Event { .json(&FullEvent { service_key, event: self, - }).send()?; + }) + .send()?; match response.status() { s if s.is_success() => Ok(()), diff --git a/src/bin/populate.rs b/src/bin/populate.rs index 06ca43e8ba6..b699d03083b 100644 --- a/src/bin/populate.rs +++ b/src/bin/populate.rs @@ -39,7 +39,8 @@ fn update(conn: &PgConnection) -> QueryResult<()> { version_downloads::version_id.eq(id), version_downloads::downloads.eq(dls), version_downloads::date.eq(date(now - day.days())), - )).execute(conn)?; + )) + .execute(conn)?; } } Ok(()) diff --git a/src/bin/render-readmes.rs b/src/bin/render-readmes.rs index 87dbb4cf6a9..5d414b1eb32 100644 --- a/src/bin/render-readmes.rs +++ b/src/bin/render-readmes.rs @@ -81,7 +81,8 @@ fn main() { readme_renderings::rendered_at .lt(older_than) .or(readme_renderings::version_id.is_null()), - ).select(versions::id) + ) + .select(versions::id) .into_boxed(); if let Some(crate_name) = args.flag_crate { @@ -150,7 +151,8 @@ fn main() { &readme_path, readme.into_bytes(), "text/html", - ).unwrap_or_else(|_| { + ) + .unwrap_or_else(|_| { panic!( "[{}-{}] Couldn't upload file to S3", krate_name, version.num @@ -227,7 +229,8 @@ fn get_readme(config: &Config, version: &Version, krate_name: &str) -> Option( }; filepath == path } - }).unwrap_or_else(|| { + }) + .unwrap_or_else(|| { panic!( "[{}-{}] couldn't open file: {}", krate_name, version.num, path.display() ) - }).unwrap_or_else(|_| { + }) + .unwrap_or_else(|_| { panic!( "[{}-{}] file is not present: {}", krate_name, diff --git a/src/bin/transfer-crates.rs b/src/bin/transfer-crates.rs index bf4543568f1..6c7a6f749d5 100644 --- a/src/bin/transfer-crates.rs +++ b/src/bin/transfer-crates.rs @@ -21,7 +21,8 @@ fn main() { conn.transaction::<_, diesel::result::Error, _>(|| { transfer(&conn); Ok(()) - }).unwrap() + }) + .unwrap() } fn transfer(conn: &PgConnection) { diff --git a/src/bin/update-downloads.rs b/src/bin/update-downloads.rs index 7b82a0b1efe..5d399f74431 100644 --- a/src/bin/update-downloads.rs +++ b/src/bin/update-downloads.rs @@ -92,7 +92,8 @@ fn collect(conn: &PgConnection, rows: &[VersionDownload]) -> QueryResult<()> { crate_downloads::crate_id.eq(crate_id), crate_downloads::downloads.eq(amt), crate_downloads::date.eq(download.date), - )).on_conflict(crate_downloads::table.primary_key()) + )) + .on_conflict(crate_downloads::table.primary_key()) .do_update() .set(crate_downloads::downloads.eq(crate_downloads::downloads + amt)) .execute(conn)?; @@ -136,7 +137,8 @@ mod test { let krate = NewCrate { name: "foo", ..Default::default() - }.create_or_update(&conn, None, user_id) + } + .create_or_update(&conn, None, user_id) .unwrap(); let version = NewVersion::new( krate.id, @@ -145,7 +147,8 @@ mod test { None, None, None, - ).unwrap(); + ) + .unwrap(); let version = version.save(&conn, &[]).unwrap(); (krate, version) } @@ -176,7 +179,8 @@ mod test { version_downloads::version_id.eq(version.id), version_downloads::date.eq(date(now - 1.day())), version_downloads::processed.eq(true), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); ::update(&conn).unwrap(); @@ -213,7 +217,8 @@ mod test { version_downloads::counted.eq(2), version_downloads::date.eq(date(now - 2.days())), version_downloads::processed.eq(false), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); ::update(&conn).unwrap(); let processed = version_downloads::table @@ -236,7 +241,8 @@ mod test { version_downloads::counted.eq(2), version_downloads::date.eq(date(now)), version_downloads::processed.eq(false), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); ::update(&conn).unwrap(); let processed = version_downloads::table @@ -269,13 +275,15 @@ mod test { version_downloads::counted.eq(1), version_downloads::date.eq(date(now)), version_downloads::processed.eq(false), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); insert_into(version_downloads::table) .values(( version_downloads::version_id.eq(version.id), version_downloads::date.eq(date(now - 1.day())), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); let version_before = versions::table @@ -331,7 +339,8 @@ mod test { version_downloads::counted.eq(2), version_downloads::date.eq(date(now - 2.days())), version_downloads::processed.eq(false), - )).execute(&conn) + )) + .execute(&conn) .unwrap(); ::update(&conn).unwrap(); diff --git a/src/boot/categories.rs b/src/boot/categories.rs index 669367d4593..a64a506003f 100644 --- a/src/boot/categories.rs +++ b/src/boot/categories.rs @@ -107,7 +107,8 @@ pub fn sync_with_connection(toml_str: &str, conn: &PgConnection) -> CargoResult< category.eq(c.name), description.eq(c.description), ) - }).collect::>(); + }) + .collect::>(); conn.transaction(|| { let slugs = diesel::insert_into(categories) @@ -117,7 +118,8 @@ pub fn sync_with_connection(toml_str: &str, conn: &PgConnection) -> CargoResult< .set(( category.eq(excluded(category)), description.eq(excluded(description)), - )).returning(slug) + )) + .returning(slug) .get_results::(&*conn)?; diesel::delete(categories) diff --git a/src/controllers/crate_owner_invitation.rs b/src/controllers/crate_owner_invitation.rs index 032475a6b06..26fc8ed1d0f 100644 --- a/src/controllers/crate_owner_invitation.rs +++ b/src/controllers/crate_owner_invitation.rs @@ -71,7 +71,8 @@ fn accept_invite( owner_id: user_id, created_by: pending_crate_owner.invited_by_user_id, owner_kind: OwnerKind::User as i32, - }).on_conflict(crate_owners::table.primary_key()) + }) + .on_conflict(crate_owners::table.primary_key()) .do_update() .set(crate_owners::deleted.eq(false)) .execute(conn)?; diff --git a/src/controllers/krate/downloads.rs b/src/controllers/krate/downloads.rs index 15801c29ba0..1af10e71b50 100644 --- a/src/controllers/krate/downloads.rs +++ b/src/controllers/krate/downloads.rs @@ -39,7 +39,8 @@ pub fn downloads(req: &mut dyn Request) -> CargoResult { .select(( to_char(version_downloads::date, "YYYY-MM-DD"), sum_downloads, - )).filter(version_downloads::date.gt(date(now - 90.days()))) + )) + .filter(version_downloads::date.gt(date(now - 90.days()))) .group_by(version_downloads::date) .order(version_downloads::date.asc()) .load::(&*conn)?; diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index abef8f9a66e..723456d58e3 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -34,7 +34,8 @@ pub fn summary(req: &mut dyn Request) -> CargoResult { .zip(krates) .map(|(max_version, krate)| { Ok(krate.minimal_encodable(&max_version, None, false, None)) - }).collect() + }) + .collect() }; let new_crates = crates diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index e6fa6feb72f..b603e34932d 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -53,7 +53,8 @@ pub fn publish(req: &mut dyn Request) -> CargoResult { k[..].to_string(), v.iter().map(|v| v[..].to_string()).collect(), ) - }).collect::>>(); + }) + .collect::>>(); let keywords = new_crate .keywords .as_ref() @@ -136,7 +137,8 @@ pub fn publish(req: &mut dyn Request) -> CargoResult { // Downcast is okay because the file length must be less than the max upload size // to get here, and max upload sizes are way less than i32 max Some(file_length as i32), - )?.save(&conn, &new_crate.authors)?; + )? + .save(&conn, &new_crate.authors)?; // Link this new version to all dependencies let git_deps = dependency::add_dependencies(&conn, &new_crate.deps, version.id)?; diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index db30e5dbc0d..16d4d8a0eb0 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -54,7 +54,8 @@ pub fn search(req: &mut dyn Request) -> CargoResult { ALL_COLUMNS, false.into_sql::(), recent_crate_downloads::downloads.nullable(), - )).into_boxed(); + )) + .into_boxed(); if let Some(q_string) = params.get("q") { if !q_string.is_empty() { @@ -71,7 +72,7 @@ pub fn search(req: &mut dyn Request) -> CargoResult { recent_crate_downloads::downloads.nullable(), )); query = query.order(Crate::with_name(q_string).desc()); - + if sort == "relevance" { let rank = ts_rank_cd(crates::textsearchable_index_col, q); query = query.then_order_by(rank.desc()) @@ -195,7 +196,8 @@ pub fn search(req: &mut dyn Request) -> CargoResult { Some(recent_downloads), ) }, - ).collect(); + ) + .collect(); #[derive(Serialize)] struct R { @@ -211,4 +213,4 @@ pub fn search(req: &mut dyn Request) -> CargoResult { crates, meta: Meta { total }, })) -} \ No newline at end of file +} diff --git a/src/controllers/user/me.rs b/src/controllers/user/me.rs index f1e0e403c18..58a8a07b63d 100644 --- a/src/controllers/user/me.rs +++ b/src/controllers/user/me.rs @@ -34,7 +34,8 @@ pub fn me(req: &mut dyn Request) -> CargoResult { emails::verified.nullable(), emails::email.nullable(), emails::token_generated_at.nullable().is_not_null(), - )).first::<(User, Option, Option, bool)>(&*conn)?; + )) + .first::<(User, Option, Option, bool)>(&*conn)?; let verified = verified.unwrap_or(false); let verification_sent = verified || verification_sent; diff --git a/src/controllers/user/other.rs b/src/controllers/user/other.rs index ce41c527ffb..9823a3eeef4 100644 --- a/src/controllers/user/other.rs +++ b/src/controllers/user/other.rs @@ -37,7 +37,8 @@ pub fn stats(req: &mut dyn Request) -> CargoResult { crate_owners::owner_id .eq(user_id) .and(crate_owners::owner_kind.eq(OwnerKind::User as i32)), - ).select(sum(crates::downloads)) + ) + .select(sum(crates::downloads)) .first::>(&*conn)? .unwrap_or(0); diff --git a/src/controllers/user/session.rs b/src/controllers/user/session.rs index d3560e7e5af..6fc6f4e810c 100644 --- a/src/controllers/user/session.rs +++ b/src/controllers/user/session.rs @@ -109,7 +109,8 @@ pub fn github_access_token(req: &mut dyn Request) -> CargoResult { ghuser.name.as_ref().map(|s| &s[..]), ghuser.avatar_url.as_ref().map(|s| &s[..]), &token.access_token, - ).create_or_update(&*req.db_conn()?)?; + ) + .create_or_update(&*req.db_conn()?)?; req.session() .insert("user_id".to_string(), user.id.to_string()); req.mut_extensions().insert(user); diff --git a/src/email.rs b/src/email.rs index 5378c49ba91..6f496c69294 100644 --- a/src/email.rs +++ b/src/email.rs @@ -82,7 +82,8 @@ fn send_email(recipient: &str, subject: &str, body: &str) -> CargoResult<()> { .credentials(Credentials::new( mailgun_config.smtp_login, mailgun_config.smtp_password, - )).smtp_utf8(true) + )) + .smtp_utf8(true) .authentication_mechanism(Mechanism::Plain) .build(); diff --git a/src/git.rs b/src/git.rs index 238c1a5fb56..994dacdfef1 100644 --- a/src/git.rs +++ b/src/git.rs @@ -99,7 +99,8 @@ pub fn yank(app: &App, krate: &str, version: &semver::Version, yanked: bool) -> } git_crate.yanked = Some(yanked); Ok(serde_json::to_string(&git_crate).unwrap()) - }).collect::>>(); + }) + .collect::>>(); let new = new?.join("\n"); let mut f = File::create(&dst)?; f.write_all(new.as_bytes())?; diff --git a/src/github.rs b/src/github.rs index b6dc5c05a4c..a8467f6b1eb 100644 --- a/src/github.rs +++ b/src/github.rs @@ -27,7 +27,8 @@ where .header( header::AUTHORIZATION, format!("token {}", auth.access_token), - ).send()? + ) + .send()? .error_for_status() .map_err(|e| handle_error_response(&e))? .json() diff --git a/src/models/badge.rs b/src/models/badge.rs index d622f0fc091..9993c9f973a 100644 --- a/src/models/badge.rs +++ b/src/models/badge.rs @@ -22,11 +22,7 @@ pub struct CrateBadge { } #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -#[serde( - rename_all = "kebab-case", - tag = "badge_type", - content = "attributes" -)] +#[serde(rename_all = "kebab-case", tag = "badge_type", content = "attributes")] pub enum Badge { TravisCi { repository: String, diff --git a/src/models/category.rs b/src/models/category.rs index 229d054219a..b9b0773ba38 100644 --- a/src/models/category.rs +++ b/src/models/category.rs @@ -118,7 +118,8 @@ impl Category { .map(|c| CrateCategory { category_id: c.id, crate_id: krate.id, - }).collect::>(); + }) + .collect::>(); delete(CrateCategory::belonging_to(krate)).execute(conn)?; insert_into(crates_categories::table) @@ -231,7 +232,8 @@ mod tests { (category.eq("Cat 2"), slug.eq("cat2")), (category.eq("Cat 1"), slug.eq("cat1")), (category.eq("Cat 1::sub"), slug.eq("cat1::sub")), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cats = Category::toplevel(&conn, "", 10, 0) @@ -252,7 +254,8 @@ mod tests { (category.eq("Cat 1"), slug.eq("cat1"), crates_cnt.eq(0)), (category.eq("Cat 2"), slug.eq("cat2"), crates_cnt.eq(2)), (category.eq("Cat 3"), slug.eq("cat3"), crates_cnt.eq(1)), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cats = Category::toplevel(&conn, "crates", 10, 0) @@ -276,7 +279,8 @@ mod tests { .values(&vec![ (category.eq("Cat 1"), slug.eq("cat1")), (category.eq("Cat 2"), slug.eq("cat2")), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cats = Category::toplevel(&conn, "", 1, 0) @@ -320,7 +324,8 @@ mod tests { crates_cnt.eq(5), ), (category.eq("Cat 3"), slug.eq("cat3"), crates_cnt.eq(6)), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cats = Category::toplevel(&conn, "crates", 10, 0) @@ -360,7 +365,8 @@ mod tests { crates_cnt.eq(5), ), (category.eq("Cat 3"), slug.eq("cat3"), crates_cnt.eq(6)), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cats = Category::toplevel(&conn, "crates", 2, 0) @@ -414,7 +420,8 @@ mod tests { crates_cnt.eq(5), ), (category.eq("Cat 3"), slug.eq("cat3"), crates_cnt.eq(200)), - ]).execute(&conn) + ]) + .execute(&conn) .unwrap(); let cat = Category::by_slug("cat1::sub1") diff --git a/src/models/dependency.rs b/src/models/dependency.rs index 7224beb5a16..868f75bcf48 100644 --- a/src/models/dependency.rs +++ b/src/models/dependency.rs @@ -126,7 +126,8 @@ pub fn add_dependencies( target.eq(dep.target.as_ref().map(|s| &**s)), ), )) - }).collect::, _>>()?; + }) + .collect::, _>>()?; let (git_deps, new_dependencies): (Vec<_>, Vec<_>) = git_and_new_dependencies.into_iter().unzip(); diff --git a/src/models/keyword.rs b/src/models/keyword.rs index d0ca48c4e18..807cc1df18b 100644 --- a/src/models/keyword.rs +++ b/src/models/keyword.rs @@ -85,7 +85,8 @@ impl Keyword { .map(|kw| CrateKeyword { crate_id: krate.id, keyword_id: kw.id, - }).collect::>(); + }) + .collect::>(); diesel::insert_into(crates_keywords::table) .values(&crate_keywords) .execute(conn)?; diff --git a/src/models/krate.rs b/src/models/krate.rs index 408d0358a94..7a385795b93 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -91,7 +91,10 @@ type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; /// The result of a loose search -type LikeName<'a> = diesel::pg::expression::helper_types::ILike, CanonCrateName<&'a str>>; +type LikeName<'a> = diesel::pg::expression::helper_types::ILike< + CanonCrateName, + CanonCrateName<&'a str>, +>; type ByName<'a> = diesel::dsl::Filter>; type ByExactName<'a> = diesel::dsl::Filter>; @@ -154,7 +157,7 @@ impl<'a> NewCrate<'a> { "`{}` has an invalid url \ scheme: `{}`", field, s - ))) + ))); } } if url.cannot_be_a_base() { @@ -202,7 +205,8 @@ impl<'a> NewCrate<'a> { let reserved_name = select(exists( reserved_crate_names.filter(canon_crate_name(name).eq(canon_crate_name(self.name))), - )).get_result::(conn)?; + )) + .get_result::(conn)?; if reserved_name { Err(human("cannot upload a crate with a reserved name")) } else { @@ -276,11 +280,12 @@ impl Crate { } fn valid_ident(name: &str) -> bool { - Self::valid_feature_name(name) && name - .chars() - .nth(0) - .map(char::is_alphabetic) - .unwrap_or(false) + Self::valid_feature_name(name) + && name + .chars() + .nth(0) + .map(char::is_alphabetic) + .unwrap_or(false) } pub fn valid_feature_name(name: &str) -> bool { @@ -461,7 +466,8 @@ impl Crate { invited_user_id: owner.id(), invited_by_user_id: req_user.id, crate_id: self.id, - }).on_conflict_do_nothing() + }) + .on_conflict_do_nothing() .execute(conn)?; Ok(format!( "user {} has been invited to be an owner of crate {}", @@ -477,7 +483,8 @@ impl Crate { owner_id: owner.id(), created_by: req_user.id, owner_kind: OwnerKind::Team as i32, - }).on_conflict(crate_owners::table.primary_key()) + }) + .on_conflict(crate_owners::table.primary_key()) .do_update() .set(crate_owners::deleted.eq(false)) .execute(conn)?; diff --git a/src/models/token.rs b/src/models/token.rs index 0e7ffce8db5..02c2ff4b401 100644 --- a/src/models/token.rs +++ b/src/models/token.rs @@ -63,16 +63,14 @@ mod tests { last_used_at: Some(NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 12)), }; let json = serde_json::to_string(&tok).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); - assert!( - json.as_str() - .find(r#""last_used_at":"2017-01-06T14:23:12+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); + assert!(json + .as_str() + .find(r#""last_used_at":"2017-01-06T14:23:12+00:00""#) + .is_some()); } #[test] @@ -85,16 +83,14 @@ mod tests { last_used_at: Some(NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 12)), }; let json = serde_json::to_string(&tok).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); - assert!( - json.as_str() - .find(r#""last_used_at":"2017-01-06T14:23:12+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); + assert!(json + .as_str() + .find(r#""last_used_at":"2017-01-06T14:23:12+00:00""#) + .is_some()); } } diff --git a/src/models/user.rs b/src/models/user.rs index 81286431d05..da929495c39 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -78,7 +78,8 @@ impl<'a> NewUser<'a> { name.eq(excluded(name)), gh_avatar.eq(excluded(gh_avatar)), gh_access_token.eq(excluded(gh_access_token)), - )).get_result::(conn)?; + )) + .get_result::(conn)?; // To send the user an account verification email... if let Some(user_email) = user.email.as_ref() { @@ -143,12 +144,16 @@ impl User { let mut best = Rights::None; for owner in owners { match *owner { - Owner::User(ref other_user) => if other_user.id == self.id { - return Ok(Rights::Full); - }, - Owner::Team(ref team) => if team.contains_user(app, self)? { - best = Rights::Publish; - }, + Owner::User(ref other_user) => { + if other_user.id == self.id { + return Ok(Rights::Full); + } + } + Owner::Team(ref team) => { + if team.contains_user(app, self)? { + best = Rights::Publish; + } + } } } Ok(best) diff --git a/src/render.rs b/src/render.rs index 8580265d25d..7e5f5ce5289 100644 --- a/src/render.rs +++ b/src/render.rs @@ -57,9 +57,9 @@ impl<'a> MarkdownRenderer<'a> { "hr", "span", ] - .iter() - .cloned() - .collect(); + .iter() + .cloned() + .collect(); let tag_attributes = [ ("a", ["href", "id", "target"].iter().cloned().collect()), ( @@ -74,9 +74,9 @@ impl<'a> MarkdownRenderer<'a> { ["checked", "disabled", "type"].iter().cloned().collect(), ), ] - .iter() - .cloned() - .collect(); + .iter() + .cloned() + .collect(); let allowed_classes = [( "code", [ @@ -95,13 +95,13 @@ impl<'a> MarkdownRenderer<'a> { "language-sql", "yaml", ] - .iter() - .cloned() - .collect(), - )] .iter() .cloned() - .collect(); + .collect(), + )] + .iter() + .cloned() + .collect(); let sanitizer_base_url = base_url.map(|s| s.to_string()); @@ -182,7 +182,8 @@ impl<'a> MarkdownRenderer<'a> { UrlRelative::Custom(Box::new(relative_url_sanitizer)) } else { UrlRelative::Custom(Box::new(unrelative_url_sanitizer)) - }).id_prefix(Some("user-content-")); + }) + .id_prefix(Some("user-content-")); MarkdownRenderer { html_sanitizer } } diff --git a/src/router.rs b/src/router.rs index 48b494e21ea..9bc5ace463d 100644 --- a/src/router.rs +++ b/src/router.rs @@ -213,14 +213,13 @@ mod tests { // All other error types are propogated up the middleware, eventually becoming status 500 assert!(C(|_| Err(internal(""))).call(&mut req).is_err()); - assert!( - C(|_| err(::serde_json::Error::syntax( - ::serde_json::error::ErrorCode::ExpectedColon, - 0, - 0 - ))).call(&mut req) - .is_err() - ); + assert!(C(|_| err(::serde_json::Error::syntax( + ::serde_json::error::ErrorCode::ExpectedColon, + 0, + 0 + ))) + .call(&mut req) + .is_err()); assert!( C(|_| err(::std::io::Error::new(::std::io::ErrorKind::Other, ""))) .call(&mut req) diff --git a/src/tests/all.rs b/src/tests/all.rs index 600a3db6628..30691c3a29d 100644 --- a/src/tests/all.rs +++ b/src/tests/all.rs @@ -339,7 +339,8 @@ fn new_dependency(conn: &PgConnection, version: &Version, krate: &Crate) -> Depe optional.eq(false), default_features.eq(false), features.eq(Vec::::new()), - )).get_result(conn) + )) + .get_result(conn) .unwrap() } @@ -475,7 +476,8 @@ fn new_crate_to_body(new_crate: &u::NewCrate, files: &[(&str, &[u8])]) -> Vec>(); + }) + .collect::>(); new_crate_to_body_with_io(new_crate, &mut files) } @@ -508,8 +510,8 @@ fn new_crate_to_body_with_tarball(new_crate: &u::NewCrate, tarball: &[u8]) -> Ve (json.len() >> 16) as u8, (json.len() >> 24) as u8, ] - .iter() - .cloned(), + .iter() + .cloned(), ); body.extend(json.as_bytes().iter().cloned()); body.extend(&[ diff --git a/src/tests/builders.rs b/src/tests/builders.rs index 82fbeafa014..eed37226112 100644 --- a/src/tests/builders.rs +++ b/src/tests/builders.rs @@ -81,7 +81,8 @@ impl<'a> VersionBuilder<'a> { license, self.license_file, None, - )?.save(connection, &[])?; + )? + .save(connection, &[])?; if self.yanked { vers = update(&vers) @@ -102,7 +103,8 @@ impl<'a> VersionBuilder<'a> { dependencies::default_features.eq(false), dependencies::features.eq(Vec::::new()), ) - }).collect::>(); + }) + .collect::>(); insert_into(dependencies::table) .values(&new_deps) .execute(connection)?; @@ -328,7 +330,8 @@ impl PublishBuilder { .map(|(&(name, _), data)| { let len = data.len() as u64; (name, data as &mut Read, len) - }).collect::>(); + }) + .collect::>(); let mut tarball = Vec::new(); { diff --git a/src/tests/category.rs b/src/tests/category.rs index 8b9f2617dfd..8f1d5356205 100644 --- a/src/tests/category.rs +++ b/src/tests/category.rs @@ -117,7 +117,8 @@ fn update_crate() { &app.diesel_database.get().unwrap(), &krate, &["cat1", "category-2"], - ).unwrap(); + ) + .unwrap(); assert_eq!(cnt!(&mut req, "cat1"), 1); assert_eq!(cnt!(&mut req, "category-2"), 1); @@ -131,7 +132,8 @@ fn update_crate() { &app.diesel_database.get().unwrap(), &krate, &["cat1", "catnope"], - ).unwrap(); + ) + .unwrap(); assert_eq!(invalid_categories, vec!["catnope"]); assert_eq!(cnt!(&mut req, "cat1"), 1); assert_eq!(cnt!(&mut req, "category-2"), 0); diff --git a/src/tests/krate.rs b/src/tests/krate.rs index a316e47964c..0d385edce25 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -440,11 +440,13 @@ fn loose_search_order() { .expect_build(conn); // evalrs should match 3rd because of readme let three = CrateBuilder::new("evalrs", user.id) - .readme(r#"$ echo 'println!("Hello World!")' | evalrs + .readme( + r#"$ echo 'println!("Hello World!")' | evalrs Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.daiPxHtjV2VR) Finished debug [unoptimized + debuginfo] target(s) in 0.51 secs Running `target\debug\evalrs_temp.exe` -Hello World!"#) +Hello World!"#, + ) .description("description") .keyword("kw1") .expect_build(conn); @@ -1038,11 +1040,9 @@ fn new_krate_dependency_missing() { sign_in(&mut req, &app); let mut response = ok_resp!(middle.call(&mut req)); let json = ::json::(&mut response); - assert!( - json.errors[0] - .detail - .contains("no known crate named `bar_missing`",) - ); + assert!(json.errors[0] + .detail + .contains("no known crate named `bar_missing`",)); } #[test] @@ -1299,21 +1299,17 @@ fn yank() { assert!(contents.contains("\"yanked\":false")); // make sure it's not yanked - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk/1.0.0",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk/1.0.0",), + )); assert!(!::json::(&mut r).version.yanked); // yank it - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Delete,) - .with_path("/api/v1/crates/fyk/1.0.0/yank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Delete,) + .with_path("/api/v1/crates/fyk/1.0.0/yank",), + )); assert!(::json::(&mut r).ok); let remote_contents = clone_remote_repo(); @@ -1324,21 +1320,17 @@ fn yank() { .read_to_string(&mut contents) .unwrap(); assert!(contents.contains("\"yanked\":true")); - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk/1.0.0",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk/1.0.0",), + )); assert!(::json::(&mut r).version.yanked); // un-yank it - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Put,) - .with_path("/api/v1/crates/fyk/1.0.0/unyank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Put,) + .with_path("/api/v1/crates/fyk/1.0.0/unyank",), + )); assert!(::json::(&mut r).ok); let remote_contents = clone_remote_repo(); @@ -1349,12 +1341,10 @@ fn yank() { .read_to_string(&mut contents) .unwrap(); assert!(contents.contains("\"yanked\":false")); - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk/1.0.0",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk/1.0.0",), + )); assert!(!::json::(&mut r).version.yanked); } @@ -1388,115 +1378,89 @@ fn yank_max_version() { // add version 2.0.0 let body = new_req_body_version_2(krate("fyk_max")); - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_method(Method::Put) - .with_body(&body), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_method(Method::Put) + .with_body(&body), + )); let json: GoodCrate = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); // yank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Delete,) - .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Delete,) + .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); // unyank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Put,) - .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Put,) + .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); // yank version 2.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Delete,) - .with_path("/api/v1/crates/fyk_max/2.0.0/yank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Delete,) + .with_path("/api/v1/crates/fyk_max/2.0.0/yank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "1.0.0"); // yank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Delete,) - .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Delete,) + .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "0.0.0"); // unyank version 2.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Put,) - .with_path("/api/v1/crates/fyk_max/2.0.0/unyank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Put,) + .with_path("/api/v1/crates/fyk_max/2.0.0/unyank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); // unyank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Put,) - .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Put,) + .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); } @@ -1515,48 +1479,38 @@ fn publish_after_yank_max_version() { assert_eq!(json.krate.max_version, "1.0.0"); // yank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Delete,) - .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Delete,) + .with_path("/api/v1/crates/fyk_max/1.0.0/yank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "0.0.0"); // add version 2.0.0 let body = new_req_body_version_2(krate("fyk_max")); - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_method(Method::Put) - .with_body(&body), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_method(Method::Put) + .with_body(&body), + )); let json: GoodCrate = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); // unyank version 1.0.0 - let mut r = ok_resp!( - middle.call( - req.with_method(Method::Put,) - .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), - ) - ); + let mut r = ok_resp!(middle.call( + req.with_method(Method::Put,) + .with_path("/api/v1/crates/fyk_max/1.0.0/unyank",), + )); assert!(::json::(&mut r).ok); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/fyk_max",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/fyk_max",), + )); let json: CrateResponse = ::json(&mut response); assert_eq!(json.krate.max_version, "2.0.0"); } @@ -1713,12 +1667,10 @@ fn good_badges() { assert_eq!(json.krate.name, "foobadger"); assert_eq!(json.krate.max_version, "1.0.0"); - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/foobadger",), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/foobadger",), + )); let json: CrateResponse = ::json(&mut response); @@ -1756,23 +1708,19 @@ fn ignored_badges() { assert_eq!(json.krate.name, "foo_ignored_badge"); assert_eq!(json.krate.max_version, "1.0.0"); assert_eq!(json.warnings.invalid_badges.len(), 2); - assert!( - json.warnings - .invalid_badges - .contains(&"travis-ci".to_string(),) - ); - assert!( - json.warnings - .invalid_badges - .contains(&"not-a-badge".to_string(),) - ); - - let mut response = ok_resp!( - middle.call( - req.with_method(Method::Get,) - .with_path("/api/v1/crates/foo_ignored_badge",), - ) - ); + assert!(json + .warnings + .invalid_badges + .contains(&"travis-ci".to_string(),)); + assert!(json + .warnings + .invalid_badges + .contains(&"not-a-badge".to_string(),)); + + let mut response = ok_resp!(middle.call( + req.with_method(Method::Get,) + .with_path("/api/v1/crates/foo_ignored_badge",), + )); let json: CrateResponse = ::json(&mut response); @@ -1797,7 +1745,8 @@ fn reverse_dependencies() { VersionBuilder::new("1.1.0") .dependency(&c1, None) .dependency(&c1, Some("foo")), - ).expect_build(&conn); + ) + .expect_build(&conn); } let mut response = ok_resp!(middle.call(&mut req)); @@ -2013,9 +1962,9 @@ fn test_recent_download_count() { } /* Given one crate with zero downloads, check that the crate - still shows up in index results, but that it displays 0 - for both recent downloads and downloads. - */ + still shows up in index results, but that it displays 0 + for both recent downloads and downloads. +*/ #[test] fn test_zero_downloads() { let (app, anon, user) = TestApp::init().with_user(); diff --git a/src/tests/owners.rs b/src/tests/owners.rs index 9b488e9f3b6..965bed0814b 100644 --- a/src/tests/owners.rs +++ b/src/tests/owners.rs @@ -116,11 +116,9 @@ fn owners_can_remove_self() { let mut response = ok_resp!(middle.call(req.with_method(Method::Delete,).with_body(body.as_bytes(),),)); let json = ::json::(&mut response); - assert!( - json.errors[0] - .detail - .contains("cannot remove the sole owner of a crate",) - ); + assert!(json.errors[0] + .detail + .contains("cannot remove the sole owner of a crate",)); let body = r#"{"users":["secondowner"]}"#; let mut response = @@ -149,13 +147,11 @@ fn owners_can_remove_self() { logout(&mut req); sign_in_as(&mut req, &second_owner); - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("/api/v1/me/crate_owner_invitations/{}", krate_id)) - .with_method(Method::Put) - .with_body(body.to_string().as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("/api/v1/me/crate_owner_invitations/{}", krate_id)) + .with_method(Method::Put) + .with_body(body.to_string().as_bytes()), + )); #[derive(Deserialize)] struct CrateOwnerInvitation { @@ -171,13 +167,11 @@ fn owners_can_remove_self() { // Deleting yourself when there are other owners is allowed. let body = r#"{"users":["firstowner"]}"#; - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/crates/owners_selfremove/owners") - .with_method(Method::Delete) - .with_body(body.as_bytes()) - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/crates/owners_selfremove/owners") + .with_method(Method::Delete) + .with_body(body.as_bytes()) + )); assert!(::json::(&mut response).ok); // After you delete yourself, you no longer have permisions to manage the crate. @@ -185,11 +179,9 @@ fn owners_can_remove_self() { let mut response = ok_resp!(middle.call(req.with_method(Method::Delete,).with_body(body.as_bytes(),),)); let json = ::json::(&mut response); - assert!( - json.errors[0] - .detail - .contains("only owners have permission to modify owners",) - ); + assert!(json.errors[0] + .detail + .contains("only owners have permission to modify owners",)); } /* Testing the crate ownership between two crates and one team. @@ -308,7 +300,8 @@ fn invitations_list() { invited_by_user_id: owner.id, invited_user_id: user.id, crate_id: krate.id, - }).execute(&*conn) + }) + .execute(&*conn) .unwrap(); (krate, user) }; @@ -364,7 +357,8 @@ fn test_accept_invitation() { invited_by_user_id: owner.id, invited_user_id: user.id, crate_id: krate.id, - }).execute(&*conn) + }) + .execute(&*conn) .unwrap(); (krate, user) }; @@ -382,13 +376,11 @@ fn test_accept_invitation() { // first check that response from inserting new crate owner // and deleting crate_owner_invitation is okay - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id)) - .with_method(Method::Put) - .with_body(body.to_string().as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id)) + .with_method(Method::Put) + .with_body(body.to_string().as_bytes()), + )); let json: T = ::json(&mut response); assert_eq!(json.crate_owner_invitation.accepted, true); @@ -397,22 +389,18 @@ fn test_accept_invitation() { // then check to make sure that accept_invite did what it // was supposed to // crate_owner_invitation was deleted - let mut response = ok_resp!( - middle.call( - req.with_path("api/v1/me/crate_owner_invitations") - .with_method(Method::Get) - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("api/v1/me/crate_owner_invitations") + .with_method(Method::Get) + )); let json: R = ::json(&mut response); assert_eq!(json.crate_owner_invitations.len(), 0); // new crate owner was inserted - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/crates/invited_crate/owners") - .with_method(Method::Get) - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/crates/invited_crate/owners") + .with_method(Method::Get) + )); let json: Q = ::json(&mut response); assert_eq!(json.users.len(), 2); } @@ -454,7 +442,8 @@ fn test_decline_invitation() { invited_by_user_id: owner.id, invited_user_id: user.id, crate_id: krate.id, - }).execute(&*conn) + }) + .execute(&*conn) .unwrap(); (krate, user) }; @@ -472,13 +461,11 @@ fn test_decline_invitation() { // first check that response from deleting // crate_owner_invitation is okay - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id)) - .with_method(Method::Put) - .with_body(body.to_string().as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("api/v1/me/crate_owner_invitations/{}", krate.id)) + .with_method(Method::Put) + .with_body(body.to_string().as_bytes()), + )); let json: T = ::json(&mut response); assert_eq!(json.crate_owner_invitation.accepted, false); @@ -487,22 +474,18 @@ fn test_decline_invitation() { // then check to make sure that decline_invite did what it // was supposed to // crate_owner_invitation was deleted - let mut response = ok_resp!( - middle.call( - req.with_path("api/v1/me/crate_owner_invitations") - .with_method(Method::Get) - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("api/v1/me/crate_owner_invitations") + .with_method(Method::Get) + )); let json: R = ::json(&mut response); assert_eq!(json.crate_owner_invitations.len(), 0); // new crate owner was not inserted - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/crates/invited_crate/owners") - .with_method(Method::Get) - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/crates/invited_crate/owners") + .with_method(Method::Get) + )); let json: Q = ::json(&mut response); assert_eq!(json.users.len(), 1); } diff --git a/src/tests/record.rs b/src/tests/record.rs index 1ba1b0b904a..d69505b444b 100644 --- a/src/tests/record.rs +++ b/src/tests/record.rs @@ -62,9 +62,11 @@ impl Drop for Bomb { .to_string(); match res { Err(..) if !thread::panicking() => panic!("server subtask failed: {}", stderr), - Err(e) => if !stderr.is_empty() { - println!("server subtask failed ({:?}): {}", e, stderr) - }, + Err(e) => { + if !stderr.is_empty() { + println!("server subtask failed ({:?}): {}", e, stderr) + } + } Ok(_) if thread::panicking() => {} Ok(None) => {} Ok(Some((data, file))) => { @@ -123,7 +125,8 @@ pub fn proxy() -> (String, Bomb) { sink: sink2, record: Arc::clone(&record), client, - }).map_err(|e| eprintln!("server connection error: {}", e)); + }) + .map_err(|e| eprintln!("server connection error: {}", e)); drop(core.run(srv.select2(quitrx))); @@ -363,7 +366,8 @@ impl GhUser { note: "crates.io test".to_string(), client_id: ::env("GH_CLIENT_ID"), client_secret: ::env("GH_CLIENT_SECRET"), - }).basic_auth(self.login, Some(password)); + }) + .basic_auth(self.login, Some(password)); let mut response = t!(req.send().and_then(|r| r.error_for_status())); diff --git a/src/tests/team.rs b/src/tests/team.rs index eabf605084d..e36c52a41bd 100644 --- a/src/tests/team.rs +++ b/src/tests/team.rs @@ -65,13 +65,11 @@ fn not_github() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_not_github"); let body = r#"{"users":["dropbox:foo:foo"]}"#; - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_not_github/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_not_github/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0].detail.contains("unknown organization"), "{:?}", @@ -85,13 +83,11 @@ fn weird_name() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_weird_name"); let body = r#"{"users":["github:foo/../bar:wut"]}"#; - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_weird_name/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_weird_name/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] .detail @@ -108,13 +104,11 @@ fn one_colon() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_one_colon"); let body = r#"{"users":["github:foo"]}"#; - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_one_colon/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_one_colon/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0].detail.contains("missing github team"), "{:?}", @@ -129,13 +123,11 @@ fn nonexistent_team() { request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_nonexistent"); let body = r#"{"users":["github:crates-test-org:this-does-not-exist"]}"#; - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_nonexistent/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_nonexistent/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] .detail @@ -153,13 +145,11 @@ fn add_team_mixed_case() { let body = r#"{"users":["github:Crates-Test-Org:Core"]}"#; - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_mixed_case/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_mixed_case/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -169,13 +159,11 @@ fn add_team_mixed_case() { assert_eq!(krate.owners(&*conn).unwrap().len(), 2); } - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_mixed_case/owners") - .with_method(Method::Get) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_mixed_case/owners") + .with_method(Method::Get) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -195,13 +183,11 @@ fn add_team_as_member() { request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_team_member"); let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_team_member/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_team_member/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -220,13 +206,11 @@ fn add_team_as_non_member() { request_with_user_and_mock_crate(&app, &mock_user_on_only_x(), "foo_team_non_member"); let body = body_for_team_y(); - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_team_non_member/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_team_non_member/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] .detail @@ -243,13 +227,11 @@ fn remove_team_as_named_owner() { request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_remove_team"); let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_remove_team/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_remove_team/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -260,13 +242,11 @@ fn remove_team_as_named_owner() { } let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_remove_team/owners") - .with_method(Method::Delete) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_remove_team/owners") + .with_method(Method::Delete) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -274,13 +254,11 @@ fn remove_team_as_named_owner() { sign_in_as(&mut req, &user); } let body = new_req_body_version_2(::krate("foo_remove_team")); - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_body(&body) - .with_method(Method::Put), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_body(&body) + .with_method(Method::Put), + )); assert!( json.errors[0] .detail @@ -297,13 +275,11 @@ fn remove_team_as_team_owner() { request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_remove_team_owner"); let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_remove_team_owner/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_remove_team_owner/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -317,13 +293,11 @@ fn remove_team_as_team_owner() { sign_in_as(&mut req, &user); } let body = body_for_team_x(); - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_remove_team_owner/owners") - .with_method(Method::Delete) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_remove_team_owner/owners") + .with_method(Method::Delete) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] @@ -334,13 +308,11 @@ fn remove_team_as_team_owner() { ); let body = new_req_body_version_2(::krate("foo_remove_team_owner")); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_body(&body) - .with_method(Method::Put), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_body(&body) + .with_method(Method::Put), + )); } // Test trying to publish a krate we don't own @@ -351,13 +323,11 @@ fn publish_not_owned() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_not_owned"); let body = body_for_team_y(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_not_owned/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_not_owned/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -371,13 +341,11 @@ fn publish_not_owned() { sign_in_as(&mut req, &user); } let body = new_req_body_version_2(::krate("foo_not_owned")); - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_body(&body) - .with_method(Method::Put), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_body(&body) + .with_method(Method::Put), + )); assert!( json.errors[0] .detail @@ -394,13 +362,11 @@ fn publish_owned() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_team_owned"); let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_team_owned/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_team_owned/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -414,13 +380,11 @@ fn publish_owned() { sign_in_as(&mut req, &user); } let body = new_req_body_version_2(::krate("foo_team_owned")); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/new") - .with_body(&body) - .with_method(Method::Put), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/new") + .with_body(&body) + .with_method(Method::Put), + )); } // Test trying to change owners (when only on an owning team) @@ -430,13 +394,11 @@ fn add_owners_as_team_owner() { let mut req = request_with_user_and_mock_crate(&app, &mock_user_on_x_and_y(), "foo_add_owner"); let body = body_for_team_x(); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_add_owner/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_add_owner/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); { let conn = app.diesel_database.get().unwrap(); @@ -450,13 +412,11 @@ fn add_owners_as_team_owner() { sign_in_as(&mut req, &user); } let body = r#"{"users":["FlashCat"]}"#; // User doesn't matter - let json = bad_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_add_owner/owners") - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path("/api/v1/crates/foo_add_owner/owners") + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] .detail diff --git a/src/tests/token.rs b/src/tests/token.rs index e4d9a8e494c..3905efa46f2 100644 --- a/src/tests/token.rs +++ b/src/tests/token.rs @@ -158,7 +158,8 @@ fn cannot_create_token_with_token() { .put::<()>( "/api/v1/me/tokens", br#"{ "api_token": { "name": "baz" } }"#, - ).bad_with_status(400); + ) + .bad_with_status(400); assert_contains!( json.errors[0].detail, diff --git a/src/tests/user.rs b/src/tests/user.rs index e2f6f987d92..7bad6d5b5e2 100644 --- a/src/tests/user.rs +++ b/src/tests/user.rs @@ -92,7 +92,8 @@ fn show_latest_user_case_insensitively() { Some("I was first then deleted my github account"), None, "bar" - ).create_or_update(&conn)); + ) + .create_or_update(&conn)); t!(NewUser::new( 2, "FOOBAR", @@ -100,7 +101,8 @@ fn show_latest_user_case_insensitively() { Some("I was second, I took the foobar username on github"), None, "bar" - ).create_or_update(&conn)); + ) + .create_or_update(&conn)); } let mut req = req(Method::Get, "api/v1/users/fOObAr"); let mut response = ok_resp!(middle.call(&mut req)); @@ -167,63 +169,49 @@ fn following() { .expect_build(&conn); } - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/me/updates",) - .with_method(Method::Get,), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/me/updates",) + .with_method(Method::Get,), + )); let r = ::json::(&mut response); assert_eq!(r.versions.len(), 0); assert_eq!(r.meta.more, false); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/foo_fighters/follow") - .with_method(Method::Put), - ) - ); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/bar_fighters/follow") - .with_method(Method::Put), - ) - ); - - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/me/updates",) - .with_method(Method::Get,), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/foo_fighters/follow") + .with_method(Method::Put), + )); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/bar_fighters/follow") + .with_method(Method::Put), + )); + + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/me/updates",) + .with_method(Method::Get,), + )); let r = ::json::(&mut response); assert_eq!(r.versions.len(), 2); assert_eq!(r.meta.more, false); - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/me/updates") - .with_method(Method::Get) - .with_query("per_page=1"), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/me/updates") + .with_method(Method::Get) + .with_query("per_page=1"), + )); let r = ::json::(&mut response); assert_eq!(r.versions.len(), 1); assert_eq!(r.meta.more, true); - ok_resp!( - middle.call( - req.with_path("/api/v1/crates/bar_fighters/follow") - .with_method(Method::Delete), - ) - ); - let mut response = ok_resp!( - middle.call( - req.with_path("/api/v1/me/updates") - .with_method(Method::Get) - .with_query("page=2&per_page=1"), - ) - ); + ok_resp!(middle.call( + req.with_path("/api/v1/crates/bar_fighters/follow") + .with_method(Method::Delete), + )); + let mut response = ok_resp!(middle.call( + req.with_path("/api/v1/me/updates") + .with_method(Method::Get) + .with_query("page=2&per_page=1"), + )); let r = ::json::(&mut response); assert_eq!(r.versions.len(), 0); assert_eq!(r.meta.more, false); @@ -350,13 +338,11 @@ fn test_github_login_does_not_overwrite_email() { let body = r#"{"user":{"email":"apricot@apricots.apricot","name":"Apricot Apricoto","login":"apricot","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/apricot","kind":null}}"#; - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!(::json::(&mut response).ok); logout(&mut req); @@ -410,13 +396,11 @@ fn test_email_get_and_put() { let body = r#"{"user":{"email":"mango@mangos.mango","name":"Mango McMangoface","login":"mango","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/mango","kind":null}}"#; - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!(::json::(&mut response).ok); let mut response = ok_resp!(middle.call(req.with_path("/api/v1/me").with_method(Method::Get),)); @@ -450,13 +434,11 @@ fn test_empty_email_not_added() { let body = r#"{"user":{"email":"","name":"Papayo Papaya","login":"papaya","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/papaya","kind":null}}"#; - let json = bad_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0].detail.contains("empty email rejected"), @@ -466,13 +448,11 @@ fn test_empty_email_not_added() { let body = r#"{"user":{"email":null,"name":"Papayo Papaya","login":"papaya","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/papaya","kind":null}}"#; - let json = bad_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0].detail.contains("empty email rejected"), @@ -505,13 +485,11 @@ fn test_this_user_cannot_change_that_user_email() { let body = r#"{"user":{"email":"pineapple@pineapples.pineapple","name":"Pine Apple","login":"pineapple","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/pineapple","kind":null}}"#; - let json = bad_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", not_signed_in_user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let json = bad_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", not_signed_in_user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!( json.errors[0] @@ -616,13 +594,11 @@ fn test_insert_into_email_table_with_email_change() { let body = r#"{"user":{"email":"apricot@apricots.apricot","name":"potato","login":"potato","avatar":"https://avatars0.githubusercontent.com","url":"https://github.com/potato","kind":null}}"#; - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("/api/v1/users/{}", user.id)) - .with_method(Method::Put) - .with_body(body.as_bytes()), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("/api/v1/users/{}", user.id)) + .with_method(Method::Put) + .with_body(body.as_bytes()), + )); assert!(::json::(&mut response).ok); logout(&mut req); @@ -690,12 +666,10 @@ fn test_confirm_user_email() { .unwrap() }; - let mut response = ok_resp!( - middle.call( - req.with_path(&format!("/api/v1/confirm/{}", email_token)) - .with_method(Method::Put), - ) - ); + let mut response = ok_resp!(middle.call( + req.with_path(&format!("/api/v1/confirm/{}", email_token)) + .with_method(Method::Put), + )); assert!(::json::(&mut response).ok); let mut response = ok_resp!(middle.call(req.with_path("/api/v1/me").with_method(Method::Get),)); diff --git a/src/views/mod.rs b/src/views/mod.rs index 5ce2e3da790..f324ec899d5 100644 --- a/src/views/mod.rs +++ b/src/views/mod.rs @@ -232,11 +232,10 @@ mod tests { created_at: NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 11), }; let json = serde_json::to_string(&cat).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); } #[test] @@ -252,11 +251,10 @@ mod tests { parent_categories: vec![], }; let json = serde_json::to_string(&cat).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); } #[test] @@ -268,11 +266,10 @@ mod tests { crates_cnt: 0, }; let json = serde_json::to_string(&key).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); } #[test] @@ -297,16 +294,14 @@ mod tests { crate_size: Some(1234), }; let json = serde_json::to_string(&ver).unwrap(); - assert!( - json.as_str() - .find(r#""updated_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:12+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""updated_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:12+00:00""#) + .is_some()); } #[test] @@ -338,16 +333,14 @@ mod tests { exact_match: false, }; let json = serde_json::to_string(&crt).unwrap(); - assert!( - json.as_str() - .find(r#""updated_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:12+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""updated_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:12+00:00""#) + .is_some()); } #[test] @@ -359,10 +352,9 @@ mod tests { created_at: NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 11), }; let json = serde_json::to_string(&inv).unwrap(); - assert!( - json.as_str() - .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) - .is_some() - ); + assert!(json + .as_str() + .find(r#""created_at":"2017-01-06T14:23:11+00:00""#) + .is_some()); } } From 17c817fe37522493c222f0d56bb06784ad072dd6 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 14 Feb 2019 18:05:18 -0600 Subject: [PATCH 6/9] reduce size of test --- src/tests/krate.rs | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/src/tests/krate.rs b/src/tests/krate.rs index f5ab41f0530..e639c4b544b 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -426,13 +426,7 @@ fn loose_search_order() { .description("description") .keyword("kw1") .expect_build(conn); - // file shouldn't match at all - CrateBuilder::new("file", user.id) - .readme("readme") - .description("description") - .keyword("kw1") - .expect_build(conn); - // temp_udp should match second + // temp_udp should match second because of _ let two = CrateBuilder::new("temp_utp", user.id) .readme("readme") .description("description") @@ -441,11 +435,7 @@ fn loose_search_order() { // evalrs should match 3rd because of readme let three = CrateBuilder::new("evalrs", user.id) .readme( - r#"$ echo 'println!("Hello World!")' | evalrs - Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.daiPxHtjV2VR) - Finished debug [unoptimized + debuginfo] target(s) in 0.51 secs - Running `target\debug\evalrs_temp.exe` -Hello World!"#, + "evalrs_temp evalrs_temp evalrs_temp", ) .description("description") .keyword("kw1") @@ -456,25 +446,14 @@ Hello World!"#, .description("description") .keyword("kw1") .expect_build(conn); - // mkstemp should appear 5th - let five = CrateBuilder::new("mkstemp", user.id) - .readme("readme") - .description("description") - .keyword("kw1") - .expect_build(conn); - vec![one, two, three, four, five] + vec![one, two, three, four] }); let search_temp = anon.search("q=temp"); - assert_eq!(search_temp.meta.total, 5); - assert_eq!(search_temp.crates.len(), 5); + assert_eq!(search_temp.meta.total, 4); + assert_eq!(search_temp.crates.len(), 4); for (lhs, rhs) in search_temp.crates.iter().zip(ordered) { assert_eq!(lhs.name, rhs.name); } - let search_file = anon.search("q=file"); - assert_eq!(search_file.meta.total, 2); - assert_eq!(search_file.crates.len(), 2); - assert_eq!(&search_file.crates[0].name, "file"); - assert_eq!(&search_file.crates[1].name, "tempfile"); } #[test] From 41eb04b263dd3df8f5c8182ceabbcc8846dff6d1 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 14 Feb 2019 18:05:34 -0600 Subject: [PATCH 7/9] ilike -> like --- src/models/krate.rs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/models/krate.rs b/src/models/krate.rs index d7fc962a4c4..5ed7cd13940 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -88,7 +88,7 @@ type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; /// The result of a loose search -type LikeName<'a> = diesel::pg::expression::helper_types::ILike< +type LikeName<'a> = diesel::dsl::Like< CanonCrateName, CanonCrateName<&'a str>, >; @@ -241,20 +241,10 @@ impl<'a> NewCrate<'a> { impl Crate { /// SQL filter with the `like` binary operator - /// ```sql - /// SELECT * - /// FROM crates - /// WHERE name like $1 - /// ``` pub fn like_name(name: &str) -> LikeName<'_> { - canon_crate_name(crates::name).ilike(canon_crate_name(name)) + canon_crate_name(crates::name).like(canon_crate_name(name)) } /// SQL filter with the = binary operator - /// ```sql - /// SELECT * - /// FROM crates - /// WHERE name = $1 - /// ``` pub fn with_name(name: &str) -> WithName<'_> { canon_crate_name(crates::name).eq(canon_crate_name(name)) } From 3f19187cf83f607a7cfd494df883025524837e63 Mon Sep 17 00:00:00 2001 From: rfm Date: Fri, 15 Feb 2019 09:12:33 -0600 Subject: [PATCH 8/9] cargo fmt --- src/models/krate.rs | 5 +---- src/tests/krate.rs | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/models/krate.rs b/src/models/krate.rs index 5ed7cd13940..8457155d706 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -88,10 +88,7 @@ type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; /// The result of a loose search -type LikeName<'a> = diesel::dsl::Like< - CanonCrateName, - CanonCrateName<&'a str>, ->; +type LikeName<'a> = diesel::dsl::Like, CanonCrateName<&'a str>>; type ByName<'a> = diesel::dsl::Filter>; type ByExactName<'a> = diesel::dsl::Filter>; diff --git a/src/tests/krate.rs b/src/tests/krate.rs index e639c4b544b..a52c868c4f5 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -434,9 +434,7 @@ fn loose_search_order() { .expect_build(conn); // evalrs should match 3rd because of readme let three = CrateBuilder::new("evalrs", user.id) - .readme( - "evalrs_temp evalrs_temp evalrs_temp", - ) + .readme("evalrs_temp evalrs_temp evalrs_temp") .description("description") .keyword("kw1") .expect_build(conn); From 346b573535150520f3de1131fd2b09354d5c51fc Mon Sep 17 00:00:00 2001 From: "Carol (Nichols || Goulding)" Date: Tue, 23 Apr 2019 20:17:12 -0400 Subject: [PATCH 9/9] Move wildcard adding code into the like_name function --- src/controllers/krate/search.rs | 9 ++------- src/models/krate.rs | 10 ++++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index 9ebb9827b37..2d897481194 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -38,12 +38,6 @@ pub fn search(req: &mut dyn Request) -> CargoResult { let conn = req.db_conn()?; let (offset, limit) = req.pagination(10, 100)?; let params = req.query(); - //extract the search param for loose searching - let search_q = if let Some(q) = params.get("q") { - format!("%{}%", q) - } else { - String::new() - }; let sort = params .get("sort") .map(|s| &**s) @@ -64,10 +58,11 @@ pub fn search(req: &mut dyn Request) -> CargoResult { has_filter = true; if !q_string.is_empty() { let sort = params.get("sort").map(|s| &**s).unwrap_or("relevance"); + let q = plainto_tsquery(q_string); query = query.filter( q.matches(crates::textsearchable_index_col) - .or(Crate::like_name(&search_q)), + .or(Crate::like_name(&q_string)), ); query = query.select(( diff --git a/src/models/krate.rs b/src/models/krate.rs index fca6ba12373..376dcdb5a7d 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -87,7 +87,7 @@ type CanonCrateName = self::canon_crate_name::HelperType; type All = diesel::dsl::Select; type WithName<'a> = diesel::dsl::Eq, CanonCrateName<&'a str>>; /// The result of a loose search -type LikeName<'a> = diesel::dsl::Like, CanonCrateName<&'a str>>; +type LikeName = diesel::dsl::Like, CanonCrateName>; type ByName<'a> = diesel::dsl::Filter>; type ByExactName<'a> = diesel::dsl::Filter>; @@ -236,9 +236,11 @@ impl<'a> NewCrate<'a> { } impl Crate { - /// SQL filter with the `like` binary operator - pub fn like_name(name: &str) -> LikeName<'_> { - canon_crate_name(crates::name).like(canon_crate_name(name)) + /// SQL filter with the `like` binary operator. Adds wildcards to the beginning and end to get + /// substring matches. + pub fn like_name(name: &str) -> LikeName { + let wildcard_name = format!("%{}%", name); + canon_crate_name(crates::name).like(canon_crate_name(wildcard_name)) } /// SQL filter with the = binary operator pub fn with_name(name: &str) -> WithName<'_> {