amplify 1.0.1 → 1.1.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.
- data/lib/amplify/version.rb +1 -1
- data/{app → lib}/assets/javascripts/amplify/core.js.erb +13 -7
- data/{app → lib}/assets/javascripts/amplify/index.js.erb +0 -0
- data/{app → lib}/assets/javascripts/amplify/request.js.erb +76 -28
- data/{app → lib}/assets/javascripts/amplify/store.js.erb +84 -69
- metadata +43 -74
data/lib/amplify/version.rb
CHANGED
@@ -15,6 +15,7 @@ var slice = [].slice,
|
|
15
15
|
var amplify = global.amplify = {
|
16
16
|
publish: function( topic ) {
|
17
17
|
var args = slice.call( arguments, 1 ),
|
18
|
+
topicSubscriptions,
|
18
19
|
subscription,
|
19
20
|
length,
|
20
21
|
i = 0,
|
@@ -24,8 +25,9 @@ var amplify = global.amplify = {
|
|
24
25
|
return true;
|
25
26
|
}
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
topicSubscriptions = subscriptions[ topic ].slice();
|
29
|
+
for ( length = topicSubscriptions.length; i < length; i++ ) {
|
30
|
+
subscription = topicSubscriptions[ i ];
|
29
31
|
ret = subscription.callback.apply( subscription.context, args );
|
30
32
|
if ( ret === false ) {
|
31
33
|
break;
|
@@ -48,9 +50,11 @@ var amplify = global.amplify = {
|
|
48
50
|
|
49
51
|
var topicIndex = 0,
|
50
52
|
topics = topic.split( /\s/ ),
|
51
|
-
topicLength = topics.length
|
53
|
+
topicLength = topics.length,
|
54
|
+
added;
|
52
55
|
for ( ; topicIndex < topicLength; topicIndex++ ) {
|
53
56
|
topic = topics[ topicIndex ];
|
57
|
+
added = false;
|
54
58
|
if ( !subscriptions[ topic ] ) {
|
55
59
|
subscriptions[ topic ] = [];
|
56
60
|
}
|
@@ -65,11 +69,14 @@ var amplify = global.amplify = {
|
|
65
69
|
for ( ; i >= 0; i-- ) {
|
66
70
|
if ( subscriptions[ topic ][ i ].priority <= priority ) {
|
67
71
|
subscriptions[ topic ].splice( i + 1, 0, subscriptionInfo );
|
68
|
-
|
72
|
+
added = true;
|
73
|
+
break;
|
69
74
|
}
|
70
75
|
}
|
71
|
-
|
72
|
-
|
76
|
+
|
77
|
+
if ( !added ) {
|
78
|
+
subscriptions[ topic ].unshift( subscriptionInfo );
|
79
|
+
}
|
73
80
|
}
|
74
81
|
|
75
82
|
return callback;
|
@@ -93,4 +100,3 @@ var amplify = global.amplify = {
|
|
93
100
|
};
|
94
101
|
|
95
102
|
}( this ) );
|
96
|
-
|
File without changes
|
@@ -15,6 +15,24 @@ function isFunction( obj ) {
|
|
15
15
|
return ({}).toString.call( obj ) === "[object Function]";
|
16
16
|
}
|
17
17
|
|
18
|
+
function async( fn ) {
|
19
|
+
var isAsync = false;
|
20
|
+
setTimeout(function() {
|
21
|
+
isAsync = true;
|
22
|
+
}, 1 );
|
23
|
+
return function() {
|
24
|
+
var that = this,
|
25
|
+
args = arguments;
|
26
|
+
if ( isAsync ) {
|
27
|
+
fn.apply( that, args );
|
28
|
+
} else {
|
29
|
+
setTimeout(function() {
|
30
|
+
fn.apply( that, args );
|
31
|
+
}, 1 );
|
32
|
+
}
|
33
|
+
};
|
34
|
+
}
|
35
|
+
|
18
36
|
amplify.request = function( resourceId, data, callback ) {
|
19
37
|
// default to an empty hash just so we can handle a missing resourceId
|
20
38
|
// in one place
|
@@ -36,18 +54,18 @@ amplify.request = function( resourceId, data, callback ) {
|
|
36
54
|
resource = amplify.request.resources[ settings.resourceId ],
|
37
55
|
success = settings.success || noop,
|
38
56
|
error = settings.error || noop;
|
39
|
-
settings.success = function( data, status ) {
|
57
|
+
settings.success = async( function( data, status ) {
|
40
58
|
status = status || "success";
|
41
59
|
amplify.publish( "request.success", settings, data, status );
|
42
60
|
amplify.publish( "request.complete", settings, data, status );
|
43
61
|
success( data, status );
|
44
|
-
};
|
45
|
-
settings.error = function( data, status ) {
|
62
|
+
});
|
63
|
+
settings.error = async( function( data, status ) {
|
46
64
|
status = status || "error";
|
47
65
|
amplify.publish( "request.error", settings, data, status );
|
48
66
|
amplify.publish( "request.complete", settings, data, status );
|
49
67
|
error( data, status );
|
50
|
-
};
|
68
|
+
});
|
51
69
|
|
52
70
|
if ( !resource ) {
|
53
71
|
if ( !settings.resourceId ) {
|
@@ -101,10 +119,8 @@ amplify.request.types.ajax = function( defnSettings ) {
|
|
101
119
|
return function( settings, request ) {
|
102
120
|
var xhr,
|
103
121
|
url = defnSettings.url,
|
104
|
-
data = settings.data,
|
105
122
|
abort = request.abort,
|
106
|
-
ajaxSettings = {},
|
107
|
-
mappedKeys = [],
|
123
|
+
ajaxSettings = $.extend( true, {}, defnSettings, { data: settings.data } ),
|
108
124
|
aborted = false,
|
109
125
|
ampXHR = {
|
110
126
|
readyState: 0,
|
@@ -136,27 +152,10 @@ amplify.request.types.ajax = function( defnSettings ) {
|
|
136
152
|
}
|
137
153
|
};
|
138
154
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
url = url.replace( rurlData, function ( m, key ) {
|
143
|
-
if ( key in data ) {
|
144
|
-
mappedKeys.push( key );
|
145
|
-
return data[ key ];
|
146
|
-
}
|
147
|
-
});
|
148
|
-
|
149
|
-
// We delete the keys later so duplicates are still replaced
|
150
|
-
$.each( mappedKeys, function ( i, key ) {
|
151
|
-
delete data[ key ];
|
152
|
-
});
|
153
|
-
}
|
155
|
+
amplify.publish( "request.ajax.preprocess",
|
156
|
+
defnSettings, settings, ajaxSettings, ampXHR );
|
154
157
|
|
155
|
-
$.extend( ajaxSettings,
|
156
|
-
url: url,
|
157
|
-
type: defnSettings.type,
|
158
|
-
data: data,
|
159
|
-
dataType: defnSettings.dataType,
|
158
|
+
$.extend( ajaxSettings, {
|
160
159
|
success: function( data, status ) {
|
161
160
|
handleResponse( data, status );
|
162
161
|
},
|
@@ -212,6 +211,56 @@ amplify.request.types.ajax = function( defnSettings ) {
|
|
212
211
|
|
213
212
|
|
214
213
|
|
214
|
+
amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) {
|
215
|
+
var mappedKeys = [],
|
216
|
+
data = ajaxSettings.data;
|
217
|
+
|
218
|
+
if ( typeof data === "string" ) {
|
219
|
+
return;
|
220
|
+
}
|
221
|
+
|
222
|
+
data = $.extend( true, {}, defnSettings.data, data );
|
223
|
+
|
224
|
+
ajaxSettings.url = ajaxSettings.url.replace( rurlData, function ( m, key ) {
|
225
|
+
if ( key in data ) {
|
226
|
+
mappedKeys.push( key );
|
227
|
+
return data[ key ];
|
228
|
+
}
|
229
|
+
});
|
230
|
+
|
231
|
+
// We delete the keys later so duplicates are still replaced
|
232
|
+
$.each( mappedKeys, function ( i, key ) {
|
233
|
+
delete data[ key ];
|
234
|
+
});
|
235
|
+
|
236
|
+
ajaxSettings.data = data;
|
237
|
+
});
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) {
|
242
|
+
var data = ajaxSettings.data,
|
243
|
+
dataMap = defnSettings.dataMap;
|
244
|
+
|
245
|
+
if ( !dataMap || typeof data === "string" ) {
|
246
|
+
return;
|
247
|
+
}
|
248
|
+
|
249
|
+
if ( $.isFunction( dataMap ) ) {
|
250
|
+
ajaxSettings.data = dataMap( data );
|
251
|
+
} else {
|
252
|
+
$.each( defnSettings.dataMap, function( orig, replace ) {
|
253
|
+
if ( orig in data ) {
|
254
|
+
data[ replace ] = data[ orig ];
|
255
|
+
delete data[ orig ];
|
256
|
+
}
|
257
|
+
});
|
258
|
+
ajaxSettings.data = data;
|
259
|
+
}
|
260
|
+
});
|
261
|
+
|
262
|
+
|
263
|
+
|
215
264
|
var cache = amplify.request.cache = {
|
216
265
|
_key: function( resourceId, url, data ) {
|
217
266
|
data = url + data;
|
@@ -334,4 +383,3 @@ amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSett
|
|
334
383
|
});
|
335
384
|
|
336
385
|
}( amplify, jQuery ) );
|
337
|
-
|
@@ -123,7 +123,7 @@ for ( var webStorageType in { localStorage: 1, sessionStorage: 1 } ) {
|
|
123
123
|
// globalStorage
|
124
124
|
// non-standard: Firefox 2+
|
125
125
|
// https://developer.mozilla.org/en/dom/storage#globalStorage
|
126
|
-
if ( window.globalStorage ) {
|
126
|
+
if ( !store.types.localStorage && window.globalStorage ) {
|
127
127
|
// try/catch for file protocol in Firefox
|
128
128
|
try {
|
129
129
|
createFromStorageInterface( "globalStorage",
|
@@ -153,65 +153,88 @@ if ( window.globalStorage ) {
|
|
153
153
|
attrKey = "amplify";
|
154
154
|
div.style.display = "none";
|
155
155
|
document.getElementsByTagName( "head" )[ 0 ].appendChild( div );
|
156
|
-
|
156
|
+
|
157
|
+
// we can't feature detect userData support
|
158
|
+
// so just try and see if it fails
|
159
|
+
// surprisingly, even just adding the behavior isn't enough for a failure
|
160
|
+
// so we need to load the data as well
|
161
|
+
try {
|
157
162
|
div.addBehavior( "#default#userdata" );
|
163
|
+
div.load( attrKey );
|
164
|
+
} catch( e ) {
|
165
|
+
div.parentNode.removeChild( div );
|
166
|
+
return;
|
167
|
+
}
|
158
168
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
169
|
+
store.addType( "userData", function( key, value, options ) {
|
170
|
+
div.load( attrKey );
|
171
|
+
var attr, parsed, prevValue, i, remove,
|
172
|
+
ret = value,
|
173
|
+
now = (new Date()).getTime();
|
164
174
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
}
|
176
|
-
}
|
177
|
-
while ( key = remove.pop() ) {
|
178
|
-
div.removeAttribute( key );
|
175
|
+
if ( !key ) {
|
176
|
+
ret = {};
|
177
|
+
remove = [];
|
178
|
+
i = 0;
|
179
|
+
while ( attr = div.XMLDocument.documentElement.attributes[ i++ ] ) {
|
180
|
+
parsed = JSON.parse( attr.value );
|
181
|
+
if ( parsed.expires && parsed.expires <= now ) {
|
182
|
+
remove.push( attr.name );
|
183
|
+
} else {
|
184
|
+
ret[ attr.name ] = parsed.data;
|
179
185
|
}
|
180
|
-
div.save( attrKey );
|
181
|
-
return ret;
|
182
186
|
}
|
187
|
+
while ( key = remove.pop() ) {
|
188
|
+
div.removeAttribute( key );
|
189
|
+
}
|
190
|
+
div.save( attrKey );
|
191
|
+
return ret;
|
192
|
+
}
|
183
193
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
194
|
+
// convert invalid characters to dashes
|
195
|
+
// http://www.w3.org/TR/REC-xml/#NT-Name
|
196
|
+
// simplified to assume the starting character is valid
|
197
|
+
// also removed colon as it is invalid in HTML attribute names
|
198
|
+
key = key.replace( /[^-._0-9A-Za-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u37f-\u1fff\u200c-\u200d\u203f\u2040\u2070-\u218f]/g, "-" );
|
189
199
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
} else {
|
196
|
-
return parsed.data;
|
197
|
-
}
|
200
|
+
if ( value === undefined ) {
|
201
|
+
attr = div.getAttribute( key );
|
202
|
+
parsed = attr ? JSON.parse( attr ) : { expires: -1 };
|
203
|
+
if ( parsed.expires && parsed.expires <= now ) {
|
204
|
+
div.removeAttribute( key );
|
198
205
|
} else {
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
206
|
+
return parsed.data;
|
207
|
+
}
|
208
|
+
} else {
|
209
|
+
if ( value === null ) {
|
210
|
+
div.removeAttribute( key );
|
211
|
+
} else {
|
212
|
+
// we need to get the previous value in case we need to rollback
|
213
|
+
prevValue = div.getAttribute( key );
|
214
|
+
parsed = JSON.stringify({
|
215
|
+
data: value,
|
216
|
+
expires: (options.expires ? (now + options.expires) : null)
|
217
|
+
});
|
218
|
+
div.setAttribute( key, parsed );
|
219
|
+
}
|
220
|
+
}
|
221
|
+
|
222
|
+
try {
|
223
|
+
div.save( attrKey );
|
224
|
+
// quota exceeded
|
225
|
+
} catch ( error ) {
|
226
|
+
// roll the value back to the previous value
|
227
|
+
if ( prevValue === null ) {
|
228
|
+
div.removeAttribute( key );
|
229
|
+
} else {
|
230
|
+
div.setAttribute( key, prevValue );
|
210
231
|
}
|
211
232
|
|
233
|
+
// expire old data and try again
|
234
|
+
store.userData();
|
212
235
|
try {
|
236
|
+
div.setAttribute( key, parsed );
|
213
237
|
div.save( attrKey );
|
214
|
-
// quota exceeded
|
215
238
|
} catch ( error ) {
|
216
239
|
// roll the value back to the previous value
|
217
240
|
if ( prevValue === null ) {
|
@@ -219,31 +242,18 @@ if ( window.globalStorage ) {
|
|
219
242
|
} else {
|
220
243
|
div.setAttribute( key, prevValue );
|
221
244
|
}
|
222
|
-
|
223
|
-
// expire old data and try again
|
224
|
-
store.userData();
|
225
|
-
try {
|
226
|
-
div.setAttribute( key, parsed );
|
227
|
-
div.save( attrKey );
|
228
|
-
} catch ( error ) {
|
229
|
-
// roll the value back to the previous value
|
230
|
-
if ( prevValue === null ) {
|
231
|
-
div.removeAttribute( key );
|
232
|
-
} else {
|
233
|
-
div.setAttribute( key, prevValue );
|
234
|
-
}
|
235
|
-
throw store.error();
|
236
|
-
}
|
245
|
+
throw store.error();
|
237
246
|
}
|
238
|
-
|
239
|
-
|
240
|
-
}
|
247
|
+
}
|
248
|
+
return ret;
|
249
|
+
});
|
241
250
|
}() );
|
242
251
|
|
243
252
|
// in-memory storage
|
244
253
|
// fallback for all browsers to enable the API even if we can't persist data
|
245
254
|
(function() {
|
246
|
-
var memory = {}
|
255
|
+
var memory = {},
|
256
|
+
timeout = {};
|
247
257
|
|
248
258
|
function copy( obj ) {
|
249
259
|
return obj === undefined ? undefined : JSON.parse( JSON.stringify( obj ) );
|
@@ -258,6 +268,11 @@ if ( window.globalStorage ) {
|
|
258
268
|
return copy( memory[ key ] );
|
259
269
|
}
|
260
270
|
|
271
|
+
if ( timeout[ key ] ) {
|
272
|
+
clearTimeout( timeout[ key ] );
|
273
|
+
delete timeout[ key ];
|
274
|
+
}
|
275
|
+
|
261
276
|
if ( value === null ) {
|
262
277
|
delete memory[ key ];
|
263
278
|
return null;
|
@@ -265,8 +280,9 @@ if ( window.globalStorage ) {
|
|
265
280
|
|
266
281
|
memory[ key ] = value;
|
267
282
|
if ( options.expires ) {
|
268
|
-
setTimeout(function() {
|
283
|
+
timeout[ key ] = setTimeout(function() {
|
269
284
|
delete memory[ key ];
|
285
|
+
delete timeout[ key ];
|
270
286
|
}, options.expires );
|
271
287
|
}
|
272
288
|
|
@@ -275,4 +291,3 @@ if ( window.globalStorage ) {
|
|
275
291
|
}() );
|
276
292
|
|
277
293
|
}( this.amplify = this.amplify || {} ) );
|
278
|
-
|
metadata
CHANGED
@@ -1,16 +1,11 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: amplify
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 1.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- Scott González
|
14
9
|
- Andrew Wirick
|
15
10
|
- Jonathan Sharp
|
16
11
|
- Douglas Neiner
|
@@ -20,94 +15,68 @@ authors:
|
|
20
15
|
autorequire:
|
21
16
|
bindir: bin
|
22
17
|
cert_chain: []
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
dependencies:
|
27
|
-
- !ruby/object:Gem::Dependency
|
18
|
+
date: 2011-12-06 00:00:00.000000000Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
28
21
|
name: jquery-rails
|
29
|
-
|
30
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
22
|
+
requirement: &70335421748260 !ruby/object:Gem::Requirement
|
31
23
|
none: false
|
32
|
-
requirements:
|
24
|
+
requirements:
|
33
25
|
- - ~>
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
|
36
|
-
segments:
|
37
|
-
- 1
|
38
|
-
- 0
|
39
|
-
- 12
|
40
|
-
version: 1.0.12
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.0'
|
41
28
|
type: :runtime
|
42
|
-
version_requirements: *id001
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: sprockets
|
45
29
|
prerelease: false
|
46
|
-
|
30
|
+
version_requirements: *70335421748260
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: sprockets
|
33
|
+
requirement: &70335421747780 !ruby/object:Gem::Requirement
|
47
34
|
none: false
|
48
|
-
requirements:
|
49
|
-
- -
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
|
52
|
-
segments:
|
53
|
-
- 2
|
54
|
-
- 0
|
55
|
-
- 0
|
56
|
-
- beta
|
57
|
-
- 10
|
58
|
-
version: 2.0.0.beta.10
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '2.1'
|
59
39
|
type: :runtime
|
60
|
-
|
61
|
-
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: *70335421747780
|
42
|
+
description: AmplifyJS is a set of components designed to solve common web application
|
43
|
+
problems with a simplistic API.
|
62
44
|
email: alassek@lyconic.com
|
63
45
|
executables: []
|
64
|
-
|
65
46
|
extensions: []
|
66
|
-
|
67
47
|
extra_rdoc_files: []
|
68
|
-
|
69
|
-
files:
|
48
|
+
files:
|
70
49
|
- lib/amplify/engine.rb
|
71
50
|
- lib/amplify/version.rb
|
72
51
|
- lib/amplify.rb
|
73
|
-
-
|
74
|
-
-
|
75
|
-
-
|
76
|
-
-
|
77
|
-
has_rdoc: true
|
52
|
+
- lib/assets/javascripts/amplify/core.js.erb
|
53
|
+
- lib/assets/javascripts/amplify/index.js.erb
|
54
|
+
- lib/assets/javascripts/amplify/request.js.erb
|
55
|
+
- lib/assets/javascripts/amplify/store.js.erb
|
78
56
|
homepage: http://amplifyjs.com
|
79
|
-
licenses:
|
57
|
+
licenses:
|
80
58
|
- MIT
|
81
59
|
- GPL-2
|
82
60
|
post_install_message:
|
83
61
|
rdoc_options: []
|
84
|
-
|
85
|
-
require_paths:
|
62
|
+
require_paths:
|
86
63
|
- lib
|
87
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
65
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
|
94
|
-
- 0
|
95
|
-
version: "0"
|
96
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
71
|
none: false
|
98
|
-
requirements:
|
99
|
-
- -
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
102
|
-
segments:
|
103
|
-
- 0
|
104
|
-
version: "0"
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
105
76
|
requirements: []
|
106
|
-
|
107
77
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.
|
78
|
+
rubygems_version: 1.8.8
|
109
79
|
signing_key:
|
110
80
|
specification_version: 3
|
111
81
|
summary: A Javascript Component Library
|
112
82
|
test_files: []
|
113
|
-
|