ende 0.5.1 → 0.5.2

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.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +2 -2
  3. data/components/indefinido/indemma/master/component.json +27 -17
  4. data/components/indefinido/indemma/master/lib/record/associable.js +74 -75
  5. data/components/indefinido/indemma/master/lib/record/dirtyable.js +40 -0
  6. data/components/indefinido/indemma/master/lib/record/queryable.js +2 -2
  7. data/components/indefinido/indemma/master/lib/record/resource.js +1 -1
  8. data/components/indefinido/indemma/master/lib/record/rest.js +7 -2
  9. data/components/indefinido/indemma/master/lib/record/restfulable.js +37 -10
  10. data/components/indefinido/indemma/master/lib/record/scopable.js +20 -47
  11. data/components/indefinido/indemma/master/lib/record/storable.js +11 -0
  12. data/components/indefinido/indemma/master/lib/record/validatable.js +195 -1068
  13. data/components/indefinido/indemma/master/lib/record.js +1 -1
  14. data/components/indefinido/indemma/master/vendor/stampit.js +568 -242
  15. data/components/indefinido/observable/es6-modules/component.json +39 -0
  16. data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/lib/adapters/rivets.js +3 -1
  17. data/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
  18. data/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +114 -0
  19. data/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
  20. data/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
  21. data/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
  22. data/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
  23. data/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
  24. data/components/indefinido/observable/es6-modules/lib/observable.js +90 -0
  25. data/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
  26. data/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
  27. data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/accessors.js +85 -10
  28. data/lib/assets/javascripts/aura/extensions/rivets.js.coffee +1 -1
  29. data/lib/ende/version.rb +1 -1
  30. data/vendor/assets/components/ende_build.js +18379 -26828
  31. metadata +20 -128
  32. data/components/indefinido/indemma/master/.gitignore +0 -17
  33. data/components/indefinido/indemma/master/.ruby-gemset +0 -1
  34. data/components/indefinido/indemma/master/.ruby-version +0 -1
  35. data/components/indefinido/indemma/master/Gemfile +0 -13
  36. data/components/indefinido/indemma/master/Guardfile +0 -39
  37. data/components/indefinido/indemma/master/History.md +0 -0
  38. data/components/indefinido/indemma/master/Readme.md +0 -447
  39. data/components/indefinido/indemma/master/build/build.js +0 -26288
  40. data/components/indefinido/indemma/master/build/development.js +0 -22200
  41. data/components/indefinido/indemma/master/build/release.js +0 -22139
  42. data/components/indefinido/indemma/master/build/test.js +0 -22200
  43. data/components/indefinido/indemma/master/components/chaijs-assertion-error/component.json +0 -18
  44. data/components/indefinido/indemma/master/components/chaijs-assertion-error/index.js +0 -110
  45. data/components/indefinido/indemma/master/components/chaijs-chai/component.json +0 -47
  46. data/components/indefinido/indemma/master/components/chaijs-chai/index.js +0 -1
  47. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/assertion.js +0 -130
  48. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/core/assertions.js +0 -1270
  49. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/assert.js +0 -1080
  50. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/expect.js +0 -12
  51. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/should.js +0 -76
  52. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +0 -94
  53. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addMethod.js +0 -37
  54. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addProperty.js +0 -40
  55. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/eql.js +0 -129
  56. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/flag.js +0 -32
  57. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getActual.js +0 -19
  58. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +0 -25
  59. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getMessage.js +0 -49
  60. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getName.js +0 -20
  61. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getPathValue.js +0 -102
  62. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getProperties.js +0 -35
  63. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/index.js +0 -108
  64. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/inspect.js +0 -320
  65. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/objDisplay.js +0 -48
  66. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +0 -51
  67. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +0 -54
  68. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/test.js +0 -26
  69. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/transferFlags.js +0 -44
  70. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/type.js +0 -45
  71. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai.js +0 -80
  72. data/components/indefinido/indemma/master/components/component-bind/component.json +0 -14
  73. data/components/indefinido/indemma/master/components/component-bind/index.js +0 -24
  74. data/components/indefinido/indemma/master/components/component-jquery/component.json +0 -14
  75. data/components/indefinido/indemma/master/components/component-jquery/index.js +0 -9601
  76. data/components/indefinido/indemma/master/components/component-type/component.json +0 -18
  77. data/components/indefinido/indemma/master/components/component-type/index.js +0 -32
  78. data/components/indefinido/indemma/master/components/indefinido-advisable/component.json +0 -21
  79. data/components/indefinido/indemma/master/components/indefinido-advisable/index.js +0 -1
  80. data/components/indefinido/indemma/master/components/indefinido-advisable/lib/advisable.js +0 -60
  81. data/components/indefinido/indemma/master/components/indefinido-observable/component.json +0 -25
  82. data/components/indefinido/indemma/master/components/indefinido-observable/components/cjohansen-sinon/sinon.js +0 -4290
  83. data/components/indefinido/indemma/master/components/indefinido-observable/lib/observable.js +0 -323
  84. data/components/indefinido/indemma/master/components/kapit-observe-utils/component.json +0 -13
  85. data/components/indefinido/indemma/master/components/paulmillr-es6-shim/component.json +0 -17
  86. data/components/indefinido/indemma/master/components/paulmillr-es6-shim/es6-shim.js +0 -996
  87. data/components/indefinido/indemma/master/components/pluma-assimilate/component.json +0 -25
  88. data/components/indefinido/indemma/master/components/pluma-assimilate/dist/assimilate.js +0 -127
  89. data/components/indefinido/indemma/master/karma.conf.js +0 -76
  90. data/components/indefinido/indemma/master/package.json +0 -9
  91. data/components/indefinido/indemma/master/spec/record/associable_spec.js +0 -137
  92. data/components/indefinido/indemma/master/spec/record/persistable_spec.js +0 -36
  93. data/components/indefinido/indemma/master/spec/record/queryable_spec.js +0 -33
  94. data/components/indefinido/indemma/master/spec/record/resource_spec.js +0 -93
  95. data/components/indefinido/indemma/master/spec/record/rest_spec.js +0 -32
  96. data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +0 -300
  97. data/components/indefinido/indemma/master/spec/record/scopable_spec.js +0 -212
  98. data/components/indefinido/indemma/master/spec/record/storable_spec.js +0 -53
  99. data/components/indefinido/indemma/master/spec/record/translationable.js +0 -28
  100. data/components/indefinido/indemma/master/spec/record/validatable_spec.js +0 -111
  101. data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +0 -43
  102. data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +0 -36
  103. data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +0 -35
  104. data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +0 -28
  105. data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +0 -87
  106. data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +0 -48
  107. data/components/indefinido/indemma/master/spec/record_spec.js +0 -37
  108. data/components/indefinido/indemma/master/spec/spec_helper.js +0 -11
  109. data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +0 -45
  110. data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +0 -17
  111. data/components/indefinido/indemma/master/src/lib/record/associable.coffee +0 -380
  112. data/components/indefinido/indemma/master/src/lib/record/errors.coffee +0 -20
  113. data/components/indefinido/indemma/master/src/lib/record/maid.coffee +0 -16
  114. data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +0 -32
  115. data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +0 -30
  116. data/components/indefinido/indemma/master/src/lib/record/resource.coffee +0 -106
  117. data/components/indefinido/indemma/master/src/lib/record/rest.coffee +0 -28
  118. data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +0 -447
  119. data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +0 -294
  120. data/components/indefinido/indemma/master/src/lib/record/storable.coffee +0 -46
  121. data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +0 -18
  122. data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +0 -207
  123. data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +0 -30
  124. data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +0 -17
  125. data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +0 -57
  126. data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +0 -16
  127. data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +0 -61
  128. data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +0 -31
  129. data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +0 -5
  130. data/components/indefinido/indemma/master/src/lib/record.coffee +0 -138
  131. data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +0 -130
  132. data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +0 -30
  133. data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +0 -27
  134. data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +0 -69
  135. data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +0 -22
  136. data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +0 -215
  137. data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +0 -191
  138. data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +0 -40
  139. data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +0 -19
  140. data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +0 -100
  141. data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +0 -35
  142. data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +0 -25
  143. data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +0 -28
  144. data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +0 -24
  145. data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +0 -74
  146. data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +0 -33
  147. data/components/indefinido/indemma/master/src/spec/record_spec.coffee +0 -23
  148. data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +0 -9
  149. data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +0 -30
  150. data/components/indefinido/indemma/master/vendor/object/mixin.js +0 -196
  151. data/components/indefinido/indemma/master/vendor/sinon.js +0 -4290
  152. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/index.js +0 -0
  153. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/accessors-legacy.js +0 -0
  154. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/array.indexOf.js +0 -0
  155. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/object.create.js +0 -0
