ende 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +2 -2
  3. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +1 -1
  4. data/lib/ende/version.rb +1 -1
  5. data/vendor/assets/components/build.js +638 -133
  6. data/vendor/components/indefinido-indemma/.gitignore +14 -0
  7. data/vendor/components/indefinido-indemma/.gitignore~ +2 -0
  8. data/vendor/components/indefinido-indemma/.ruby-gemset +1 -0
  9. data/vendor/components/indefinido-indemma/.ruby-version +1 -0
  10. data/vendor/components/indefinido-indemma/Gemfile +13 -0
  11. data/vendor/components/indefinido-indemma/Guardfile +39 -0
  12. data/vendor/components/indefinido-indemma/History.md +0 -0
  13. data/vendor/components/indefinido-indemma/Readme.md +447 -0
  14. data/vendor/components/indefinido-indemma/build/development.js +340 -0
  15. data/vendor/components/indefinido-indemma/build/release.js +22039 -0
  16. data/vendor/components/indefinido-indemma/build/test.js +22039 -0
  17. data/vendor/components/indefinido-indemma/component.json +7 -3
  18. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/component.json +18 -0
  19. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/index.js +110 -0
  20. data/vendor/components/indefinido-indemma/components/chaijs-chai/component.json +47 -0
  21. data/vendor/components/indefinido-indemma/components/chaijs-chai/index.js +1 -0
  22. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/assertion.js +130 -0
  23. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  24. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  25. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  26. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  27. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  28. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  29. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  30. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/eql.js +129 -0
  31. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  32. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  33. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  34. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  35. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  36. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  37. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  38. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  39. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  40. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  41. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  42. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  43. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  44. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  45. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  46. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai.js +80 -0
  47. data/vendor/components/indefinido-indemma/components/component-bind/component.json +14 -0
  48. data/vendor/components/indefinido-indemma/components/component-bind/index.js +24 -0
  49. data/vendor/components/indefinido-indemma/components/component-jquery/component.json +14 -0
  50. data/vendor/components/indefinido-indemma/components/component-jquery/index.js +9601 -0
  51. data/vendor/components/indefinido-indemma/components/component-type/component.json +18 -0
  52. data/vendor/components/indefinido-indemma/components/component-type/index.js +32 -0
  53. data/vendor/components/indefinido-indemma/components/indefinido-advisable/component.json +21 -0
  54. data/vendor/components/indefinido-indemma/components/indefinido-advisable/index.js +1 -0
  55. data/vendor/components/indefinido-indemma/components/indefinido-advisable/lib/advisable.js +60 -0
  56. data/vendor/components/indefinido-indemma/components/indefinido-observable/component.json +25 -0
  57. data/vendor/components/indefinido-indemma/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  58. data/vendor/components/indefinido-indemma/components/indefinido-observable/index.js +1 -0
  59. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  60. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/observable.js +323 -0
  61. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  62. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  63. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  64. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  65. data/vendor/components/indefinido-indemma/components/kapit-observe-utils/component.json +13 -0
  66. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/component.json +17 -0
  67. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/es6-shim.js +996 -0
  68. data/vendor/components/indefinido-indemma/components/pluma-assimilate/component.json +25 -0
  69. data/vendor/components/indefinido-indemma/components/pluma-assimilate/dist/assimilate.js +127 -0
  70. data/vendor/components/indefinido-indemma/karma.conf.js +86 -0
  71. data/vendor/components/indefinido-indemma/lib/record/associable.js +229 -82
  72. data/vendor/components/indefinido-indemma/lib/record/errors.js +1 -0
  73. data/vendor/components/indefinido-indemma/lib/record/persistable.js +32 -0
  74. data/vendor/components/indefinido-indemma/lib/record/queryable.js +32 -0
  75. data/vendor/components/indefinido-indemma/lib/record/resource.js +12 -4
  76. data/vendor/components/indefinido-indemma/lib/record/rest.js +1 -1
  77. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +38 -27
  78. data/vendor/components/indefinido-indemma/lib/record/scopable.js +15 -2
  79. data/vendor/components/indefinido-indemma/lib/record/storable.js +48 -0
  80. data/vendor/components/indefinido-indemma/lib/record/validatable.js +10 -5
  81. data/vendor/components/indefinido-indemma/lib/record/validations/cpf.js +1 -1
  82. data/vendor/components/indefinido-indemma/lib/record.js +15 -12
  83. data/vendor/components/indefinido-indemma/spec/record/associable_spec.js +137 -0
  84. data/vendor/components/indefinido-indemma/spec/record/persistable_spec.js +36 -0
  85. data/vendor/components/indefinido-indemma/spec/record/queryable_spec.js +33 -0
  86. data/vendor/components/indefinido-indemma/spec/record/resource_spec.js +93 -0
  87. data/vendor/components/indefinido-indemma/spec/record/rest_spec.js +32 -0
  88. data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +288 -0
  89. data/vendor/components/indefinido-indemma/spec/record/scopable_spec.js +212 -0
  90. data/vendor/components/indefinido-indemma/spec/record/storable_spec.js +53 -0
  91. data/vendor/components/indefinido-indemma/spec/record/translationable.js +28 -0
  92. data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +111 -0
  93. data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +43 -0
  94. data/vendor/components/indefinido-indemma/spec/record/validations/confirmation_spec.js +36 -0
  95. data/vendor/components/indefinido-indemma/spec/record/validations/cpf_spec.js +35 -0
  96. data/vendor/components/indefinido-indemma/spec/record/validations/presence_spec.js +28 -0
  97. data/vendor/components/indefinido-indemma/spec/record/validations/remote_spec.js +87 -0
  98. data/vendor/components/indefinido-indemma/spec/record/validations/type_spec.js +48 -0
  99. data/vendor/components/indefinido-indemma/spec/record_spec.js +37 -0
  100. data/vendor/components/indefinido-indemma/spec/spec_helper.js +11 -0
  101. data/vendor/components/indefinido-indemma/spec/support/value_objects/phone.js +45 -0
  102. data/vendor/components/indefinido-indemma/src/lib/extensions/rivets.coffee +17 -0
  103. data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +342 -0
  104. data/vendor/components/indefinido-indemma/src/lib/record/errors.coffee +20 -0
  105. data/vendor/components/indefinido-indemma/src/lib/record/maid.coffee +16 -0
  106. data/vendor/components/indefinido-indemma/src/lib/record/persistable.coffee +27 -0
  107. data/vendor/components/indefinido-indemma/src/lib/record/queryable.coffee +29 -0
  108. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +106 -0
  109. data/vendor/components/indefinido-indemma/src/lib/record/rest.coffee +28 -0
  110. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +348 -0
  111. data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +275 -0
  112. data/vendor/components/indefinido-indemma/src/lib/record/storable.coffee +46 -0
  113. data/vendor/components/indefinido-indemma/src/lib/record/translationable.coffee +18 -0
  114. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +217 -0
  115. data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +32 -0
  116. data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +19 -0
  117. data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +58 -0
  118. data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +19 -0
  119. data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +65 -0
  120. data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +32 -0
  121. data/vendor/components/indefinido-indemma/src/lib/record.coffee +136 -0
  122. data/vendor/components/indefinido-indemma/src/spec/record/associable_spec.coffee +130 -0
  123. data/vendor/components/indefinido-indemma/src/spec/record/persistable_spec.coffee +30 -0
  124. data/vendor/components/indefinido-indemma/src/spec/record/queryable_spec.coffee +27 -0
  125. data/vendor/components/indefinido-indemma/src/spec/record/resource_spec.coffee +69 -0
  126. data/vendor/components/indefinido-indemma/src/spec/record/rest_spec.coffee +22 -0
  127. data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +207 -0
  128. data/vendor/components/indefinido-indemma/src/spec/record/scopable_spec.coffee +191 -0
  129. data/vendor/components/indefinido-indemma/src/spec/record/storable_spec.coffee +40 -0
  130. data/vendor/components/indefinido-indemma/src/spec/record/translationable.coffee +19 -0
  131. data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +100 -0
  132. data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +35 -0
  133. data/vendor/components/indefinido-indemma/src/spec/record/validations/confirmation_spec.coffee +25 -0
  134. data/vendor/components/indefinido-indemma/src/spec/record/validations/cpf_spec.coffee +28 -0
  135. data/vendor/components/indefinido-indemma/src/spec/record/validations/presence_spec.coffee +24 -0
  136. data/vendor/components/indefinido-indemma/src/spec/record/validations/remote_spec.coffee +74 -0
  137. data/vendor/components/indefinido-indemma/src/spec/record/validations/type_spec.coffee +33 -0
  138. data/vendor/components/indefinido-indemma/src/spec/record_spec.coffee +23 -0
  139. data/vendor/components/indefinido-indemma/src/spec/spec_helper.coffee +9 -0
  140. data/vendor/components/indefinido-indemma/src/spec/support/value_objects/phone.coffee +30 -0
  141. data/vendor/components/indefinido-indemma/vendor/object/mixin.js +196 -0
  142. data/vendor/components/indefinido-indemma/vendor/owl/pluralize.js +190 -0
  143. metadata +130 -2
