ende 0.5.20 → 0.5.21

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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +1 -1
  3. data/components/indefinido/indemma/master/.gitignore +17 -0
  4. data/components/indefinido/indemma/master/.ruby-gemset +1 -0
  5. data/components/indefinido/indemma/master/.ruby-version +1 -0
  6. data/components/indefinido/indemma/master/Gemfile +12 -0
  7. data/components/indefinido/indemma/master/Guardfile +39 -0
  8. data/components/indefinido/indemma/master/History.md +0 -0
  9. data/components/indefinido/indemma/master/Readme.md +445 -0
  10. data/components/indefinido/indemma/master/build/development.js +26123 -0
  11. data/components/indefinido/indemma/master/build/release.js +16741 -0
  12. data/components/indefinido/indemma/master/build/test.js +26123 -0
  13. data/components/indefinido/indemma/master/component.json +1 -1
  14. data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/component.json +18 -0
  15. data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/index.js +110 -0
  16. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.gitignore +22 -0
  17. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.mailmap +1 -0
  18. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.npmignore +14 -0
  19. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.travis.yml +14 -0
  20. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/CONTRIBUTING.md +173 -0
  21. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/History.md +895 -0
  22. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/Makefile +93 -0
  23. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/README.md +99 -0
  24. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/ReleaseNotes.md +482 -0
  25. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/bower.json +27 -0
  26. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/chai.js +4782 -0
  27. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/component.json +50 -0
  28. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/index.js +1 -0
  29. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.conf.js +28 -0
  30. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.sauce.js +41 -0
  31. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/assertion.js +130 -0
  32. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/config.js +50 -0
  33. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/core/assertions.js +1314 -0
  34. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/assert.js +1056 -0
  35. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/expect.js +12 -0
  36. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/should.js +78 -0
  37. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addChainableMethod.js +111 -0
  38. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addMethod.js +43 -0
  39. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addProperty.js +40 -0
  40. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/flag.js +32 -0
  41. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getActual.js +18 -0
  42. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getEnumerableProperties.js +25 -0
  43. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getMessage.js +49 -0
  44. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getName.js +20 -0
  45. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getPathValue.js +102 -0
  46. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getProperties.js +35 -0
  47. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/index.js +114 -0
  48. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/inspect.js +320 -0
  49. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/objDisplay.js +49 -0
  50. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteChainableMethod.js +53 -0
  51. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteMethod.js +51 -0
  52. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteProperty.js +54 -0
  53. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/test.js +26 -0
  54. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/transferFlags.js +44 -0
  55. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/type.js +45 -0
  56. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai.js +87 -0
  57. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/package.json +42 -0
  58. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/sauce.browsers.js +128 -0
  59. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_block.sh +7 -0
  60. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_setup.sh +53 -0
  61. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/assert.js +638 -0
  62. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/auth/.gitkeep +0 -0
  63. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/index.js +22 -0
  64. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/karma.js +22 -0
  65. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/configuration.js +133 -0
  66. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/errors.js +14 -0
  67. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/message.js +47 -0
  68. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/expect.js +814 -0
  69. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/globalShould.js +15 -0
  70. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/plugins.js +24 -0
  71. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/should.js +744 -0
  72. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/utilities.js +309 -0
  73. data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/component.json +20 -0
  74. data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/lib/eql.js +257 -0
  75. data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/component.json +18 -0
  76. data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/lib/type.js +142 -0
  77. data/components/indefinido/indemma/master/components/component/bind/1.0.0/component.json +14 -0
  78. data/components/indefinido/indemma/master/components/component/bind/1.0.0/index.js +23 -0
  79. data/components/indefinido/indemma/master/components/component/jquery/1.0.0/component.json +10 -0
  80. data/components/indefinido/indemma/master/components/component/jquery/1.0.0/index.js +10308 -0
  81. data/components/indefinido/indemma/master/components/component/type/1.0.0/component.json +20 -0
  82. data/components/indefinido/indemma/master/components/component/type/1.0.0/index.js +32 -0
  83. data/components/indefinido/indemma/master/components/indefinido/advisable/master/component.json +21 -0
  84. data/components/indefinido/indemma/master/components/indefinido/advisable/master/index.js +1 -0
  85. data/components/indefinido/indemma/master/components/indefinido/advisable/master/lib/advisable.js +60 -0
  86. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/component.json +39 -0
  87. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/index.js +1 -0
  88. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/adapters/rivets.js +40 -0
  89. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
  90. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +147 -0
  91. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
  92. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
  93. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
  94. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
  95. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
  96. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable.js +97 -0
  97. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
  98. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
  99. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors-legacy.js +92 -0
  100. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors.js +248 -0
  101. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/array.indexOf.js +8 -0
  102. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/object.create.js +77 -0
  103. data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/component.json +25 -0
  104. data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/dist/assimilate.js +127 -0
  105. data/components/indefinido/indemma/master/karma.conf.js +75 -0
  106. data/components/indefinido/indemma/master/lib/record/associable.js +4 -2
  107. data/components/indefinido/indemma/master/lib/record/dirtyable.js +1 -1
  108. data/components/indefinido/indemma/master/package.json +9 -0
  109. data/components/indefinido/indemma/master/spec/record/associable_spec.js +211 -0
  110. data/components/indefinido/indemma/master/spec/record/dirtyable_spec.js +57 -0
  111. data/components/indefinido/indemma/master/spec/record/maid_spec.js +40 -0
  112. data/components/indefinido/indemma/master/spec/record/persistable_spec.js +46 -0
  113. data/components/indefinido/indemma/master/spec/record/queryable_spec.js +39 -0
  114. data/components/indefinido/indemma/master/spec/record/resource_spec.js +93 -0
  115. data/components/indefinido/indemma/master/spec/record/rest_spec.js +32 -0
  116. data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +346 -0
  117. data/components/indefinido/indemma/master/spec/record/scopable_spec.js +242 -0
  118. data/components/indefinido/indemma/master/spec/record/storable_spec.js +44 -0
  119. data/components/indefinido/indemma/master/spec/record/translationable.js +28 -0
  120. data/components/indefinido/indemma/master/spec/record/validatable_spec.js +142 -0
  121. data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +43 -0
  122. data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +36 -0
  123. data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +34 -0
  124. data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +28 -0
  125. data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +87 -0
  126. data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +48 -0
  127. data/components/indefinido/indemma/master/spec/record_spec.js +49 -0
  128. data/components/indefinido/indemma/master/spec/spec_helper.js +15 -0
  129. data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +45 -0
  130. data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +17 -0
  131. data/components/indefinido/indemma/master/src/lib/record/associable.coffee +419 -0
  132. data/components/indefinido/indemma/master/src/lib/record/dirtyable.coffee +47 -0
  133. data/components/indefinido/indemma/master/src/lib/record/errors.coffee +20 -0
  134. data/components/indefinido/indemma/master/src/lib/record/maid.coffee +16 -0
  135. data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +34 -0
  136. data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +29 -0
  137. data/components/indefinido/indemma/master/src/lib/record/resource.coffee +107 -0
  138. data/components/indefinido/indemma/master/src/lib/record/rest.coffee +34 -0
  139. data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +487 -0
  140. data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +279 -0
  141. data/components/indefinido/indemma/master/src/lib/record/storable.coffee +49 -0
  142. data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +18 -0
  143. data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +241 -0
  144. data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +34 -0
  145. data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +17 -0
  146. data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +57 -0
  147. data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +16 -0
  148. data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +61 -0
  149. data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +31 -0
  150. data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +5 -0
  151. data/components/indefinido/indemma/master/src/lib/record.coffee +143 -0
  152. data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +205 -0
  153. data/components/indefinido/indemma/master/src/spec/record/dirtyable_spec.coffee +47 -0
  154. data/components/indefinido/indemma/master/src/spec/record/maid_spec.coffee +34 -0
  155. data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +39 -0
  156. data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +33 -0
  157. data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +69 -0
  158. data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +22 -0
  159. data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +257 -0
  160. data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +227 -0
  161. data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +39 -0
  162. data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +19 -0
  163. data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +127 -0
  164. data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +35 -0
  165. data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +25 -0
  166. data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +27 -0
  167. data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +24 -0
  168. data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +74 -0
  169. data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +33 -0
  170. data/components/indefinido/indemma/master/src/spec/record_spec.coffee +29 -0
  171. data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +11 -0
  172. data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +30 -0
  173. data/components/indefinido/indemma/master/vendor/object/mixin.js +196 -0
  174. data/components/indefinido/indemma/master/vendor/spec/sinon/assert.js +199 -0
  175. data/components/indefinido/indemma/master/vendor/spec/sinon/behavior.js +334 -0
  176. data/components/indefinido/indemma/master/vendor/spec/sinon/call.js +205 -0
  177. data/components/indefinido/indemma/master/vendor/spec/sinon/collection.js +155 -0
  178. data/components/indefinido/indemma/master/vendor/spec/sinon/match.js +245 -0
  179. data/components/indefinido/indemma/master/vendor/spec/sinon/mock.js +451 -0
  180. data/components/indefinido/indemma/master/vendor/spec/sinon/sandbox.js +144 -0
  181. data/components/indefinido/indemma/master/vendor/spec/sinon/spy.js +413 -0
  182. data/components/indefinido/indemma/master/vendor/spec/sinon/stub.js +161 -0
  183. data/components/indefinido/indemma/master/vendor/spec/sinon/test.js +77 -0
  184. data/components/indefinido/indemma/master/vendor/spec/sinon/test_case.js +99 -0
  185. data/components/indefinido/indemma/master/vendor/spec/sinon/util/event.js +94 -0
  186. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server.js +212 -0
  187. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server_with_clock.js +83 -0
  188. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_timers.js +405 -0
  189. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xdomain_request.js +206 -0
  190. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xml_http_request.js +575 -0
  191. data/components/indefinido/indemma/master/vendor/spec/sinon/util/timers_ie.js +31 -0
  192. data/components/indefinido/indemma/master/vendor/spec/sinon/util/xdr_ie.js +14 -0
  193. data/components/indefinido/indemma/master/vendor/spec/sinon/util/xhr_ie.js +19 -0
  194. data/components/indefinido/indemma/master/vendor/spec/sinon.js +383 -0
  195. data/lib/assets/javascripts/value_objects/phone.js.coffee +3 -1
  196. data/lib/assets/javascripts/widgets/viewer/plugins/scopable.js.coffee +5 -5
  197. data/lib/ende/version.rb +1 -1
  198. data/vendor/assets/components/ende_build.css +4 -4
  199. data/vendor/assets/components/ende_build.js +7974 -7889
  200. metadata +191 -5
  201. data/vendor/assets/component/build.css +0 -112
  202. data/vendor/assets/components/build.css +0 -112
  203. data/vendor/assets/components/indemma_with_none.js +0 -30553
