ende 0.1.14 → 0.2.0

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 (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)