diff --git a/app/components/badge-circle-ci.js b/app/components/badge-circle-ci.js
new file mode 100644
index 00000000000..90d97507178
--- /dev/null
+++ b/app/components/badge-circle-ci.js
@@ -0,0 +1,13 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ tagName: 'span',
+ classNames: ['badge'],
+ repository: Ember.computed.alias('badge.attributes.repository'),
+ branch: Ember.computed('badge.attributes.branch', function() {
+ return encodeURIComponent(this.get('badge.attributes.branch') || 'master');
+ }),
+ text: Ember.computed('branch', function() {
+ return `Circle CI build status for the ${ this.get('branch') } branch`;
+ })
+});
diff --git a/app/templates/components/badge-circle-ci.hbs b/app/templates/components/badge-circle-ci.hbs
new file mode 100644
index 00000000000..3db4fb34a34
--- /dev/null
+++ b/app/templates/components/badge-circle-ci.hbs
@@ -0,0 +1,6 @@
+
+
+
diff --git a/src/badge.rs b/src/badge.rs
index f38d95cd0a3..3c762eccafb 100644
--- a/src/badge.rs
+++ b/src/badge.rs
@@ -23,6 +23,10 @@ pub enum Badge {
repository: String,
branch: Option,
},
+ CircleCi {
+ repository: String,
+ branch: Option,
+ },
IsItMaintainedIssueResolution { repository: String },
IsItMaintainedOpenIssues { repository: String },
Codecov {
diff --git a/src/tests/badge.rs b/src/tests/badge.rs
index 2ff94fd54f2..829a29f47db 100644
--- a/src/tests/badge.rs
+++ b/src/tests/badge.rs
@@ -20,6 +20,8 @@ struct BadgeRef {
codecov_attributes: HashMap,
coveralls: Badge,
coveralls_attributes: HashMap,
+ circle_ci: Badge,
+ circle_ci_attributes: HashMap,
}
fn set_up() -> (Arc, Crate, BadgeRef) {
@@ -96,6 +98,14 @@ fn set_up() -> (Arc, Crate, BadgeRef) {
badge_attributes_coveralls.insert(String::from("repository"), String::from("rust-lang/rust"));
badge_attributes_coveralls.insert(String::from("service"), String::from("github"));
+ let circle_ci = Badge::CircleCi {
+ repository: String::from("rust-lang/rust"),
+ branch: Some(String::from("beta")),
+ };
+ let mut badge_attributes_circle_ci = HashMap::new();
+ badge_attributes_circle_ci.insert(String::from("branch"), String::from("beta"));
+ badge_attributes_circle_ci.insert(String::from("repository"), String::from("rust-lang/rust"));
+
let badges = BadgeRef {
appveyor: appveyor,
appveyor_attributes: badge_attributes_appveyor,
@@ -112,6 +122,8 @@ fn set_up() -> (Arc, Crate, BadgeRef) {
codecov_attributes: badge_attributes_codecov,
coveralls: coveralls,
coveralls_attributes: badge_attributes_coveralls,
+ circle_ci: circle_ci,
+ circle_ci_attributes: badge_attributes_circle_ci,
};
(app, krate, badges)
}
@@ -223,6 +235,18 @@ fn update_add_coveralls() {
assert_eq!(krate.badges(&conn).unwrap(), vec![test_badges.coveralls]);
}
+#[test]
+fn update_add_circle_ci() {
+ // Add a CircleCI badge
+ let (app, krate, test_badges) = set_up();
+ let conn = app.diesel_database.get().unwrap();
+
+ let mut badges = HashMap::new();
+ badges.insert(String::from("circle-ci"), test_badges.circle_ci_attributes);
+ Badge::update_crate(&conn, &krate, Some(&badges)).unwrap();
+ assert_eq!(krate.badges(&conn).unwrap(), vec![test_badges.circle_ci]);
+}
+
#[test]
fn replace_badge() {
// Replacing one badge with another
@@ -438,6 +462,24 @@ fn coveralls_required_keys() {
assert_eq!(krate.badges(&conn).unwrap(), vec![]);
}
+#[test]
+fn circle_ci_required_keys() {
+ // Add a CircleCI badge missing a required field
+ let (app, krate, mut test_badges) = set_up();
+ let conn = app.diesel_database.get().unwrap();
+
+ let mut badges = HashMap::new();
+
+ // Repository is a required key
+ test_badges.circle_ci_attributes.remove("repository");
+ badges.insert(String::from("circle-ci"), test_badges.circle_ci_attributes);
+
+ let invalid_badges = Badge::update_crate(&conn, &krate, Some(&badges)).unwrap();
+ assert_eq!(invalid_badges.len(), 1);
+ assert!(invalid_badges.contains(&"circle-ci"));
+ assert_eq!(krate.badges(&conn).unwrap(), vec![]);
+}
+
#[test]
fn unknown_badge() {
// Add an unknown badge