Skip to content

Commit bef2600

Browse files
committed
models::krate: Inline encodable() method
1 parent 201fe6f commit bef2600

File tree

2 files changed

+132
-150
lines changed

2 files changed

+132
-150
lines changed

src/models/krate.rs

Lines changed: 2 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,15 @@ use crate::controllers::helpers::pagination::*;
1010
use crate::email;
1111
use crate::models::version::TopVersions;
1212
use crate::models::{
13-
Badge, Category, CrateOwner, CrateOwnerInvitation, Keyword, NewCrateOwnerInvitation, Owner,
14-
OwnerKind, ReverseDependency, User, Version,
13+
Badge, CrateOwner, CrateOwnerInvitation, NewCrateOwnerInvitation, Owner, OwnerKind,
14+
ReverseDependency, User, Version,
1515
};
1616
use crate::util::errors::{cargo_err, AppResult};
17-
use crate::views::{EncodableCrate, EncodableCrateLinks};
1817

1918
use crate::models::helpers::with_count::*;
2019
use crate::publish_rate_limit::PublishRateLimit;
2120
use crate::schema::*;
2221

23-
/// Hosts in this list are known to not be hosting documentation,
24-
/// and are possibly of malicious intent e.g. ad tracking networks, etc.
25-
const DOCUMENTATION_BLOCKLIST: [&str; 2] = ["rust-ci.org", "rustless.org"];
26-
2722
#[derive(Debug, Queryable, Identifiable, Associations, Clone, Copy)]
2823
#[belongs_to(Crate)]
2924
#[primary_key(crate_id)]
@@ -296,109 +291,6 @@ impl Crate {
296291
&& prefix_part.map_or(true, Crate::valid_feature_prefix)
297292
}
298293