@@ -1,447 +0,0 @@
1
- merge = require('assimilate').withStrategy 'deep'
2
- type = require 'type'
3
- observable = require('observable').mixin
4
- $ = require 'jquery' # TODO remove jquery dependency and use simple promises implementation
5
- rest = require './rest.js'
6
- root = exports ? @
7
-
8
- util =
9
- model:
10
- map: (records) ->
11
- @ record for record in records
12
-
13
-
14
- restful =
15
- model:
16
- # returns an array of promises
17
- create: (params..., callback) ->
18
- throw new TypeError("No arguments provided for #{@resource}.create") unless arguments.length
19
- unless typeof callback == 'function'
20
- params.push callback
21
- callback = undefined
22
-
23
- params.unshift {} unless params.length
24
-
25
- savings = []
26
- for attributes in params
27
- # TODO accept dirty as attribute on record creation
28
- record = @ attributes
29
- record.dirty = true
30
- savings.push record.save callback
31
-
32
- $.when savings...
33
-
34
- # returns a promise
35
- # TODO move to scopable
36
- every: (conditions = {}, doned, failed) ->
37
- if typeof conditions == 'function'
38
- doned = conditions
39
- conditions = {}
40
-
41
- # TODO Consider parent resources
42
- # if @parent and not @parent._id
43
- # return callback.call @model, []
44
-
45
- $.when(rest.get.call @, conditions)
46
- .then(util.model.map )
47
- .done(doned )
48
- .fail failed
49
-
50
- first: (conditions = {}, callback) ->
51
- if typeof conditions == 'function'
52
- callback = conditions
53
- conditions = {}
54
-
55
- namespaced = conditions[@resource] || {}
56
- namespaced.limit = 1
57
- namespaced.order = 'desc'
58
-
59
- # TODO should fail when server returns more then one record
60
- @every conditions, callback
61
-
62
- # TODO better treating of arguments
63
- get: (action, data = {}) ->
64
- # TODO better way to override route
65
- old_route = @route
66
- default_route = "/#{model.pluralize @resource.name}"
67
- @route = default_route unless default_route == @route
68
-
69
- if action
70
- # TODO Get own property descriptor, or better way do override route
71
- Object.defineProperty @, 'route',
72
- value: "#{default_route}/#{action}"
73
- configurable: true
74
-
75
- # TODO not allow resource overriding
76
- resource = data.resource
77
- data = data.json() if data and data.json
78
-
79
- if resource?
80
- payload = data
81
- data = {}
82
- data[resource] = payload
83
-
84
- promise = rest.get.call @, data
85
-
86
- # TODO Get own property descriptor, or better way do override route
87
- Object.defineProperty @, 'route',
88
- value: old_route
89
- configurable: true
90
-
91
- promise
92
-
93
- put: rest.put
94
- delete: rest.delete
95
-
96
- record:
97
- ready: (callback) -> callback.call @
98
- reload: (params...) ->
99
-
100
- # TODO better signature implementation
101
- data = params.pop()
102
- params.push data if type(data) != 'object'
103
-
104
- promise = rest.get.call @, data || {}
105
- promise.done @assign_attributes
106
- promise.fail @failed
107
-
108
- @reloading = promise
109
- # Assign ready callback before, to allow promise override
110
- @ready = ->
111
- console.warn "resource.ready was deprecated, please use resource.reloading.done"
112
- promise.done arguments...
113
-
114
- # Bind one time save callbacks
115
- promise.done param for param in params
116
-
117
- promise
118
-
119
- assign_attributes: (attributes) ->
120
-
121
- # TODO only set associations on nested attributes!
122
- # First assign has_many associations
123
- # TODO implement setter on has_many association and move this code there
124
- for association_name in model[@resource.toString()].has_many
125
- associations_attributes = attributes[association_name]
126
-
127
- # TODO copy attributes object and don't change it inside the assignment method
128
- delete attributes[association_name] # Remove loaded json data
129
-
130
- # Clear current stored cache on this association
131
- # TODO implement setter on this association and let user to set
132
- # it to an empty array
133
- association = @[association_name]
134
-
135
- unless association?
136
- message = "Association '#{association_name}' not found. \n"
137
- message += "For record with resource #{@resource}. \n"
138
- message += "Probably defined on server side but not on client side.\n"
139
- message += "Skipping association assignment!"
140
- console.warn message
141
- continue
142
-
143
- # TODO implement association.clear
144
- Array.prototype.splice.call association, 0 if association.length
145
-
146
- # continue if no associations_attributes were found by the server
147
- continue unless associations_attributes? and associations_attributes.length
148
-
149
- singular_resource = model.singularize association_name
150
-
151
- # Normalize json data for building on association
152
- for association_attributes in associations_attributes
153
-
154
- # TODO only nest specified nested attributes on model definition
155
- # TODO create special deserialization method no plural association
156
- # TODO check if we need to nest attributes in other association types
157
- for association_name in model[singular_resource].has_many
158
- association_attributes["#{association_name}_attributes"] = association_attributes[association_name]
159
-
160
- # TODO copy attributes object and don't change it inside
161
- # the assignment method
162
- delete association_attributes[association_name]
163
-
164
- # Load new associations_attributes on this association
165
- association.add associations_attributes...
166
-
167
-
168
- # Nested attributes
169
- # TODO implement setter on has_one association and move this
170
- # code there
171
- for association_name in model[@resource.toString()].has_one
172
- association_attributes = attributes[association_name]
173
-
174
- # TODO copy attributes object and don't change it inside the
175
- # assignment method
176
- delete attributes[association_name]
177
- delete attributes[association_name + "_attributes"]
178
- @[association_name] = @["build_#{association_name}"] association_attributes if association_attributes
179
-
180
-
181
- # Assign remaining attributes
182
- # TODO see if it is a best practice not overriding unchanged attributes
183
- # TODO rename attributes for properties
184
- for name, attribute of attributes when attribute isnt @[name]
185
- # TODO faster object property assignment, get from model definition, instead of checking every attribute
186
- # TODO implement custom comparator for each object when es7 is out
187
- if type(attribute) == 'object'
188
- @[name] = attributes[name] if JSON.stringify(attribute) != JSON.stringify @[name]
189
- else
190
- @[name] = attributes[name]
191
-
192
- destroy: (doned, failed, data) ->
193
- throw new Error 'Can\'t delete record without id!' unless @id? or @_id?
194
-
195
- promise = rest.delete.call @, data
196
- promise.done @destroyed
197
- promise.fail @failed
198
-
199
- # Bind one time save callbacks
200
- promise.done doned
201
- promise.fail failed
202
-
203
- promise
204
-
205
- saving: false
206
- salvation: null
207
- save: (doned, failed, data) ->
208
- lock = JSON.stringify @json()
209
-
210
- # When saving and receive save command again check if the model
211
- # has changed, then abort the salvation operation and send a new
212
- # save request
213
- # TODO check dirty property instead of lock!
214
- if @saving
215
- if @lock == lock
216
- return @salvation
217
- else
218
- @salvation.abort()
219
-
220
- # TODO better lock generation
221
- @lock = lock
222
-
223
- # TODO remove jquery dependency
224
- # TODO think with wich value makes more sense to resolve the
225
- # absence of need to save the model
226
- salvation = $.Deferred().resolveWith @, null unless @dirty
227
- @saving = true
228
- salvation ||= rest[if @_id then 'put' else 'post'].call @, data
229
- @salvation = salvation
230
-
231
- salvation.done @saved
232
- salvation.fail @failed
233
- salvation.always -> @saving = false
234
-
235
- # Bind one time save callbacks
236
- salvation.done doned
237
- salvation.fail failed
238
-
239
- salvation
240
-
241
- saved: (data) ->
242
-
243
- # TODO better lock generation
244
- if @lock == JSON.stringify(@json())
245
- @dirty = false
246
- delete @lock
247
-
248
- @assign_attributes data if data?
249
-
250
- throw "Not supported after_save callback: " + callback for callback in @after_save if @after_save
251
-
252
- # Parse error json if any
253
- failed: (xhr, error, status) ->
254
- payload = xhr.responseJSON
255
- try payload ||= JSON.parse(xhr.responseText) catch e
256
- payload ||= xhr.responseText
257
-
258
- # When client fail
259
- switch xhr.status
260
- # TODO move to validatable
261
- when 0
262
- message = status or xhr.statusText
263
- switch message
264
- when 'abort'
265
- console.info "salvation probably aborted"
266
- when 'error'
267
- console.info "server probably unreachable"
268
- else
269
- throw new Error 'Unhandled status code for xhr'
270
-
271
- when 422
272
-
273
- definition = model[@resource.toString()]
274
-
275
- for attribute_name, messages of payload.errors
276
-
277
- # TODO add support for error checking message introspection
278
- # Check for association errors
279
- if (!definition.associations)
280
- # TODO update this attribute when associations are dinamically changed
281
- definition.associations = definition.has_one.concat(definition.has_many.concat(definition.belongs_to))
282
-
283
- # Only add errors to existing attributes
284
- # TODO shorten this verification
285
- unless @hasOwnProperty(attribute_name) or definition.hasOwnProperty(attribute_name) or definition.associations.indexOf(attribute_name) != -1 or attribute_name == 'base'
286
-
287
- message = "Server returned an validation error message for a attribute that is not defined in your model.\n"
288
- message += "The attribute was '#{attribute_name}', the model resource was '#{@resource}'.\n"
289
- message += "The model definition keys were '#{JSON.stringify Object.keys definition }'.\n"
290
- message += "Please remove server validation, or update your model definition."
291
- throw new TypeError message
292
-
293
- for message in messages
294
- @errors.add attribute_name, 'server', server_message: message
295
-
296
- # Unknown fail
297
- else
298
- message = "Fail in #{@resource}.save:\n"
299
- message += "Record: #{@}\n"
300
- message += "Status: #{status} (#{(payload || xhr).status})\n"
301
- message += "Error : #{payload.error || payload.message || payload}"
302
- console.log message
303
-
304
- # Finish saving
305
- @saving = false
306
-
307
- # TODO move to record.coffee
308
- toString: ->
309
- serialized = {}
310
- serialized[@resource] = @json()
311
-
312
- try
313
- # TODO figure out why it throws circular references sometines
314
- JSON.stringify serialized
315
- catch e
316
- console.warn "restfulable.toString: Failed to stringify record: #{e.message}. retrying..."
317
-
318
- for name, property of serialized
319
- delete serialized[name] if typeof property == 'object'
320
-
321
- JSON.stringify serialized
322
-
323
- # TODO move this to serializable module
324
- # TODO figure out why sometimes is rendering a circular referenced json
325
- # TODO rename to toJSON
326
- json: (methods = {}) ->
327
- json = {}
328
-
329
- definition = model[@resource.toString()]
330
-
331
- for name of @
332
- # TODO smarter way to ignore Dom node fix properties
333
- continue if observable.ignores.indexOf(name) != -1
334
-
335
- # TODO treat other associations to!
336
- # TODO create association reflection for god sake!
337
- nested = @nested_attributes.indexOf(name) != -1
338
-
339
- # Skip association attributes that are note nested TODO create
340
- # an associations array
341
- continue if not nested and (definition.belongs_to.indexOf(name) != -1 or definition.has_one.indexOf(name) != -1 or definition.has_many.indexOf(name) != -1)
342
-
343
- # TODO Bypass only undefined values so we can erase data on server
344
- value = @[name]
345
- continue unless value?
346
-
347
- nature = type value
348
- continue if nature == 'function'
349
-
350
- if nature == 'object' or nature == 'element'
351
-
352
- if nested
353
- unless value.json
354
- console.warn "json: Tryied to serialize nested attribute '#{name}' without serialization method!"
355
- continue
356
-
357
- # TODO move nested attributes to model definition and
358
- # implement toJSON there
359
- json["#{name}_attributes"] = value.json methods[name]
360
-
361
- # Serialize complex type values
362
- else if value.toJSON? || value.json?
363
- # FIXME sometimes wrong pluralization occurs and we cannot
364
- # skip association objects, so detect them and skip here
365
- continue if value.resource
366
-
367
- # TODO rename json to toJSON
368
- if value.json?
369
- json[name] = value.json methods[name]
370
- else
371
- json[name] = value.toJSON methods[name]
372
-
373
- # It is a complex type value without serializtion support so
374
- # we just ignore it
375
- else
376
- # TODO maybe log warning based on debug or info flag here?
377
- continue
378
-
379
- else
380
-
381
- # Serialize primitive type values
382
- json[name] = value
383
-
384
- # Remove observable methods and dom node properties
385
- json = observable.unobserve json
386
-
387
- # TODO Store reserved words in a array
388
- # TODO Use _.omit function
389
- # TODO Use object.defineProperty to not need to delete this properties
390
- # Remove model reserved words
391
- delete json.dirty
392
- delete json.resource
393
- delete json.route
394
- delete json.initial_route # TODO implement better initial_route and remove attribute from here
395
-
396
- delete json.after_initialize
397
- delete json.before_initialize
398
- delete json.parent_resource
399
- delete json.nested_attributes
400
-
401
- delete json.reloading
402
- delete json.ready
403
-
404
- delete json.saving
405
- delete json.salvation
406
- delete json.sustained
407
-
408
- delete json.element
409
- delete json.default
410
- delete json.lock
411
-
412
- delete json.validated
413
- delete json.validation
414
- delete json.errors
415
-
416
- json
417
-
418
-
419
- # TODO put deprecation warning on json method
420
- # TODO rename json method to toJSON
421
- restful.toJSON = restful.json
422
-
423
-
424
- # Extend indemma
425
- model = window.model # TODO better way to get parent
426
- record = window.record # TODO better way to get parent
427
-
428
- model.restfulable = true
429
-
430
- record.mix (recordable) ->
431
- merge recordable, restful.record
432
-
433
-
434
- model.mix (modelable ) ->
435
- merge modelable , restful.model
436
-
437
-
438
- model.associable && model.associable.mix (singular_association, plural_association) ->
439
-
440
- # TODO move route setting to plural_association.after_mix
441
- plural_association.get = ->
442
- @route ||= "#{@parent.route}/#{@parent._id}/#{model.pluralize @resource.name}" if @parent?
443
- rest.get.apply @, arguments
444
-
445
- plural_association.post = ->
446
- @route ||= "#{@parent.route}/#{@parent._id}/#{model.pluralize @resource.name}" if @parent?
447
- rest.post.apply @, arguments