paloma 4.1.1 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,479 @@
1
+ /*
2
+ http://www.JSON.org/json2.js
3
+ 2009-08-17
4
+
5
+ Public Domain.
6
+
7
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
8
+
9
+ See http://www.JSON.org/js.html
10
+
11
+ This file creates a global JSON object containing two methods: stringify
12
+ and parse.
13
+
14
+ JSON.stringify(value, replacer, space)
15
+ value any JavaScript value, usually an object or array.
16
+
17
+ replacer an optional parameter that determines how object
18
+ values are stringified for objects. It can be a
19
+ function or an array of strings.
20
+
21
+ space an optional parameter that specifies the indentation
22
+ of nested structures. If it is omitted, the text will
23
+ be packed without extra whitespace. If it is a number,
24
+ it will specify the number of spaces to indent at each
25
+ level. If it is a string (such as '\t' or ' '),
26
+ it contains the characters used to indent at each level.
27
+
28
+ This method produces a JSON text from a JavaScript value.
29
+
30
+ When an object value is found, if the object contains a toJSON
31
+ method, its toJSON method will be called and the result will be
32
+ stringified. A toJSON method does not serialize: it returns the
33
+ value represented by the name/value pair that should be serialized,
34
+ or undefined if nothing should be serialized. The toJSON method
35
+ will be passed the key associated with the value, and this will be
36
+ bound to the value
37
+
38
+ For example, this would serialize Dates as ISO strings.
39
+
40
+ Date.prototype.toJSON = function (key) {
41
+ function f(n) {
42
+ // Format integers to have at least two digits.
43
+ return n < 10 ? '0' + n : n;
44
+ }
45
+
46
+ return this.getUTCFullYear() + '-' +
47
+ f(this.getUTCMonth() + 1) + '-' +
48
+ f(this.getUTCDate()) + 'T' +
49
+ f(this.getUTCHours()) + ':' +
50
+ f(this.getUTCMinutes()) + ':' +
51
+ f(this.getUTCSeconds()) + 'Z';
52
+ };
53
+
54
+ You can provide an optional replacer method. It will be passed the
55
+ key and value of each member, with this bound to the containing
56
+ object. The value that is returned from your method will be
57
+ serialized. If your method returns undefined, then the member will
58
+ be excluded from the serialization.
59
+
60
+ If the replacer parameter is an array of strings, then it will be
61
+ used to select the members to be serialized. It filters the results
62
+ such that only members with keys listed in the replacer array are
63
+ stringified.
64
+
65
+ Values that do not have JSON representations, such as undefined or
66
+ functions, will not be serialized. Such values in objects will be
67
+ dropped; in arrays they will be replaced with null. You can use
68
+ a replacer function to replace those with JSON values.
69
+ JSON.stringify(undefined) returns undefined.
70
+
71
+ The optional space parameter produces a stringification of the
72
+ value that is filled with line breaks and indentation to make it
73
+ easier to read.
74
+
75
+ If the space parameter is a non-empty string, then that string will
76
+ be used for indentation. If the space parameter is a number, then
77
+ the indentation will be that many spaces.
78
+
79
+ Example:
80
+
81
+ text = JSON.stringify(['e', {pluribus: 'unum'}]);
82
+ // text is '["e",{"pluribus":"unum"}]'
83
+
84
+
85
+ text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
86
+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
87
+
88
+ text = JSON.stringify([new Date()], function (key, value) {
89
+ return this[key] instanceof Date ?
90
+ 'Date(' + this[key] + ')' : value;
91
+ });
92
+ // text is '["Date(---current time---)"]'
93
+
94
+
95
+ JSON.parse(text, reviver)
96
+ This method parses a JSON text to produce an object or array.
97
+ It can throw a SyntaxError exception.
98
+
99
+ The optional reviver parameter is a function that can filter and
100
+ transform the results. It receives each of the keys and values,
101
+ and its return value is used instead of the original value.
102
+ If it returns what it received, then the structure is not modified.
103
+ If it returns undefined then the member is deleted.
104
+
105
+ Example:
106
+
107
+ // Parse the text. Values that look like ISO date strings will
108
+ // be converted to Date objects.
109
+
110
+ myData = JSON.parse(text, function (key, value) {
111
+ var a;
112
+ if (typeof value === 'string') {
113
+ a =
114
+ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
115
+ if (a) {
116
+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
117
+ +a[5], +a[6]));
118
+ }
119
+ }
120
+ return value;
121
+ });
122
+
123
+ myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
124
+ var d;
125
+ if (typeof value === 'string' &&
126
+ value.slice(0, 5) === 'Date(' &&
127
+ value.slice(-1) === ')') {
128
+ d = new Date(value.slice(5, -1));
129
+ if (d) {
130
+ return d;
131
+ }
132
+ }
133
+ return value;
134
+ });
135
+
136
+
137
+ This is a reference implementation. You are free to copy, modify, or
138
+ redistribute.
139
+
140
+ This code should be minified before deployment.
141
+ See http://javascript.crockford.com/jsmin.html
142
+
143
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
144
+ NOT CONTROL.
145
+ */
146
+
147
+ /*jslint evil: true */
148
+
149
+ /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
150
+ call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
151
+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
152
+ lastIndex, length, parse, prototype, push, replace, slice, stringify,
153
+ test, toJSON, toString, valueOf
154
+ */
155
+
156
+
157
+ "use strict";
158
+
159
+ // Create a JSON object only if one does not already exist. We create the
160
+ // methods in a closure to avoid creating global variables.
161
+
162
+ if (!this.JSON) {
163
+ this.JSON = {};
164
+ }
165
+
166
+ (function () {
167
+
168
+ function f(n) {
169
+ // Format integers to have at least two digits.
170
+ return n < 10 ? '0' + n : n;
171
+ }
172
+
173
+ if (typeof Date.prototype.toJSON !== 'function') {
174
+
175
+ Date.prototype.toJSON = function (key) {
176
+
177
+ return isFinite(this.valueOf()) ?
178
+ this.getUTCFullYear() + '-' +
179
+ f(this.getUTCMonth() + 1) + '-' +
180
+ f(this.getUTCDate()) + 'T' +
181
+ f(this.getUTCHours()) + ':' +
182
+ f(this.getUTCMinutes()) + ':' +
183
+ f(this.getUTCSeconds()) + 'Z' : null;
184
+ };
185
+
186
+ String.prototype.toJSON =
187
+ Number.prototype.toJSON =
188
+ Boolean.prototype.toJSON = function (key) {
189
+ return this.valueOf();
190
+ };
191
+ }
192
+
193
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
194
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
195
+ gap,
196
+ indent,
197
+ meta = { // table of character substitutions
198
+ '\b': '\\b',
199
+ '\t': '\\t',
200
+ '\n': '\\n',
201
+ '\f': '\\f',
202
+ '\r': '\\r',
203
+ '"' : '\\"',
204
+ '\\': '\\\\'
205
+ },
206
+ rep;
207
+
208
+
209
+ function quote(string) {
210
+
211
+ // If the string contains no control characters, no quote characters, and no
212
+ // backslash characters, then we can safely slap some quotes around it.
213
+ // Otherwise we must also replace the offending characters with safe escape
214
+ // sequences.
215
+
216
+ escapable.lastIndex = 0;
217
+ return escapable.test(string) ?
218
+ '"' + string.replace(escapable, function (a) {
219
+ var c = meta[a];
220
+ return typeof c === 'string' ? c :
221
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
222
+ }) + '"' :
223
+ '"' + string + '"';
224
+ }
225
+
226
+
227
+ function str(key, holder) {
228
+ // Produce a string from holder[key].
229
+
230
+ var i, // The loop counter.
231
+ k, // The member key.
232
+ v, // The member value.
233
+ length,
234
+ mind = gap,
235
+ partial,
236
+ value = holder[key];
237
+
238
+ // If the value has a toJSON method, call it to obtain a replacement value.
239
+
240
+ if (value && typeof value === 'object' &&
241
+ typeof value.toJSON === 'function') {
242
+ value = value.toJSON(key);
243
+ }
244
+
245
+ // If we were called with a replacer function, then call the replacer to
246
+ // obtain a replacement value.
247
+
248
+ if (typeof rep === 'function') {
249
+ value = rep.call(holder, key, value);
250
+ }
251
+
252
+ // What happens next depends on the value's type.
253
+
254
+ switch (typeof value) {
255
+ case 'string':
256
+ return quote(value);
257
+
258
+ case 'number':
259
+
260
+ // JSON numbers must be finite. Encode non-finite numbers as null.
261
+
262
+ return isFinite(value) ? String(value) : 'null';
263
+
264
+ case 'boolean':
265
+ case 'null':
266
+
267
+ // If the value is a boolean or null, convert it to a string. Note:
268
+ // typeof null does not produce 'null'. The case is included here in
269
+ // the remote chance that this gets fixed someday.
270
+
271
+ return String(value);
272
+
273
+ // If the type is 'object', we might be dealing with an object or an array or
274
+ // null.
275
+
276
+ case 'object':
277
+
278
+ // Due to a specification blunder in ECMAScript, typeof null is 'object',
279
+ // so watch out for that case.
280
+
281
+ if (!value) {
282
+ return 'null';
283
+ }
284
+
285
+ // Make an array to hold the partial results of stringifying this object value.
286
+
287
+ gap += indent;
288
+ partial = [];
289
+
290
+ // Is the value an array?
291
+
292
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
293
+
294
+ // The value is an array. Stringify every element. Use null as a placeholder
295
+ // for non-JSON values.
296
+
297
+ length = value.length;
298
+ for (i = 0; i < length; i += 1) {
299
+ partial[i] = str(i, value) || 'null';
300
+ }
301
+
302
+ // Join all of the elements together, separated with commas, and wrap them in
303
+ // brackets.
304
+
305
+ v = partial.length === 0 ? '[]' :
306
+ gap ? '[\n' + gap +
307
+ partial.join(',\n' + gap) + '\n' +
308
+ mind + ']' :
309
+ '[' + partial.join(',') + ']';
310
+ gap = mind;
311
+ return v;
312
+ }
313
+
314
+ // If the replacer is an array, use it to select the members to be stringified.
315
+
316
+ if (rep && typeof rep === 'object') {
317
+ length = rep.length;
318
+ for (i = 0; i < length; i += 1) {
319
+ k = rep[i];
320
+ if (typeof k === 'string') {
321
+ v = str(k, value);
322
+ if (v) {
323
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
324
+ }
325
+ }
326
+ }
327
+ } else {
328
+
329
+ // Otherwise, iterate through all of the keys in the object.
330
+
331
+ for (k in value) {
332
+ if (Object.hasOwnProperty.call(value, k)) {
333
+ v = str(k, value);
334
+ if (v) {
335
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
336
+ }
337
+ }
338
+ }
339
+ }
340
+
341
+ // Join all of the member texts together, separated with commas,
342
+ // and wrap them in braces.
343
+
344
+ v = partial.length === 0 ? '{}' :
345
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
346
+ mind + '}' : '{' + partial.join(',') + '}';
347
+ gap = mind;
348
+ return v;
349
+ }
350
+ }
351
+
352
+ // If the JSON object does not yet have a stringify method, give it one.
353
+
354
+ if (typeof JSON.stringify !== 'function') {
355
+ JSON.stringify = function (value, replacer, space) {
356
+ // The stringify method takes a value and an optional replacer, and an optional
357
+ // space parameter, and returns a JSON text. The replacer can be a function
358
+ // that can replace values, or an array of strings that will select the keys.
359
+ // A default replacer method can be provided. Use of the space parameter can
360
+ // produce text that is more easily readable.
361
+
362
+ var i;
363
+ gap = '';
364
+ indent = '';
365
+
366
+ // If the space parameter is a number, make an indent string containing that
367
+ // many spaces.
368
+
369
+ if (typeof space === 'number') {
370
+ for (i = 0; i < space; i += 1) {
371
+ indent += ' ';
372
+ }
373
+
374
+ // If the space parameter is a string, it will be used as the indent string.
375
+
376
+ } else if (typeof space === 'string') {
377
+ indent = space;
378
+ }
379
+
380
+ // If there is a replacer, it must be a function or an array.
381
+ // Otherwise, throw an error.
382
+
383
+ rep = replacer;
384
+ if (replacer && typeof replacer !== 'function' &&
385
+ (typeof replacer !== 'object' ||
386
+ typeof replacer.length !== 'number')) {
387
+ throw new Error('JSON.stringify');
388
+ }
389
+
390
+ // Make a fake root object containing our value under the key of ''.
391
+ // Return the result of stringifying the value.
392
+
393
+ return str('', {'': value});
394
+ };
395
+ }
396
+
397
+
398
+ // If the JSON object does not yet have a parse method, give it one.
399
+
400
+ if (typeof JSON.parse !== 'function') {
401
+ JSON.parse = function (text, reviver) {
402
+
403
+ // The parse method takes a text and an optional reviver function, and returns
404
+ // a JavaScript value if the text is a valid JSON text.
405
+
406
+ var j;
407
+
408
+ function walk(holder, key) {
409
+
410
+ // The walk method is used to recursively walk the resulting structure so
411
+ // that modifications can be made.
412
+
413
+ var k, v, value = holder[key];
414
+ if (value && typeof value === 'object') {
415
+ for (k in value) {
416
+ if (Object.hasOwnProperty.call(value, k)) {
417
+ v = walk(value, k);
418
+ if (v !== undefined) {
419
+ value[k] = v;
420
+ } else {
421
+ delete value[k];
422
+ }
423
+ }
424
+ }
425
+ }
426
+ return reviver.call(holder, key, value);
427
+ }
428
+
429
+
430
+ // Parsing happens in four stages. In the first stage, we replace certain
431
+ // Unicode characters with escape sequences. JavaScript handles many characters
432
+ // incorrectly, either silently deleting them, or treating them as line endings.
433
+
434
+ cx.lastIndex = 0;
435
+ if (cx.test(text)) {
436
+ text = text.replace(cx, function (a) {
437
+ return '\\u' +
438
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
439
+ });
440
+ }
441
+
442
+ // In the second stage, we run the text against regular expressions that look
443
+ // for non-JSON patterns. We are especially concerned with '()' and 'new'
444
+ // because they can cause invocation, and '=' because it can cause mutation.
445
+ // But just to be safe, we want to reject all unexpected forms.
446
+
447
+ // We split the second stage into 4 regexp operations in order to work around
448
+ // crippling inefficiencies in IE's and Safari's regexp engines. First we
449
+ // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
450
+ // replace all simple value tokens with ']' characters. Third, we delete all
451
+ // open brackets that follow a colon or comma or that begin the text. Finally,
452
+ // we look to see that the remaining characters are only whitespace or ']' or
453
+ // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
454
+
455
+ if (/^[\],:{}\s]*$/.
456
+ test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
457
+ replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
458
+ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
459
+
460
+ // In the third stage we use the eval function to compile the text into a
461
+ // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
462
+ // in JavaScript: it can begin a block or an object literal. We wrap the text
463
+ // in parens to eliminate the ambiguity.
464
+
465
+ j = eval('(' + text + ')');
466
+
467
+ // In the optional fourth stage, we recursively walk the new structure, passing
468
+ // each name/value pair to a reviver function for possible transformation.
469
+
470
+ return typeof reviver === 'function' ?
471
+ walk({'': j}, '') : j;
472
+ }
473
+
474
+ // If the text is not JSON parseable, then a SyntaxError is thrown.
475
+
476
+ throw new SyntaxError('JSON.parse');
477
+ };
478
+ }
479
+ }());
@@ -0,0 +1,44 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
5
+ <title>Jasmine Specs</title>
6
+
7
+ <link href="./assets/jasmine.css" media="screen" rel="stylesheet" type="text/css" />
8
+ </head>
9
+ <body>
10
+ <div id="jasmine_content"></div>
11
+
12
+ <script src="./assets/jasmine.js" type="text/javascript"></script>
13
+ <script src="./assets/jasmine-html.js" type="text/javascript"></script>
14
+ <script src="./assets/json2.js" type="text/javascript"></script>
15
+ <script src="./assets/jasmine-console-shims.js" type="text/javascript"></script>
16
+ <script src="./assets/jasmine-console-reporter.js" type="text/javascript"></script>
17
+ <script src="./assets/jasmine-boot.js" type="text/javascript"></script>
18
+ <script src="./assets/jasmine-specs.js" type="text/javascript"></script>
19
+
20
+ <div class="js-paloma-hook" data-id="1427203087424">
21
+ <script type="text/javascript">
22
+ (function(){
23
+ // Do not continue if Paloma not found.
24
+ if (window['Paloma'] === undefined) {
25
+ return true;
26
+ }
27
+
28
+ Paloma.env = 'development';
29
+
30
+ // Remove any callback details if any
31
+ $('.js-paloma-hook[data-id!=' + 1427203087424 + ']').remove();
32
+
33
+ var request = {"resource":"JasmineRails/SpecRunner","action":"index","params":{}};
34
+
35
+ Paloma.engine.setRequest({
36
+ id: "1427203087424",
37
+ resource: request['resource'],
38
+ action: request['action'],
39
+ params: request['params']});
40
+ })();
41
+ </script>
42
+ </div>
43
+ </body>
44
+ </html>
@@ -6,6 +6,17 @@
6
6
  };