@@ -0,0 +1,14 @@
1
+ # Coverage reports
2
+
3
+ # Emacs Temporary Files
4
+ *~
5
+ *#
6
+ .#*
7
+
8
+ # Eclipse
9
+ .directory
10
+ .project
11
+ .loadpath
12
+
13
+ # Mac OS X Files
14
+ .DS_*
@@ -0,0 +1,2 @@
1
+ components
2
+ build
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p195
@@ -0,0 +1,13 @@
1
+ # A sample Gemfile
2
+ source "https://rubygems.org"
3
+
4
+
5
+ group :development do
6
+ # gem 'libv8'
7
+ gem 'guard'
8
+ gem 'guard-coffeescript'
9
+ gem 'guard-shell'
10
+ gem "guard-bundler"
11
+ gem "rb-fsevent", :require => false
12
+ gem "growl", "~> 1.0"
13
+ end
@@ -0,0 +1,39 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'bundler' do
5
+ watch('Gemfile')
6
+ # Uncomment next line if Gemfile contain `gemspec' command
7
+ # watch(/^.+\.gemspec/)
8
+ end
9
+
10
+ guard 'coffeescript', :input => 'src', :output => '.', :bare => true
11
+ # Add files and commands to this file, like the example:
12
+ # watch(%r{file/path}) { `command(s)` }
13
+ #
14
+ guard 'shell' do
15
+ watch(/src\/lib\/(.*).coffee/) { |m|
16
+ puts ' Building release component'
17
+ puts `component-build --verbose --name release`
18
+
19
+ puts ' Building development component'
20
+ puts `component-build --verbose --name development --dev`
21
+
22
+ puts ' Building tests component'
23
+ puts `component-build --verbose --name test --dev`
24
+ }
25
+
26
+ watch(/component.json/) { |m|
27
+ puts ' Installing possible new components'
28
+ puts `component install`
29
+
30
+ puts ' Building release component'
31
+ puts `component-build --verbose --name release`
32
+
33
+ puts ' Building development component'
34
+ puts `component-build --verbose --name development --dev`
35
+
36
+ puts ' Building tests component'
37
+ puts `component-build --verbose --name test`
38
+ }
39
+ end
File without changes
@@ -0,0 +1,447 @@
1
+
2
+ indemma
3
+ =======
4
+
5
+ Indemma (mind picture → memory), client side, ES5 observable and REST, extensible modular data model.
6
+
7
+ Current version 0.1.0
8
+
9
+ Summary
10
+ -------
11
+
12
+ - We are tired of calling .attr on our models.
13
+ - We are tired of using templates
14
+ - We want a decent kind of polyfill to view models and rest clients until polymer is out of beta
15
+ - Requirements
16
+ - ES5 Getters and Setters (Shim ships with component, IE 10+)
17
+ - ES7 Observer (Shim ships with component, IE ?+)
18
+
19
+ Installation
20
+ ------------
21
+
22
+ $ component install indefinido/indemma
23
+
24
+ Usage
25
+ -----
26
+
27
+ ### Basic Functionality (Query, Observable, Advisable)
28
+
29
+ Basic functionality: Just a copy of [ActiveRecord Interface](https://github.com/rails/rails/blob/master/activerecord) on javascript.
30
+
31
+ #### Model
32
+
33
+ ```javascript
34
+
35
+ require('indemma');
36
+
37
+ var person = model.call({
38
+ resource: 'person',
39
+ record: {
40
+ after_initialize: [] // Callbacks
41
+
42
+ // Default attributes
43
+ avatar: "assets/images/layout/avatar_placeholder.png"
44
+ }
45
+ });
46
+
47
+ // In the future will return a promise object
48
+ // for now it doesn't, i know it's bad
49
+ person.create({name: "Arthur Philip Dent"}, {name: "Ford Perfect"});
50
+
51
+ // some time passed here
52
+
53
+ person.find(1) // {name: "Arthur Philip Dent", subscribe: ..., before: ..., after: ..., ... }
54
+
55
+ person.all() // [{name: "Arthur Philip Dent", subscribe: ..., ... }, {name: "Ford Perfect", subscribe: ..., ... }]
56
+
57
+ // TODO active record interface like: person.where(attribute: value)
58
+ ```
59
+
60
+ #### Record
61
+
62
+ ```javascript
63
+
64
+ require('indemma');
65
+
66
+ var person = model.call({resource: 'person'}),
67
+
68
+ arthur = person({
69
+ name : function () { return this.firstname + " " + this.surname; },
70
+ firstname: "Arthur Philip",
71
+ surname : "Dent",
72
+ species : "Humam"
73
+ });
74
+
75
+ // Subscribe to all changes
76
+ arthur.subscribe(function (updates) {
77
+ var i = updates.length, update;
78
+ while (i--) {
79
+ update = updates[i];
80
+ console.log(update.name, update.type, update.oldValue, '→', update.object[update.name]); // also this[update.name]
81
+ }
82
+ });
83
+
84
+ // Subscribe to single property change
85
+ arthur.subscribe('firstname', function ( update) {
86
+ console.log( update.name, update.type, update.oldValue, '→', update.object[ update.name]); // also this[ update.name]
87
+ });
88
+
89
+ // Advice function calls
90
+ arthur.after('name', function () {
91
+ console.log('excuted after arthur.name()');
92
+ });
93
+
94
+ arthur.firstname = "Arthur Philip Dent";
95
+ delete arthur.name
96
+ ```
97
+
98
+ ### Extensions
99
+
100
+ #### Associations
101
+
102
+ Basic active record like associations
103
+
104
+ ```javascript
105
+ require('indemma');
106
+
107
+ // Activate association support
108
+ require('indemma/lib/record/associations'); // Working on to be require('indemma/association')
109
+ model.associable();
110
+
111
+ var person = model.call({
112
+ resource: 'person',
113
+ has_many: 'towels' // Yes! Say no to camelcase!
114
+ }),
115
+
116
+ towel = model.call({
117
+ resource: 'towel',
118
+ belongs_to: 'person'
119
+ })
120
+
121
+ // Lets have our data
122
+
123
+ arthur = person({
124
+ name : function () { return this.firstname + " " + this.surname; },
125
+ firstname: "Arthur Philip",
126
+ surname : "Dent",
127
+ species : "Humam"
128
+ });
129
+
130
+ // Magic (⚡) and Science (☣) happening now
131
+ microfiber_towel = arthur.towels.create({
132
+ material : 'microfiber',
133
+ color : 'orange',
134
+ functions_amount: Infinity
135
+ });
136
+
137
+
138
+ arthur.towels[0] === microfiber_towel // true
139
+ arthur.towels.length // 1
140
+
141
+ microfiber_towel.person_id // 1
142
+ microfiber_towel.person = person({name: "Ford"}) // 1
143
+ microfiber_towel.person_id // 2 (This may vary depending on storage)
144
+ arthur.towels.length // 0
145
+ ```
146
+
147
+ TODO table with all available methods per association
148
+
149
+
150
+ Nested Attributes
151
+
152
+ ```javascript
153
+ require('indemma');
154
+
155
+ // Activate association support
156
+ require('indemma/lib/record/associations'); // Working on to be require('indemma/association')
157
+ model.associable();
158
+
159
+ var person = model.call({
160
+ resource: 'person',
161
+ nest_attributes: 'towel'
162
+ }),
163
+
164
+ towel = model.call({
165
+ resource: 'towel'
166
+ }),
167
+
168
+ arthur = person({
169
+ name : function () { return this.firstname + " " + this.surname; },
170
+ firstname: "Arthur Philip",
171
+ surname : "Dent",
172
+ species : "Humam"
173
+ });
174
+
175
+ arthur.towel_attributes = { material: 'microfiber', functions: Infinity }
176
+ arthur.towels[0]; // { material: 'microfiber', functions: Infinity } (Still in beta)
177
+
178
+ ```
179
+
180
+ #### Restful
181
+
182
+ ```javascript
183
+
184
+ require('indemma');
185
+
186
+ // Activate restful support
187
+ // Compatible with default rails json rendering e.g. render :json => @person
188
+ // Depends on resourceful module
189
+ require('indemma/lib/record/restful'); // Working on to be require('indemma/restful')
190
+
191
+ var person = model.call({
192
+ resource: 'person'
193
+ }),
194
+
195
+ arthur = person({
196
+ name : function () { return this.firstname + " " + this.surname; },
197
+ firstname: "Arthur Philip",
198
+ surname : "Dent",
199
+ species : "Humam"
200
+ });
201
+
202
+ // ⚡ + ☣ again
203
+ arthur.save(); // POST /people
204
+
205
+ // ... some time passes
206
+ arthur.species = "Homo Sapiens Sapiens";
207
+ arthur.save(); // PUT /people/1
208
+
209
+ // serialization
210
+ arthur.json(); // {name: "Arthur Philip Dent", firstname: "Arthur Philip", surname: "Dent", species: "Humam"}
211
+
212
+ ```
213
+
214
+ #### Resourcefull
215
+
216
+ Inflection and resource modules together.
217
+
218
+ ```javascript
219
+
220
+ require('indemma/lib/record/resource'); // Working on to be require('indemma/resourceable')
221
+
222
+ var person = model.call({
223
+ resource: {
224
+ name : 'person',
225
+ param_name: 'guy',
226
+ scope : 'world'
227
+ // singular: true // Works as singular resource too =D
228
+ }
229
+ }),
230
+
231
+ arthur = person({
232
+ name : "Arthur Philip",
233
+ species: "Humam"
234
+ });
235
+
236
+ // Also sets the accept header to application/json
237
+
238
+ arthur.save(); // POST /world/person?guy[name]=Arthur Philip&guy[species]=Human
239
+
240
+ ```
241
+
242
+ #### Scopable
243
+
244
+ Active Record like scopes and some finders
245
+
246
+ ```javascript
247
+ require('indemma/lib/record/scopable'); // Working on to be require('indemma/scopable)
248
+
249
+ // Sintax is up to change yet
250
+ var person = model.call({
251
+ resource: 'person',
252
+ $gender: String,
253
+ $age: Number
254
+ $towel_ids: Array
255
+
256
+ // $towel: function () {} // Runtime scope builders to come
257
+ });
258
+
259
+ // Also sets the accept header to application/json
260
+
261
+ person.all(); // GET /people
262
+ person.gender('m'); // GET /people?gender=m
263
+ person.age(32); // GET /people?age=32
264
+ person.none.age(32); // GET /people
265
+ person.towel_ids(1, 2, 3); // GET /people?towel_ids[]=1&towel_ids[]=2&towel_ids[]=3
266
+
267
+ ```
268
+
269
+ #### Maid
270
+
271
+ TODO make documentation
272
+
273
+ #### Storage (Persistance, Queryable & Storeable)
274
+
275
+ TODO make documentation
276
+
277
+ ### Validations support
278
+
279
+ ```javascript
280
+ require('indemma');
281
+
282
+ // model definition
283
+ var person = model.call({
284
+ resource : 'person',
285
+
286
+ email : 'Email', // By default uses type validation
287
+ age : Number,
288
+ birthday : {type: Number},
289
+
290
+ // You can use builtin validators sintax
291
+ validates_presence_of : 'age',
292
+ validates_remotely : 'email', // Remote validator will do POST /people/validate?person[email]=arthur@earth.com
293
+
294
+ // Coming soon!
295
+ // validates : {name: {beginsWith: 'arthur', presence: true}} // Or you can use the object syntax
296
+
297
+ });
298
+
299
+
300
+ arthur = person({
301
+ name: "Arthur Philip Dent",
302
+ });
303
+
304
+
305
+ arthur.email = "arthur@earth.com";// "arthur@earth.com"
306
+ arthur.valid; // true
307
+
308
+ arthur.email = "wrong@@";
309
+ arthur.valid; // false
310
+
311
+ // When calling valid attribute will trigger validations
312
+ arthur.errors; // [ email: ["Email 'wrongg@@' is in an invalid format.", "..."]
313
+ arthur.errors.messages.email; // "Email 'wrongg@@' is in an invalid format."
314
+
315
+ // When using remote validations use the returned deferred
316
+ arthur.validate(function (record, validation_results...) {
317
+ alert(record.errors.messages.email);
318
+ });
319
+
320
+ <div>
321
+ <input class="invalid" data-value="user.email" data-class-invalid="user.errors.messages.email" />
322
+ </div>
323
+
324
+ // Validators reference
325
+ person.validators // [ {attribute_name: 'email', type: 'Email', ... } , ... ]
326
+
327
+
328
+ // Suport for custom validators coming soon!
329
+ // person.validators.phone = function (record, attribute, value) {... }
330
+
331
+ ```
332
+
333
+ #### Adapters
334
+
335
+ ##### Rivets
336
+
337
+ ```javascript
338
+ require('indemma');
339
+
340
+ // Activate restful support
341
+ // Requires observer-shim
342
+ // Compatible with default rails json rendering e.g. render :json => @person
343
+ require('indemma/lib/record/rivets'); // Working on to be require('indemma/adapters/rivets')
344
+
345
+ var person = model.call({resource: 'person'}),
346
+
347
+ arthur = person({
348
+ name : function () { return this.firstname + " " + this.surname; },
349
+ firstname: "Arthur Philip",
350
+ surname : "Dent",
351
+ species : "Humam"
352
+ }),
353
+
354
+ template = '<div class="person">' +
355
+ ' <span data-html="person.name"></span> ' +
356
+ ' <span data-html="person.species"></span> ' +
357
+ '</div>';
358
+
359
+ document.body.innerHTML = template;
360
+ element = document.body.children[0];
361
+
362
+ arthur.tie(element); // equivalent to rivets.bind(element, {person: arthur});
363
+
364
+ arthur.species = "Homo Sapiens";
365
+
366
+ ```
367
+
368
+ ## TODO
369
+
370
+ Move API to a custom page or the github wiki
371
+
372
+ ## Tests!
373
+
374
+ A medium part of tests has been written, but more on the go!
375
+ You can help by implementing the body of some spec
376
+
377
+
378
+ ### Define property on steroids sintax support
379
+
380
+ With setter on steroids
381
+
382
+ ```javascript
383
+ require('indemma');
384
+
385
+ // model definition
386
+ var person = model.call({
387
+ resource : 'person',
388
+ name : {
389
+ set : function (name) { this.name = name.split(' '); },
390
+ get : function (name) { this.name.join(' '); }
391
+ },
392
+ firstname: {
393
+ get : function () { this.name[0] },
394
+ }
395
+ });
396
+
397
+ arthur = person({
398
+ name: "Arthur Philip Dent",
399
+ species : "Humam"
400
+ });
401
+
402
+ arthur.firstname // Arthur
403
+ ```
404
+
405
+ ### Inflections support
406
+
407
+ ```javascript
408
+ require('indemma');
409
+
410
+ var person = model.call({resource: 'person'});
411
+ person.plural // 'people'
412
+
413
+ ```
414
+
415
+ ### Storage extension
416
+
417
+ ```javascript
418
+ require('indemma');
419
+
420
+ model.storable()
421
+
422
+ arthur = person({
423
+ name: "Arthur Philip Dent",
424
+ species : "Humam",
425
+ });
426
+
427
+ arthur.save() // Store on selected storage (localStorage, memory, etc ...)
428
+ ```
429
+
430
+ ### Single extensions call option
431
+
432
+ ```javascript
433
+ require('indemma');
434
+
435
+ model(['advisable', 'observable', 'restfulable', 'maid', ... ]);
436
+ ```
437
+
438
+ Credits
439
+ -------
440
+
441
+ Built upon the lovely [coffeescript](http://coffeescript.org/) language
442
+ Building with [the prototypal paradigm](http://ericleads.com/2013/02/fluent-javascript-three-different-kinds-of-prototypal-oo) library [stampit](https://github.com/dilvie/stampit)
443
+
444
+
445
+
446
+
447
+ This project rocks and uses [WTFP-LICENSE](http://www.wtfpl.net)