ende 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +2 -2
  3. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +1 -1
  4. data/lib/ende/version.rb +1 -1
  5. data/vendor/assets/components/build.js +638 -133
  6. data/vendor/components/indefinido-indemma/.gitignore +14 -0
  7. data/vendor/components/indefinido-indemma/.gitignore~ +2 -0
  8. data/vendor/components/indefinido-indemma/.ruby-gemset +1 -0
  9. data/vendor/components/indefinido-indemma/.ruby-version +1 -0
  10. data/vendor/components/indefinido-indemma/Gemfile +13 -0
  11. data/vendor/components/indefinido-indemma/Guardfile +39 -0
  12. data/vendor/components/indefinido-indemma/History.md +0 -0
  13. data/vendor/components/indefinido-indemma/Readme.md +447 -0
  14. data/vendor/components/indefinido-indemma/build/development.js +340 -0
  15. data/vendor/components/indefinido-indemma/build/release.js +22039 -0
  16. data/vendor/components/indefinido-indemma/build/test.js +22039 -0
  17. data/vendor/components/indefinido-indemma/component.json +7 -3
  18. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/component.json +18 -0
  19. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/index.js +110 -0
  20. data/vendor/components/indefinido-indemma/components/chaijs-chai/component.json +47 -0
  21. data/vendor/components/indefinido-indemma/components/chaijs-chai/index.js +1 -0
  22. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/assertion.js +130 -0
  23. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  24. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  25. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  26. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  27. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  28. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  29. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  30. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/eql.js +129 -0
  31. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  32. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  33. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  34. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  35. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  36. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  37. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  38. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  39. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  40. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  41. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  42. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  43. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  44. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  45. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  46. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai.js +80 -0
  47. data/vendor/components/indefinido-indemma/components/component-bind/component.json +14 -0
  48. data/vendor/components/indefinido-indemma/components/component-bind/index.js +24 -0
  49. data/vendor/components/indefinido-indemma/components/component-jquery/component.json +14 -0
  50. data/vendor/components/indefinido-indemma/components/component-jquery/index.js +9601 -0
  51. data/vendor/components/indefinido-indemma/components/component-type/component.json +18 -0
  52. data/vendor/components/indefinido-indemma/components/component-type/index.js +32 -0
  53. data/vendor/components/indefinido-indemma/components/indefinido-advisable/component.json +21 -0
  54. data/vendor/components/indefinido-indemma/components/indefinido-advisable/index.js +1 -0
  55. data/vendor/components/indefinido-indemma/components/indefinido-advisable/lib/advisable.js +60 -0
  56. data/vendor/components/indefinido-indemma/components/indefinido-observable/component.json +25 -0
  57. data/vendor/components/indefinido-indemma/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  58. data/vendor/components/indefinido-indemma/components/indefinido-observable/index.js +1 -0
  59. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  60. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/observable.js +323 -0
  61. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  62. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  63. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  64. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  65. data/vendor/components/indefinido-indemma/components/kapit-observe-utils/component.json +13 -0
  66. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/component.json +17 -0
  67. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/es6-shim.js +996 -0
  68. data/vendor/components/indefinido-indemma/components/pluma-assimilate/component.json +25 -0
  69. data/vendor/components/indefinido-indemma/components/pluma-assimilate/dist/assimilate.js +127 -0
  70. data/vendor/components/indefinido-indemma/karma.conf.js +86 -0
  71. data/vendor/components/indefinido-indemma/lib/record/associable.js +229 -82
  72. data/vendor/components/indefinido-indemma/lib/record/errors.js +1 -0
  73. data/vendor/components/indefinido-indemma/lib/record/persistable.js +32 -0
  74. data/vendor/components/indefinido-indemma/lib/record/queryable.js +32 -0
  75. data/vendor/components/indefinido-indemma/lib/record/resource.js +12 -4
  76. data/vendor/components/indefinido-indemma/lib/record/rest.js +1 -1
  77. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +38 -27
  78. data/vendor/components/indefinido-indemma/lib/record/scopable.js +15 -2
  79. data/vendor/components/indefinido-indemma/lib/record/storable.js +48 -0
  80. data/vendor/components/indefinido-indemma/lib/record/validatable.js +10 -5
  81. data/vendor/components/indefinido-indemma/lib/record/validations/cpf.js +1 -1
  82. data/vendor/components/indefinido-indemma/lib/record.js +15 -12
  83. data/vendor/components/indefinido-indemma/spec/record/associable_spec.js +137 -0
  84. data/vendor/components/indefinido-indemma/spec/record/persistable_spec.js +36 -0
  85. data/vendor/components/indefinido-indemma/spec/record/queryable_spec.js +33 -0
  86. data/vendor/components/indefinido-indemma/spec/record/resource_spec.js +93 -0
  87. data/vendor/components/indefinido-indemma/spec/record/rest_spec.js +32 -0
  88. data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +288 -0
  89. data/vendor/components/indefinido-indemma/spec/record/scopable_spec.js +212 -0
  90. data/vendor/components/indefinido-indemma/spec/record/storable_spec.js +53 -0
  91. data/vendor/components/indefinido-indemma/spec/record/translationable.js +28 -0
  92. data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +111 -0
  93. data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +43 -0
  94. data/vendor/components/indefinido-indemma/spec/record/validations/confirmation_spec.js +36 -0
  95. data/vendor/components/indefinido-indemma/spec/record/validations/cpf_spec.js +35 -0
  96. data/vendor/components/indefinido-indemma/spec/record/validations/presence_spec.js +28 -0
  97. data/vendor/components/indefinido-indemma/spec/record/validations/remote_spec.js +87 -0
  98. data/vendor/components/indefinido-indemma/spec/record/validations/type_spec.js +48 -0
  99. data/vendor/components/indefinido-indemma/spec/record_spec.js +37 -0
  100. data/vendor/components/indefinido-indemma/spec/spec_helper.js +11 -0
  101. data/vendor/components/indefinido-indemma/spec/support/value_objects/phone.js +45 -0
  102. data/vendor/components/indefinido-indemma/src/lib/extensions/rivets.coffee +17 -0
  103. data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +342 -0
  104. data/vendor/components/indefinido-indemma/src/lib/record/errors.coffee +20 -0
  105. data/vendor/components/indefinido-indemma/src/lib/record/maid.coffee +16 -0
  106. data/vendor/components/indefinido-indemma/src/lib/record/persistable.coffee +27 -0
  107. data/vendor/components/indefinido-indemma/src/lib/record/queryable.coffee +29 -0
  108. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +106 -0
  109. data/vendor/components/indefinido-indemma/src/lib/record/rest.coffee +28 -0
  110. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +348 -0
  111. data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +275 -0
  112. data/vendor/components/indefinido-indemma/src/lib/record/storable.coffee +46 -0
  113. data/vendor/components/indefinido-indemma/src/lib/record/translationable.coffee +18 -0
  114. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +217 -0
  115. data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +32 -0
  116. data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +19 -0
  117. data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +58 -0
  118. data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +19 -0
  119. data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +65 -0
  120. data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +32 -0
  121. data/vendor/components/indefinido-indemma/src/lib/record.coffee +136 -0
  122. data/vendor/components/indefinido-indemma/src/spec/record/associable_spec.coffee +130 -0
  123. data/vendor/components/indefinido-indemma/src/spec/record/persistable_spec.coffee +30 -0
  124. data/vendor/components/indefinido-indemma/src/spec/record/queryable_spec.coffee +27 -0
  125. data/vendor/components/indefinido-indemma/src/spec/record/resource_spec.coffee +69 -0
  126. data/vendor/components/indefinido-indemma/src/spec/record/rest_spec.coffee +22 -0
  127. data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +207 -0
  128. data/vendor/components/indefinido-indemma/src/spec/record/scopable_spec.coffee +191 -0
  129. data/vendor/components/indefinido-indemma/src/spec/record/storable_spec.coffee +40 -0
  130. data/vendor/components/indefinido-indemma/src/spec/record/translationable.coffee +19 -0
  131. data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +100 -0
  132. data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +35 -0
  133. data/vendor/components/indefinido-indemma/src/spec/record/validations/confirmation_spec.coffee +25 -0
  134. data/vendor/components/indefinido-indemma/src/spec/record/validations/cpf_spec.coffee +28 -0
  135. data/vendor/components/indefinido-indemma/src/spec/record/validations/presence_spec.coffee +24 -0
  136. data/vendor/components/indefinido-indemma/src/spec/record/validations/remote_spec.coffee +74 -0
  137. data/vendor/components/indefinido-indemma/src/spec/record/validations/type_spec.coffee +33 -0
  138. data/vendor/components/indefinido-indemma/src/spec/record_spec.coffee +23 -0
  139. data/vendor/components/indefinido-indemma/src/spec/spec_helper.coffee +9 -0
  140. data/vendor/components/indefinido-indemma/src/spec/support/value_objects/phone.coffee +30 -0
  141. data/vendor/components/indefinido-indemma/vendor/object/mixin.js +196 -0
  142. data/vendor/components/indefinido-indemma/vendor/owl/pluralize.js +190 -0
  143. metadata +130 -2
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/observable');
@@ -0,0 +1,26 @@
1
+ exports.adapter = {
2
+ subscribe: function(record, attribute_path, callback) {
3
+ if (record == null) {
4
+ throw new TypeError('observable.adapters.rivets.subscribe: No record provided for subscription');
5
+ }
6
+ return record.subscribe(attribute_path, callback);
7
+ },
8
+ unsubscribe: function(record, attribute_path, callback) {
9
+ if (record == null) {
10
+ throw new TypeError('observable.adapters.rivets.unsubscribe: No record provided for subscription');
11
+ }
12
+ return record.unsubscribe(attribute_path, callback);
13
+ },
14
+ read: function(record, attribute_path) {
15
+ if (record == null) {
16
+ throw new TypeError('observable.adapters.rivets.read: No record provided for subscription');
17
+ }
18
+ return record[attribute_path];
19
+ },
20
+ publish: function(record, attribute_path, value) {
21
+ if (record == null) {
22
+ throw new TypeError('observable.adapters.rivets.publish: No record provided for subscription');
23
+ }
24
+ return record[attribute_path] = value;
25
+ }
26
+ };
@@ -0,0 +1,323 @@
1
+ // TODO Better keypath support
2
+
3
+ // Shim older browsers
4
+ if (!Object.create ) require('../vendor/shims/object.create');
5
+ if (!Array.prototype.indexOf) require('../vendor/shims/array.indexOf');
6
+
7
+ // Object.defineProperty (for ie5+)
8
+ if (typeof require != 'undefined') {
9
+ require('../vendor/shims/accessors.js');
10
+
11
+ // __lookup*__ and __define*__ for browsers with defineProperty support
12
+ // TODO Figure out why gives an infinity loop
13
+ require('../vendor/shims/accessors-legacy.js');
14
+ }
15
+
16
+ // Require Dependencies
17
+ if (!window['jQuery']) jQuery = $ = require('jquery');
18
+
19
+ // Observable Implementation
20
+ var observable, requiresDomElement, check, lookup, mixin, generator, mutations;
21
+
22
+ // Support objects
23
+
24
+ // TODO implement Object.getOwnPropertyDescriptor
25
+ lookup = {
26
+ setter: Object.prototype.__lookupSetter__ || function (property) {
27
+ return this.observed && this.observed[property + '_setter'];
28
+ },
29
+ getter: Object.prototype.__lookupGetter__ || function (property) {
30
+ var default_getter;
31
+ return this.observed && this.observed[property + '_getter'] || (
32
+ (default_getter = $.proxy(lookup.default_getter, this, property)) &&
33
+ (default_getter.is_default = true) &&
34
+ (default_getter)
35
+ );
36
+ },
37
+ types: {
38
+ 'undefined': undefined,
39
+ 'null': null,
40
+ 'true': true,
41
+ 'false': false,
42
+ 'NaN': NaN
43
+ },
44
+ // overrides: [Object.prototype.toString, String.prototype.toString, Array.prototype.toString, Number.prototype.toString],
45
+ basic_types: [undefined, null],
46
+ default_getter: function (property) {
47
+ var possible_value = this[property];
48
+
49
+ // Getter is the toString property of object
50
+ if (possible_value && possible_value.hasOwnProperty('toString')) {
51
+
52
+ if (possible_value.toString.is_default) return this.observed[property];
53
+
54
+ return possible_value.toString.call(this);
55
+
56
+ } else if (possible_value in lookup.types) {
57
+
58
+ return lookup.types[possible_value];
59
+
60
+ } else return possible_value;
61
+ }
62
+ };
63
+
64
+
65
+ // Core Implementation
66
+
67
+ requiresDomElement = Object.defineProperty['requiresDomElement'];
68
+
69
+ mixin = {
70
+ subscribe: function observable_subscribe (keypath, callback) {
71
+ if (keypath == 'observed') throw new TypeError('observable.subscribe: cannot observe reserved property observed');
72
+ if ($.isArray(this[keypath])) generator.mutations.call(this, keypath);
73
+ generator.observe.call(this, keypath, callback);
74
+ return true;
75
+ },
76
+ unsubscribe: function (object, keypath, callback) {
77
+ console.error("observable.unsubscribe not implemented yet.");
78
+ console.log(object, keypath, callback);
79
+ },
80
+ publish: function observable_publish (keypath, value) {
81
+ // TODO actually call callbacks
82
+ return this[keypath] = value;
83
+ }
84
+ };
85
+
86
+
87
+ if (requiresDomElement) {
88
+
89
+ observable = function (object) {
90
+
91
+ // observable() or observable(object)
92
+ if (this.document && this.location) {
93
+ if (!object) {
94
+ object = {};
95
+ }
96
+ // observable.call(...)
97
+ } else {
98
+ // observable.call(param, param)
99
+ if (object) {
100
+ throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');
101
+ // observable.call(object)
102
+ } else {
103
+ object = this;
104
+ }
105
+ }
106
+
107
+ if (!jQuery.isReady) throw new Error('observable.call: For compatibility reasons, observable can only be called when dom is loaded.');
108
+ var fix = document.createElement('fix');
109
+
110
+ if (!jQuery.isReady) $(function () {document.body.appendChild(fix);});
111
+ else document.body.appendChild(fix);
112
+
113
+ if (!object.observed) generator.observable_for(fix);
114
+
115
+ return $.extend(fix, object, mixin);
116
+ };
117
+
118
+ var ignores = document.createElement('fix'), fix_ignores = [], property;
119
+
120
+ for (property in ignores) {
121
+ fix_ignores.push(property);
122
+ }
123
+
124
+ observable.ignores = fix_ignores;
125
+
126
+ } else {
127
+
128
+ observable = function (object) {
129
+ // observable() or observable(object)
130
+ if (this === window) {
131
+ if (!object) {
132
+ object = {};
133
+ }
134
+ // observable.call(...)
135
+ } else if (this !== window) {
136
+ // observable.call(param, param)
137
+ if (object) {
138
+ throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');
139
+ // observable.call(object)
140
+ } else {
141
+ object = this;
142
+ }
143
+ }
144
+
145
+ if (!object.observed) generator.observable_for(object);
146
+
147
+ return $.extend(object, mixin);
148
+ };
149
+
150
+ observable.ignores = [];
151
+ }
152
+
153
+
154
+ observable.unobserve = function (object) {
155
+ var property;
156
+
157
+ for (property in mixin) {
158
+ delete object[property];
159
+ }
160
+
161
+ delete object.observed;
162
+ return true;
163
+ };
164
+
165
+ check = function (keypath, value) {
166
+ this.observed[keypath] = value;
167
+
168
+ // TODO implement subscription
169
+ (this.dirty === false) && (this.dirty = true);
170
+ return true;
171
+ };
172
+
173
+ generator = {
174
+ observe: function(keypath, callback) {
175
+ return Object.defineProperty(this, keypath, {
176
+ get: generator.getter.call(this, keypath),
177
+ set: generator.setter.call(this, keypath, callback),
178
+ enumerable: true
179
+ });
180
+ },
181
+
182
+ observable_for: function (object) {
183
+ return Object.defineProperty(object, 'observed', {
184
+ configurable: true,
185
+ enumerable: false,
186
+ value: {}
187
+ });
188
+ },
189
+
190
+ // TODO improve readability
191
+ // TODO implement linked list
192
+ setter: function subscribed_setter (keypath, callback) {
193
+ var setter = lookup.setter.call(this, keypath), current, getter, old_setter;
194
+
195
+ // Set value
196
+ this.observed[keypath] = lookup.getter.call(this, keypath) && lookup.getter.call(this, keypath)() || this[keypath];
197
+
198
+ // First time subscribing
199
+ if (!setter) {
200
+ setter = function setter (value) {
201
+ check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);
202
+ };
203
+
204
+ // First time subscribing but does not have callback_thread associated
205
+ } else if (!setter.callback_thread) {
206
+ old_setter = setter;
207
+ setter = function setter (value) {
208
+ check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);
209
+ };
210
+
211
+ setter.callback_thread = old_setter;
212
+ }
213
+
214
+ current = setter.callback_thread || $.noop;
215
+
216
+ setter.callback_thread = function thread (value) {
217
+ current.call(this, value) !== false && callback.call(this, value);
218
+ };
219
+
220
+ // TODO better implementation of loookup setter / lookup getter on accessors shim
221
+ if (requiresDomElement) this.observed[keypath + '_setter'] = setter;
222
+
223
+ return setter;
224
+ },
225
+ getter: function subscribed_getter (keypath) {
226
+ var object = this, getter;
227
+
228
+ getter = lookup.getter.call(this, keypath) || function root_getter () {
229
+ return object.observed[keypath];
230
+ };
231
+
232
+ // TODO better implementation of loookup setter / lookup getter on accessors shim
233
+ if (requiresDomElement) this.observed[keypath + '_getter'] = getter;
234
+
235
+ return getter;
236
+ },
237
+ mutations: function(keypath) {
238
+ var setter = lookup.setter.call(this, keypath),
239
+ array = this[keypath];
240
+
241
+ // First time subscribing, and it is an array
242
+ if (!setter) {
243
+ // TODO use this.subscribe instead of generator.observe.call
244
+ generator.observe.call(this, keypath, function(new_array) {
245
+ var i, type, j;
246
+
247
+ // Avoid non push operations!
248
+ // TODO remove jquery dependency
249
+ if ($.type(new_array) !== 'array') return;
250
+
251
+ // Skip this if it is not the first time
252
+ if (new_array.object === array.object && new_array.thread === array.thread) return;
253
+ i = new_array.length;
254
+ j = new_array.length;
255
+
256
+ new_array.thread = array.thread;
257
+ new_array.object = array.object;
258
+ new_array.key = keypath;
259
+
260
+ while (i--) {
261
+ // TODO remove jquery dependency
262
+ type = $.type(arguments[i]);
263
+ if (!new_array[i].observed
264
+ && (type != 'object' || type != 'array')) {
265
+ new_array[i] = observable(new_array[i]);
266
+ }
267
+ }
268
+
269
+ new_array.length = j;
270
+
271
+ // Update internal property value
272
+ $.extend(new_array, mutations.overrides);
273
+ });
274
+
275
+ setter = lookup.setter.call(this, keypath);
276
+ }
277
+
278
+ // TODO Transform this code to define property
279
+ array.thread = setter.callback_thread;
280
+ array.object = this;
281
+ array.key = keypath;
282
+
283
+ // Override default array methods
284
+ $.extend(array, mutations.overrides);
285
+
286
+ if (!this.observed.mutate) this.observed.mutate = mutations.mutate;
287
+ }
288
+ };
289
+
290
+ mutations = {
291
+ mutate: function(thread, method, array) {
292
+ array.method = method;
293
+ thread.call(this, array);
294
+ this.publish(array.key, array); // TODO ver se é uma boa
295
+ delete array.method;
296
+ },
297
+ overrides: {
298
+ push: function() {
299
+ var i = arguments.length, operation;
300
+
301
+ while (i--) {
302
+ !arguments[i].observed && $.type(arguments[i]) == 'object' && (arguments[i] = observable(arguments[i]));
303
+ }
304
+
305
+ operation = Array.prototype.push.apply(this, arguments); // TODO Convert arguments for real array
306
+ this.object.observed.mutate.call(this.object, this.thread, 'push', this);
307
+ return operation;
308
+ }
309
+ }
310
+ };
311
+
312
+ $('pop shift unshift'.split(' ')).each(function (i, method) {
313
+ mutations.overrides[method] = function () {
314
+ Array.prototype[method].apply(this, arguments);
315
+ this.object.observed.mutate.call(this.object, this.thread, method, this);
316
+ };
317
+ });
318
+
319
+ if (typeof exports != 'undefined') {
320
+ exports.mixin = observable;
321
+ } else {
322
+ window.observable = observable;
323
+ }
@@ -0,0 +1,92 @@
1
+ /*
2
+ * Xccessors Legacy: Cross-browser legacy non-standard accessors
3
+ * http://github.com/eligrey/Xccessors
4
+ *
5
+ * 2010-03-21
6
+ *
7
+ * By Elijah Grey, http://eligrey.com
8
+ *
9
+ * A shim that implements __defineGetter__, __defineSetter__, __lookupGetter__,
10
+ * and __lookupSetter__
11
+ * in browsers that have ECMAScript 5 accessor support but not the legacy methods.
12
+ *
13
+ * Public Domain.
14
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
15
+ */
16
+
17
+ /*global Element, Window, HTMLDocument */
18
+
19
+ /*jslint white: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true,
20
+ strict: true, newcap: true, immed: true, maxlen: 90 */
21
+
22
+ /*! @source http://purl.eligrey.com/github/Xccessors/blob/master/xccessors-legacy.js*/
23
+
24
+ "use strict";
25
+
26
+ (function () {
27
+ var
28
+ defineProp = Object.defineProperty,
29
+ getProp = Object.getOwnPropertyDescriptor,
30
+
31
+ // methods being implemented
32
+ methods = [
33
+ "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"
34
+ ],
35
+
36
+ // objects to implement legacy methods onto their prototypes
37
+ // Object.prototype[method] doesn't work on everything for IE
38
+ extend = [Object, String, Array, Function, Boolean, Number,
39
+ RegExp, Date, Error],
40
+ len = extend.length,
41
+ proto = "prototype",
42
+ extendMethod = function (method, fun) {
43
+ var i = len;
44
+ if (!(method in {})) {
45
+ while (i--) {
46
+ defineProp(extend[i][proto], method, {value: fun, enumerable: false})
47
+ }
48
+ }
49
+ };
50
+
51
+ // IE8 Does not support enumerable key so we abort!
52
+ // TODO Fix this without cluttering the prototype
53
+ try {defineProp({}, 'domo', {value: true, enumerable: false})} catch (e) {return;}
54
+
55
+ // IE7 Does not have Element, Window defined, so we check here
56
+ if (typeof Element != 'undefined') extend.push(Element);
57
+ if (typeof Window != 'undefined') extend.push(Window);
58
+
59
+ // IE9 Does not have html document defined, so we check here
60
+ if (typeof HTMLDocument != 'undefined') extend.push(HTMLDocument);
61
+
62
+
63
+ if (defineProp) {
64
+ extendMethod(methods[0], function (prop, fun) { // __defineGetter__
65
+ defineProp(this, prop, { get: fun });
66
+ });
67
+
68
+ extendMethod(methods[1], function (prop, fun) { // __defineSetter__
69
+ defineProp(this, prop, { set: fun });
70
+ });
71
+ }
72
+
73
+ if (getProp && !defineProp.requiresDomElement) {
74
+ extendMethod(methods[2], function (prop) { // __lookupGetter__
75
+ var descriptor = getProp(this, prop);
76
+ if (descriptor && descriptor.get) return descriptor.get;
77
+
78
+ // look in prototype too
79
+ descriptor = getProp(this.constructor[proto], prop);
80
+ if (descriptor && descriptor.get) return descriptor.get;
81
+ });
82
+
83
+ extendMethod(methods[3], function (prop) { // __lookupSetter__
84
+ var descriptor = getProp(this, prop);
85
+ if (descriptor && descriptor.set) return descriptor.set;
86
+
87
+ // look in prototype too
88
+ descriptor = getProp(this.constructor[proto], prop);
89
+ if (descriptor && descriptor.set) return descriptor.set;
90
+ });
91
+ }
92
+ }());
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ (function () {
4
+ // Cache native objects for better performacy and easy to use
5
+ // references
6
+ var ObjectProto = Object.prototype,
7
+ hasOwnProp = ObjectProto.hasOwnProperty,
8
+ getProp = Object.getOwnPropertyDescriptor,
9
+ defineProp = Object.defineProperty,
10
+ toStrings = [],
11
+ features = null,
12
+ stack = [], detach,
13
+ prototypeBase = [Object, String, Array, Function, Boolean, Number, RegExp, Date, Error];
14
+
15
+ // IE7 Does not have Element and Window defined, so only add them if
16
+ // they exists check here
17
+ if (typeof Element != 'undefined') prototypeBase.push(Element);
18
+ if (typeof Window != 'undefined') prototypeBase.push(Window);
19
+
20
+ features = {
21
+ allowsNonEnumerableProperty: function () {
22
+ var broken = false;
23
+ try {
24
+ defineProp({}, 'x', {})
25
+ } catch(e) {
26
+ broken = true;
27
+ }
28
+
29
+ return (!broken) && (!!defineProp);
30
+ },
31
+ supportsOnPropertyChangeEvent: function () {
32
+ var test = document.createElement('domo');
33
+ return 'onpropertychange' in test
34
+ }
35
+ }
36
+
37
+ if (!features.allowsNonEnumerableProperty() && features.supportsOnPropertyChangeEvent()) {
38
+
39
+ // Check if node is on document
40
+ var inDocument = function inDocument (node) {
41
+ var curr = node;
42
+ while (curr != null) {
43
+ curr = curr.parentNode;
44
+ if (curr == document) return true;
45
+ }
46
+ return false;
47
+ },
48
+
49
+ // Generate property event handler for setting some property
50
+ generate_setter = function generate_setter (object, property, descriptor) {
51
+ var setter = function object_define_property_shim_change_listener (event) {
52
+ var current_value, changed_value;
53
+ if (
54
+ // if we are setting this property
55
+ event.propertyName == property
56
+
57
+ // prevent firing setters again
58
+ // by checking callstack
59
+ && stack.indexOf(property) === -1
60
+ ) {
61
+ // Remove the event so it doesn't fire again and
62
+ // create a loop
63
+ object.detachEvent("onpropertychange", setter);
64
+
65
+ // If detaching the current setter
66
+ // just remove the event listener
67
+ if (detach) return;
68
+
69
+ // get the changed value, run it through the set function
70
+ changed_value = object[property];
71
+ descriptor.set.call(object, changed_value);
72
+
73
+ // Restore get function if it exists and there's no falsey value
74
+ if (descriptor.get && descriptor.value && descriptor.value.toString != descriptor.bound_getter) {
75
+ // TODO if (descriptor.get + '' === 'undefined') descriptor.get = ''; // Handle undefined getter
76
+ descriptor.value.toString = descriptor.bound_getter
77
+ }
78
+
79
+ // Update stored values
80
+ object[property] = descriptor.value = changed_value;
81
+
82
+ // restore the event handler
83
+ object.attachEvent("onpropertychange", setter);
84
+
85
+ // stack.pop();
86
+ return false;
87
+ }
88
+ }
89
+
90
+ return setter;
91
+ }
92
+
93
+ // Shim define property with apropriated fail cases exceptions
94
+ Object.defineProperty = function (obj, prop, descriptor) {
95
+ var fix;
96
+
97
+ if (!obj.attachEvent) throw new TypeError('Object.defineProperty: First parameter must be a dom element.');
98
+
99
+ if (!fix && !inDocument(obj)) throw new TypeError('Object.defineProperty: Dom element must be attached in document.');
100
+
101
+ if (!descriptor) throw new TypeError('Object.defineProperty (object, property, descriptor): Descriptor must be an object, was \'' + descriptor + '\'.');
102
+
103
+ if ((descriptor.get || descriptor.set) && descriptor.value) throw new TypeError('Object.defineProperty: Descriptor must have only getters and setters or value.');
104
+
105
+ // Store current value in descriptor
106
+ descriptor.value = descriptor.value || (descriptor.get && descriptor.get.call(obj)) || obj[prop];
107
+
108
+ if (descriptor.get || descriptor.set) {
109
+ // Detach old listeners if any
110
+ detach = true;
111
+ obj[prop] = 'detaching';
112
+ detach = false;
113
+
114
+ if (descriptor.get) {
115
+ descriptor.bound_getter = $.extend($.proxy(descriptor.get, obj), descriptor.get);
116
+
117
+ // We only bind the getter when we have a non falsey value
118
+ if (descriptor.value) descriptor.value.toString = descriptor.bound_getter;
119
+
120
+ // Although its not allowed for convention to have getters
121
+ // and setters with the descriptor value, here we just reuse
122
+ // the descriptor stored value
123
+ obj[prop] = descriptor.value;
124
+ }
125
+
126
+ (fix || obj).attachEvent("onpropertychange", generate_setter(obj, prop, descriptor));
127
+
128
+ } else {
129
+ obj[prop] = descriptor.value;
130
+ }
131
+
132
+ return obj;
133
+ }
134
+
135
+ // Allow others to check requirements for define property
136
+ Object.defineProperty.requiresDomElement = true
137
+ }
138
+
139
+
140
+ // Since we shimed define property, we can also shim defineProperties
141
+ if (!Object.defineProperties) {
142
+ Object.defineProperties = function (obj, props) {
143
+ for (var prop in props) {
144
+ if (hasOwnProp.call(props, prop)) {
145
+ Object.defineProperty(obj, prop, props[prop]);
146
+ }
147
+ }
148
+ };
149
+ }
150
+
151
+ /* TODO Use define Property, and only define if
152
+ non-enumerable properties are allowed
153
+
154
+ also define __defineGetter__ and __defineSetter__
155
+ if (!Object.defineProperty.requiresDomElement) {
156
+ if (!Object.prototype.__lookupGetter__) {
157
+ Object.__lookupGetter__ = function () {
158
+ console && console.log('__lookupGetter__ not implemented yet');
159
+ return null;
160
+ }
161
+ }
162
+
163
+ if (!Object.__lookupSetter__) {
164
+ Object.prototype.__lookupSetter__ = function () {
165
+ console && console.log('__lookupSetter__ not implemented yet');
166
+ return null;
167
+ }
168
+ }
169
+ }
170
+ */
171
+
172
+ })();
173
+
@@ -0,0 +1,8 @@
1
+ if (!Array.prototype.indexOf) {
2
+ Array.prototype.indexOf = function(obj, start) {
3
+ for (var i = (start || 0), j = this.length; i < j; i++) {
4
+ if (this[i] === obj) { return i; }
5
+ }
6
+ return -1;
7
+ }
8
+ }