@@ -0,0 +1,16 @@
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
@@ -0,0 +1,61 @@
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
+ rest = require '../rest'
8
+ stampit = require '../../../vendor/stampit'
9
+
10
+ remoteable = stampit
11
+ validate_each: (record, attribute, value) ->
12
+ data = @json record
13
+
14
+ # TODO best partial application
15
+ # @post(data).done(_.partial @succeeded, record)
16
+ @post(data).done((json) => @succeeded(json, record))
17
+
18
+ json: (record) ->
19
+ param = @resource.param_name || @resource.toString()
20
+
21
+ data = {}
22
+ data[param] = record.json()
23
+
24
+ # TODO stop renaming id field, lol
25
+ data[param].id ||= data[param]._id
26
+ delete data[param]._id
27
+
28
+ data
29
+
30
+ # TODO Use rest.post
31
+ post: (data) ->
32
+
33
+ jQuery.ajax
34
+ url : @route
35
+ data : data
36
+ type : 'post'
37
+ dataType: 'json'
38
+ context : @
39
+
40
+ succeeded: (json, record) ->
41
+ error_messages = json[@attribute_name]
42
+
43
+ return unless error_messages
44
+
45
+ for error_message in error_messages
46
+ record.errors.add @attribute_name, 'server', server_message: error_message
47
+ ,
48
+ message: "Remote validation failed"
49
+ route: null
50
+ , ->
51
+ # TODO discover why @model.route is coming null!
52
+ # Desglobalize model constant
53
+ pluralized_resource = model.pluralize @model.resource.toString()
54
+ @resource = @model.resource
55
+ @route ||= "/#{pluralized_resource}/validate"
56
+ @
57
+
58
+
59
+ composed = stampit.compose require('./validatorable'), remoteable
60
+ composed.definition_key = 'validates_remotely'
61
+ module.exports = composed
@@ -0,0 +1,31 @@
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
+ validations = require '../validatable'
8
+ stampit = require '../../../vendor/stampit'
9
+
10
+ typeable = stampit
11
+ validate_each: (record, attribute, value) ->
12
+ # TODO store type on validator instantiation
13
+ @type ||= model[record.resource.toString()][attribute]
14
+
15
+ if value
16
+
17
+ if value instanceof @type
18
+
19
+ # TODO store type_name on costructor
20
+ @type_name ||= @type.name
21
+
22
+ unless value.valid # Will trigger validation
23
+ record.errors.add attribute, 'type', type_name: @type_name?
24
+
25
+ else
26
+ throw new Error "Invalid attribute value type! Found #{typeof value} expected #{@type.name}"
27
+
28
+
29
+ composed = stampit.compose require('./validatorable'), typeable
30
+ composed.definition_key = 'validates_type_of'
31
+ module.exports = composed
@@ -0,0 +1,5 @@
1
+ stampit = require '../../../vendor/stampit'
2
+
3
+ module.exports = stampit
4
+ validate: -> throw new Error 'Composed factory must override the validate method'
5
+ validate_each: -> throw new Error 'Composed factory must override the validate each method'
@@ -0,0 +1,143 @@
1
+ $ = require 'jquery'
2
+ type = require 'type'
3
+ bind = require 'bind'
4
+ observable = require 'observable'
5
+ advisable = require('advisable' ).mixin
6
+ extend = require 'assimilate'
7
+ merge = require('assimilate').withStrategy 'deep'
8
+
9
+ # TODO support other type of associations
10
+ @model = do -> # mixin
11
+ modelable =
12
+ after_mix: []
13
+ record:
14
+ # TODO usar deferred
15
+ after_initialize: []
16
+ # TODO usar deferred
17
+ before_initialize: []
18
+ every: ->
19
+ # TODO transform model in a array like object and store cache in root
20
+ @cache
21
+ # TODO better find support
22
+ create: (params...) ->
23
+ # Implementat non restful model creation
24
+ throw 'model.create not implemented yet, try using the restful.model.create method'
25
+ # find: (id) ->
26
+ # @where id: id, true
27
+ where: (conditions, first = false) ->
28
+ results = []
29
+ conditions.id = [conditions.id] if type(conditions.id) != 'array'
30
+ # TODO transform model in a array like object and store cache in root
31
+ for record in @cache when conditions.id.indexOf(record._id) isnt -1
32
+ if first
33
+ return record
34
+ else
35
+ results.push record
36
+
37
+ if first then null else results
38
+
39
+ initialize_record = (data = {resource: @resource, parent_resource: @parent_resource}) ->
40
+ data.resource ||= @resource
41
+ data.parent_resource ||= @resource.parent || @parent_resource
42
+ data.route ||= @route
43
+ data.nested_attributes = @nested_attributes || []
44
+
45
+ # instance = record.call extend data, @record # TODO remove @record from outside scop
46
+ after_initialize = (data.after_initialize || []).concat(@record.after_initialize)
47
+
48
+ # TODO only shim in older browsers
49
+ # TODO try to remove _shim need
50
+ creation = extend Object.create(data, {_shim: {}}), @record, creation, after_initialize: after_initialize
51
+
52
+ # TODO use deferred instead of before_initialize array
53
+ for callback, index in @record.before_initialize
54
+ callback.call @, creation
55
+
56
+ instance = record.call creation # TODO remove @record from outside scope
57
+
58
+
59
+ # Call and remove used callbacks
60
+ # TODO use deferred instead of after_initialize array
61
+ for callback, index in instance.after_initialize
62
+ callback.call instance, instance
63
+
64
+ delete instance.after_initialize
65
+
66
+ instance
67
+
68
+
69
+ # Create model
70
+ mixer = (options) ->
71
+ throw 'Model mixin called incorrectly! \n Call with model.call({}) instead of model({}) \n Also the first argument must be non null.' if @ == window
72
+ mixer.stale = true unless mixer.stale # Prevent model changes
73
+
74
+ # TODO Use stampit and solve this mess!!
75
+ if @record and @record.after_initialize
76
+ after_initialize = @record.after_initialize.splice 0
77
+ else
78
+ after_initialize = []
79
+
80
+ # TODO Use stampit and solve this mess!!
81
+ if @after_mix
82
+ after_mix = @after_mix.splice 0
83
+ else
84
+ after_mix = []
85
+
86
+ instance = bind @, initialize_record
87
+
88
+ extend instance, merge @, modelable
89
+
90
+ @record = instance.record = merge {}, instance.record, modelable.record
91
+ @record.after_initialize = instance.record.after_initialize = instance.record.after_initialize.concat after_initialize
92
+
93
+ @record.before_initialize = instance.record.before_initialize.concat []
94
+
95
+ callback.call instance, instance for callback in modelable.after_mix.concat after_mix
96
+
97
+ # Store model for later use
98
+ # TODO implement correctly stampit usage, and remove the need for
99
+ # direct storage
100
+ mixer[@resource.name || @resource.toString()] = instance
101
+
102
+ mixer.mix = (blender) ->
103
+ throw "Trying to change model mixin with #{object} but model already used.\nCheck your configuration order" if @stale
104
+
105
+ blender modelable
106
+
107
+ # window.model
108
+ mixer
109
+
110
+ @record = do -> # mixin
111
+
112
+ callbacks =
113
+ # TODO search for a existing word and rename method, 'smudge' perhaps?
114
+ dirtify: ->
115
+ # TODO add suport to subscribe to any property
116
+ # @subscribe (prop, value, old) ->
117
+ # if prop isnt 'dirty' and not @dirty and value isnt old
118
+ # console.groupCollapsed "◉ Property '#{prop}' dirtied a #{@resource}"
119
+ # console.log old, "→", value
120
+ # console.log @
121
+ # console.groupEnd()
122
+ # @dirty = true
123
+
124
+ recordable =
125
+ # TODO usar deferred
126
+ dirty: false
127
+ after_initialize: [ callbacks.dirtify ]
128
+
129
+ that = (data) ->
130
+ throw "Mixin called incorrectly, call mixin with call method: record.call(object, data)" if @ == window
131
+
132
+ data ||= {}
133
+ after_initialize = (@after_initialize || []).concat(data.after_initialize || []).concat(recordable.after_initialize)
134
+ advisable observable(extend(@, recordable, data, after_initialize: after_initialize))
135
+
136
+
137
+ that.mix = (blender) ->
138
+ blender recordable
139
+
140
+ that
141
+
142
+ exports.record = @record
143
+ exports.model = @model
@@ -0,0 +1,205 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/associable.js'
4
+ $ = require 'jquery'
5
+
6
+ describe 'record', ->
7
+ record = root.record
8
+
9
+ it 'should create a record'
10
+
11
+ describe 'model', ->
12
+ model = root.model
13
+ arthur = radio = null
14
+ person = corporation = null
15
+
16
+ beforeEach ->
17
+ corporation = model.call
18
+ resource: 'corporation'
19
+
20
+ # TODO implement support for self referential associations
21
+ friend = model.call
22
+ resource: 'friends'
23
+
24
+
25
+ person = model.call
26
+ resource : 'person'
27
+ has_many : 'friends'
28
+ belongs_to: 'corporation'
29
+
30
+ radio = corporation
31
+ _id: 1
32
+ name: 'Local Radio'
33
+
34
+ ford = friend
35
+ _id: 2
36
+ name: 'Ford Perfect'
37
+
38
+ @arthur = arthur = person
39
+ _id: 3
40
+ name: 'Arthur Philip Dent'
41
+
42
+ describe 'has_one', ->
43
+ it 'should add a has_one property with the associations descriptions', ->
44
+ $.type(person.has_one).should.be.eq 'array'
45
+
46
+
47
+ describe 'belongs_to', ->
48
+ it 'should add a belongs_to property with the associations descriptions', ->
49
+ $.type(person.belongs_to).should.be.eq 'array'
50
+
51
+ describe "{associated}_id", ->
52
+ xdescribe 'with autobuild option on the asssociation', ->
53
+ xit 'should return an partial resource when acessing associated', ->
54
+ @arthur.corporation_id = radio._id
55
+
56
+ @arthur.should.have.property 'corporation'
57
+ @arthur.corporation.should.be.object
58
+ @arthur.corporation.should.have.property 'resource'
59
+ @arthur.corporation.should.have.property '_id', radio._id
60
+
61
+ xit 'should fetch the resource when accessing associated and resource not present', (done) ->
62
+ radio = corporation
63
+ _id: 1
64
+ name: 'Local Radio'
65
+
66
+ @arthur.corporation_id = radio._id
67
+
68
+ @arthur.corporation.should.be.object
69
+ @arthur.corporation.should.have.property 'resource', radio.resource
70
+ @arthur.corporation._id.should.be null
71
+ @arthur.corporation.locking.should.be.object
72
+
73
+ @arthur.corporation.locking.done (corporation) ->
74
+ corporation.should.have.property '_id' , radio.id
75
+ corporation.should.have.property 'name', radio.name
76
+
77
+ it 'should notify changes', ->
78
+ radio = corporation _id: 1, name: 'Local Radio'
79
+ subscribed_id = sinon.spy()
80
+ subscribed = sinon.spy()
81
+
82
+ @arthur.subscribe 'corporation_id', subscribed_id
83
+ @arthur.subscribe 'corporation' , subscribed
84
+ @arthur.corporation_id = radio._id
85
+ @arthur.observation.deliver()
86
+
87
+ @arthur.corporation_id = null
88
+ @arthur.observation.deliver()
89
+
90
+ # Tests
91
+ subscribed.called.should.be.true
92
+ subscribed.callCount.should.be.eq 2
93
+ subscribed_id.called.should.be.true
94
+ subscribed_id.callCount.should.be.eq 2
95
+
96
+
97
+ it 'should remove {associated} when nulifying', ->
98
+ radio = corporation _id: 1, name: 'Local Radio'
99
+ subscribed = sinon.spy()
100
+
101
+ # Associate arthur with a corporation through id
102
+ @arthur.subscribe 'corporation_id', subscribed
103
+ @arthur.corporation_id = radio._id
104
+ @arthur.observation.deliver()
105
+
106
+ # Unassociate arthur with a corporation through id
107
+ @arthur.corporation_id = null
108
+ @arthur.observation.deliver()
109
+
110
+ subscribed.called.should.be.true
111
+ subscribed.callCount.should.be.eq 2
112
+ @arthur.should.have.property 'corporation_id', null
113
+ @arthur.should.have.property 'corporation' , null
114
+
115
+
116
+ describe "{associated}", ->
117
+
118
+ describe 'with autoload option on the association', ->
119
+
120
+ it 'should create associated when sustained and stored', ->
121
+ radio.sustained.should.be.true
122
+ @arthur.corporation_id = radio._id
123
+ @arthur.should.have.property 'corporation', radio
124
+
125
+
126
+ it 'should update {associated_id} and record when associated record changes', ->
127
+ radio = corporation
128
+ _id: 1
129
+ name: 'Local Radio'
130
+ sustained: true
131
+
132
+ expect(@arthur.corporation).to.be.null
133
+
134
+ @arthur.corporation = radio
135
+
136
+ @arthur.corporation_id
137
+ @arthur.should.have.property 'corporation' , radio
138
+ @arthur.should.have.property 'corporation_id', radio._id
139
+
140
+ @arthur.corporation = null
141
+ @arthur.observation.deliver()
142
+
143
+ @arthur.should.have.property 'corporation' , null
144
+ @arthur.should.have.property 'corporation_id', null
145
+
146
+ it 'should notify changes', ->
147
+ radio = corporation _id: 1, name: 'Local Radio'
148
+ subscribed = sinon.spy()
149
+ subscribed_id = sinon.spy()
150
+
151
+ @arthur.subscribe 'corporation' , subscribed
152
+ @arthur.subscribe 'corporation_id', subscribed_id
153
+ @arthur.corporation = radio
154
+ @arthur.observation.deliver()
155
+
156
+ @arthur.corporation = null
157
+ @arthur.observation.deliver()
158
+
159
+ # Tests
160
+ subscribed.called.should.be.true
161
+ subscribed.callCount.should.be.eq 2
162
+
163
+ subscribed_id.called.should.be.true
164
+ subscribed_id.callCount.should.be.eq 2
165
+
166
+ describe "#build_{associated}", ->
167
+ it 'should add builded object to association named attribute', ->
168
+ @arthur = person
169
+ name: 'Arthur Dent'
170
+
171
+ corporation = @arthur.build_corporation()
172
+ @arthur.should.have.property 'corporation'
173
+ expect(corporation).to.be.ok
174
+
175
+ describe 'has_many', ->
176
+ it 'should add a has_many property with the associations descriptions', ->
177
+ $.type(person.has_many).should.be.eq 'array'
178
+
179
+ it 'should return a record factory with associations stored', ->
180
+ person.has_many.should.be.array
181
+
182
+ has_many = Array.prototype.splice.call person.has_many, 0
183
+
184
+ has_many.should.contain 'friends'
185
+
186
+ describe '#()', ->
187
+
188
+ it 'should return a record with an association object', ->
189
+ person().should.have.property 'friends'
190
+
191
+ describe '{generated_association}', ->
192
+ association = null
193
+
194
+ beforeEach -> association = person().friends
195
+
196
+ it 'should have query methods', ->
197
+ # THINK Why has many check is here
198
+ # association.should.have.property 'has_many'
199
+ association.should.have.property 'find'
200
+ association.should.have.property 'each'
201
+ association.should.have.property 'reload'
202
+
203
+ describe '#every', ->
204
+
205
+ it 'should auto observe nested associations attributes'
@@ -0,0 +1,47 @@
1
+ require 'indemma/lib/record/restfulable.js'
2
+ require 'indemma/lib/record/dirtyable.js'
3
+
4
+ 'use strict'
5
+
6
+ root = exports ? window
7
+
8
+ model = root.model # TODO model = require 'indemma/model'
9
+ record = root.record # TODO model = require 'indemma/record'
10
+ jQuery = require 'component-jquery'
11
+
12
+ describe 'dirtyable', ->
13
+
14
+ describe 'when included', ->
15
+ it 'sets te dirtyable loaded flag on model', ->
16
+ model.dirtyable.should.be.true
17
+
18
+ describe 'record', ->
19
+ # TODO Convert to @arthur
20
+ describe '()', ->
21
+
22
+ beforeEach ->
23
+ # TODO Convert to @arthur
24
+ @person = model.call resource: 'person'
25
+ @arthur = @person name : 'Arthur Philip Dent'
26
+
27
+ describe '.dirty', ->
28
+ it 'should exist after initialization', ->
29
+ @arthur.should.have.property 'dirty'
30
+
31
+ it 'should be true on record changes', ->
32
+ @arthur.name = 10
33
+
34
+ # Force instantaneous delivery
35
+ @arthur.observation.deliver()
36
+
37
+ @arthur.dirty.should.be.true
38
+
39
+ describe '.saved()', ->
40
+ beforeEach -> sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
41
+ afterEach -> jQuery.ajax.restore()
42
+
43
+ it 'should clean record after', ->
44
+
45
+
46
+ describe 'model' , ->
47
+ describe '()', ->
@@ -0,0 +1,34 @@
1
+ 'use strict'
2
+
3
+ maid = require 'indemma/lib/record/maid.js'
4
+
5
+ describe 'maid', ->
6
+
7
+ beforeEach ->
8
+ @personable = model.call
9
+ resource: 'person'
10
+ washing: true
11
+
12
+ it 'should save upon record dirtying', (done) ->
13
+ @arthur = @personable name: 'Arthur Dent'
14
+
15
+ sinon.stub(@arthur, 'save').returns true
16
+ @arthur.name = 'Arthur Philip Dent'
17
+
18
+ setTimeout =>
19
+ @arthur.save.called.should.be.true
20
+ done()
21
+ , 1000
22
+
23
+
24
+ it 'should not save upon record creation', (done) ->
25
+ @timeout 10000
26
+ sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
27
+ @arthur = @personable name: 'Arthur Dent'
28
+
29
+ setTimeout =>
30
+ jQuery.ajax.called.should.be.false
31
+ jQuery.ajax.restore()
32
+ done()
33
+ , 2000
34
+
@@ -0,0 +1,39 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/persistable.js'
4
+
5
+ describe 'persistable', ->
6
+
7
+ describe 'model', ->
8
+ it 'should set the persistable key', ->
9
+ model.should.have.property 'persistable', true
10
+
11
+ describe '#find', ->
12
+ beforeEach ->
13
+ @xhr = jQuery.Deferred()
14
+ sinon.stub(jQuery, "ajax").returns @xhr
15
+
16
+ @personable = model.call
17
+ resource : 'person'
18
+ has_many : 'friends'
19
+ belongs_to: 'corporation'
20
+
21
+ @arthur = @personable
22
+ name: 'Arthur Philip Dent'
23
+
24
+ @xhr.resolveWith @arthur, [_id: 1]
25
+
26
+ # TODO use another way to check if record has persisted
27
+ @arthur.dirty = true
28
+
29
+ afterEach -> jQuery.ajax.restore()
30
+
31
+ it 'should try to store a record after saving when initialzed without id', (done) ->
32
+ sinon.stub(@personable.storage, 'store').returns true
33
+
34
+ @arthur.save =>
35
+ expect(@personable.storage.store.calledOnce).to.be.true
36
+ done()
37
+
38
+ @personable.storage.store.restore()
39
+
@@ -0,0 +1,33 @@
1
+ root = exports ? window
2
+
3
+ queryable = require 'indemma/lib/record/queryable.js'
4
+
5
+ describe 'queryable', ->
6
+
7
+ describe 'model', ->
8
+ beforeEach ->
9
+ @personable = model.call
10
+ resource : 'person'
11
+
12
+ it 'should set the queryable key', ->
13
+ model.should.have.property 'queryable', true
14
+
15
+ it 'should create a storage', ->
16
+ @personable.should.have.property 'storage'
17
+
18
+ describe '#find', ->
19
+ beforeEach ->
20
+ @xhr = jQuery.Deferred()
21
+ sinon.stub(jQuery, "ajax").returns @xhr
22
+
23
+ @arthur = @personable
24
+ _id: '1'
25
+ name: 'Arthur Philip Dent'
26
+
27
+ @arthur.save()
28
+ @xhr.resolveWith @arthur, [@arthur.json()]
29
+
30
+ afterEach -> jQuery.ajax.restore()
31
+
32
+ it 'should retrieve a record by key', ->
33
+ @personable.find('1').should.have.property 'name', @arthur.name
@@ -0,0 +1,69 @@
1
+ require 'indemma/lib/record/restfulable.js'
2
+ require 'indemma/lib/record/resource.js'
3
+
4
+ root = exports ? window
5
+
6
+ model = root.model # TODO model = require 'indemma/model'
7
+ record = root.record # TODO model = require 'indemma/record'
8
+ jQuery = require 'component-jquery'
9
+
10
+ describe 'resource', ->
11
+
12
+ describe 'with scope option', ->
13
+ person = towel = null
14
+
15
+ beforeEach ->
16
+ person = model.call
17
+ resource: 'person'
18
+
19
+ towel = model.call
20
+ resource:
21
+ name: 'towel'
22
+ scope: 'users'
23
+
24
+
25
+ it 'should be prefixed with scope', ->
26
+ towel. route.should.be.eq '/users/towels'
27
+ towel( { } ).route.should.be.eq '/users/towels'
28
+ towel(id: 1).route.should.be.eq '/users/towels'
29
+
30
+
31
+ describe 'with singular resource', ->
32
+ towel = null
33
+
34
+ beforeEach ->
35
+ towel = model.call
36
+ resource:
37
+ name: 'towel'
38
+ singular: true
39
+
40
+ deferred = jQuery.Deferred()
41
+
42
+ context = towel(name: 'Arthur Philip Dent')
43
+ context.lock = JSON.stringify context.json()
44
+ deferred.resolveWith context, [_id: 1, name: 'Arthur Philip Dent']
45
+
46
+ sinon.stub(jQuery, "ajax").returns(deferred)
47
+
48
+ promises = towel.create {name: 'Arthur Philip Dent'}, {name: 'Ford'}
49
+
50
+ afterEach -> jQuery.ajax.restore()
51
+
52
+ it 'the route should be in singular form', ->
53
+ towel. route.should.be.eq '/towel'
54
+ towel( { } ).route.should.be.eq '/towel'
55
+ towel(id: 1).route.should.be.eq '/towel'
56
+
57
+
58
+ describe 'when included', ->
59
+ xit 'sets the resource loaded flag on model', ->
60
+ # model.resource.should.be.true
61
+
62
+ describe 'model' , ->
63
+ it 'add methods to model object'
64
+
65
+ describe '#pluralize', ->
66
+ xit 'transforms word into plural form'
67
+
68
+ describe '#singularize', ->
69
+ xit 'transforms word into singular form'