Merge lp:~stephen-stewart/snapweb/post-css-bem-lint into lp:~snappy-dev/snapweb/trunk

Proposed by Stephen Stewart
Status: Merged
Approved by: John Lenton
Approved revision: 144
Merged at revision: 141
Proposed branch: lp:~stephen-stewart/snapweb/post-css-bem-lint
Merge into: lp:~snappy-dev/snapweb/trunk
Diff against target: 460 lines (+74/-49)
15 files modified
gulpfile.js (+14/-3)
package.json (+3/-1)
www/src/css/alert.css (+2/-0)
www/src/css/banner.css (+4/-3)
www/src/css/installer.css (+7/-5)
www/src/css/layout.css (+2/-0)
www/src/css/snap.css (+3/-1)
www/src/css/snaplist.css (+20/-18)
www/src/js/models/snap.js (+5/-4)
www/src/js/templates/_installer.hbs (+2/-2)
www/src/js/templates/layout-banner.hbs (+4/-4)
www/src/js/views/layout-banner.js (+1/-1)
www/src/js/views/snap-menu.js (+1/-1)
www/src/js/views/snaplist.js (+2/-2)
www/tests/snapLayoutViewSpec.js (+4/-4)
To merge this branch: bzr merge lp:~stephen-stewart/snapweb/post-css-bem-lint
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+258696@code.launchpad.net

Commit message

postcss bem linter

To post a comment you must log in.
144. By Stephen Stewart

update class names in tests

