transistor 0.1.3 → 0.1.4
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/.gitignore +3 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +2 -3
- data/Rakefile +20 -107
- data/build/min/transistor-backbone.js +1 -0
- data/build/min/transistor-radio.js +1 -1
- data/build/min/transistor.js +1 -1
- data/build/src/transistor-backbone.js +100 -0
- data/build/src/transistor-radio.js +63 -46
- data/build/src/transistor.js +63 -46
- data/index.html +41 -0
- data/jake.yml +3 -0
- data/js/transistor/backbone-collection.js +100 -0
- data/js/transistor/binder.js +126 -0
- data/js/transistor/control.js +64 -0
- data/js/transistor/radio.js +69 -0
- data/js/vendor/faye-browser-min.js +2 -0
- data/js/vendor/jsonp.js +83 -0
- data/lib/assets/javascripts/.keep +0 -0
- data/lib/assets/javascripts/transistor-backbone.js +100 -0
- data/lib/assets/javascripts/transistor-radio.js +63 -46
- data/lib/assets/javascripts/transistor.js +63 -46
- data/spec/javascripts/TransistorBackboneCollectionSpec.js +112 -0
- data/spec/javascripts/support/backbone.js +1571 -0
- data/spec/javascripts/support/jasmine.yml +9 -6
- data/spec/javascripts/support/underscore.js +1227 -0
- data/transistor.gemspec +23 -0
- metadata +58 -34
data/build/src/transistor.js
CHANGED
@@ -159,11 +159,11 @@ if (window.Transistor === undefined) {
|
|
159
159
|
}
|
160
160
|
|
161
161
|
(function (transistor) {
|
162
|
-
var Binder
|
163
|
-
return function (array) {
|
164
|
-
var H, set, insert, update, remove;
|
162
|
+
var Binder, ArrayBinding;
|
165
163
|
|
166
|
-
|
164
|
+
ArrayBinding = {
|
165
|
+
bindTo: function (array) {
|
166
|
+
var H = (function () {
|
167
167
|
return {
|
168
168
|
clear: function () {
|
169
169
|
for (;array.length !== 0;) {
|
@@ -179,21 +179,66 @@ if (window.Transistor === undefined) {
|
|
179
179
|
}
|
180
180
|
|
181
181
|
throw new Error("unknown id: " + id);
|
182
|
-
}
|
182
|
+
}
|
183
|
+
};
|
184
|
+
}());
|
185
|
+
|
186
|
+
return {
|
187
|
+
set: function (collection) {
|
188
|
+
H.clear();
|
189
|
+
|
190
|
+
if (collection !== undefined) {
|
191
|
+
for (var i = 0 ; i < collection.length; i += 1) {
|
192
|
+
array[i] = collection[i];
|
193
|
+
}
|
194
|
+
}
|
195
|
+
},
|
196
|
+
insert: function (entry) {
|
197
|
+
if (entry !== undefined) {
|
198
|
+
array.push(entry);
|
199
|
+
}
|
200
|
+
},
|
201
|
+
update: function (id, entry) {
|
202
|
+
if (id === undefined) {
|
203
|
+
throw new Error("undefined id");
|
204
|
+
}
|
205
|
+
|
206
|
+
array[H.indexOfId(id)] = entry;
|
207
|
+
},
|
208
|
+
remove: function (id) {
|
209
|
+
array.splice(H.indexOfId(id), 1);
|
210
|
+
}
|
211
|
+
};
|
212
|
+
}
|
213
|
+
};
|
214
|
+
|
215
|
+
|
216
|
+
Binder = (function () {
|
217
|
+
return function (binding) {
|
218
|
+
var validate, target;
|
219
|
+
|
220
|
+
if (Object.prototype.toString.call( binding ) === '[object Array]') {
|
221
|
+
target = ArrayBinding.bindTo(binding);
|
222
|
+
} else {
|
223
|
+
target = binding;
|
224
|
+
}
|
183
225
|
|
184
|
-
|
226
|
+
|
227
|
+
validate = (function () {
|
228
|
+
return {
|
229
|
+
collection: function (args) {
|
185
230
|
if (args.collection === undefined) {
|
186
231
|
throw new Error("undefined collection");
|
187
232
|
}
|
188
233
|
},
|
189
234
|
|
190
|
-
|
235
|
+
entry: function (args) {
|
191
236
|
if (args.entry === undefined) {
|
192
237
|
throw new Error("undefined entry");
|
193
238
|
}
|
194
239
|
},
|
195
240
|
|
196
|
-
|
241
|
+
id: function (args) {
|
197
242
|
if (args.id === undefined) {
|
198
243
|
throw new Error("undefined id");
|
199
244
|
}
|
@@ -201,34 +246,6 @@ if (window.Transistor === undefined) {
|
|
201
246
|
};
|
202
247
|
}());
|
203
248
|
|
204
|
-
set = function (collection) {
|
205
|
-
H.clear();
|
206
|
-
|
207
|
-
if (collection !== undefined) {
|
208
|
-
for (var i = 0 ; i < collection.length; i += 1) {
|
209
|
-
array[i] = collection[i];
|
210
|
-
}
|
211
|
-
}
|
212
|
-
};
|
213
|
-
|
214
|
-
insert = function (entry) {
|
215
|
-
if (entry !== undefined) {
|
216
|
-
array.push(entry);
|
217
|
-
}
|
218
|
-
};
|
219
|
-
|
220
|
-
update = function (id, entry) {
|
221
|
-
if (id === undefined) {
|
222
|
-
throw new Error("undefined id");
|
223
|
-
}
|
224
|
-
|
225
|
-
array[H.indexOfId(id)] = entry;
|
226
|
-
};
|
227
|
-
|
228
|
-
remove = function (id) {
|
229
|
-
array.splice(H.indexOfId(id), 1);
|
230
|
-
};
|
231
|
-
|
232
249
|
return function (event, args) {
|
233
250
|
if (args === undefined) {
|
234
251
|
throw new Error("undefined arguments");
|
@@ -236,24 +253,24 @@ if (window.Transistor === undefined) {
|
|
236
253
|
|
237
254
|
switch (event) {
|
238
255
|
case 'init':
|
239
|
-
set(args);
|
256
|
+
target.set(args);
|
240
257
|
break;
|
241
258
|
case 'set':
|
242
|
-
|
243
|
-
set(args.collection);
|
259
|
+
validate.collection(args);
|
260
|
+
target.set(args.collection);
|
244
261
|
break;
|
245
262
|
case 'insert':
|
246
|
-
|
247
|
-
insert(args.entry);
|
263
|
+
validate.entry(args);
|
264
|
+
target.insert(args.entry);
|
248
265
|
break;
|
249
266
|
case 'update':
|
250
|
-
|
251
|
-
|
252
|
-
update(args.id, args.entry);
|
267
|
+
validate.id(args);
|
268
|
+
validate.entry(args);
|
269
|
+
target.update(args.id, args.entry);
|
253
270
|
break;
|
254
271
|
case 'remove':
|
255
|
-
|
256
|
-
remove(args.id);
|
272
|
+
validate.id(args);
|
273
|
+
target.remove(args.id);
|
257
274
|
break;
|
258
275
|
}
|
259
276
|
};
|
data/index.html
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
<!DOCTYPE HTML>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
5
|
+
<title>radiotower</title>
|
6
|
+
<!-- <script type="text/javascript" src="js/vendor/faye-browser-min.js"></script> -->
|
7
|
+
<!-- <script type="text/javascript" src="js/vendor/jsonp.js"></script> -->
|
8
|
+
<!-- <script type="text/javascript" src="js/transistor/radio.js"></script> -->
|
9
|
+
<!-- <script type="text/javascript" src="js/transistor/control.js"></script> -->
|
10
|
+
<!-- <script type="text/javascript" src="js/transistor/binder.js"></script> -->
|
11
|
+
<script type="text/javascript" src="build/src/transistor.js"></script>
|
12
|
+
<script type="text/javascript">
|
13
|
+
|
14
|
+
var control = Transistor.Control(
|
15
|
+
'http://localhost:9700', // broadcaster
|
16
|
+
'e0745051ed75e95d1088986fedbde764', // station uid
|
17
|
+
'26d47e42b5ce83a934725f5e18e01d2b' // push token
|
18
|
+
)
|
19
|
+
|
20
|
+
var radio = Transistor.Radio(
|
21
|
+
'http://localhost:9703', // station_finder
|
22
|
+
'e0745051ed75e95d1088986fedbde764', // station uid
|
23
|
+
'4b9b62aae02f1f4fe079da7bcd0be00d' // test/live token
|
24
|
+
);
|
25
|
+
|
26
|
+
// explicit listener function
|
27
|
+
radio.tune("about", function(event, args) {
|
28
|
+
console.log('about', event, args);
|
29
|
+
});
|
30
|
+
|
31
|
+
// bind channel to a local array
|
32
|
+
var news = [];
|
33
|
+
radio.tune("news", Transistor.Binder(news));
|
34
|
+
|
35
|
+
radio.turnOn();
|
36
|
+
</script>
|
37
|
+
</head>
|
38
|
+
<body>
|
39
|
+
|
40
|
+
</body>
|
41
|
+
</html>
|
data/jake.yml
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
/*global Backbone, _ */
|
2
|
+
|
3
|
+
if (window.Transistor === undefined) {
|
4
|
+
window.Transistor = {};
|
5
|
+
}
|
6
|
+
|
7
|
+
(function (transistor) {
|
8
|
+
var BackboneCollection = (function () {
|
9
|
+
return function (radio, channel) {
|
10
|
+
var H, backbone_collection, collection_interface, binder;
|
11
|
+
|
12
|
+
H = (function () {
|
13
|
+
return {
|
14
|
+
};
|
15
|
+
}());
|
16
|
+
|
17
|
+
backbone_collection = new Backbone.Collection();
|
18
|
+
|
19
|
+
collection_interface = {
|
20
|
+
add: backbone_collection.add,
|
21
|
+
remove: backbone_collection.remove,
|
22
|
+
reset: backbone_collection.reset,
|
23
|
+
set: backbone_collection.set
|
24
|
+
};
|
25
|
+
|
26
|
+
(function (writer) {
|
27
|
+
var frozen = true,
|
28
|
+
delegate = function (func) {
|
29
|
+
writer[func] = (function (name) {
|
30
|
+
return function () {
|
31
|
+
if (frozen) {
|
32
|
+
throw "BackboneCollection is not mutable by user.";
|
33
|
+
} else {
|
34
|
+
return collection_interface[name].apply(backbone_collection, arguments);
|
35
|
+
}
|
36
|
+
};
|
37
|
+
}(func));
|
38
|
+
};
|
39
|
+
|
40
|
+
collection_interface.unfreeze = function () {
|
41
|
+
frozen = false;
|
42
|
+
};
|
43
|
+
|
44
|
+
collection_interface.freeze = function () {
|
45
|
+
frozen = true;
|
46
|
+
};
|
47
|
+
|
48
|
+
collection_interface.unfrozen = function (unfrozen_context) {
|
49
|
+
collection_interface.unfreeze();
|
50
|
+
unfrozen_context();
|
51
|
+
collection_interface.freeze();
|
52
|
+
};
|
53
|
+
|
54
|
+
delegate('add');
|
55
|
+
delegate('remove');
|
56
|
+
delegate('reset');
|
57
|
+
delegate('set');
|
58
|
+
}(backbone_collection));
|
59
|
+
|
60
|
+
binder = transistor.Binder({
|
61
|
+
set: function (collection) {
|
62
|
+
collection_interface.unfrozen(function () {
|
63
|
+
var models = _.map(collection, function (entry) {
|
64
|
+
return new Backbone.Model(entry);
|
65
|
+
});
|
66
|
+
backbone_collection.reset(models);
|
67
|
+
});
|
68
|
+
},
|
69
|
+
insert: function (entry) {
|
70
|
+
collection_interface.unfrozen(function () {
|
71
|
+
backbone_collection.add(new Backbone.Model(entry));
|
72
|
+
});
|
73
|
+
},
|
74
|
+
update: function (id, entry) {
|
75
|
+
collection_interface.unfrozen(function () {
|
76
|
+
var model = backbone_collection.get(id);
|
77
|
+
model.clear({silent: true});
|
78
|
+
model.set(entry);
|
79
|
+
});
|
80
|
+
},
|
81
|
+
remove: function (id) {
|
82
|
+
collection_interface.unfrozen(function () {
|
83
|
+
var model = backbone_collection.get(id);
|
84
|
+
backbone_collection.remove(model);
|
85
|
+
});
|
86
|
+
}
|
87
|
+
});
|
88
|
+
|
89
|
+
radio.tune(channel, binder);
|
90
|
+
|
91
|
+
return backbone_collection;
|
92
|
+
};
|
93
|
+
}());
|
94
|
+
|
95
|
+
if (transistor.Backbone === undefined) {
|
96
|
+
transistor.Backbone = {};
|
97
|
+
}
|
98
|
+
transistor.Backbone.Collection = BackboneCollection;
|
99
|
+
|
100
|
+
}(window.Transistor));
|
@@ -0,0 +1,126 @@
|
|
1
|
+
if (window.Transistor === undefined) {
|
2
|
+
window.Transistor = {};
|
3
|
+
}
|
4
|
+
|
5
|
+
(function (transistor) {
|
6
|
+
var Binder, ArrayBinding;
|
7
|
+
|
8
|
+
ArrayBinding = {
|
9
|
+
bindTo: function (array) {
|
10
|
+
var H = (function () {
|
11
|
+
return {
|
12
|
+
clear: function () {
|
13
|
+
for (;array.length !== 0;) {
|
14
|
+
array.pop();
|
15
|
+
}
|
16
|
+
},
|
17
|
+
|
18
|
+
indexOfId: function (id) {
|
19
|
+
for (var i = 0; i < array.length; i += 1) {
|
20
|
+
if (array[i].id === id) {
|
21
|
+
return i;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
throw new Error("unknown id: " + id);
|
26
|
+
}
|
27
|
+
};
|
28
|
+
}());
|
29
|
+
|
30
|
+
return {
|
31
|
+
set: function (collection) {
|
32
|
+
H.clear();
|
33
|
+
|
34
|
+
if (collection !== undefined) {
|
35
|
+
for (var i = 0 ; i < collection.length; i += 1) {
|
36
|
+
array[i] = collection[i];
|
37
|
+
}
|
38
|
+
}
|
39
|
+
},
|
40
|
+
insert: function (entry) {
|
41
|
+
if (entry !== undefined) {
|
42
|
+
array.push(entry);
|
43
|
+
}
|
44
|
+
},
|
45
|
+
update: function (id, entry) {
|
46
|
+
if (id === undefined) {
|
47
|
+
throw new Error("undefined id");
|
48
|
+
}
|
49
|
+
|
50
|
+
array[H.indexOfId(id)] = entry;
|
51
|
+
},
|
52
|
+
remove: function (id) {
|
53
|
+
array.splice(H.indexOfId(id), 1);
|
54
|
+
}
|
55
|
+
};
|
56
|
+
}
|
57
|
+
};
|
58
|
+
|
59
|
+
|
60
|
+
Binder = (function () {
|
61
|
+
return function (binding) {
|
62
|
+
var validate, target;
|
63
|
+
|
64
|
+
if (Object.prototype.toString.call( binding ) === '[object Array]') {
|
65
|
+
target = ArrayBinding.bindTo(binding);
|
66
|
+
} else {
|
67
|
+
target = binding;
|
68
|
+
}
|
69
|
+
|
70
|
+
|
71
|
+
validate = (function () {
|
72
|
+
return {
|
73
|
+
collection: function (args) {
|
74
|
+
if (args.collection === undefined) {
|
75
|
+
throw new Error("undefined collection");
|
76
|
+
}
|
77
|
+
},
|
78
|
+
|
79
|
+
entry: function (args) {
|
80
|
+
if (args.entry === undefined) {
|
81
|
+
throw new Error("undefined entry");
|
82
|
+
}
|
83
|
+
},
|
84
|
+
|
85
|
+
id: function (args) {
|
86
|
+
if (args.id === undefined) {
|
87
|
+
throw new Error("undefined id");
|
88
|
+
}
|
89
|
+
}
|
90
|
+
};
|
91
|
+
}());
|
92
|
+
|
93
|
+
return function (event, args) {
|
94
|
+
if (args === undefined) {
|
95
|
+
throw new Error("undefined arguments");
|
96
|
+
}
|
97
|
+
|
98
|
+
switch (event) {
|
99
|
+
case 'init':
|
100
|
+
target.set(args);
|
101
|
+
break;
|
102
|
+
case 'set':
|
103
|
+
validate.collection(args);
|
104
|
+
target.set(args.collection);
|
105
|
+
break;
|
106
|
+
case 'insert':
|
107
|
+
validate.entry(args);
|
108
|
+
target.insert(args.entry);
|
109
|
+
break;
|
110
|
+
case 'update':
|
111
|
+
validate.id(args);
|
112
|
+
validate.entry(args);
|
113
|
+
target.update(args.id, args.entry);
|
114
|
+
break;
|
115
|
+
case 'remove':
|
116
|
+
validate.id(args);
|
117
|
+
target.remove(args.id);
|
118
|
+
break;
|
119
|
+
}
|
120
|
+
};
|
121
|
+
};
|
122
|
+
}());
|
123
|
+
|
124
|
+
transistor.Binder = Binder;
|
125
|
+
|
126
|
+
}(window.Transistor));
|
@@ -0,0 +1,64 @@
|
|
1
|
+
/*global JSONP */
|
2
|
+
if (window.Transistor === undefined) {
|
3
|
+
window.Transistor = {};
|
4
|
+
}
|
5
|
+
|
6
|
+
(function (transistor) {
|
7
|
+
|
8
|
+
var Control = (function () {
|
9
|
+
|
10
|
+
return function (broadcaster, station_uid, token) {
|
11
|
+
var jsonp, set, insert, update, remove, command_url, send;
|
12
|
+
|
13
|
+
jsonp = JSONP();
|
14
|
+
|
15
|
+
set = function (channel, collection, cb) {
|
16
|
+
send(command_url('set', channel), {collection: collection}, cb);
|
17
|
+
};
|
18
|
+
|
19
|
+
insert = function (channel, entry, cb) {
|
20
|
+
send(command_url('insert', channel), {entry: entry}, cb);
|
21
|
+
};
|
22
|
+
|
23
|
+
update = function (channel, id, entry, cb) {
|
24
|
+
send(command_url('update', channel), {id: id, entry: entry}, cb);
|
25
|
+
};
|
26
|
+
|
27
|
+
remove = function (channel, id, cb) {
|
28
|
+
send(command_url('remove', channel), {id: id}, cb);
|
29
|
+
};
|
30
|
+
|
31
|
+
command_url = function (cmd, channel) {
|
32
|
+
var base = broadcaster + '/command/' + cmd + '/' + station_uid + '/' + token;
|
33
|
+
|
34
|
+
if (channel === undefined) {
|
35
|
+
return base;
|
36
|
+
} else {
|
37
|
+
return base + '/' + channel;
|
38
|
+
}
|
39
|
+
};
|
40
|
+
|
41
|
+
send = function (command_url, data, cb) {
|
42
|
+
if (cb === undefined) {
|
43
|
+
cb = function (result) {};
|
44
|
+
}
|
45
|
+
|
46
|
+
if (data === undefined) {
|
47
|
+
jsonp.get(command_url, {}, cb);
|
48
|
+
} else {
|
49
|
+
jsonp.get(command_url, {data: JSON.stringify(data)}, cb);
|
50
|
+
}
|
51
|
+
};
|
52
|
+
|
53
|
+
return {
|
54
|
+
set: set,
|
55
|
+
insert: insert,
|
56
|
+
update: update,
|
57
|
+
remove: remove
|
58
|
+
};
|
59
|
+
};
|
60
|
+
}());
|
61
|
+
|
62
|
+
transistor.Control = Control;
|
63
|
+
|
64
|
+
}(window.Transistor));
|