Skip to content

Commit f311ee2

Browse files
authored
Fixed details dropdown (rust-lang#890)
* Fixed crate releases list * Added CSS test
1 parent 731d031 commit f311ee2

File tree

3 files changed

+92
-28
lines changed

3 files changed

+92
-28
lines changed

src/web/badge/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! Simple badge generator
22
33
use base64::display::Base64Display;
4-
use rusttype::{point, Font, Point, PositionedGlyph, Scale};
54
use once_cell::sync::Lazy;
5+
use rusttype::{point, Font, Point, PositionedGlyph, Scale};
66

77
const FONT_DATA: &[u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/DejaVuSans.ttf"));
88
const FONT_SIZE: f32 = 11.0;
@@ -35,9 +35,8 @@ pub struct Badge {
3535

3636
impl Badge {
3737
pub fn new(options: BadgeOptions) -> Result<Badge, String> {
38-
static FONT: Lazy<Font> = Lazy::new(|| {
39-
Font::try_from_bytes(FONT_DATA).expect("Failed to parse FONT_DATA")
40-
});
38+
static FONT: Lazy<Font> =
39+
Lazy::new(|| Font::try_from_bytes(FONT_DATA).expect("Failed to parse FONT_DATA"));
4140

4241
let font = &*FONT;
4342
let scale = Scale {

src/web/crate_details.rs

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ pub struct Release {
6363
pub version: String,
6464
pub build_status: bool,
6565
pub yanked: bool,
66+
pub is_library: bool,
6667
}
6768

6869
impl CrateDetails {
@@ -243,23 +244,29 @@ impl CrateDetails {
243244
fn map_to_release(conn: &Connection, crate_id: i32, version: String) -> Release {
244245
let rows = conn
245246
.query(
246-
"SELECT build_status, yanked
247+
"SELECT build_status,
248+
yanked,
249+
is_library
247250
FROM releases
248251
WHERE releases.crate_id = $1 and releases.version = $2;",
249252
&[&crate_id, &version],
250253
)
251254
.unwrap();
252255

253-
let (build_status, yanked) = if !rows.is_empty() {
254-
(rows.get(0).get(0), rows.get(0).get(1))
255-
} else {
256-
Default::default()
257-
};
256+
let (build_status, yanked, is_library) =
257+
rows.iter().next().map_or_else(Default::default, |row| {
258+
(
259+
row.get("build_status"),
260+
row.get("yanked"),
261+
row.get("is_library"),
262+
)
263+
});
258264

259265
Release {
260266
version,
261267
build_status,
262268
yanked,
269+
is_library,
263270
}
264271
}
265272

@@ -308,8 +315,9 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
308315
#[cfg(test)]
309316
mod tests {
310317
use super::*;
311-
use crate::test::TestDatabase;
318+
use crate::test::{wrapper, TestDatabase};
312319
use failure::Error;
320+
use kuchiki::traits::TendrilSink;
313321

314322
fn assert_last_successful_build_equals(
315323
db: &TestDatabase,
@@ -329,7 +337,7 @@ mod tests {
329337

330338
#[test]
331339
fn test_last_successful_build_when_last_releases_failed_or_yanked() {
332-
crate::test::wrapper(|env| {
340+
wrapper(|env| {
333341
let db = env.db();
334342

335343
db.fake_release().name("foo").version("0.0.1").create()?;
@@ -362,7 +370,7 @@ mod tests {
362370

363371
#[test]
364372
fn test_last_successful_build_when_all_releases_failed_or_yanked() {
365-
crate::test::wrapper(|env| {
373+
wrapper(|env| {
366374
let db = env.db();
367375

368376
db.fake_release()
@@ -390,7 +398,7 @@ mod tests {
390398

391399
#[test]
392400
fn test_last_successful_build_with_intermittent_releases_failed_or_yanked() {
393-
crate::test::wrapper(|env| {
401+
wrapper(|env| {
394402
let db = env.db();
395403

396404
db.fake_release().name("foo").version("0.0.1").create()?;
@@ -416,7 +424,7 @@ mod tests {
416424

417425
#[test]
418426
fn test_releases_should_be_sorted() {
419-
crate::test::wrapper(|env| {
427+
wrapper(|env| {
420428
let db = env.db();
421429

422430
// Add new releases of 'foo' out-of-order since CrateDetails should sort them descending
@@ -438,6 +446,12 @@ mod tests {
438446
.name("foo")
439447
.version("0.2.0-alpha")
440448
.create()?;
449+
db.fake_release()
450+
.name("foo")
451+
.version("0.0.1")
452+
.build_result_successful(false)
453+
.binary(true)
454+
.create()?;
441455

442456
let details = CrateDetails::new(&db.conn(), "foo", "0.2.0").unwrap();
443457
assert_eq!(
@@ -446,37 +460,50 @@ mod tests {
446460
Release {
447461
version: "1.0.0".to_string(),
448462
build_status: true,
449-
yanked: false
463+
yanked: false,
464+
is_library: true,
450465
},
451466
Release {
452467
version: "0.12.0".to_string(),
453468
build_status: true,
454-
yanked: false
469+
yanked: false,
470+
is_library: true,
455471
},
456472
Release {
457473
version: "0.3.0".to_string(),
458474
build_status: false,
459-
yanked: false
475+
yanked: false,
476+
is_library: true,
460477
},
461478
Release {
462479
version: "0.2.0".to_string(),
463480
build_status: true,
464-
yanked: true
481+
yanked: true,
482+
is_library: true,
465483
},
466484
Release {
467485
version: "0.2.0-alpha".to_string(),
468486
build_status: true,
469-
yanked: false
487+
yanked: false,
488+
is_library: true,
470489
},
471490
Release {
472491
version: "0.1.1".to_string(),
473492
build_status: true,
474-
yanked: false
493+
yanked: false,
494+
is_library: true,
475495
},
476496
Release {
477497
version: "0.1.0".to_string(),
478498
build_status: true,
479-
yanked: false
499+
yanked: false,
500+
is_library: true,
501+
},
502+
Release {
503+
version: "0.0.1".to_string(),
504+
build_status: false,
505+
yanked: false,
506+
is_library: false,
480507
},
481508
]
482509
);
@@ -487,7 +514,7 @@ mod tests {
487514

488515
#[test]
489516
fn test_latest_version() {
490-
crate::test::wrapper(|env| {
517+
wrapper(|env| {
491518
let db = env.db();
492519

493520
db.fake_release().name("foo").version("0.0.1").create()?;
@@ -505,7 +532,7 @@ mod tests {
505532

506533
#[test]
507534
fn test_latest_version_ignores_yanked() {
508-
crate::test::wrapper(|env| {
535+
wrapper(|env| {
509536
let db = env.db();
510537

511538
db.fake_release().name("foo").version("0.0.1").create()?;
@@ -527,7 +554,7 @@ mod tests {
527554

528555
#[test]
529556
fn test_latest_version_only_yanked() {
530-
crate::test::wrapper(|env| {
557+
wrapper(|env| {
531558
let db = env.db();
532559

533560
db.fake_release()
@@ -554,4 +581,35 @@ mod tests {
554581
Ok(())
555582
})
556583
}
584+
585+
#[test]
586+
fn releases_dropdowns_is_correct() {
587+
wrapper(|env| {
588+
let db = env.db();
589+
590+
db.fake_release()
591+
.name("binary")
592+
.version("0.1.0")
593+
.binary(true)
594+
.create()?;
595+
596+
let page = kuchiki::parse_html()
597+
.one(env.frontend().get("/crate/binary/0.1.0").send()?.text()?);
598+
let warning = page.select_first("a.pure-menu-link.warn").unwrap();
599+
600+
assert_eq!(
601+
warning
602+
.as_node()
603+
.as_element()
604+
.unwrap()
605+
.attributes
606+
.borrow()
607+
.get("title")
608+
.unwrap(),
609+
"binary-0.1.0 is not a library"
610+
);
611+
612+
Ok(())
613+
});
614+
}
557615
}

templates/macros.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
* `version` A string of the release's version
8484
* `yanked` A boolean of the release's yanked status
8585
* `build_status` A boolean of the crate's build status (true for built, false for failed build)
86+
* `is_library` A boolean that's true if the crate is a library and false if it's a binary
8687
#}
8788
{% macro releases_list(name, releases) %}
8889
{%- for release in releases -%}
@@ -92,8 +93,14 @@
9293
{%- set release_name = name ~ "-" ~ release.version -%}
9394

9495
<li class="pure-menu-item">
95-
{# If the release is yanked but built, display an warning #}
96-
{%- if release.yanked and release.build_status -%}
96+
{# If the release isn't a library, then display that warning #}
97+
{% if not release.is_library -%}
98+
<a href="{{ release_url }}" class="pure-menu-link warn" title="{{ release_name }} is not a library">
99+
<i class="fa fa-fw fa-warning"></i> {{ release.version }}
100+
</a>
101+
102+
{# If the release has been yanked and failed to build, display a warning #}
103+
{%- elif release.yanked and release.build_status -%}
97104
<a href="{{ release_url }}" class="pure-menu-link warn" title="{{ release_name }} is yanked">
98105
<i class="fa fa-fw fa-warning"></i> {{ release.version }}
99106
</a>
@@ -116,7 +123,7 @@
116123
<a href="{{ release_url }}" class="pure-menu-link">
117124
{{ release.version }}
118125
</a>
119-
{%- endif -%}
126+
{%- endif %}
120127
</li>
121128
{%- endfor -%}
122129
{% endmacro releases_list %}

0 commit comments

Comments
 (0)