ende 0.1.14 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +1 -1
  3. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +5 -2
  4. data/lib/assets/javascripts/aura/extensions/models.js.coffee.erb +4 -3
  5. data/lib/assets/javascripts/value_objects/phone.js.coffee +8 -2
  6. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +18 -21
  7. data/lib/ende/version.rb +1 -1
  8. data/lib/ende.rb +2 -2
  9. data/vendor/assets/javascripts/ende/build.js +485 -4879
  10. data/vendor/components/component-querystring/component.json +18 -0
  11. data/vendor/components/component-querystring/index.js +49 -0
  12. data/vendor/components/component-trim/component.json +13 -0
  13. data/vendor/components/component-trim/index.js +17 -0
  14. data/vendor/components/indefinido-indemma/.gitignore +14 -0
  15. data/vendor/components/indefinido-indemma/.ruby-gemset +1 -0
  16. data/vendor/components/indefinido-indemma/.ruby-version +1 -0
  17. data/vendor/components/indefinido-indemma/Gemfile +13 -0
  18. data/vendor/components/indefinido-indemma/Guardfile +39 -0
  19. data/vendor/components/indefinido-indemma/History.md +0 -0
  20. data/vendor/components/indefinido-indemma/Readme.md +443 -0
  21. data/vendor/components/indefinido-indemma/build/development.js +331 -0
  22. data/vendor/components/indefinido-indemma/build/release.js +21693 -0
  23. data/vendor/components/indefinido-indemma/build/test.js +331 -0
  24. data/vendor/components/indefinido-indemma/component.json +8 -9
  25. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/component.json +18 -0
  26. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/index.js +110 -0
  27. data/vendor/components/indefinido-indemma/components/chaijs-chai/component.json +47 -0
  28. data/vendor/components/indefinido-indemma/components/chaijs-chai/index.js +1 -0
  29. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/assertion.js +130 -0
  30. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  31. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  32. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  33. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  34. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  35. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  36. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  37. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/eql.js +129 -0
  38. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  39. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  40. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  41. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  42. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  43. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  44. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  45. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  46. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  47. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  48. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  49. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  50. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  51. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  52. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  53. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai.js +80 -0
  54. data/vendor/components/indefinido-indemma/components/component-bind/component.json +14 -0
  55. data/vendor/components/indefinido-indemma/components/component-bind/index.js +24 -0
  56. data/vendor/components/indefinido-indemma/components/component-jquery/component.json +14 -0
  57. data/vendor/components/indefinido-indemma/components/component-jquery/index.js +9601 -0
  58. data/vendor/components/indefinido-indemma/components/component-type/component.json +18 -0
  59. data/vendor/components/indefinido-indemma/components/component-type/index.js +32 -0
  60. data/vendor/components/indefinido-indemma/components/indefinido-advisable/component.json +21 -0
  61. data/vendor/components/indefinido-indemma/components/indefinido-advisable/index.js +1 -0
  62. data/vendor/components/indefinido-indemma/components/indefinido-advisable/lib/advisable.js +60 -0
  63. data/vendor/components/indefinido-indemma/components/indefinido-observable/component.json +25 -0
  64. data/vendor/components/indefinido-indemma/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  65. data/vendor/components/indefinido-indemma/components/indefinido-observable/index.js +1 -0
  66. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  67. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/observable.js +323 -0
  68. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  69. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  70. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  71. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  72. data/vendor/components/indefinido-indemma/components/kapit-observe-utils/component.json +13 -0
  73. data/vendor/components/indefinido-indemma/components/pluma-assimilate/component.json +25 -0
  74. data/vendor/components/indefinido-indemma/components/pluma-assimilate/dist/assimilate.js +87 -0
  75. data/vendor/components/indefinido-indemma/karma.conf.js +86 -0
  76. data/vendor/components/indefinido-indemma/lib/record/associable.js +6 -6
  77. data/vendor/components/indefinido-indemma/lib/record/errors.js +1 -0
  78. data/vendor/components/indefinido-indemma/lib/record/resource.js +14 -3
  79. data/vendor/components/indefinido-indemma/lib/record/rest.js +7 -4
  80. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +45 -15
  81. data/vendor/components/indefinido-indemma/lib/record/scopable.js +13 -3
  82. data/vendor/components/indefinido-indemma/lib/record/validatable.js +20 -9
  83. data/vendor/components/indefinido-indemma/lib/record/validations/confirmation.js +1 -1
  84. data/vendor/components/indefinido-indemma/lib/record/validations/remote.js +6 -5
  85. data/vendor/components/indefinido-indemma/lib/record/validations/type.js +29 -0
  86. data/vendor/components/indefinido-indemma/lib/record.js +1 -11
  87. data/vendor/components/indefinido-indemma/spec/record/associable_spec.js +76 -0
  88. data/vendor/components/indefinido-indemma/spec/record/resource_spec.js +90 -0
  89. data/vendor/components/indefinido-indemma/spec/record/rest_spec.js +32 -0
  90. data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +232 -0
  91. data/vendor/components/indefinido-indemma/spec/record/scopable_spec.js +201 -0
  92. data/vendor/components/indefinido-indemma/spec/record/translationable.js +28 -0
  93. data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +111 -0
  94. data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +43 -0
  95. data/vendor/components/indefinido-indemma/spec/record/validations/confirmation_spec.js +36 -0
  96. data/vendor/components/indefinido-indemma/spec/record/validations/cpf_spec.js +35 -0
  97. data/vendor/components/indefinido-indemma/spec/record/validations/presence_spec.js +28 -0
  98. data/vendor/components/indefinido-indemma/spec/record/validations/remote_spec.js +86 -0
  99. data/vendor/components/indefinido-indemma/spec/record/validations/type_spec.js +48 -0
  100. data/vendor/components/indefinido-indemma/spec/record_spec.js +37 -0
  101. data/vendor/components/indefinido-indemma/spec/spec_helper.js +11 -0
  102. data/vendor/components/indefinido-indemma/spec/support/value_objects/phone.js +45 -0
  103. data/vendor/components/indefinido-indemma/src/lib/extensions/rivets.coffee +17 -0
  104. data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +173 -0
  105. data/vendor/components/indefinido-indemma/src/lib/record/errors.coffee +20 -0
  106. data/vendor/components/indefinido-indemma/src/lib/record/maid.coffee +16 -0
  107. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +103 -0
  108. data/vendor/components/indefinido-indemma/src/lib/record/rest.coffee +28 -0
  109. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +314 -0
  110. data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +266 -0
  111. data/vendor/components/indefinido-indemma/src/lib/record/translationable.coffee +18 -0
  112. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +209 -0
  113. data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +32 -0
  114. data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +19 -0
  115. data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +58 -0
  116. data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +19 -0
  117. data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +65 -0
  118. data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +32 -0
  119. data/vendor/components/indefinido-indemma/src/lib/record.coffee +123 -0
  120. data/vendor/components/indefinido-indemma/src/spec/record/associable_spec.coffee +63 -0
  121. data/vendor/components/indefinido-indemma/src/spec/record/resource_spec.coffee +64 -0
  122. data/vendor/components/indefinido-indemma/src/spec/record/rest_spec.coffee +22 -0
  123. data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +164 -0
  124. data/vendor/components/indefinido-indemma/src/spec/record/scopable_spec.coffee +181 -0
  125. data/vendor/components/indefinido-indemma/src/spec/record/translationable.coffee +19 -0
  126. data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +100 -0
  127. data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +35 -0
  128. data/vendor/components/indefinido-indemma/src/spec/record/validations/confirmation_spec.coffee +25 -0
  129. data/vendor/components/indefinido-indemma/src/spec/record/validations/cpf_spec.coffee +28 -0
  130. data/vendor/components/indefinido-indemma/src/spec/record/validations/presence_spec.coffee +24 -0
  131. data/vendor/components/indefinido-indemma/src/spec/record/validations/remote_spec.coffee +72 -0
  132. data/vendor/components/indefinido-indemma/src/spec/record/validations/type_spec.coffee +33 -0
  133. data/vendor/components/indefinido-indemma/src/spec/record_spec.coffee +23 -0
  134. data/vendor/components/indefinido-indemma/src/spec/spec_helper.coffee +9 -0
  135. data/vendor/components/indefinido-indemma/src/spec/support/value_objects/phone.coffee +30 -0
  136. data/vendor/components/indefinido-indemma/vendor/owl/pluralize.js +190 -0
  137. data/vendor/components/indefinido-observable/lib/observable.js +3 -0
  138. metadata +119 -2
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "querystring",
3
+ "version": "1.1.0",
4
+ "description": "Simple key/value pair query-string parsing",
5
+ "keywords": [
6
+ "query",
7
+ "querystring",
8
+ "query-string",
9
+ "parser"
10
+ ],
11
+ "scripts": [
12
+ "index.js"
13
+ ],
14
+ "dependencies": {
15
+ "component/trim": "*"
16
+ },
17
+ "repo": "https://raw.github.com/component/querystring"
18
+ }
@@ -0,0 +1,49 @@
1
+
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
6
+ var trim = require('trim');
7
+
8
+ /**
9
+ * Parse the given query `str`.
10
+ *
11
+ * @param {String} str
12
+ * @return {Object}
13
+ * @api public
14
+ */
15
+
16
+ exports.parse = function(str){
17
+ if ('string' != typeof str) return {};
18
+
19
+ str = trim(str);
20
+ if ('' == str) return {};
21
+
22
+ var obj = {};
23
+ var pairs = str.split('&');
24
+ for (var i = 0; i < pairs.length; i++) {
25
+ var parts = pairs[i].split('=');
26
+ obj[parts[0]] = null == parts[1]
27
+ ? ''
28
+ : decodeURIComponent(parts[1]);
29
+ }
30
+
31
+ return obj;
32
+ };
33
+
34
+ /**
35
+ * Stringify the given `obj`.
36
+ *
37
+ * @param {Object} obj
38
+ * @return {String}
39
+ * @api public
40
+ */
41
+
42
+ exports.stringify = function(obj){
43
+ if (!obj) return '';
44
+ var pairs = [];
45
+ for (var key in obj) {
46
+ pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
47
+ }
48
+ return pairs.join('&');
49
+ };
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "trim",
3
+ "version": "0.0.1",
4
+ "description": "Trim string whitespace",
5
+ "keywords": [
6
+ "string",
7
+ "trim"
8
+ ],
9
+ "scripts": [
10
+ "index.js"
11
+ ],
12
+ "repo": "https://raw.github.com/component/trim"
13
+ }
@@ -0,0 +1,17 @@
1
+
2
+ exports = module.exports = trim;
3
+
4
+ function trim(str){
5
+ if (str.trim) return str.trim();
6
+ return str.replace(/^\s*|\s*$/g, '');
7
+ }
8
+
9
+ exports.left = function(str){
10
+ if (str.trimLeft) return str.trimLeft();
11
+ return str.replace(/^\s*/, '');
12
+ };
13
+
14
+ exports.right = function(str){
15
+ if (str.trimRight) return str.trimRight();
16
+ return str.replace(/\s*$/, '');
17
+ };
@@ -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 @@
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,443 @@
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
+ ### Validations support
274
+
275
+ ```javascript
276
+ require('indemma');
277
+
278
+ // model definition
279
+ var person = model.call({
280
+ resource : 'person',
281
+
282
+ email : 'Email', // By default uses type validation
283
+ age : Number,
284
+ birthday : {type: Number},
285
+
286
+ // You can use builtin validators sintax
287
+ validates_presence_of : 'age',
288
+ validates_remotely : 'email', // Remote validator will do POST /people/validate?person[email]=arthur@earth.com
289
+
290
+ // Coming soon!
291
+ // validates : {name: {beginsWith: 'arthur', presence: true}} // Or you can use the object syntax
292
+
293
+ });
294
+
295
+
296
+ arthur = person({
297
+ name: "Arthur Philip Dent",
298
+ });
299
+
300
+
301
+ arthur.email = "arthur@earth.com";// "arthur@earth.com"
302
+ arthur.valid; // true
303
+
304
+ arthur.email = "wrong@@";
305
+ arthur.valid; // false
306
+
307
+ // When calling valid attribute will trigger validations
308
+ arthur.errors; // [ email: ["Email 'wrongg@@' is in an invalid format.", "..."]
309
+ arthur.errors.messages.email; // "Email 'wrongg@@' is in an invalid format."
310
+
311
+ // When using remote validations use the returned deferred
312
+ arthur.validate(function (record, validation_results...) {
313
+ alert(record.errors.messages.email);
314
+ });
315
+
316
+ <div>
317
+ <input class="invalid" data-value="user.email" data-class-invalid="user.errors.messages.email" />
318
+ </div>
319
+
320
+ // Validators reference
321
+ person.validators // [ {attribute_name: 'email', type: 'Email', ... } , ... ]
322
+
323
+
324
+ // Suport for custom validators coming soon!
325
+ // person.validators.phone = function (record, attribute, value) {... }
326
+
327
+ ```
328
+
329
+ #### Adapters
330
+
331
+ ##### Rivets
332
+
333
+ ```javascript
334
+ require('indemma');
335
+
336
+ // Activate restful support
337
+ // Requires observer-shim
338
+ // Compatible with default rails json rendering e.g. render :json => @person
339
+ require('indemma/lib/record/rivets'); // Working on to be require('indemma/adapters/rivets')
340
+
341
+ var person = model.call({resource: 'person'}),
342
+
343
+ arthur = person({
344
+ name : function () { return this.firstname + " " + this.surname; },
345
+ firstname: "Arthur Philip",
346
+ surname : "Dent",
347
+ species : "Humam"
348
+ }),
349
+
350
+ template = '<div class="person">' +
351
+ ' <span data-html="person.name"></span> ' +
352
+ ' <span data-html="person.species"></span> ' +
353
+ '</div>';
354
+
355
+ document.body.innerHTML = template;
356
+ element = document.body.children[0];
357
+
358
+ arthur.tie(element); // equivalent to rivets.bind(element, {person: arthur});
359
+
360
+ arthur.species = "Homo Sapiens";
361
+
362
+ ```
363
+
364
+ ## TODO
365
+
366
+ Move API to a custom page or the github wiki
367
+
368
+ ## Tests!
369
+
370
+ A medium part of tests has been written, but more on the go!
371
+ You can help by implementing the body of some spec
372
+
373
+
374
+ ### Define property on steroids sintax support
375
+
376
+ With setter on steroids
377
+
378
+ ```javascript
379
+ require('indemma');
380
+
381
+ // model definition
382
+ var person = model.call({
383
+ resource : 'person',
384
+ name : {
385
+ set : function (name) { this.name = name.split(' '); },
386
+ get : function (name) { this.name.join(' '); }
387
+ },
388
+ firstname: {
389
+ get : function () { this.name[0] },
390
+ }
391
+ });
392
+
393
+ arthur = person({
394
+ name: "Arthur Philip Dent",
395
+ species : "Humam"
396
+ });
397
+
398
+ arthur.firstname // Arthur
399
+ ```
400
+
401
+ ### Inflections support
402
+
403
+ ```javascript
404
+ require('indemma');
405
+
406
+ var person = model.call({resource: 'person'});
407
+ person.plural // 'people'
408
+
409
+ ```
410
+
411
+ ### Storage extension
412
+
413
+ ```javascript
414
+ require('indemma');
415
+
416
+ model.storable()
417
+
418
+ arthur = person({
419
+ name: "Arthur Philip Dent",
420
+ species : "Humam",
421
+ });
422
+
423
+ arthur.save() // Store on selected storage (localStorage, memory, etc ...)
424
+ ```
425
+
426
+ ### Single extensions call option
427
+
428
+ ```javascript
429
+ require('indemma');
430
+
431
+ model(['advisable', 'observable', 'restfulable', 'maid', ... ]);
432
+ ```
433
+
434
+ Credits
435
+ -------
436
+
437
+ Built upon the lovely [coffeescript](http://coffeescript.org/) language
438
+ 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)
439
+
440
+
441
+
442
+
443
+ This project rocks and uses [WTFP-LICENSE](http://www.wtfpl.net)