299-
#[allow(clippy::too_many_arguments)]
300-
pub fn encodable(
301-
self,
302-
top_versions: &TopVersions,
303-
versions: Option<Vec<i32>>,
304-
keywords: Option<&[Keyword]>,
305-
categories: Option<&[Category]>,
306-
badges: Option<Vec<Badge>>,
307-
exact_match: bool,
308-
recent_downloads: Option<i64>,
309-
) -> EncodableCrate {
310-
let Crate {
311-
name,
312-
created_at,
313-
updated_at,
314-
downloads,
315-
description,
316-
homepage,
317-
documentation,
318-
repository,
319-
..
320-
} = self;
321-
let versions_link = match versions {
322-
Some(..) => None,
323-
None => Some(format!("/api/v1/crates/{}/versions", name)),
324-
};
325-
let keyword_ids = keywords.map(|kws| kws.iter().map(|kw| kw.keyword.clone()).collect());
326-
let category_ids = categories.map(|cats| cats.iter().map(|cat| cat.slug.clone()).collect());
327-
let badges = badges.map(|bs| bs.into_iter().map(Badge::into).collect());
328-
let documentation = Crate::remove_blocked_documentation_urls(documentation);
329-
330-
let max_version = top_versions
331-
.highest
332-
.as_ref()
333-
.map(|v| v.to_string())
334-
.unwrap_or_else(|| "0.0.0".to_string());
335-
336-
let newest_version = top_versions
337-
.newest
338-
.as_ref()
339-
.map(|v| v.to_string())
340-
.unwrap_or_else(|| "0.0.0".to_string());
341-
342-
let max_stable_version = top_versions.highest_stable.as_ref().map(|v| v.to_string());
343-
344-
EncodableCrate {
345-
id: name.clone(),
346-
name: name.clone(),
347-
updated_at,
348-
created_at,
349-
downloads,
350-
recent_downloads,
351-
versions,
352-
keywords: keyword_ids,
353-
categories: category_ids,
354-
badges,
355-
max_version,
356-
newest_version,
357-
max_stable_version,
358-
documentation,
359-
homepage,
360-
exact_match,
361-
description,
362-
repository,
363-
links: EncodableCrateLinks {
364-
version_downloads: format!("/api/v1/crates/{}/downloads", name),
365-
versions: versions_link,
366-
owners: Some(format!("/api/v1/crates/{}/owners", name)),
367-
owner_team: Some(format!("/api/v1/crates/{}/owner_team", name)),
368-
owner_user: Some(format!("/api/v1/crates/{}/owner_user", name)),
369-
reverse_dependencies: format!("/api/v1/crates/{}/reverse_dependencies", name),
370-
},
371-
}
372-
}
373-
374-
/// Return `None` if the documentation URL host matches a blocked host
375-
fn remove_blocked_documentation_urls(url: Option<String>) -> Option<String> {
376-
// Handles if documentation URL is None
377-
let url = match url {
378-
Some(url) => url,
379-
None => return None,
380-
};
381-
382-
// Handles unsuccessful parsing of documentation URL
383-
let parsed_url = match Url::parse(&url) {
384-
Ok(parsed_url) => parsed_url,
385-
Err(_) => return None,
386-
};
387-
388-
// Extract host string from documentation URL
389-
let url_host = match parsed_url.host_str() {
390-
Some(url_host) => url_host,
391-
None => return None,
392-
};
393-
394-
// Match documentation URL host against blocked host array elements
395-
if DOCUMENTATION_BLOCKLIST.contains(&url_host) {
396-
None
397-
} else {
398-
Some(url)
399-
}
400-
}
401-
402294
/// Return both the newest (most recently updated) and
403295
/// highest version (in semver order) for the current crate.
404296
pub fn top_versions(&self, conn: &PgConnection) -> QueryResult<TopVersions> {
@@ -558,39 +450,6 @@ mod tests {
558450
assert_err!(krate.validate());
559451
}
560452

561-
#[test]
562-
fn documentation_blocked_no_url_provided() {
563-
assert_eq!(Crate::remove_blocked_documentation_urls(None), None);
564-
}
565-
566-
#[test]
567-
fn documentation_blocked_invalid_url() {
568-
assert_eq!(
569-
Crate::remove_blocked_documentation_urls(Some(String::from("not a url"))),
570-
None
571-
);
572-
}
573-
574-
#[test]
575-
fn documentation_blocked_url_contains_partial_match() {
576-
assert_eq!(
577-
Crate::remove_blocked_documentation_urls(Some(String::from(
578-
"http://rust-ci.organists.com"
579-
)),),
580-
Some(String::from("http://rust-ci.organists.com"))
581-
);
582-
}
583-
584-
#[test]
585-
fn documentation_blocked_url() {
586-
assert_eq!(
587-
Crate::remove_blocked_documentation_urls(Some(String::from(
588-
"http://rust-ci.org/crate/crate-0.1/doc/crate-0.1",
589-
),),),
590-
None
591-
);
592-
}
593-
594453
#[test]
595454
fn valid_name() {
596455
assert!(Crate::valid_name("foo"));

src/views.rs

Lines changed: 130 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
use chrono::NaiveDateTime;
22
use diesel::PgConnection;
33
use std::collections::HashMap;
4+
use url::Url;
45

56
use crate::github;
67
use crate::models::{
78
Badge, Category, Crate, CrateOwnerInvitation, CreatedApiToken, Dependency, DependencyKind,
8-
Keyword, Owner, ReverseDependency, Team, User, Version, VersionDownload, VersionOwnerAction,
9+
Keyword, Owner, ReverseDependency, Team, TopVersions, User, Version, VersionDownload,
10+
VersionOwnerAction,
911
};
1012
use crate::util::rfc3339;
1113

14+
/// Hosts in this list are known to not be hosting documentation,
15+
/// and are possibly of malicious intent e.g. ad tracking networks, etc.
16+
const DOCUMENTATION_BLOCKLIST: [&str; 2] = ["rust-ci.org", "rustless.org"];
17+
1218
#[derive(PartialEq, Debug, Serialize, Deserialize)]
1319
pub struct EncodableBadge {
1420
pub badge_type: String,
@@ -217,15 +223,68 @@ impl EncodableCrate {
217223
exact_match: bool,
218224
recent_downloads: Option<i64>,
219225
) -> Self {
220-
krate.encodable(
221-
top_versions,
226+
let Crate {
227+
name,
228+
created_at,
229+
updated_at,
230+
downloads,
231+
description,
232+
homepage,
233+
documentation,
234+
repository,
235+
..
236+
} = krate;
237+
let versions_link = match versions {
238+
Some(..) => None,
239+
None => Some(format!("/api/v1/crates/{}/versions", name)),
240+
};
241+
let keyword_ids = keywords.map(|kws| kws.iter().map(|kw| kw.keyword.clone()).collect());
242+
let category_ids = categories.map(|cats| cats.iter().map(|cat| cat.slug.clone()).collect());
243+
let badges = badges.map(|bs| bs.into_iter().map(Badge::into).collect());
244+
let documentation = Self::remove_blocked_documentation_urls(documentation);
245+
246+
let max_version = top_versions
247+
.highest
248+
.as_ref()
249+
.map(|v| v.to_string())
250+
.unwrap_or_else(|| "0.0.0".to_string());
251+
252+
let newest_version = top_versions
253+
.newest
254+
.as_ref()
255+
.map(|v| v.to_string())
256+
.unwrap_or_else(|| "0.0.0".to_string());
257+
258+
let max_stable_version = top_versions.highest_stable.as_ref().map(|v| v.to_string());
259+
260+
EncodableCrate {
261+
id: name.clone(),
262+
name: name.clone(),
263+
updated_at,
264+
created_at,
265+
downloads,
266+
recent_downloads,
222267
versions,
223-
keywords,
224-
categories,
268+
keywords: keyword_ids,
269+
categories: category_ids,
225270
badges,
271+
max_version,
272+
newest_version,
273+
max_stable_version,
274+
documentation,
275+
homepage,
226276
exact_match,
227-
recent_downloads,
228-
)
277+
description,
278+
repository,
279+
links: EncodableCrateLinks {
280+
version_downloads: format!("/api/v1/crates/{}/downloads", name),
281+
versions: versions_link,
282+
owners: Some(format!("/api/v1/crates/{}/owners", name)),
283+
owner_team: Some(format!("/api/v1/crates/{}/owner_team", name)),
284+
owner_user: Some(format!("/api/v1/crates/{}/owner_user", name)),
285+
reverse_dependencies: format!("/api/v1/crates/{}/reverse_dependencies", name),
286+
},
287+
}
229288
}
230289

231290
pub fn from_minimal(
@@ -246,6 +305,34 @@ impl EncodableCrate {
246305
recent_downloads,
247306
)
248307
}
308+
309+
/// Return `None` if the documentation URL host matches a blocked host
310+
fn remove_blocked_documentation_urls(url: Option<String>) -> Option<String> {
311+
// Handles if documentation URL is None
312+
let url = match url {
313+
Some(url) => url,
314+
None => return None,
315+
};
316+
317+
// Handles unsuccessful parsing of documentation URL
318+
let parsed_url = match Url::parse(&url) {
319+
Ok(parsed_url) => parsed_url,
320+
Err(_) => return None,
321+
};
322+
323+
// Extract host string from documentation URL
324+
let url_host = match parsed_url.host_str() {
325+
Some(url_host) => url_host,
326+
None => return None,
327+
};
328+
329+
// Match documentation URL host against blocked host array elements
330+
if DOCUMENTATION_BLOCKLIST.contains(&url_host) {
331+
None
332+
} else {
333+
Some(url)
334+
}
335+
}
249336
}
250337

251338
#[derive(Serialize, Deserialize, Debug)]
@@ -714,4 +801,40 @@ mod tests {
714801
.as_str()
715802
.find(r#""created_at":"2017-01-06T14:23:11+00:00""#));
716803
}
804+
805+
#[test]
806+
fn documentation_blocked_no_url_provided() {
807+
assert_eq!(
808+
EncodableCrate::remove_blocked_documentation_urls(None),
809+
None
810+
);
811+
}
812+
813+
#[test]
814+
fn documentation_blocked_invalid_url() {
815+
assert_eq!(
816+
EncodableCrate::remove_blocked_documentation_urls(Some(String::from("not a url"))),
817+
None
818+
);
819+
}
820+
821+
#[test]
822+
fn documentation_blocked_url_contains_partial_match() {
823+
assert_eq!(
824+
EncodableCrate::remove_blocked_documentation_urls(Some(String::from(
825+
"http://rust-ci.organists.com"
826+
)),),
827+
Some(String::from("http://rust-ci.organists.com"))
828+
);
829+
}
830+
831+
#[test]
832+
fn documentation_blocked_url() {
833+
assert_eq!(
834+
EncodableCrate::remove_blocked_documentation_urls(Some(String::from(
835+
"http://rust-ci.org/crate/crate-0.1/doc/crate-0.1",
836+
),),),
837+
None
838+
);
839+
}
717840
}

0 commit comments

Comments
 (0)