pinball_wizard 0.4.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +15 -2
- data/bower.json +1 -1
- data/dist/css_tagger.js +43 -24
- data/dist/css_tagger.min.js +1 -3
- data/dist/pinball_wizard.js +6 -8
- data/lib/pinball_wizard/version.rb +1 -1
- data/package.json +1 -1
- data/src/css_tagger.coffee +27 -12
- data/src/pinball_wizard.coffee +6 -6
- data/test/spec/css_tagger_spec.coffee +26 -5
- data/test/spec/pinball_wizard_spec.coffee +40 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f19047c410651760d4ba3fd40d003fc556b0f11b
|
4
|
+
data.tar.gz: 8967150c6eb2a68f737e2074760bae4df60afa8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cd56ac8890deaf4e58b14b78ca7f61e539aac0720d40154d387e1060f661a553b86cc20c728a113d917f2fc786fa6400ce4da4c90850ccfe53595b8049570e6
|
7
|
+
data.tar.gz: 35548375bf420d5ffd22abf171d535b40aeef3f6344efd9a686c7d6ba0173d4a6e21fc5316d839150445598ed5de95a1db97804a3b26abd07f70f059dec5e643
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -67,9 +67,11 @@ If the feature is not active immediately, it's recommended to hide the HTML with
|
|
67
67
|
|
68
68
|
## CSS
|
69
69
|
|
70
|
-
PinballWizard automatically adds and removes
|
70
|
+
PinballWizard automatically adds and removes CSS classes named `.use-{feature-name}` and `without-{feature-name}` to the `<html>` tag.
|
71
71
|
|
72
|
-
|
72
|
+
This supports keeping the global and feature-flipped CSS styles separated.
|
73
|
+
|
74
|
+
It is recommended to organize your CSS like so:
|
73
75
|
|
74
76
|
```scss
|
75
77
|
// app/assets/stylesheets/features/_example.scss
|
@@ -81,6 +83,17 @@ It is also recommended to organize your CSS similar to Ruby:
|
|
81
83
|
|
82
84
|
Then include it on the main file with `@import 'features/example'`
|
83
85
|
|
86
|
+
In your main SCSS file, wrap all CSS rules for the inactive state in the `without-{feature-name}` class, like so:
|
87
|
+
|
88
|
+
```scss
|
89
|
+
.without-example {
|
90
|
+
// CSS when the 'example' feature is inactive;
|
91
|
+
// i.e. current production code.
|
92
|
+
}
|
93
|
+
```
|
94
|
+
|
95
|
+
When your feature is published (made part of the permanent codebase), you can simply delete the entire `.without-example` section and remove the `.use-example` class wrapper.
|
96
|
+
|
84
97
|
|
85
98
|
## JavaScript
|
86
99
|
|
data/bower.json
CHANGED
data/dist/css_tagger.js
CHANGED
@@ -1,13 +1,46 @@
|
|
1
1
|
(function() {
|
2
2
|
define(function() {
|
3
3
|
return function(ele, pinballQueue, searchQuery) {
|
4
|
-
var add, classNames, entry, feature, featureNames, i, j, k, len, len1, len2, matches, ref, ref1, state, storage;
|
4
|
+
var add, addWithout, classNames, entry, feature, featureNames, i, isAdded, j, k, kebabify, len, len1, len2, matches, ref, ref1, state, storage;
|
5
5
|
classNames = [];
|
6
6
|
add = function(name) {
|
7
|
-
|
7
|
+
var classToAdd;
|
8
|
+
classToAdd = 'use-' + kebabify(name);
|
9
|
+
if (!isAdded(name)) {
|
10
|
+
return classNames.push(classToAdd);
|
11
|
+
}
|
12
|
+
};
|
13
|
+
isAdded = function(name) {
|
14
|
+
var classToCheck;
|
15
|
+
classToCheck = 'use-' + kebabify(name);
|
16
|
+
return classNames.indexOf(classToCheck) !== -1;
|
17
|
+
};
|
18
|
+
addWithout = function(name) {
|
19
|
+
if (!isAdded(name)) {
|
20
|
+
return classNames.push('without-' + kebabify(name));
|
21
|
+
}
|
22
|
+
};
|
23
|
+
kebabify = function(name) {
|
24
|
+
return name.split('_').join('-');
|
25
|
+
};
|
26
|
+
matches = searchQuery.match(/pinball=([a-z-_,]+)/i);
|
27
|
+
if (matches && matches.length > 1) {
|
28
|
+
featureNames = (matches[1] + '').split(',');
|
29
|
+
for (i = 0, len = featureNames.length; i < len; i++) {
|
30
|
+
feature = featureNames[i];
|
31
|
+
add(feature);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
storage = window.localStorage || {
|
35
|
+
setItem: function() {}
|
8
36
|
};
|
9
|
-
|
10
|
-
|
37
|
+
ref = JSON.parse(storage.getItem('pinball_wizard')) || [];
|
38
|
+
for (j = 0, len1 = ref.length; j < len1; j++) {
|
39
|
+
feature = ref[j];
|
40
|
+
add(feature);
|
41
|
+
}
|
42
|
+
for (k = 0, len2 = pinballQueue.length; k < len2; k++) {
|
43
|
+
entry = pinballQueue[k];
|
11
44
|
if (!entry.length) {
|
12
45
|
continue;
|
13
46
|
}
|
@@ -16,33 +49,19 @@
|
|
16
49
|
add(entry[1]);
|
17
50
|
break;
|
18
51
|
case 'add':
|
19
|
-
|
20
|
-
for (feature in
|
21
|
-
state =
|
52
|
+
ref1 = entry[1];
|
53
|
+
for (feature in ref1) {
|
54
|
+
state = ref1[feature];
|
22
55
|
if (state === 'active') {
|
23
56
|
add(feature);
|
57
|
+
} else {
|
58
|
+
addWithout(feature);
|
24
59
|
}
|
25
60
|
}
|
26
61
|
}
|
27
62
|
}
|
28
|
-
matches = searchQuery.match(/pinball=([a-z-_,]+)/i);
|
29
|
-
if (matches && matches.length > 1) {
|
30
|
-
featureNames = (matches[1] + '').split(',');
|
31
|
-
for (j = 0, len1 = featureNames.length; j < len1; j++) {
|
32
|
-
feature = featureNames[j];
|
33
|
-
add(feature);
|
34
|
-
}
|
35
|
-
}
|
36
|
-
storage = window.localStorage || {
|
37
|
-
setItem: function() {}
|
38
|
-
};
|
39
|
-
ref1 = JSON.parse(storage.getItem('pinball_wizard')) || [];
|
40
|
-
for (k = 0, len2 = ref1.length; k < len2; k++) {
|
41
|
-
feature = ref1[k];
|
42
|
-
add(feature);
|
43
|
-
}
|
44
63
|
if (ele) {
|
45
|
-
ele.className += ' ' + classNames.join(' ');
|
64
|
+
ele.className += ' ' + classNames.sort().join(' ');
|
46
65
|
}
|
47
66
|
};
|
48
67
|
});
|
data/dist/css_tagger.min.js
CHANGED
@@ -1,3 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
(function(h,c,f){var g,k,e,b,d,l,m;k=[];g=function(b){k.push("use-"+b.split("_").join("-"))};d=0;for(l=c.length;d<l;d++)if(e=c[d],e.length)switch(e[0]){case "activate":g(e[1]);break;case "add":for(b in e=e[1],e)m=e[b],"active"===m&&g(b)}if((b=f.match(/pinball=([a-z-_,]+)/i))&&1<b.length)for(c=(b[1]+"").split(","),f=0,d=c.length;f<d;f++)b=c[f],g(b);d=JSON.parse((window.localStorage||{setItem:function(){}}).getItem("pinball_wizard"))||[];c=0;for(f=d.length;c<f;c++)b=d[c],g(b);h&&(h.className+=" "+k.join(" "))})(document.documentElement,window.pinball,window.location.search);
|
1
|
+
(function(h,l,a){var e,m,f,b,c,d,k,g,n;f=[];e=function(a){var b;b="use-"+g(a);k(a)||f.push(b)};k=function(a){return-1!==f.indexOf("use-"+g(a))};m=function(a){k(a)||f.push("without-"+g(a))};g=function(a){return a.split("_").join("-")};if((a=a.match(/pinball=([a-z-_,]+)/i))&&1<a.length)for(a=(a[1]+"").split(","),d=0,b=a.length;d<b;d++)c=a[d],e(c);b=JSON.parse((window.localStorage||{setItem:function(){}}).getItem("pinball_wizard"))||[];a=0;for(d=b.length;a<d;a++)c=b[a],e(c);a=0;for(d=l.length;a<d;a++)if(b=l[a],b.length)switch(b[0]){case "activate":e(b[1]);break;case "add":for(c in b=b[1],b)n=b[c],"active"===n?e(c):m(c)}h&&(h.className+=""+f.sort().join(" "))})(document.documentElement,window.pinball,window.location.search);
|
data/dist/pinball_wizard.js
CHANGED
@@ -78,22 +78,18 @@
|
|
78
78
|
}
|
79
79
|
return prefix + name.split('_').join('-');
|
80
80
|
};
|
81
|
-
addCSSClassName = function(
|
82
|
-
var cN;
|
81
|
+
addCSSClassName = function(cN, ele) {
|
83
82
|
if (ele == null) {
|
84
83
|
ele = document.documentElement;
|
85
84
|
}
|
86
|
-
cN = cssClassName(name);
|
87
85
|
if (ele.className.indexOf(cN) < 0) {
|
88
86
|
return ele.className += ' ' + cN;
|
89
87
|
}
|
90
88
|
};
|
91
|
-
removeCSSClassName = function(
|
92
|
-
var cN;
|
89
|
+
removeCSSClassName = function(cN, ele) {
|
93
90
|
if (ele == null) {
|
94
91
|
ele = document.documentElement;
|
95
92
|
}
|
96
|
-
cN = cssClassName(name);
|
97
93
|
if (ele.className.indexOf(cN) >= 0) {
|
98
94
|
return ele.className = ele.className.replace(cN, '');
|
99
95
|
}
|
@@ -134,7 +130,8 @@
|
|
134
130
|
case 'inactive':
|
135
131
|
_log("Activate %s%s.", name, source);
|
136
132
|
update(name, 'active');
|
137
|
-
addCSSClassName(name);
|
133
|
+
addCSSClassName(cssClassName(name, 'use-'));
|
134
|
+
removeCSSClassName(cssClassName(name, 'without-'));
|
138
135
|
return _notifySubscribersOnActivate(name);
|
139
136
|
case 'active':
|
140
137
|
return _log("Attempted to activate %s, but it is already active%s.", name, source);
|
@@ -155,7 +152,8 @@
|
|
155
152
|
case 'active':
|
156
153
|
_log("Dectivate %s%s.", name, source);
|
157
154
|
update(name, 'inactive');
|
158
|
-
removeCSSClassName(name);
|
155
|
+
removeCSSClassName(cssClassName(name, 'use-'));
|
156
|
+
addCSSClassName(cssClassName(name, 'without-'));
|
159
157
|
return _notifySubscribersOnDeactivate(name);
|
160
158
|
default:
|
161
159
|
return _log("Attempted to deactivate %s, but it is %s%s.", name, state, source);
|
data/package.json
CHANGED
data/src/css_tagger.coffee
CHANGED
@@ -19,19 +19,20 @@ define ->
|
|
19
19
|
classNames = []
|
20
20
|
|
21
21
|
add = (name) ->
|
22
|
-
|
22
|
+
classToAdd = 'use-' + kebabify(name)
|
23
|
+
if !isAdded(name)
|
24
|
+
classNames.push classToAdd
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
isAdded = (name) ->
|
27
|
+
classToCheck = 'use-' + kebabify(name)
|
28
|
+
classNames.indexOf(classToCheck) != -1
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
addWithout = (name) ->
|
31
|
+
if !isAdded(name)
|
32
|
+
classNames.push 'without-' + kebabify(name)
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
add feature if state == 'active'
|
34
|
+
kebabify = (name) ->
|
35
|
+
name.split('_').join('-')
|
35
36
|
|
36
37
|
# Activated by the URL
|
37
38
|
matches = searchQuery.match(/pinball=([a-z-_,]+)/i)
|
@@ -41,12 +42,26 @@ define ->
|
|
41
42
|
for feature in featureNames
|
42
43
|
add feature
|
43
44
|
|
44
|
-
|
45
45
|
# Activated permanently
|
46
46
|
storage = window.localStorage or { setItem: -> }
|
47
47
|
for feature in (JSON.parse(storage.getItem('pinball_wizard')) or [])
|
48
48
|
add feature
|
49
49
|
|
50
|
-
|
50
|
+
# Activated by the queue
|
51
|
+
for entry in pinballQueue
|
52
|
+
continue unless entry.length
|
53
|
+
|
54
|
+
switch entry[0]
|
55
|
+
when 'activate'
|
56
|
+
add entry[1]
|
57
|
+
|
58
|
+
when 'add'
|
59
|
+
for feature, state of entry[1]
|
60
|
+
if state == 'active'
|
61
|
+
add feature
|
62
|
+
else
|
63
|
+
addWithout feature
|
64
|
+
|
65
|
+
ele.className += ' ' + classNames.sort().join(' ') if ele
|
51
66
|
|
52
67
|
return
|
data/src/pinball_wizard.coffee
CHANGED
@@ -45,13 +45,11 @@ define ->
|
|
45
45
|
cssClassName = (name, prefix = 'use-') ->
|
46
46
|
prefix + name.split('_').join('-')
|
47
47
|
|
48
|
-
addCSSClassName = (
|
49
|
-
cN = cssClassName(name)
|
48
|
+
addCSSClassName = (cN, ele = document.documentElement) ->
|
50
49
|
if ele.className.indexOf(cN) < 0
|
51
50
|
ele.className += ' ' + cN
|
52
51
|
|
53
|
-
removeCSSClassName = (
|
54
|
-
cN = cssClassName(name)
|
52
|
+
removeCSSClassName = (cN, ele = document.documentElement) ->
|
55
53
|
if ele.className.indexOf(cN) >= 0
|
56
54
|
ele.className = ele.className.replace cN, ''
|
57
55
|
|
@@ -80,7 +78,8 @@ define ->
|
|
80
78
|
when 'inactive'
|
81
79
|
_log "Activate %s%s.", name, source
|
82
80
|
update(name, 'active')
|
83
|
-
addCSSClassName(name)
|
81
|
+
addCSSClassName(cssClassName(name, 'use-'))
|
82
|
+
removeCSSClassName(cssClassName(name, 'without-'))
|
84
83
|
_notifySubscribersOnActivate(name)
|
85
84
|
when 'active'
|
86
85
|
_log "Attempted to activate %s, but it is already active%s.", name, source
|
@@ -96,7 +95,8 @@ define ->
|
|
96
95
|
when 'active'
|
97
96
|
_log "Dectivate %s%s.", name, source
|
98
97
|
update(name, 'inactive')
|
99
|
-
removeCSSClassName(name)
|
98
|
+
removeCSSClassName(cssClassName(name, 'use-'))
|
99
|
+
addCSSClassName(cssClassName(name, 'without-'))
|
100
100
|
_notifySubscribersOnDeactivate(name)
|
101
101
|
else
|
102
102
|
_log "Attempted to deactivate %s, but it is %s%s.", name, state, source
|
@@ -21,7 +21,7 @@ define ['css_tagger'], (tagger) ->
|
|
21
21
|
tagger ele, [], '?pinball=feature_a,feature_b&other=param'
|
22
22
|
expect(ele.className).toEqual 'foo-bar use-feature-a use-feature-b'
|
23
23
|
|
24
|
-
it 'should add classes from
|
24
|
+
it 'should add classes from active and inactive pinball features', ->
|
25
25
|
ele = document.createElement 'div'
|
26
26
|
pinballQueue = [
|
27
27
|
[
|
@@ -33,7 +33,20 @@ define ['css_tagger'], (tagger) ->
|
|
33
33
|
]
|
34
34
|
|
35
35
|
tagger ele, pinballQueue, ''
|
36
|
-
expect(ele.className).toEqual ' use-feature-a use-feature-c'
|
36
|
+
expect(ele.className).toEqual ' use-feature-a use-feature-c without-feature-b'
|
37
|
+
|
38
|
+
it 'should add without-feature classes for inactive and disabled pinball features', ->
|
39
|
+
ele = document.createElement 'div'
|
40
|
+
pinballQueue = [
|
41
|
+
[
|
42
|
+
'add'
|
43
|
+
feature_a: 'inactive'
|
44
|
+
feature_b: 'disabled'
|
45
|
+
]
|
46
|
+
]
|
47
|
+
|
48
|
+
tagger ele, pinballQueue, ''
|
49
|
+
expect(ele.className).toEqual ' without-feature-a without-feature-b'
|
37
50
|
|
38
51
|
it 'should add classes from queue and query params', ->
|
39
52
|
ele = document.createElement 'div'
|
@@ -41,20 +54,28 @@ define ['css_tagger'], (tagger) ->
|
|
41
54
|
[
|
42
55
|
'add'
|
43
56
|
feature_a: 'active'
|
57
|
+
feature_d: 'inactive'
|
44
58
|
],
|
45
59
|
['activate', 'feature_b'],
|
46
60
|
['something-odd']
|
47
61
|
]
|
48
62
|
|
49
63
|
tagger ele, pinballQueue, '?pinball=feature_c'
|
50
|
-
expect(ele.className).toEqual ' use-feature-a use-feature-b use-feature-c'
|
64
|
+
expect(ele.className).toEqual ' use-feature-a use-feature-b use-feature-c without-feature-d'
|
51
65
|
|
52
66
|
it 'should add classes from the permanent storage', ->
|
53
67
|
ele = document.createElement 'div'
|
54
68
|
window.localStorage.setItem 'pinball_wizard', JSON.stringify(['feature_a','feature_b'])
|
69
|
+
pinballQueue = [
|
70
|
+
[
|
71
|
+
'add'
|
72
|
+
feature_c: 'active'
|
73
|
+
feature_d: 'inactive'
|
74
|
+
]
|
75
|
+
]
|
55
76
|
|
56
|
-
tagger ele,
|
57
|
-
expect(ele.className).toEqual ' use-feature-a use-feature-b'
|
77
|
+
tagger ele, pinballQueue, ''
|
78
|
+
expect(ele.className).toEqual ' use-feature-a use-feature-b use-feature-c without-feature-d'
|
58
79
|
|
59
80
|
# Cleanup
|
60
81
|
window.localStorage.setItem 'pinball_wizard', null
|
@@ -2,6 +2,7 @@ define ['pinball_wizard'], (pinball) ->
|
|
2
2
|
|
3
3
|
beforeEach ->
|
4
4
|
pinball.reset()
|
5
|
+
document.documentElement.className = ''
|
5
6
|
|
6
7
|
describe 'initialize', ->
|
7
8
|
it 'is defined', ->
|
@@ -87,6 +88,19 @@ define ['pinball_wizard'], (pinball) ->
|
|
87
88
|
|
88
89
|
expect(pinball.get('a')).toEqual('disabled')
|
89
90
|
|
91
|
+
it 'adds use-feature class to css', ->
|
92
|
+
pinball.add
|
93
|
+
feature_a: 'inactive'
|
94
|
+
pinball.activate 'feature_a'
|
95
|
+
expect(document.documentElement.className).toEqual(' use-feature-a')
|
96
|
+
|
97
|
+
it 'removes without-feature', ->
|
98
|
+
document.documentElement.className = 'foo without-feature-a bar'
|
99
|
+
pinball.add
|
100
|
+
feature_a: 'inactive'
|
101
|
+
pinball.activate 'feature_a'
|
102
|
+
expect(document.documentElement.className).toMatch(/foo\s+bar\s+use-feature-a/)
|
103
|
+
|
90
104
|
describe '#deactivate', ->
|
91
105
|
it 'makes an active feature inactive', ->
|
92
106
|
pinball.add
|
@@ -95,6 +109,12 @@ define ['pinball_wizard'], (pinball) ->
|
|
95
109
|
|
96
110
|
expect(pinball.get('a')).toEqual('inactive')
|
97
111
|
|
112
|
+
it 'adds without-feature class to css', ->
|
113
|
+
pinball.add
|
114
|
+
feature_a: 'active'
|
115
|
+
pinball.deactivate 'feature_a'
|
116
|
+
expect(document.documentElement.className).toEqual(' without-feature-a')
|
117
|
+
|
98
118
|
describe '#isActive', ->
|
99
119
|
beforeEach ->
|
100
120
|
pinball.add
|
@@ -235,16 +255,19 @@ define ['pinball_wizard'], (pinball) ->
|
|
235
255
|
it 'builds the name with the prefix', ->
|
236
256
|
expect(pinball.cssClassName('my_feature')).toEqual 'use-my-feature'
|
237
257
|
|
258
|
+
it 'builds the name with a custom prefix', ->
|
259
|
+
expect(pinball.cssClassName('my_feature', 'without-')).toEqual 'without-my-feature'
|
260
|
+
|
238
261
|
describe '#addCSSClassName', ->
|
239
262
|
it 'appends', ->
|
240
263
|
ele = document.createElement 'div'
|
241
|
-
pinball.addCSSClassName('
|
264
|
+
pinball.addCSSClassName('use-my-feature', ele)
|
242
265
|
expect(ele.className).toEqual ' use-my-feature'
|
243
266
|
|
244
267
|
it 'does not append twice', ->
|
245
268
|
ele = document.createElement 'div'
|
246
|
-
pinball.addCSSClassName('
|
247
|
-
pinball.addCSSClassName('
|
269
|
+
pinball.addCSSClassName('use-my-feature', ele)
|
270
|
+
pinball.addCSSClassName('use-my-feature', ele)
|
248
271
|
expect(ele.className).toEqual ' use-my-feature'
|
249
272
|
|
250
273
|
describe '#removeCSSClassName', ->
|
@@ -271,28 +294,28 @@ define ['pinball_wizard'], (pinball) ->
|
|
271
294
|
beforeEach ->
|
272
295
|
pinball.resetPermanent()
|
273
296
|
pinball.add
|
274
|
-
|
297
|
+
my_feature_one: 'inactive'
|
275
298
|
|
276
299
|
it 'accepts a single feature', ->
|
277
|
-
pinball.activatePermanently('
|
278
|
-
expect(pinball.permanent()).toEqual(['
|
300
|
+
pinball.activatePermanently('my_feature_one')
|
301
|
+
expect(pinball.permanent()).toEqual(['my_feature_one'])
|
279
302
|
|
280
303
|
it 'adds it to the list of permanent', ->
|
281
|
-
pinball.activatePermanently('
|
282
|
-
expect(pinball.permanent()).toEqual(['
|
304
|
+
pinball.activatePermanently('my_feature_one')
|
305
|
+
expect(pinball.permanent()).toEqual(['my_feature_one'])
|
283
306
|
|
284
307
|
it 'activates the feature', ->
|
285
|
-
pinball.activatePermanently('
|
286
|
-
expect(pinball.isActive('
|
308
|
+
pinball.activatePermanently('my_feature_one')
|
309
|
+
expect(pinball.isActive('my_feature_one')).toEqual(true)
|
287
310
|
|
288
|
-
it 'accepts
|
311
|
+
it 'accepts multiple features', ->
|
289
312
|
pinball.add
|
290
|
-
|
291
|
-
|
292
|
-
pinball.activatePermanently('
|
293
|
-
expect(pinball.permanent()).toEqual(['
|
294
|
-
expect(pinball.isActive('
|
295
|
-
expect(pinball.isActive('
|
313
|
+
my_feature_one: 'inactive'
|
314
|
+
my_feature_two: 'inactive'
|
315
|
+
pinball.activatePermanently('my_feature_one', 'my_feature_two')
|
316
|
+
expect(pinball.permanent()).toEqual(['my_feature_one','my_feature_two'])
|
317
|
+
expect(pinball.isActive('my_feature_one')).toEqual(true)
|
318
|
+
expect(pinball.isActive('my_feature_two')).toEqual(true)
|
296
319
|
|
297
320
|
|
298
321
|
describe '#permanent', ->
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pinball_wizard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Caleb Wright
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-10-
|
14
|
+
date: 2015-10-22 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description: Build flippable features.
|
17
17
|
email:
|