Revision history for this message
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'gulpfile.js'
--- gulpfile.js 2015-05-07 10:34:34 +0000
+++ gulpfile.js 2015-05-12 11:34:29 +0000
@@ -1,5 +1,7 @@
1var aliasify = require('aliasify');1var aliasify = require('aliasify');
2var autoprefixer = require('gulp-autoprefixer');2var postcss = require('gulp-postcss');
3var autoprefixer = require('autoprefixer-core');
4var bemlinter = require('postcss-bem-linter');
3var browserify = require('browserify');5var browserify = require('browserify');
4var buffer = require('vinyl-buffer');6var buffer = require('vinyl-buffer');
5var concat = require('gulp-concat');7var concat = require('gulp-concat');
@@ -71,10 +73,19 @@
71// Styles73// Styles
7274
73gulp.task('styles', ['styles:clean'], function() {75gulp.task('styles', ['styles:clean'], function() {
74 return gulp.src(['node_modules/normalize.css/normalize.css', 'www/src/css/**/*.css'])76 var processors = [
77 autoprefixer({browsers: ['last 1 version']}),
78 bemlinter('bem')
79 ];
80 return gulp.src([
81 'node_modules/normalize.css/normalize.css',
82 'www/src/css/**/*.css'
83 ])
84 .pipe(sourcemaps.init())
85 .pipe(postcss(processors))
75 .pipe(csso())86 .pipe(csso())
76 .pipe(autoprefixer())
77 .pipe(concat('webdm.css'))87 .pipe(concat('webdm.css'))
88 .pipe(sourcemaps.write('./'))
78 .pipe(gulp.dest('www/public/css'));89 .pipe(gulp.dest('www/public/css'));
79});90});
8091
8192
=== modified file 'package.json'
--- package.json 2015-05-07 09:10:27 +0000
+++ package.json 2015-05-12 11:34:29 +0000
@@ -7,18 +7,19 @@
7 },7 },
8 "dependencies": {8 "dependencies": {
9 "aliasify": "~1.7.2",9 "aliasify": "~1.7.2",
10 "autoprefixer-core": "^5.1.11",
10 "backbone": "~1.1.2",11 "backbone": "~1.1.2",
11 "backbone.marionette": "~2.4.1",12 "backbone.marionette": "~2.4.1",
12 "backbone.radio": "^0.9.0",13 "backbone.radio": "^0.9.0",
13 "browserify": "~9.0.3",14 "browserify": "~9.0.3",
14 "del": "~1.1.1",15 "del": "~1.1.1",
15 "gulp": "~3.8.11",16 "gulp": "~3.8.11",
16 "gulp-autoprefixer": "~2.1.0",
17 "gulp-concat": "~2.5.2",17 "gulp-concat": "~2.5.2",
18 "gulp-csso": "~1.0.0",18 "gulp-csso": "~1.0.0",
19 "gulp-imagemin": "~2.2.1",19 "gulp-imagemin": "~2.2.1",
20 "gulp-jscs": "~1.4.0",20 "gulp-jscs": "~1.4.0",
21 "gulp-jshint": "~1.9.4",21 "gulp-jshint": "~1.9.4",
22 "gulp-postcss": "^5.1.6",
22 "gulp-sourcemaps": "~1.5.0",23 "gulp-sourcemaps": "~1.5.0",
23 "gulp-uglify": "~1.1.0",24 "gulp-uglify": "~1.1.0",
24 "gulp-util": "~3.0.4",25 "gulp-util": "~3.0.4",
@@ -35,6 +36,7 @@
35 "karma-phantomjs-launcher": "~0.1.4",36 "karma-phantomjs-launcher": "~0.1.4",
36 "lodash": "~3.3.1",37 "lodash": "~3.3.1",
37 "normalize.css": "^3.0.3",38 "normalize.css": "^3.0.3",
39 "postcss-bem-linter": "git://github.com/necolas/postcss-bem-linter",
38 "vinyl-buffer": "~1.0.0",40 "vinyl-buffer": "~1.0.0",
39 "vinyl-source-stream": "~1.1.0",41 "vinyl-source-stream": "~1.1.0",
40 "watchify": "~3.1.2"42 "watchify": "~3.1.2"
4143
=== modified file 'www/src/css/alert.css'
--- www/src/css/alert.css 2015-05-07 15:38:47 +0000
+++ www/src/css/alert.css 2015-05-12 11:34:29 +0000
@@ -1,3 +1,5 @@
1/** @define b-alert; weak */
2
1.b-alert {3.b-alert {
2 position: relative;4 position: relative;
3 width: 600px;5 width: 600px;
46
=== modified file 'www/src/css/banner.css'
--- www/src/css/banner.css 2015-05-04 18:24:04 +0000
+++ www/src/css/banner.css 2015-05-12 11:34:29 +0000
@@ -1,3 +1,5 @@
1/** @define b-banner; weak */
2
1.b-banner {3.b-banner {
2 display:flex;4 display:flex;
3 align-items:center;5 align-items:center;
@@ -73,11 +75,11 @@
73 border-right:1px solid #333;75 border-right:1px solid #333;
74}76}
7577
76.b-banner__nav-item--active {78.b-banner__nav-item_active {
77 position:relative;79 position:relative;
78}80}
7981
80.b-banner__nav-item--active::before {82.b-banner__nav-item_active::before {
81 position:absolute;83 position:absolute;
82 content:'';84 content:'';
83 background:#dd4814;85 background:#dd4814;
@@ -117,4 +119,3 @@
117.b-banner__secondary-nav .b-banner__nav-item:hover {119.b-banner__secondary-nav .b-banner__nav-item:hover {
118 background-color:#dd4814;120 background-color:#dd4814;
119}121}
120
121122
=== modified file 'www/src/css/installer.css'
--- www/src/css/installer.css 2015-05-08 13:11:16 +0000
+++ www/src/css/installer.css 2015-05-12 11:34:29 +0000
@@ -1,10 +1,12 @@
1/** @define b-installer; weak */
2
1.b-installer {3.b-installer {
2 position:relative;4 position:relative;
3 width:260px;5 width:260px;
4 font-size:15px;6 font-size:15px;
5}7}
68
7.b-installer.b-installer--small {9.b-installer_small {
8 font-size:13px;10 font-size:13px;
9 width:160px;11 width:160px;
10}12}
@@ -26,13 +28,13 @@
26 white-space: nowrap;28 white-space: nowrap;
27}29}
2830
29.b-installer--uninstall .b-installer__button {31.b-installer_do_uninstall .b-installer__button {
30 background-color:#ccc;32 background-color:#ccc;
31 color:#fff;33 color:#fff;
32 font-weight:300;34 font-weight:300;
33}35}
3436
35.b-installer--disabled .b-installer__button {37.b-installer_disabled .b-installer__button {
36 font-weight: inherit;38 font-weight: inherit;
37 background-color: inherit;39 background-color: inherit;
38 color:#333;40 color:#333;
@@ -40,7 +42,7 @@
40 text-transform:none;42 text-transform:none;
41}43}
4244
43.b-installer--thinking .b-installer__button {45.b-installer_thinking .b-installer__button {
44 background-color:transparent;46 background-color:transparent;
45 cursor:progress;47 cursor:progress;
46 color:#dd4814;48 color:#dd4814;
@@ -76,6 +78,6 @@
76 transition: right 0.1s;78 transition: right 0.1s;
77}79}
7880
79.b-installer--thinking.b-installer--install .b-installer__progress {81.b-installer_thinking .b-installer__progress {
80 display:block;82 display:block;
81}83}
8284
=== modified file 'www/src/css/layout.css'
--- www/src/css/layout.css 2015-05-07 15:38:47 +0000
+++ www/src/css/layout.css 2015-05-12 11:34:29 +0000
@@ -1,3 +1,5 @@
1/** @define b-layout; weak */
2
1.b-layout {3.b-layout {
2 display: flex;4 display: flex;
3 min-height: 100vh;5 min-height: 100vh;
46
=== modified file 'www/src/css/snap.css'
--- www/src/css/snap.css 2015-05-05 15:16:24 +0000
+++ www/src/css/snap.css 2015-05-12 11:34:29 +0000
@@ -1,3 +1,5 @@
1/** @define b-snap; weak */
2
1.b-snap {3.b-snap {
2}4}
35
@@ -53,7 +55,7 @@
53 padding:15px 0;55 padding:15px 0;
54}56}
5557
56.b-snap__nav-item--active::before {58.b-snap__nav-item_active::before {
57 position:absolute;59 position:absolute;
58 content:'';60 content:'';
59 background:#dd4814;61 background:#dd4814;
6062
=== modified file 'www/src/css/snaplist.css'
--- www/src/css/snaplist.css 2015-05-08 13:11:16 +0000
+++ www/src/css/snaplist.css 2015-05-12 11:34:29 +0000
@@ -1,3 +1,5 @@
1/** @define b-snaplist; weak */
2
1.b-snaplist {3.b-snaplist {
2}4}
35
@@ -7,38 +9,38 @@
79
8/** grid style **/10/** grid style **/
911
10.b-snaplist--grid {12.b-snaplist_grid {
11 display:flex;13 display:flex;
12 flex-wrap: wrap;14 flex-wrap: wrap;
13}15}
1416
15.b-snaplist--grid .b-snaplist__item {17.b-snaplist_grid .b-snaplist__item {
16 flex: 0 1 20%;18 flex: 0 1 20%;
17 padding:10px;19 padding:10px;
18}20}
1921
20.b-snaplist--grid .b-snaplist__icon {22.b-snaplist_grid .b-snaplist__icon {
21}23}
2224
23.b-snaplist--grid .b-snaplist__icon img {25.b-snaplist_grid .b-snaplist__icon img {
24 border-radius:15%;26 border-radius:15%;
25 width:100%;27 width:100%;
26}28}
2729
28.b-snaplist--grid .b-snaplist__name {30.b-snaplist_grid .b-snaplist__name {
29 text-align: center;31 text-align: center;
30 white-space: nowrap;32 white-space: nowrap;
31 overflow: hidden;33 overflow: hidden;
32 text-overflow: ellipsis;34 text-overflow: ellipsis;
33}35}
3436
35.b-snaplist--grid .b-snaplist__name ~ * {37.b-snaplist_grid .b-snaplist__name ~ * {
36 display:none;38 display:none;
37}39}
3840
39/** row style **/41/** row style **/
4042
41.b-snaplist--row .b-snaplist__item {43.b-snaplist_row .b-snaplist__item {
42 width:100%;44 width:100%;
43 display:flex;45 display:flex;
44 align-items:center;46 align-items:center;
@@ -48,24 +50,24 @@
48 background-color:#fff;50 background-color:#fff;
49}51}
5052
51.b-snaplist--row .b-snaplist__item:last-child {53.b-snaplist_row .b-snaplist__item:last-child {
52 margin-bottom:0;54 margin-bottom:0;
53}55}
5456
55.b-snaplist--row .b-snaplist__icon {57.b-snaplist_row .b-snaplist__icon {
56 flex:0 0 40px;58 flex:0 0 40px;
57}59}
5860
59.b-snaplist--row .b-snaplist__icon img {61.b-snaplist_row .b-snaplist__icon img {
60 display:block;62 display:block;
61 width: 40px;63 width: 40px;
62 height: 40px;64 height: 40px;
63}65}
6466
65.b-snaplist--row .b-snaplist__name,67.b-snaplist_row .b-snaplist__name,
66.b-snaplist--row .b-snaplist__version,68.b-snaplist_row .b-snaplist__version,
67.b-snaplist--row .b-snaplist__type,69.b-snaplist_row .b-snaplist__type,
68.b-snaplist--row .b-snaplist__origin {70.b-snaplist_row .b-snaplist__origin {
69 flex:1 1;71 flex:1 1;
70 margin:0 1em;72 margin:0 1em;
71 white-space: nowrap;73 white-space: nowrap;
@@ -74,18 +76,18 @@
74 text-overflow: ellipsis;76 text-overflow: ellipsis;
75}77}
7678
77.b-snaplist--row .b-snaplist__version {79.b-snaplist_row .b-snaplist__version {
78 min-width:100px;80 min-width:100px;
79}81}
8082
81.b-snaplist--row .b-snaplist__type {83.b-snaplist_row .b-snaplist__type {
82 text-align:center;84 text-align:center;
83}85}
8486
85.b-snaplist--row .b-snaplist__actions {87.b-snaplist_row .b-snaplist__actions {
86}88}
8789
88.b-snaplist--row .b-installer__message {90.b-snaplist_row .b-installer__message {
89 /** XXX hmm **/91 /** XXX hmm **/
90 display:none;92 display:none;
91}93}
9294
=== modified file 'www/src/js/models/snap.js'
--- www/src/js/models/snap.js 2015-05-08 14:53:07 +0000
+++ www/src/js/models/snap.js 2015-05-12 11:34:29 +0000
@@ -67,24 +67,25 @@
67 this.setInstallHTMLClass(model);67 this.setInstallHTMLClass(model);
68 },68 },
6969
70 // XXX move to install behaviour
70 setInstallHTMLClass: function(model) {71 setInstallHTMLClass: function(model) {
71 var state = model.get('status');72 var state = model.get('status');
72 var installHTMLClass = '';73 var installHTMLClass = '';
7374
74 if (state === CONF.INSTALL_STATE.UNINSTALLED) {75 if (state === CONF.INSTALL_STATE.UNINSTALLED) {
75 installHTMLClass = 'b-installer--install';76 installHTMLClass = 'b-installer_do_install';
76 }77 }
7778
78 if (state === CONF.INSTALL_STATE.INSTALLED) {79 if (state === CONF.INSTALL_STATE.INSTALLED) {
79 installHTMLClass = 'b-installer--uninstall';80 installHTMLClass = 'b-installer_do_uninstall';
80 }81 }
8182
82 if (state === CONF.INSTALL_STATE.INSTALLING) {83 if (state === CONF.INSTALL_STATE.INSTALLING) {
83 installHTMLClass = 'b-installer--install b-installer--thinking';84 installHTMLClass = 'b-installer_do_install b-installer_thinking';
84 }85 }
8586
86 if (state === CONF.INSTALL_STATE.UNINSTALLING) {87 if (state === CONF.INSTALL_STATE.UNINSTALLING) {
87 installHTMLClass = 'b-installer--uninstall b-installer--thinking';88 installHTMLClass = 'b-installer_do_uninstall b-installer_thinking';
88 }89 }
8990
90 return model.set('installHTMLClass', installHTMLClass);91 return model.set('installHTMLClass', installHTMLClass);
9192
=== modified file 'www/src/js/templates/_installer.hbs'
--- www/src/js/templates/_installer.hbs 2015-05-08 13:11:16 +0000
+++ www/src/js/templates/_installer.hbs 2015-05-12 11:34:29 +0000
@@ -1,5 +1,5 @@
1{{#if isInstallable}}1{{#if isInstallable}}
2<div class="b-installer b-installer--small {{ installHTMLClass }}">2<div class="b-installer b-installer_small {{ installHTMLClass }}">
3{{#if installActionString}}3{{#if installActionString}}
4<div class="b-installer__button">{{ installActionString }}</div>4<div class="b-installer__button">{{ installActionString }}</div>
5<div class="b-installer__progress" title="download progress">5<div class="b-installer__progress" title="download progress">
@@ -9,7 +9,7 @@
9<div class="b-installer__message"></div>9<div class="b-installer__message"></div>
10</div>10</div>
11{{else}}11{{else}}
12<div class="b-installer b-installer--small b-installer--disabled {{ installHTMLClass }}">12<div class="b-installer b-installer_small b-installer_disabled {{ installHTMLClass }}">
13<div class="b-installer__button">13<div class="b-installer__button">
14{{#if isInstalled}}14{{#if isInstalled}}
15Installed15Installed
1616
=== modified file 'www/src/js/templates/layout-banner.hbs'
--- www/src/js/templates/layout-banner.hbs 2015-05-04 18:24:04 +0000
+++ www/src/js/templates/layout-banner.hbs 2015-05-12 11:34:29 +0000
@@ -1,5 +1,5 @@
1<div class="b-banner__brand">1<div class="b-banner__brand">
2 <div class="b-banner__nav-item{{#if isHomeActive }} b-banner__nav-item--active{{/if}}">2 <div class="b-banner__nav-item{{#if isHomeActive }} b-banner__nav-item_active{{/if}}">
3 <a href="/">3 <a href="/">
4 <img src="/public/images/cof.svg" height="30" width="30">4 <img src="/public/images/cof.svg" height="30" width="30">
5 <span>{{ name }} {{ subname }}</span>5 <span>{{ name }} {{ subname }}</span>
@@ -7,7 +7,7 @@
7 </div>7 </div>
8</div>8</div>
9<div class="b-banner__primary-nav">9<div class="b-banner__primary-nav">
10 <div class="b-banner__nav-item{{#if isStoreActive }} b-banner__nav-item--active{{/if}}">10 <div class="b-banner__nav-item{{#if isStoreActive }} b-banner__nav-item_active{{/if}}">
11 <a href="/store">11 <a href="/store">
12 Snappy store12 Snappy store
13 </a>13 </a>
@@ -17,13 +17,13 @@
17<div class="b-banner__search">17<div class="b-banner__search">
18 <form class="b-banner__form" action="/search" method="GET">18 <form class="b-banner__form" action="/search" method="GET">
19 <input class="b-banner__input" type="search" name="q" placeholder="Search for snaps" value="{{ query }}">19 <input class="b-banner__input" type="search" name="q" placeholder="Search for snaps" value="{{ query }}">
20 <div class="b-banner__nav-item{{#if isSearchActive }} b-banner__nav-item--active{{/if}}">20 <div class="b-banner__nav-item{{#if isSearchActive }} b-banner__nav-item_active{{/if}}">
21 <button type="submit" class="b-banner__submit"></button>21 <button type="submit" class="b-banner__submit"></button>
22 </div>22 </div>
23 </form>23 </form>
24</div>24</div>
25<div class="b-banner__secondary-nav">25<div class="b-banner__secondary-nav">
26 <div class="b-banner__nav-item{{#if isSystemActive }} b-banner__nav-item--active{{/if}}">26 <div class="b-banner__nav-item{{#if isSystemActive }} b-banner__nav-item_active{{/if}}">
27 <a href="/system-settings">27 <a href="/system-settings">
28 <img src="/public/images/settings.svg" height="30" width="30">28 <img src="/public/images/settings.svg" height="30" width="30">
29 </a>29 </a>
3030
=== modified file 'www/src/js/views/layout-banner.js'
--- www/src/js/views/layout-banner.js 2015-04-30 14:33:49 +0000
+++ www/src/js/views/layout-banner.js 2015-05-12 11:34:29 +0000
@@ -16,7 +16,7 @@
16 'click @ui.submit': 'submit',16 'click @ui.submit': 'submit',
17 'click': function(e) {17 'click': function(e) {
18 var CLASS = 'b-banner__nav-item';18 var CLASS = 'b-banner__nav-item';
19 var ACTIVE_CLASS = 'b-banner__nav-item--active';19 var ACTIVE_CLASS = 'b-banner__nav-item_active';
20 var navItem = e.target.closest('.' + CLASS);20 var navItem = e.target.closest('.' + CLASS);
21 if (navItem) {21 if (navItem) {
22 this.$('.' + ACTIVE_CLASS).toggleClass(ACTIVE_CLASS, false);22 this.$('.' + ACTIVE_CLASS).toggleClass(ACTIVE_CLASS, false);
2323
=== modified file 'www/src/js/views/snap-menu.js'
--- www/src/js/views/snap-menu.js 2015-05-05 14:40:14 +0000
+++ www/src/js/views/snap-menu.js 2015-05-12 11:34:29 +0000
@@ -29,7 +29,7 @@
29 setActiveNav: function(link) {29 setActiveNav: function(link) {
30 link = link || 'details';30 link = link || 'details';
31 var toActiveSelector = '[href=' + link + ']';31 var toActiveSelector = '[href=' + link + ']';
32 var activeClass = 'b-snap__nav-item--active';32 var activeClass = 'b-snap__nav-item_active';
33 var activeSelector = '.' + activeClass;33 var activeSelector = '.' + activeClass;
34 this.$(activeSelector).removeClass(activeClass);34 this.$(activeSelector).removeClass(activeClass);
35 this.$(toActiveSelector).addClass(activeClass);35 this.$(toActiveSelector).addClass(activeClass);
3636
=== modified file 'www/src/js/views/snaplist.js'
--- www/src/js/views/snaplist.js 2015-04-28 21:33:43 +0000
+++ www/src/js/views/snaplist.js 2015-05-12 11:34:29 +0000
@@ -12,9 +12,9 @@
12 var style = this.options.style || 'row';12 var style = this.options.style || 'row';
1313
14 if (style === 'row') {14 if (style === 'row') {
15 return 'b-snaplist b-snaplist--row';15 return 'b-snaplist b-snaplist_row';
16 } else if (style === 'grid') {16 } else if (style === 'grid') {
17 return 'b-snaplist b-snaplist--grid';17 return 'b-snaplist b-snaplist_grid';
18 }18 }
19 },19 },
2020
2121
=== modified file 'www/tests/snapLayoutViewSpec.js'
--- www/tests/snapLayoutViewSpec.js 2015-05-05 20:29:57 +0000
+++ www/tests/snapLayoutViewSpec.js 2015-05-12 11:34:29 +0000
@@ -31,22 +31,22 @@
3131
32 it('should be thinking when installing', function() {32 it('should be thinking when installing', function() {
33 this.model.set('status', CONF.INSTALL_STATE.INSTALLING);33 this.model.set('status', CONF.INSTALL_STATE.INSTALLING);
34 expect(this.uiInstaller.hasClass('b-installer--thinking')).toBeTruthy();34 expect(this.uiInstaller.hasClass('b-installer_thinking')).toBeTruthy();
35 });35 });
3636
37 it('should be thinking when uninstalling', function() {37 it('should be thinking when uninstalling', function() {
38 this.model.set('status', CONF.INSTALL_STATE.UNINSTALLING);38 this.model.set('status', CONF.INSTALL_STATE.UNINSTALLING);
39 expect(this.uiInstaller.hasClass('b-installer--thinking')).toBeTruthy();39 expect(this.uiInstaller.hasClass('b-installer_thinking')).toBeTruthy();
40 });40 });
4141
42 it('should not be thinking when installed', function() {42 it('should not be thinking when installed', function() {
43 this.model.set('status', CONF.INSTALL_STATE.INSTALLED);43 this.model.set('status', CONF.INSTALL_STATE.INSTALLED);
44 expect(this.uiInstaller.hasClass('b-installer--thinking')).toBeFalsy();44 expect(this.uiInstaller.hasClass('b-installer_thinking')).toBeFalsy();
45 });45 });
4646
47 it('should not be thinking when uninstalled', function() {47 it('should not be thinking when uninstalled', function() {
48 this.model.set('status', CONF.INSTALL_STATE.UNINSTALLED);48 this.model.set('status', CONF.INSTALL_STATE.UNINSTALLED);
49 expect(this.uiInstaller.hasClass('b-installer--thinking')).toBeFalsy();49 expect(this.uiInstaller.hasClass('b-installer_thinking')).toBeFalsy();
50 });50 });
5151
52 it('should deactivate install button if model has unrecognised status', function() {52 it('should deactivate install button if model has unrecognised status', function() {

Subscribers

People subscribed via source and target branches