7
7
 
8
8
  Engine.prototype.start = function(){
9
+ // Do not execute if there is no request available.
10
+ if ( !this._request ) return;
11
+
12
+ // Do not execute if already executed.
13
+ //
14
+ // This happens when using turbolinks,
15
+ // if a page using js(false) is rendered
16
+ // after a page with executed js, then the
17
+ // previous js will be executed again.
18
+ if ( this._request.executed ) return;
19
+
9
20
  var resource = this._request['controller'],
10
21
  Controller = this.factory.get(resource);
11
22
 
@@ -27,11 +38,26 @@
27
38
  Paloma.log(params);
28
39
 
29
40
  controller[ this._request['action'] ]();
41
+
42
+ this._request.executed = true;
30
43
  };
31
44
 
32
45
 
33
- Engine.prototype.setRequest = function(resource, action, params){
34
- this._request = {controller: resource, action: action, params: params};
46
+ //
47
+ // options:
48
+ // resource
49
+ // action
50
+ // params
51
+ // id
52
+ //
53
+ Engine.prototype.setRequest = function(options){
54
+ this._request = {
55
+ id: options.id,
56
+ controller: options.resource,
57
+ action: options.action,
58
+ params: options.params,
59
+ executed: false
60
+ };
35
61
  };
36
62
 
37
63