ende 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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,294 +0,0 @@
1
- require './restfulable'
2
- require './resource'
3
-
4
- stampit = require '../../vendor/stampit'
5
- extend = require 'assimilate'
6
- observable = require('observable').mixin
7
- merge = extend.withStrategy 'deep'
8
- $ = require 'jquery'
9
- rest = require './rest'
10
-
11
- # TODO merge all with fetch and remove this util object
12
- util =
13
- model:
14
- map: (records) ->
15
- (@build or @).call @, record for record, index in records
16
-
17
- # TODO better responsibilty division for this code
18
- scopable =
19
- builder: stampit().enclose ->
20
-
21
- # Builds a given scope
22
- # {param} name Scope name also, the name of method used to invoke it
23
- # {param} type Default value for scope, or base class to derive default for default type
24
-
25
- stampit.mixIn (name, type) ->
26
- if $.type(type) == 'function'
27
- @["$#{name}"] = type() || new type
28
- type = $.type @["$#{name}"]
29
- else
30
- @["$#{name}"] = defaults[type] || type
31
-
32
- type = $.type type unless $.type(type) == 'string'
33
- builder = builders[type]
34
-
35
- throw "Unknown scope type: '#{type}', For model with resource: '#{@resource}'" unless builder?
36
-
37
- @scope.declared.push name
38
- @[name] = builder name: name
39
- ,
40
- data: {}
41
- then: []
42
- fail: []
43
- declared: []
44
- fetch: (data, done, fail) ->
45
-
46
- if typeof data == 'function'
47
- done = data
48
- data = {}
49
-
50
- scope = extend {}, @scope.data
51
- observable.unobserve scope
52
-
53
- if scope.noned?
54
- deferred = $.Deferred()
55
- deferred.resolveWith @, [[]]
56
- else
57
- deferred = rest.get.call(@, extend scope, data)
58
-
59
- deferred
60
- .then(util.model.map)
61
- .done(@scope.then.concat [done])
62
- .fail(@scope.fail.concat [fail])
63
-
64
- @scope.clear()
65
-
66
- deferred
67
-
68
- clear: ->
69
- @data = {}
70
- @callbacks = []
71
-
72
- # Shared scope stuff
73
- base: stampit().state
74
- name: 'unamed_scope'
75
-
76
- record:
77
- # Parse error json if any
78
- failed: (xhr, error, status) ->
79
- payload = xhr.responseJSON
80
- try payload ||= JSON.parse(xhr.responseText) catch e
81
- payload ||= xhr.responseText
82
-
83
- # When client fail
84
- switch xhr.status
85
- when 422
86
- @valid = false
87
- return @errors = payload.errors
88
- # Unknown fail
89
- else
90
- message = "Fail in #{@resource}.save:\n"
91
- message += "Record: #{@}\n"
92
- message += "Status: #{status} (#{payload.status || xhr.status})\n"
93
- message += "Error : #{payload.error || payload.message || payload}"
94
-
95
- console.error message
96
- model:
97
- # TODO implement getter for none property!
98
- none: ->
99
- @scope.data.noned = true
100
- @
101
-
102
- # TODO merge with all object
103
- fetch: (data, done, fail) ->
104
- if typeof data == 'function'
105
- done = data
106
- data = null
107
-
108
- @scope.fetch.call @, data, done, fail
109
-
110
- # TODO optmize this iterations or add support for stampit on associable and merge factories
111
- # @ = record instance
112
- forward_scopes_to_associations: ->
113
- factory = model[@resource.name]
114
-
115
- for association_name in factory.has_many
116
- associated_resource = model.singularize association_name
117
- associated_factory = model[associated_resource]
118
-
119
- # TODO change this warn message into a exception when
120
- # associations are renamable
121
- unless model[associated_resource]
122
- console.warn("Associated factory not found for associated resource: #{associated_resource}")
123
- continue
124
-
125
- association = @[association_name]
126
- association.scope = scopable.builder association
127
-
128
-
129
- for scope in associated_factory.scope.declared
130
- association.scope scope, associated_factory["$#{scope}"]
131
-
132
- for associated_resource in factory.has_one
133
- # TODO change this warn message into a exception when
134
- # associations are renamable
135
- unless model[associated_resource]
136
- console.warn("Associated factory not found for associated resource: #{associated_resource}")
137
- continue
138
-
139
- for scope in model[associated_resource].scope.declared
140
- @[associated_resource][scope] = factory[scope]
141
-
142
- # TODO improve associable inner workings to stampit objects
143
- if factory.belongs_to.length
144
- generate_forwarder = (associated_resource) ->
145
- associated_factory = model[associated_resource]
146
-
147
- # TODO change this warn message into a exception when
148
- # associations are renamable
149
- return console.warn("Associated factory not found for associated resource: #{associated_resource}") unless associated_factory
150
-
151
- declared_scopes = associated_factory.scope.declared
152
-
153
- ->
154
- for scope in declared_scopes
155
- @[associated_resource][scope] = associated_factory[scope]
156
-
157
- for associated_resource in factory.belongs_to
158
- forwarder = generate_forwarder associated_resource
159
- @after "build_#{associated_resource}", forwarder
160
-
161
- true
162
- # @ = model instance
163
- after_mix: ->
164
- @scope = scopable.builder @
165
-
166
- for property, type of @
167
- if property.charAt(0) == '$'
168
- name = property.substring 1
169
- @scope name, type
170
-
171
- builders =
172
- # Builds a string scope builder
173
- string: stampit().enclose ->
174
- base = scopable.base @
175
-
176
- stampit.mixIn (value, callbacks...) ->
177
- callbacks.length and @scope.then = @scope.then.concat callbacks
178
- @scope.data[base.name] ||= value ? @["$#{base.name}"]
179
- @
180
-
181
- # Builds a boolean scope builder
182
- boolean: stampit().enclose ->
183
- base = scopable.base @
184
-
185
- stampit.mixIn (value, callbacks...) ->
186
- callbacks.length and @scope.then = @scope.then.concat callbacks
187
- @scope.data[base.name] ||= value ? @["$#{base.name}"]
188
- @
189
-
190
- # Builds a array scope builder
191
- array: stampit().enclose ->
192
- base = scopable.base @
193
-
194
- stampit.mixIn (values...) ->
195
- @scope.data[base.name] ||= values ? @["$#{base.name}"]
196
- @
197
-
198
- defaults =
199
- boolean: true
200
- array: []
201
-
202
- # Extend indemma
203
- model = window.model # TODO better way to get parent
204
- record = window.record # TODO better way to get parent
205
-
206
- model.scopable = true
207
-
208
- # TODO use stampit to extend record and model
209
- #record.mix (recordable) ->
210
- # merge recordable, scopable.record
211
-
212
- model.mix (modelable) ->
213
- merge modelable, scopable.model
214
-
215
- modelable.after_mix.push scopable.after_mix
216
-
217
-
218
- # TODO create a deferred to better mix models
219
- if model.associable
220
- model.mix (modelable) ->
221
- modelable.record.after_initialize.push ->
222
- scopable.model.forward_scopes_to_associations.call @
223
-
224
- model.associable.mix (singular_association, plural_association) ->
225
-
226
- # reload (done callbacks...)
227
- plural_association.every = plural_association.reload = (data, done, fail) ->
228
- # TODO move route discovery to plural_association.after_mix
229
- @route ||= "#{@parent.route}/#{@parent._id}/#{model.pluralize @resource}" if @parent?
230
- promises = []
231
-
232
- # TODO better calculate fetch settings
233
- # dirty = 0
234
- # if more than 5 records are dirty, we reftech all
235
- # if dirty < 5
236
- # for record in @
237
- # promises.push record.reload()
238
- # else we reload everthing!
239
- # else
240
- #
241
- # for record in @
242
- # dirty++ if record.dirty
243
-
244
- if typeof data == 'function'
245
- done = data
246
- data = undefined
247
-
248
- promises.push @scope.fetch.call @, data, null, scopable.record.failed
249
-
250
- reload = $.when.apply jQuery, promises
251
-
252
- # Update association with data sent from the server
253
- # TODO implement setter on this association and let user to set
254
- reload.done (records, status) ->
255
-
256
- # Clear current stored cache on this association
257
- # it to an empty array
258
- Array.prototype.splice.call @, 0
259
-
260
- # return if no records were found by the server
261
- return unless records.length
262
-
263
- singular_resource = model.singularize @resource
264
-
265
- # Normalize json data for building on association
266
- for record in records
267
-
268
- # TODO only nest specified nested attributes on model definition
269
- # TODO create special deserialization method no plural association
270
- # TODO check if we need to nest attributes in other association tipes
271
- for association_name in model[singular_resource].has_many
272
- record["#{association_name}_attributes"] = record[association_name]
273
- delete record[association_name]
274
-
275
- # Load new records on this association
276
- @add.apply @, records
277
-
278
- # Override the response records object with added to association records
279
- records.splice 0
280
- records.push.apply records, @
281
-
282
-
283
- reload.done done
284
- reload.fail fail
285
-
286
- reload
287
-
288
- plural_association.each = (callback) ->
289
- @route ||= "#{@parent.route}/#{@parent._id}/#{model.pluralize @resource}" if @parent?
290
-
291
- # TODO cache models
292
- @get().done (records) =>
293
- for record in @
294
- callback record
@@ -1,46 +0,0 @@
1
- extend = require 'assimilate'
2
- merge = extend.withStrategy 'deep'
3
- stampit = require '../../vendor/stampit'
4
-
5
- storable = stampit
6
- store: (keypath, value, options) ->
7
- collection = @database
8
- keypath = keypath.toString().split '.'
9
- key = keypath.pop()
10
-
11
- for entry in keypath
12
- collection[entry] ||= {}
13
- collection = collection[entry]
14
-
15
- if arguments.length == 1
16
- @reads++
17
- collection[key]
18
- else
19
- @writes++
20
-
21
- # TODO use object.defineProperty
22
- value.sustained ||= true
23
- collection[key] = value
24
-
25
- values: ->
26
- Object.values @database
27
- ,
28
- type: 'object'
29
- writes: 0
30
- reads: 0
31
- , ->
32
- @database ||= {}
33
- @
34
-
35
-
36
- # Extend indemma
37
- # TODO use stampit to extend record and model
38
- model = window.model # TODO better way to get parent
39
- record = window.record # TODO better way to get parent
40
-
41
- model.storable = true
42
- module.exports = storable
43
- #model.mix (modelable) ->
44
- # merge modelable, storable.model
45
-
46
-
@@ -1,18 +0,0 @@
1
- root = exports ? window
2
-
3
- # TODO better way to get core model definition
4
- # model = require ...
5
-
6
- # TODO implement method
7
- # model[resource].validators_on 'field' # Get all validators related to this field
8
-
9
- extend = require('assimilate')
10
-
11
- extensions =
12
- model:
13
- human_attribute_name: (attribute_name) ->
14
- @translation?.attributes?[attribute_name] or attribute_name
15
-
16
- model.mix (modelable) ->
17
- extend modelable, extensions.model
18
-
@@ -1,207 +0,0 @@
1
- require './translationable'
2
-
3
- root = exports ? @
4
- stampit = require '../../vendor/stampit'
5
- observable = require('observable').mixin
6
- type = require 'type'
7
-
8
- # TODO better model require
9
- # model = require ...
10
-
11
- # TODO Add base settings to validation
12
- # TODO implement method
13
- # model[resource].validators_on 'field' # Get all validators related to this field
14
-
15
- # TODO use http://validatejs.org for internal handling
16
-
17
- messages =
18
- blank: (attribute_name) ->
19
- attribute_name = @human_attribute_name attribute_name
20
- "O campo #{attribute_name} não pode ficar em branco."
21
-
22
- cpf: (attribute_name) ->
23
- attribute_name = @human_attribute_name attribute_name
24
- "O campo #{attribute_name} não está válido."
25
-
26
- confirmation: (attribute_name) ->
27
- confirmation_attribute_name = @human_attribute_name attribute_name
28
- attribute_name = @human_attribute_name attribute_name.replace '_confirmation', ''
29
- "O campo #{attribute_name} não está de acordo com o campo #{confirmation_attribute_name}."
30
-
31
- associated: (attribute_name) ->
32
- attribute_name = @human_attribute_name attribute_name
33
- "O registro associado #{attribute_name} não é válido."
34
-
35
- server: (attribute_name, options) ->
36
- # TODO Better checking of base attribute case, better yet remove
37
- # checking from here, just like active record
38
- if attribute_name == 'base'
39
- options.server_message
40
- else
41
- attribute_name = @human_attribute_name attribute_name
42
- "#{attribute_name} #{options.server_message}."
43
-
44
- type: (attribute_name, options) ->
45
- attribute_name = @human_attribute_name attribute_name
46
- "O campo #{attribute_name} não está válido."
47
-
48
- # TODO move to errorsable.coffee
49
- errorsable = stampit
50
- add: (attribute_name, message_key, options) ->
51
-
52
- @push [attribute_name, message_key, options]
53
- # TODO Also push to attribute named
54
- # @[attribute_name].push message_key, message, options
55
-
56
- @messages[attribute_name] = ''
57
-
58
- translator = messages[message_key]
59
-
60
- if translator?
61
- @messages[attribute_name] += translator.call @model, attribute_name, options
62
- else
63
- @messages[attribute_name] += message_key
64
-
65
- clear: ->
66
- if @length
67
- @length = 0
68
- @messages[attribute_name] = null for attribute_name of @messages
69
-
70
- push: Array.prototype.push
71
- splice: Array.prototype.splice
72
- indexOf: Array.prototype.indexOf
73
- ,
74
- model: null
75
- messages: null
76
- length: 0
77
- , ->
78
- @messages = {}
79
- @
80
-
81
-
82
- initializers =
83
- define_triggers: ->
84
-
85
- # TODO remove the extra inheritance level of model[@resource]
86
- @errors = errorsable model: model[@resource]
87
-
88
- # TODO only add after save when resourceable is included
89
- # TODO @after_initialize validate_field_types
90
- # TODO only execute save operation if record is valid
91
- @before 'save', -> @validate() if @save
92
-
93
- # TODO move this functionality control to validatable
94
- @validated = false
95
- @subscribe 'dirty', (value) -> value and @validated = false
96
-
97
- Object.defineProperty @, 'valid',
98
- get: ->
99
-
100
- @validate()
101
-
102
- if @validation.state() == 'resolved'
103
- !@errors.length
104
- else
105
- null
106
-
107
- set: -> throw new TypeError "You can't set the value for the valid property."
108
- enumerable: false
109
-
110
- create_validators: (definitions) ->
111
-
112
- @validators = []
113
-
114
- for name, validator of manager.validators
115
- definition = definitions[validator.definition_key]
116
-
117
- if definition
118
- definition = [definition] unless type(definition) == 'array'
119
-
120
- for validator_options in definition
121
-
122
- # Parse validation definition
123
- validator_options = attribute_name: validator_options unless type(validator_options) == 'object'
124
- validator_options.model = @
125
-
126
- # Instantiate validator
127
- @validators.push validator validator_options
128
-
129
- # Clear out definition to prevent validators from becoming
130
- # attributes
131
- delete definitions[validator.definition_key]
132
-
133
- # Model and Record extensions
134
- # TODO Use stampit!
135
- extensions =
136
- model:
137
- validators: null
138
-
139
- record:
140
-
141
- validate_attribute: (attribute, doned, failed) ->
142
- # TODO better clearing of single attribute error message
143
- @errors.messages[attribute] = null
144
-
145
- results = [@, attribute]
146
-
147
- # TODO copy validators reference from model object to record object
148
- # TODO update json serializer
149
- # TODO filter validators for attribute
150
- for validator in model[@resource.toString()].validators
151
- if validator.attribute_name is attribute
152
- results.push validator.validate_each @, validator.attribute_name, @[validator.attribute_name]
153
-
154
- validation = jQuery.when.apply jQuery, results
155
- validation.done doned
156
- validation.fail failed
157
-
158
- validation
159
-
160
- validate: (doned, failed) ->
161
- return @validation if @validated and not @dirty
162
-
163
- @errors.clear()
164
- results = [@]
165
-
166
- # TODO copy validators reference from model object to record object
167
- # TODO update json serializer
168
- for validator in model[@resource.toString()].validators
169
- results.push validator.validate_each @, validator.attribute_name, @[validator.attribute_name]
170
-
171
- @validation = jQuery.when results...
172
- @validation.done doned
173
- @validation.fail failed
174
-
175
- # TODO store this callback
176
- @validation.done (record) -> record.validated ||= true
177
-
178
-
179
- # Validators management
180
- manager =
181
-
182
- validators: {}
183
-
184
- # TODO async validator loading
185
- # for: (name) ->
186
- # builder = @validators[name] ||= require "validations/#{name}"
187
-
188
-
189
- # TODO better stampit integration
190
- model.mix (modelable) ->
191
- jQuery.extend modelable, extensions.model
192
-
193
- jQuery.extend modelable.record, extensions.record
194
-
195
- modelable.after_mix.unshift initializers.create_validators
196
- modelable.record.after_initialize.push initializers.define_triggers
197
-
198
- model.validators = manager.validators
199
-
200
- # TODO async validator loading
201
- manager.validators.confirmation = require './validations/confirmation'
202
- manager.validators.associated = require './validations/associated'
203
- manager.validators.presence = require './validations/presence'
204
- manager.validators.remote = require './validations/remote'
205
- manager.validators.type = require './validations/type'
206
- manager.validators.cpf = require './validations/cpf'
207
-
@@ -1,30 +0,0 @@
1
- # TODO Add base settings to validation
2
- # model = window.model
3
- # TODO implement method
4
-
5
- # model[resource].validators_on 'field' # Get all validators related to this field
6
-
7
- stampit = require '../../../vendor/stampit'
8
-
9
- associationable = stampit
10
- validate_each: (record, attribute, value) ->
11
- # TODO figure out why this method is being called twice
12
- if record[attribute]
13
-
14
- # TODO detect association type, and then validate
15
- # current we only support has_one associations
16
- unless model[record.resource].has_one.indexOf(attribute) != -1
17
- throw new Error 'Only has_one associations are supported to validates_associated'
18
-
19
- associated_validation = record[attribute].validate()
20
-
21
- associated_validation.done ->
22
- if record[attribute].errors.length
23
- record.errors.add attribute, 'associated', @options
24
-
25
- associated_validation
26
-
27
-
28
- composed = stampit.compose(require('./validatorable'), associationable)
29
- composed.definition_key = 'validates_associated'
30
- module.exports = composed
@@ -1,17 +0,0 @@
1
- # TODO Add base settings to validation
2
- # model = window.model
3
-
4
- # TODO implement method
5
- # model[resource].validators_on 'field' # Get all validators related to this field
6
-
7
- stampit = require '../../../vendor/stampit'
8
-
9
- confirmationable = stampit
10
- validate_each: (record, attribute, value) ->
11
- if record[attribute] != record["#{attribute}_confirmation"]
12
- record.errors.add "#{attribute}_confirmation", 'confirmation', @options
13
-
14
-
15
- composed = stampit.compose require('./validatorable'), confirmationable
16
- composed.definition_key = 'validates_confirmation_of'
17
- module.exports = composed
@@ -1,57 +0,0 @@
1
- # TODO Add base settings to validation
2
- # model = window.model
3
-
4
- # TODO implement method
5
- # model[resource].validators_on 'field' # Get all validators related to this field
6
-
7
- stampit = require '../../../vendor/stampit'
8
-
9
- cpfable = stampit
10
- validate_format: (value) ->
11
- value = value.replace /[\.\-]/g, ""
12
-
13
- # Wrong cpf size
14
- return false if value.length < 11
15
-
16
- # Dummy but valid values (000.000.000-00, 111.111.111-11, ...)
17
- return false if value.match /^(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)$/
18
-
19
- # Mod 11 validation
20
- c = value.substr 0, 9
21
- dv = value.substr 9, 2
22
- d1 = 0
23
- v = false
24
- i = 0
25
-
26
- for i in [0..9]
27
- d1 += c.charAt(i) * (10 - i)
28
-
29
- return false if d1 == 0
30
-
31
- d1 = 11 - (d1 % 11)
32
- d1 = 0 if (d1 > 9 )
33
-
34
- return false if +dv.charAt(0) != d1
35
-
36
- d1 *= 2
37
- for i in [0..9]
38
- d1 += c.charAt(i) * (11 - i)
39
-
40
-
41
- d1 = 11 - (d1 % 11)
42
- d1 = 0 if (d1 > 9 )
43
-
44
- return false if +dv.charAt(1) != d1
45
-
46
- true
47
-
48
-
49
- validate_each: (record, attribute, value) ->
50
- record.errors.add attribute, 'cpf', @options if value and not @validate_format value
51
-
52
-
53
-
54
-
55
- composed = stampit.compose require('./validatorable'), cpfable
56
- composed.definition_key = 'validates_cpf_format'
57
- module.exports = composed
@@ -1,16 +0,0 @@
1
- # TODO Add base settings to validation
2
- # model = window.model
3
-
4
- # TODO implement method
5
- # model[resource].validators_on 'field' # Get all validators related to this field
6
-
7
- stampit = require '../../../vendor/stampit'
8
-
9
- presenceable = stampit
10
- validate_each: (record, attribute, value) ->
11
- if value == null or value == '' or value == undefined
12
- record.errors.add attribute, 'blank', @options
13
-
14
- composed = stampit.compose require('./validatorable'), presenceable
15
- composed.definition_key = 'validates_presence_of'
16
- module.exports = composed