pinball_wizard 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +23 -5
- data/dist/css_tagger.js +8 -8
- data/dist/pinball_wizard.js +68 -33
- data/lib/pinball_wizard/version.rb +1 -1
- data/package.json +3 -4
- data/src/pinball_wizard.coffee +31 -0
- data/test/spec/pinball_wizard_spec.coffee +42 -0
- metadata +3 -4
- data/dist/css_tagger.min.js +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78d6696dbc0eb16536cecb49b6ca0b9afc6416e8
|
4
|
+
data.tar.gz: 5a931d205815ff4b35f562c7ac2d306ee7bdb096
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6c2b38b3675d9337810fb94a8e34b98fdb401fd939017b9b93eb4d8b4a7e0d118c1ac13213d9b9d297154569ac8586213b47558b943ba295807da8c2997ccc4
|
7
|
+
data.tar.gz: 9a5284f3b01f5427415c7090a547a74da5acfbe5f774e138a0ee85045a8a0d829d64b4167eb24509b4ab789728d00b5c8b68bc05e0778d95562aac9d24b7d8db
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# v0.4.0
|
2
|
+
* [feature] Added `#activatePermanently('feature_name')` to
|
3
|
+
activate features across URLs. Stored in `localStorage`
|
4
|
+
* [feature] Added `#resetPermanent` which clears all permanent.
|
5
|
+
* [feature] Added `#permanent` which lists out features turned on.
|
6
|
+
|
7
|
+
[Compare v0.3.0..v0.4.0](https://github.com/primedia/pinball_wizard/compare/v0.3.0...v0.4.0)
|
8
|
+
|
1
9
|
# v0.3.0
|
2
10
|
* [feature] Automatically add and remove CSS class `.use-{feature-name}` to `<html>` as features are enabled and disabled.
|
3
11
|
* [feature] Switch to karma for the test runner.
|
data/README.md
CHANGED
@@ -29,7 +29,7 @@ A feature is simply a name and default state:
|
|
29
29
|
|
30
30
|
## Ruby
|
31
31
|
|
32
|
-
Define your feature
|
32
|
+
Define your feature (typically in `config/initializers/pinball_wizard.rb`).
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
PinballWizard::DSL.build do
|
@@ -41,7 +41,7 @@ PinballWizard::DSL.build do
|
|
41
41
|
end
|
42
42
|
```
|
43
43
|
|
44
|
-
You can also pass in a proc for situtations where active/inactive is conditional. Returning false
|
44
|
+
You can also pass in a proc for situtations where active/inactive is conditional. Returning false will make the feature inactive.
|
45
45
|
|
46
46
|
```ruby
|
47
47
|
PinballWizard::DSL.build do
|
@@ -113,9 +113,9 @@ define ['pinball_wizard'], (pinball) ->
|
|
113
113
|
|
114
114
|
@after 'initialize', ->
|
115
115
|
pinball.subscribe 'example',
|
116
|
-
|
116
|
+
->
|
117
117
|
# callback when activated. e.g. show it
|
118
|
-
|
118
|
+
->
|
119
119
|
# callback when deactivated. e.g. hide it.
|
120
120
|
|
121
121
|
```
|
@@ -131,7 +131,7 @@ define ['pinball_wizard'], (pinball) ->
|
|
131
131
|
# Do something
|
132
132
|
```
|
133
133
|
|
134
|
-
## Activating
|
134
|
+
## Activating Features for Testing (once)
|
135
135
|
|
136
136
|
### With a URL Param
|
137
137
|
Add `pinball` to the URL (e.g. `?pinball=example_a,example_b`).
|
@@ -156,7 +156,25 @@ activated while debugging.
|
|
156
156
|
```javascript
|
157
157
|
pinball.activate('example','source name');
|
158
158
|
```
|
159
|
+
## Activating Features (permanently)
|
159
160
|
|
161
|
+
To turn on and keep a feature on, you can activate it permanently in the console. This is only for your browser's session.
|
162
|
+
|
163
|
+
```javascript
|
164
|
+
pinball.activatePermanently('example')
|
165
|
+
```
|
166
|
+
|
167
|
+
#### See a List of Permanent Features
|
168
|
+
|
169
|
+
```javascript
|
170
|
+
pinball.permanent()
|
171
|
+
```
|
172
|
+
|
173
|
+
#### Reset Permanent Features
|
174
|
+
|
175
|
+
```javascript
|
176
|
+
pinball.resetPermanent()
|
177
|
+
```
|
160
178
|
|
161
179
|
## JsConfig
|
162
180
|
The application keeps a list of features and passes them in the JsConfig object (e.g. `window.ApartmentGuide`). These define what's available and activated on page load. AG is hooked up to PinballWizard to automatically be aware of these. No additional code is necessary.
|
data/dist/css_tagger.js
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
(function() {
|
2
2
|
define(function() {
|
3
3
|
return function(ele, pinballQueue, searchQuery) {
|
4
|
-
var add, classNames, entry, feature, featureNames,
|
4
|
+
var add, classNames, entry, feature, featureNames, i, j, len, len1, matches, ref, state;
|
5
5
|
classNames = [];
|
6
6
|
add = function(name) {
|
7
7
|
return classNames.push('use-' + name.split('_').join('-'));
|
8
8
|
};
|
9
|
-
for (
|
10
|
-
entry = pinballQueue[
|
9
|
+
for (i = 0, len = pinballQueue.length; i < len; i++) {
|
10
|
+
entry = pinballQueue[i];
|
11
11
|
if (!entry.length) {
|
12
12
|
continue;
|
13
13
|
}
|
@@ -16,9 +16,9 @@
|
|
16
16
|
add(entry[1]);
|
17
17
|
break;
|
18
18
|
case 'add':
|
19
|
-
|
20
|
-
for (feature in
|
21
|
-
state =
|
19
|
+
ref = entry[1];
|
20
|
+
for (feature in ref) {
|
21
|
+
state = ref[feature];
|
22
22
|
if (state === 'active') {
|
23
23
|
add(feature);
|
24
24
|
}
|
@@ -28,8 +28,8 @@
|
|
28
28
|
matches = searchQuery.match(/pinball=([a-z-_,]+)/i);
|
29
29
|
if (matches && matches.length > 1) {
|
30
30
|
featureNames = (matches[1] + '').split(',');
|
31
|
-
for (
|
32
|
-
feature = featureNames[
|
31
|
+
for (j = 0, len1 = featureNames.length; j < len1; j++) {
|
32
|
+
feature = featureNames[j];
|
33
33
|
add(feature);
|
34
34
|
}
|
35
35
|
}
|
data/dist/pinball_wizard.js
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
(function() {
|
2
2
|
'use strict';
|
3
|
-
var
|
3
|
+
var slice = [].slice;
|
4
4
|
|
5
5
|
define(function() {
|
6
|
-
var activate, add, addCSSClassName, cssClassName, deactivate, debug, exports, features, get, isActive, logPrefix, push, removeCSSClassName, reset, showLog, state, subscribe, subscribers, update, urlValues
|
6
|
+
var _buildSubscriber, _log, _notifySubscriberOnActivate, _notifySubscribersOnActivate, _notifySubscribersOnDeactivate, _urlValueMatches, _urlValues, activate, activateAllPermanent, activatePermanently, add, addCSSClassName, appendPermanent, cssClassName, deactivate, debug, exports, features, get, isActive, logPrefix, permanent, push, removeCSSClassName, reset, resetPermanent, setPermanent, showLog, state, storage, subscribe, subscribers, update, urlValues;
|
7
7
|
features = {};
|
8
8
|
subscribers = {};
|
9
9
|
showLog = false;
|
10
10
|
logPrefix = '[PinballWizard]';
|
11
11
|
_log = function() {
|
12
12
|
var args, message;
|
13
|
-
message = arguments[0], args = 2 <= arguments.length ?
|
13
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
14
14
|
if (showLog && window.console && window.console.log) {
|
15
|
-
console.log.apply(console, [
|
15
|
+
console.log.apply(console, [logPrefix + " " + message].concat(slice.call(args)));
|
16
16
|
}
|
17
17
|
};
|
18
18
|
_notifySubscribersOnActivate = function(name) {
|
19
|
-
var
|
19
|
+
var i, len, ref, results, subscriber;
|
20
20
|
if (subscribers[name] == null) {
|
21
21
|
subscribers[name] = [];
|
22
22
|
}
|
23
|
-
|
24
|
-
|
25
|
-
for (
|
26
|
-
subscriber =
|
27
|
-
|
23
|
+
ref = subscribers[name];
|
24
|
+
results = [];
|
25
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
26
|
+
subscriber = ref[i];
|
27
|
+
results.push(_notifySubscriberOnActivate(subscriber, name));
|
28
28
|
}
|
29
|
-
return
|
29
|
+
return results;
|
30
30
|
};
|
31
31
|
_notifySubscriberOnActivate = function(subscriber, name) {
|
32
32
|
_log('Notify subscriber that %s is active', name);
|
33
33
|
return subscriber.onActivate();
|
34
34
|
};
|
35
35
|
_notifySubscribersOnDeactivate = function(name) {
|
36
|
-
var
|
36
|
+
var i, len, ref, results, subscriber;
|
37
37
|
if (subscribers[name] == null) {
|
38
38
|
subscribers[name] = [];
|
39
39
|
}
|
40
|
-
|
41
|
-
|
42
|
-
for (
|
43
|
-
subscriber =
|
44
|
-
|
40
|
+
ref = subscribers[name];
|
41
|
+
results = [];
|
42
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
43
|
+
subscriber = ref[i];
|
44
|
+
results.push(subscriber.onDeactivate());
|
45
45
|
}
|
46
|
-
return
|
46
|
+
return results;
|
47
47
|
};
|
48
48
|
_urlValueMatches = function(value) {
|
49
|
-
var
|
50
|
-
|
51
|
-
for (
|
52
|
-
v =
|
49
|
+
var i, len, ref, v;
|
50
|
+
ref = _urlValues();
|
51
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
52
|
+
v = ref[i];
|
53
53
|
if (value === v) {
|
54
54
|
return true;
|
55
55
|
}
|
@@ -57,14 +57,14 @@
|
|
57
57
|
return false;
|
58
58
|
};
|
59
59
|
_urlValues = function(search) {
|
60
|
-
var
|
60
|
+
var i, key, len, pair, pairs, ref, value;
|
61
61
|
if (search == null) {
|
62
62
|
search = window.location.search;
|
63
63
|
}
|
64
64
|
pairs = search.substr(1).split('&');
|
65
|
-
for (
|
66
|
-
pair = pairs[
|
67
|
-
|
65
|
+
for (i = 0, len = pairs.length; i < len; i++) {
|
66
|
+
pair = pairs[i];
|
67
|
+
ref = pair.split('='), key = ref[0], value = ref[1];
|
68
68
|
if (key === 'pinball' && (value != null)) {
|
69
69
|
return value.split(',');
|
70
70
|
}
|
@@ -99,21 +99,21 @@
|
|
99
99
|
}
|
100
100
|
};
|
101
101
|
add = function(list) {
|
102
|
-
var name,
|
103
|
-
|
102
|
+
var name, results, state;
|
103
|
+
results = [];
|
104
104
|
for (name in list) {
|
105
105
|
state = list[name];
|
106
106
|
features[name] = state;
|
107
107
|
_log("Added %s: %s.", name, state);
|
108
108
|
if (isActive(name)) {
|
109
|
-
|
109
|
+
results.push(activate(name, "automatic. added as '" + state + "'"));
|
110
110
|
} else if (_urlValueMatches(name, urlValues)) {
|
111
|
-
|
111
|
+
results.push(activate(name, 'URL'));
|
112
112
|
} else {
|
113
|
-
|
113
|
+
results.push(void 0);
|
114
114
|
}
|
115
115
|
}
|
116
|
-
return
|
116
|
+
return results;
|
117
117
|
};
|
118
118
|
get = function(name) {
|
119
119
|
return features[name];
|
@@ -187,6 +187,36 @@
|
|
187
187
|
method = params.shift();
|
188
188
|
return this[method].apply(this, params);
|
189
189
|
};
|
190
|
+
storage = window.localStorage;
|
191
|
+
setPermanent = function(value) {
|
192
|
+
return storage.setItem('pinball_wizard', JSON.stringify(value));
|
193
|
+
};
|
194
|
+
appendPermanent = function(name) {
|
195
|
+
var l;
|
196
|
+
l = permanent();
|
197
|
+
l.push(name);
|
198
|
+
return setPermanent(l);
|
199
|
+
};
|
200
|
+
permanent = function() {
|
201
|
+
return JSON.parse(storage.getItem('pinball_wizard') || "[]") || [];
|
202
|
+
};
|
203
|
+
activatePermanently = function(name) {
|
204
|
+
appendPermanent(name);
|
205
|
+
return activate(name, 'permanent');
|
206
|
+
};
|
207
|
+
resetPermanent = function() {
|
208
|
+
return setPermanent([]);
|
209
|
+
};
|
210
|
+
activateAllPermanent = function() {
|
211
|
+
var i, len, name, ref, results;
|
212
|
+
ref = permanent();
|
213
|
+
results = [];
|
214
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
215
|
+
name = ref[i];
|
216
|
+
results.push(activate(name));
|
217
|
+
}
|
218
|
+
return results;
|
219
|
+
};
|
190
220
|
state = function() {
|
191
221
|
return features;
|
192
222
|
};
|
@@ -210,7 +240,11 @@
|
|
210
240
|
cssClassName: cssClassName,
|
211
241
|
addCSSClassName: addCSSClassName,
|
212
242
|
removeCSSClassName: removeCSSClassName,
|
213
|
-
_urlValues: _urlValues
|
243
|
+
_urlValues: _urlValues,
|
244
|
+
activatePermanently: activatePermanently,
|
245
|
+
resetPermanent: resetPermanent,
|
246
|
+
permanent: permanent,
|
247
|
+
activateAllPermanent: activateAllPermanent
|
214
248
|
};
|
215
249
|
if (typeof window !== "undefined" && window !== null ? window.pinball : void 0) {
|
216
250
|
if (_urlValueMatches('debug')) {
|
@@ -221,6 +255,7 @@
|
|
221
255
|
}
|
222
256
|
window.pinball = exports;
|
223
257
|
}
|
258
|
+
activateAllPermanent();
|
224
259
|
return exports;
|
225
260
|
});
|
226
261
|
|
data/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "pinball_wizard",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.4.0",
|
4
4
|
"description": "pinball_wizard",
|
5
5
|
"homepage": "https://github.com/primedia/pinball_wizard",
|
6
6
|
"license": "MIT",
|
@@ -14,7 +14,7 @@
|
|
14
14
|
"github": "https://github.com/primedia/pinball_wizard.git",
|
15
15
|
"devDependencies": {
|
16
16
|
"del": "^1.1.0",
|
17
|
-
"gulp": "
|
17
|
+
"gulp": "~3.8.10",
|
18
18
|
"gulp-coffee": "^2.2.0",
|
19
19
|
"gulp-sourcemaps": "~1.2.0",
|
20
20
|
"gulp-util": "^3.0.1",
|
@@ -23,8 +23,7 @@
|
|
23
23
|
"karma-cli": "0.0.4",
|
24
24
|
"karma-chrome-launcher": "~0.1.7",
|
25
25
|
"requirejs": "~2.1.15",
|
26
|
-
"karma-requirejs": "~0.2.2"
|
27
|
-
"gulp": "~3.8.10"
|
26
|
+
"karma-requirejs": "~0.2.2"
|
28
27
|
},
|
29
28
|
"scripts": {
|
30
29
|
"compile": "gulp build",
|
data/src/pinball_wizard.coffee
CHANGED
@@ -120,6 +120,31 @@ define ->
|
|
120
120
|
method = params.shift()
|
121
121
|
@[method].apply(@, params)
|
122
122
|
|
123
|
+
|
124
|
+
storage = window.localStorage
|
125
|
+
|
126
|
+
setPermanent = (value) ->
|
127
|
+
storage.setItem('pinball_wizard', JSON.stringify(value))
|
128
|
+
|
129
|
+
appendPermanent = (name) ->
|
130
|
+
l = permanent()
|
131
|
+
l.push(name)
|
132
|
+
setPermanent l
|
133
|
+
|
134
|
+
permanent = ->
|
135
|
+
JSON.parse(storage.getItem('pinball_wizard') or "[]") or []
|
136
|
+
|
137
|
+
activatePermanently = (name) ->
|
138
|
+
appendPermanent(name)
|
139
|
+
activate(name, 'permanent')
|
140
|
+
|
141
|
+
resetPermanent = ->
|
142
|
+
setPermanent []
|
143
|
+
|
144
|
+
activateAllPermanent = ->
|
145
|
+
for name in permanent()
|
146
|
+
activate(name)
|
147
|
+
|
123
148
|
state = ->
|
124
149
|
features
|
125
150
|
|
@@ -145,6 +170,10 @@ define ->
|
|
145
170
|
addCSSClassName
|
146
171
|
removeCSSClassName
|
147
172
|
_urlValues
|
173
|
+
activatePermanently
|
174
|
+
resetPermanent
|
175
|
+
permanent
|
176
|
+
activateAllPermanent
|
148
177
|
}
|
149
178
|
|
150
179
|
# Initialize
|
@@ -154,4 +183,6 @@ define ->
|
|
154
183
|
exports.push window.pinball.shift()
|
155
184
|
window.pinball = exports
|
156
185
|
|
186
|
+
activateAllPermanent()
|
187
|
+
|
157
188
|
exports
|
@@ -266,3 +266,45 @@ define ['pinball_wizard'], (pinball) ->
|
|
266
266
|
it 'works with other keys/values', ->
|
267
267
|
urlParam = '?foo=bar&pinball=a,b&bar'
|
268
268
|
expect(pinball._urlValues(urlParam)).toEqual(['a','b'])
|
269
|
+
|
270
|
+
describe '#activatePermanent', ->
|
271
|
+
beforeEach ->
|
272
|
+
pinball.add
|
273
|
+
my_feature: 'inactive'
|
274
|
+
pinball.activatePermanently('my_feature')
|
275
|
+
|
276
|
+
it 'adds it to the list of permanent', ->
|
277
|
+
expect(pinball.permanent()).toEqual(['my_feature'])
|
278
|
+
|
279
|
+
it 'activates the feature', ->
|
280
|
+
expect(pinball.isActive('my_feature')).toEqual(true)
|
281
|
+
|
282
|
+
describe '#permanent', ->
|
283
|
+
beforeEach ->
|
284
|
+
pinball.resetPermanent()
|
285
|
+
pinball.add
|
286
|
+
my_feature: 'inactive'
|
287
|
+
|
288
|
+
it 'is empty by default', ->
|
289
|
+
expect(pinball.permanent()).toEqual([])
|
290
|
+
|
291
|
+
it 'builds a list of those permanent', ->
|
292
|
+
pinball.activatePermanently('my_feature')
|
293
|
+
expect(pinball.permanent()).toEqual(['my_feature'])
|
294
|
+
|
295
|
+
it 'is empty after resetting', ->
|
296
|
+
pinball.activatePermanently('my_feature')
|
297
|
+
pinball.resetPermanent()
|
298
|
+
expect(pinball.permanent()).toEqual([])
|
299
|
+
|
300
|
+
describe '#activateAllPermanent', ->
|
301
|
+
beforeEach ->
|
302
|
+
pinball.resetPermanent()
|
303
|
+
pinball.add
|
304
|
+
my_feature: 'inactive'
|
305
|
+
|
306
|
+
it 'is active', ->
|
307
|
+
pinball.activatePermanently('my_feature')
|
308
|
+
pinball.deactivate 'my_feature'
|
309
|
+
pinball.activateAllPermanent()
|
310
|
+
expect(pinball.isActive('my_feature')).toEqual(true)
|
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: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Caleb Wright
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-10-15 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Build flippable features.
|
16
16
|
email:
|
@@ -29,7 +29,6 @@ files:
|
|
29
29
|
- Rakefile
|
30
30
|
- bower.json
|
31
31
|
- dist/css_tagger.js
|
32
|
-
- dist/css_tagger.min.js
|
33
32
|
- dist/pinball_wizard.js
|
34
33
|
- gulpfile.js
|
35
34
|
- karma.conf.js
|
@@ -74,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
73
|
version: '0'
|
75
74
|
requirements: []
|
76
75
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
76
|
+
rubygems_version: 2.2.2
|
78
77
|
signing_key:
|
79
78
|
specification_version: 4
|
80
79
|
summary: Lib to build flippable features.
|
data/dist/css_tagger.min.js
DELETED
@@ -1,3 +0,0 @@
|
|
1
|
-
// Minified on http://closure-compiler.appspot.com/ using Advanced settings
|
2
|
-
|
3
|
-
(function(g,d,e){var f,h,b,a,c,l,k;h=[];f=function(a){h.push("use-"+a.split("_").join("-"))};c=0;for(l=d.length;c<l;c++)if(b=d[c],b.length)switch(b[0]){case "activate":f(b[1]);break;case "add":for(a in k=b[1],k)b=k[a],"active"===b&&f(a)}if((a=e.match(/pinball=([a-z-_,]+)/i))&&1<a.length)for(d=(a[1]+"").split(","),e=0,c=d.length;e<c;e++)a=d[e],f(a);g&&(g.className+=" "+h.join(" "))})(document.documentElement,window.pinball,window.location.search);
|