ende 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +2 -2
  3. data/components/indefinido/indemma/master/component.json +27 -17
  4. data/components/indefinido/indemma/master/lib/record/associable.js +74 -75
  5. data/components/indefinido/indemma/master/lib/record/dirtyable.js +40 -0
  6. data/components/indefinido/indemma/master/lib/record/queryable.js +2 -2
  7. data/components/indefinido/indemma/master/lib/record/resource.js +1 -1
  8. data/components/indefinido/indemma/master/lib/record/rest.js +7 -2
  9. data/components/indefinido/indemma/master/lib/record/restfulable.js +37 -10
  10. data/components/indefinido/indemma/master/lib/record/scopable.js +20 -47
  11. data/components/indefinido/indemma/master/lib/record/storable.js +11 -0
  12. data/components/indefinido/indemma/master/lib/record/validatable.js +195 -1068
  13. data/components/indefinido/indemma/master/lib/record.js +1 -1
  14. data/components/indefinido/indemma/master/vendor/stampit.js +568 -242
  15. data/components/indefinido/observable/es6-modules/component.json +39 -0
  16. data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/lib/adapters/rivets.js +3 -1
  17. data/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
  18. data/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +114 -0
  19. data/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
  20. data/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
  21. data/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
  22. data/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
  23. data/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
  24. data/components/indefinido/observable/es6-modules/lib/observable.js +90 -0
  25. data/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
  26. data/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
  27. data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/accessors.js +85 -10
  28. data/lib/assets/javascripts/aura/extensions/rivets.js.coffee +1 -1
  29. data/lib/ende/version.rb +1 -1
  30. data/vendor/assets/components/ende_build.js +18379 -26828
  31. metadata +20 -128
  32. data/components/indefinido/indemma/master/.gitignore +0 -17
  33. data/components/indefinido/indemma/master/.ruby-gemset +0 -1
  34. data/components/indefinido/indemma/master/.ruby-version +0 -1
  35. data/components/indefinido/indemma/master/Gemfile +0 -13
  36. data/components/indefinido/indemma/master/Guardfile +0 -39
  37. data/components/indefinido/indemma/master/History.md +0 -0
  38. data/components/indefinido/indemma/master/Readme.md +0 -447
  39. data/components/indefinido/indemma/master/build/build.js +0 -26288
  40. data/components/indefinido/indemma/master/build/development.js +0 -22200
  41. data/components/indefinido/indemma/master/build/release.js +0 -22139
  42. data/components/indefinido/indemma/master/build/test.js +0 -22200
  43. data/components/indefinido/indemma/master/components/chaijs-assertion-error/component.json +0 -18
  44. data/components/indefinido/indemma/master/components/chaijs-assertion-error/index.js +0 -110
  45. data/components/indefinido/indemma/master/components/chaijs-chai/component.json +0 -47
  46. data/components/indefinido/indemma/master/components/chaijs-chai/index.js +0 -1
  47. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/assertion.js +0 -130
  48. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/core/assertions.js +0 -1270
  49. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/assert.js +0 -1080
  50. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/expect.js +0 -12
  51. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/interface/should.js +0 -76
  52. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +0 -94
  53. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addMethod.js +0 -37
  54. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/addProperty.js +0 -40
  55. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/eql.js +0 -129
  56. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/flag.js +0 -32
  57. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getActual.js +0 -19
  58. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +0 -25
  59. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getMessage.js +0 -49
  60. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getName.js +0 -20
  61. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getPathValue.js +0 -102
  62. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/getProperties.js +0 -35
  63. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/index.js +0 -108
  64. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/inspect.js +0 -320
  65. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/objDisplay.js +0 -48
  66. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +0 -51
  67. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +0 -54
  68. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/test.js +0 -26
  69. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/transferFlags.js +0 -44
  70. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai/utils/type.js +0 -45
  71. data/components/indefinido/indemma/master/components/chaijs-chai/lib/chai.js +0 -80
  72. data/components/indefinido/indemma/master/components/component-bind/component.json +0 -14
  73. data/components/indefinido/indemma/master/components/component-bind/index.js +0 -24
  74. data/components/indefinido/indemma/master/components/component-jquery/component.json +0 -14
  75. data/components/indefinido/indemma/master/components/component-jquery/index.js +0 -9601
  76. data/components/indefinido/indemma/master/components/component-type/component.json +0 -18
  77. data/components/indefinido/indemma/master/components/component-type/index.js +0 -32
  78. data/components/indefinido/indemma/master/components/indefinido-advisable/component.json +0 -21
  79. data/components/indefinido/indemma/master/components/indefinido-advisable/index.js +0 -1
  80. data/components/indefinido/indemma/master/components/indefinido-advisable/lib/advisable.js +0 -60
  81. data/components/indefinido/indemma/master/components/indefinido-observable/component.json +0 -25
  82. data/components/indefinido/indemma/master/components/indefinido-observable/components/cjohansen-sinon/sinon.js +0 -4290
  83. data/components/indefinido/indemma/master/components/indefinido-observable/lib/observable.js +0 -323
  84. data/components/indefinido/indemma/master/components/kapit-observe-utils/component.json +0 -13
  85. data/components/indefinido/indemma/master/components/paulmillr-es6-shim/component.json +0 -17
  86. data/components/indefinido/indemma/master/components/paulmillr-es6-shim/es6-shim.js +0 -996
  87. data/components/indefinido/indemma/master/components/pluma-assimilate/component.json +0 -25
  88. data/components/indefinido/indemma/master/components/pluma-assimilate/dist/assimilate.js +0 -127
  89. data/components/indefinido/indemma/master/karma.conf.js +0 -76
  90. data/components/indefinido/indemma/master/package.json +0 -9
  91. data/components/indefinido/indemma/master/spec/record/associable_spec.js +0 -137
  92. data/components/indefinido/indemma/master/spec/record/persistable_spec.js +0 -36
  93. data/components/indefinido/indemma/master/spec/record/queryable_spec.js +0 -33
  94. data/components/indefinido/indemma/master/spec/record/resource_spec.js +0 -93
  95. data/components/indefinido/indemma/master/spec/record/rest_spec.js +0 -32
  96. data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +0 -300
  97. data/components/indefinido/indemma/master/spec/record/scopable_spec.js +0 -212
  98. data/components/indefinido/indemma/master/spec/record/storable_spec.js +0 -53
  99. data/components/indefinido/indemma/master/spec/record/translationable.js +0 -28
  100. data/components/indefinido/indemma/master/spec/record/validatable_spec.js +0 -111
  101. data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +0 -43
  102. data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +0 -36
  103. data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +0 -35
  104. data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +0 -28
  105. data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +0 -87
  106. data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +0 -48
  107. data/components/indefinido/indemma/master/spec/record_spec.js +0 -37
  108. data/components/indefinido/indemma/master/spec/spec_helper.js +0 -11
  109. data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +0 -45
  110. data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +0 -17
  111. data/components/indefinido/indemma/master/src/lib/record/associable.coffee +0 -380
  112. data/components/indefinido/indemma/master/src/lib/record/errors.coffee +0 -20
  113. data/components/indefinido/indemma/master/src/lib/record/maid.coffee +0 -16
  114. data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +0 -32
  115. data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +0 -30
  116. data/components/indefinido/indemma/master/src/lib/record/resource.coffee +0 -106
  117. data/components/indefinido/indemma/master/src/lib/record/rest.coffee +0 -28
  118. data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +0 -447
  119. data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +0 -294
  120. data/components/indefinido/indemma/master/src/lib/record/storable.coffee +0 -46
  121. data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +0 -18
  122. data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +0 -207
  123. data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +0 -30
  124. data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +0 -17
  125. data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +0 -57
  126. data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +0 -16
  127. data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +0 -61
  128. data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +0 -31
  129. data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +0 -5
  130. data/components/indefinido/indemma/master/src/lib/record.coffee +0 -138
  131. data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +0 -130
  132. data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +0 -30
  133. data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +0 -27
  134. data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +0 -69
  135. data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +0 -22
  136. data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +0 -215
  137. data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +0 -191
  138. data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +0 -40
  139. data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +0 -19
  140. data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +0 -100
  141. data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +0 -35
  142. data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +0 -25
  143. data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +0 -28
  144. data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +0 -24
  145. data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +0 -74
  146. data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +0 -33
  147. data/components/indefinido/indemma/master/src/spec/record_spec.coffee +0 -23
  148. data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +0 -9
  149. data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +0 -30
  150. data/components/indefinido/indemma/master/vendor/object/mixin.js +0 -196
  151. data/components/indefinido/indemma/master/vendor/sinon.js +0 -4290
  152. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/index.js +0 -0
  153. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/accessors-legacy.js +0 -0
  154. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/array.indexOf.js +0 -0
  155. /data/components/indefinido/{indemma/master/components/indefinido-observable → observable/es6-modules}/vendor/shims/object.create.js +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 52237c1735e1a7a869f529311883f4b26d16dba6
4
- data.tar.gz: 6b80f204da396bc04481a1c2dafb2211a4d467f5
3
+ metadata.gz: 62968c729a073ebbf59f3784cab367762e84d539
4
+ data.tar.gz: 4cf11ac267c9c8bbc05dccf562f44c0ac0cad292
5
5
  SHA512:
6
- metadata.gz: 0f4d01fb4e90db307400b08c1ad512dff0cf8bf24dfa957caf1b21a056d03b24cfbcdf4571110e82c301b72d802387ffc7f2ff5f3fe8c86b21d4a81193d20c3f
7
- data.tar.gz: 69d53d478d64d4b3f0cb7780c97efbab1a2c3332e1358b72b368ebed6a10e9ed54c20d52c9b9c46266f17e56341d6882632c7b1ad15f3ecbd37889fb944048ff
6
+ metadata.gz: b42de80aa1a414be0df5218d99f657827457c17548f52eddadb82d7295e19730e5c1fea9ef5728c99880450fd745e86eef85537bc4f5443436de98c022d81806
7
+ data.tar.gz: 9647f2ea5a1ed71670ebc9206575b150511157584c774f91a7db46e2fbdaeb4fe7676b1a21bf98f9939514812a1e207533578a10fd56f1469f1a28b44b48d608
data/component.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ende",
3
3
  "repo": "indefinido/ende",
4
4
  "description": "Core web application functionacility",
5
- "version": "0.5.0",
5
+ "version": "0.5.1",
6
6
  "keywords": [],
7
7
  "dependencies": {
8
8
  "mikeric/rivets": "v0.5.12",
@@ -16,7 +16,7 @@
16
16
  "components/modernizr": "*",
17
17
  "indefinido/advisable": "*",
18
18
  "indefinido/observable": "es6-modules",
19
- "indefinido/indemma": "*",
19
+ "indefinido/indemma": "master",
20
20
  "component/dialog": "*"
21
21
  },
22
22
  "scripts": [
@@ -1,45 +1,55 @@
1
1
  {
2
2
  "name": "indemma",
3
3
  "description": "Indemma (mind picture = memory), client side ES5 observable REST model",
4
- "version": "0.1.9",
4
+ "version": "0.1.13",
5
5
  "keywords": [],
6
6
  "dependencies": {
7
7
  "pluma/assimilate": "0.3.0",
8
8
  "component/type": "*",
9
9
  "component/bind": "*",
10
10
  "component/jquery": "*",
11
- "indefinido/observable": "*",
12
11
  "indefinido/advisable": "*",
13
- "chaijs/chai": "*"
12
+ "indefinido/observable": "es6-modules"
13
+ },
14
+ "development": {
15
+ "dependencies": {
16
+ "chaijs/chai": "*"
17
+ },
18
+ "scripts": [
19
+ "vendor/spec/sinon.js",
20
+ "vendor/spec/sinon/**/*.js"
21
+ ]
14
22
  },
15
- "development": {},
16
23
  "license": "WTFPL",
24
+ "paths": [
25
+ "vendor/components"
26
+ ],
17
27
  "scripts": [
18
28
  "index.js",
19
- "vendor/stampit.js",
20
- "vendor/sinon.js",
21
- "vendor/owl/pluralize.js",
29
+ "lib/extensions/rivets.js",
22
30
  "lib/record.js",
23
31
  "lib/record/associable.js",
32
+ "lib/record/dirtyable.js",
33
+ "lib/record/errors.js",
34
+ "lib/record/maid.js",
24
35
  "lib/record/persistable.js",
25
- "lib/record/storable.js",
26
36
  "lib/record/queryable.js",
27
37
  "lib/record/resource.js",
28
38
  "lib/record/rest.js",
29
39
  "lib/record/restfulable.js",
30
40
  "lib/record/scopable.js",
31
- "lib/record/maid.js",
41
+ "lib/record/storable.js",
32
42
  "lib/record/translationable.js",
33
- "lib/record/validations/validatorable.js",
34
- "lib/record/validations/confirmation.js",
43
+ "lib/record/validatable.js",
35
44
  "lib/record/validations/associated.js",
45
+ "lib/record/validations/confirmation.js",
46
+ "lib/record/validations/cpf.js",
36
47
  "lib/record/validations/presence.js",
37
48
  "lib/record/validations/remote.js",
38
49
  "lib/record/validations/type.js",
39
- "lib/record/validations/cpf.js",
40
- "lib/record/validatable.js",
41
- "lib/extensions/rivets.js"
50
+ "lib/record/validations/validatorable.js",
51
+ "vendor/stampit.js",
52
+ "vendor/owl/pluralize.js"
42
53
  ],
43
- "repository": "indefinido/indemma",
44
- "repo": "indefinido/indemma"
45
- }
54
+ "repository": "indefinido/indemma"
55
+ }
@@ -1,4 +1,4 @@
1
- var $, associable, callbacks, extend, model, modifiers, plural, root, singular, subscribers,
1
+ var $, associable, callbacks, descriptors, extend, model, plural, root, singular,
2
2
  __slice = [].slice;
3
3
 
4
4
  root = window;
@@ -52,7 +52,8 @@ plural = {
52
52
  },
53
53
  push: function() {
54
54
  console.warn("" + this.resource + ".push is deprecated and will be removed, please use add instead");
55
- return Array.prototype.push.apply(this, arguments);
55
+ Array.prototype.push.apply(this, arguments);
56
+ return arguments[0];
56
57
  },
57
58
  length: 0,
58
59
  json: function(methods, omissions) {
@@ -64,7 +65,18 @@ plural = {
64
65
  _results.push(record.json(methods, omissions));
65
66
  }
66
67
  return _results;
67
- }
68
+ },
69
+ find: function(id) {
70
+ var resource, _i, _len;
71
+
72
+ for (_i = 0, _len = this.length; _i < _len; _i++) {
73
+ resource = this[_i];
74
+ if (resource._id === id) {
75
+ return resource;
76
+ }
77
+ }
78
+ },
79
+ filter: Array.prototype.filter || (typeof _ !== "undefined" && _ !== null ? _.filter : void 0)
68
80
  };
69
81
 
70
82
  singular = {
@@ -76,82 +88,61 @@ singular = {
76
88
  }
77
89
  };
78
90
 
79
- subscribers = {
91
+ descriptors = {
80
92
  belongs_to: {
81
- foreign_key: function(resource_id) {
82
- var association_name, current_resource_id, resource, _ref;
93
+ resource_id: {
94
+ getter: function() {
95
+ return this.owner.observed[this.resource + '_id'];
96
+ },
97
+ setter: function(resource_id) {
98
+ var association_name, current_resource_id, _ref;
83
99
 
84
- association_name = this.resource.toString();
85
- if (!resource_id) {
86
- this.dirty = true;
87
- this.owner[association_name] = resource_id;
88
- return resource_id;
89
- }
90
- current_resource_id = (_ref = this.owner.observed[association_name]) != null ? _ref._id : void 0;
91
- if (resource_id !== current_resource_id) {
92
- resource = model[association_name];
93
- if (!resource) {
94
- console.warn("subscribers.belongs_to.foreign_key: associated factory not found for model: " + association_name);
100
+ association_name = this.resource.toString();
101
+ if (!resource_id) {
102
+ this.dirty = true;
103
+ this.owner[association_name] = resource_id;
95
104
  return resource_id;
96
105
  }
97
- this.owner.observed[association_name] = null;
106
+ current_resource_id = (_ref = this.owner.observed[association_name]) != null ? _ref._id : void 0;
107
+ if (resource_id !== current_resource_id) {
108
+ this.owner.observed[association_name + '_id'] = resource_id;
109
+ this.owner.observed[association_name] = null;
110
+ }
111
+ return resource_id;
98
112
  }
99
- return resource_id;
100
113
  },
101
- associated_changed: function(associated) {
102
- return this.owner.observed["" + (this.resource.toString()) + "_id"] = associated ? associated._id : null;
103
- }
104
- }
105
- };
106
-
107
- modifiers = {
108
- belongs_to: {
109
- associated_loader: function() {
110
- var association_name, definition, temporary_observed,
111
- _this = this;
112
-
113
- association_name = this.resource.toString();
114
- if (this.owner.observed == null) {
115
- this.owner.observed = {};
116
- temporary_observed = true;
117
- }
118
- definition = Object.defineProperty(this.owner, association_name, {
119
- set: function(associated) {
120
- return this.observed[association_name] = associated;
121
- },
122
- get: function() {
123
- var associated, associated_id, resource;
114
+ resource: {
115
+ getter: function() {
116
+ var associated, associated_id, association_name, resource;
124
117
 
125
- associated = _this.owner.observed[association_name];
126
- associated_id = _this.owner.observed[association_name + '_id'];
127
- if (!(((associated != null ? associated._id : void 0) != null) || associated_id)) {
128
- return associated;
129
- }
130
- if (associated != null ? associated.sustained : void 0) {
131
- return associated;
132
- }
133
- resource = model[association_name];
134
- if (!resource) {
135
- console.warn("subscribers.belongs_to.foreign_key: associated factory not found for model: " + association_name);
136
- return associated;
137
- }
138
- associated = resource.find(associated_id || associated._id);
139
- if (associated) {
140
- return _this.owner.observed[association_name] = associated;
141
- }
142
- associated || (associated = resource({
143
- _id: associated_id
144
- }));
145
- associated.reload();
146
- return _this.owner.observed[association_name] = associated;
147
- },
148
- configurable: true,
149
- enumerable: true
150
- });
151
- if (temporary_observed) {
152
- delete this.owner.observed;
118
+ association_name = this.resource.toString();
119
+ associated = this.owner.observed[association_name];
120
+ associated_id = this.owner.observed[association_name + '_id'];
121
+ if (!(((associated != null ? associated._id : void 0) != null) || associated_id)) {
122
+ return associated;
123
+ }
124
+ if (associated != null ? associated.sustained : void 0) {
125
+ return associated;
126
+ }
127
+ resource = model[association_name];
128
+ if (!resource) {
129
+ console.warn("descriptors.belongs_to.resource.getter: associated factory not found for model '" + association_name + "' belonging to '" + this.owner.resource + "'");
130
+ return associated;
131
+ }
132
+ associated = resource.find(associated_id || associated._id);
133
+ if (associated) {
134
+ return this.owner.observed[association_name] = associated;
135
+ }
136
+ associated || (associated = resource({
137
+ _id: associated_id
138
+ }));
139
+ associated.reload();
140
+ return this.owner.observed[association_name] = associated;
141
+ },
142
+ setter: function(associated) {
143
+ this.owner.observed[this.resource.toString()] = associated;
144
+ return this.owner.observed[this.resource.toString() + '_id'] = associated ? associated._id : null;
153
145
  }
154
- return definition;
155
146
  }
156
147
  }
157
148
  };
@@ -313,8 +304,11 @@ associable = {
313
304
  old_resource_id = this["" + resource + "_id"];
314
305
  old_dirty = this.dirty;
315
306
  this["" + resource + "_id"] = null;
316
- this.subscribe("" + resource + "_id", $.proxy(subscribers.belongs_to.foreign_key, association_proxy));
317
- this.subscribe(resource.toString(), $.proxy(subscribers.belongs_to.associated_changed, association_proxy));
307
+ Object.defineProperty(this, "" + resource + "_id", {
308
+ get: $.proxy(descriptors.belongs_to.resource_id.getter, association_proxy),
309
+ set: $.proxy(descriptors.belongs_to.resource_id.setter, association_proxy),
310
+ configurable: true
311
+ });
318
312
  this["" + resource + "_id"] = old_resource_id;
319
313
  _results.push(this.dirty = old_dirty);
320
314
  }
@@ -322,7 +316,7 @@ associable = {
322
316
  }
323
317
  },
324
318
  create_before_hooks: function(record) {
325
- var association_proxy, definition, resource, _i, _len, _ref, _results;
319
+ var association_proxy, definition, old_resource, resource, _i, _len, _ref, _results;
326
320
 
327
321
  definition = this;
328
322
  if (definition.belongs_to) {
@@ -335,7 +329,12 @@ associable = {
335
329
  parent_resource: this.resource,
336
330
  owner: record
337
331
  };
338
- _results.push(modifiers.belongs_to.associated_loader.call(association_proxy));
332
+ old_resource = this[resource];
333
+ Object.defineProperty(record, resource.toString(), {
334
+ get: $.proxy(descriptors.belongs_to.resource.getter, association_proxy),
335
+ set: $.proxy(descriptors.belongs_to.resource.setter, association_proxy)
336
+ });
337
+ _results.push(this[resource] = old_resource);
339
338
  }
340
339
  return _results;
341
340
  }
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+ var dirtyable, model, record;
3
+
4
+ dirtyable = {
5
+ ignores: ['dirty', 'resource', 'route', 'initial_route', 'after_initialize', 'before_initialize', 'parent_resource', 'nested_attributes', 'reloading', 'ready', 'saving', 'salvation', 'sustained', 'element', 'default', 'lock', 'validated', 'validation', 'errors', 'dirty'],
6
+ change: function(name) {
7
+ return dirtyable.ignores.indexOf(name) === -1;
8
+ },
9
+ descriptor: {
10
+ get: function() {
11
+ return this.observed.dirty;
12
+ },
13
+ set: function(value) {
14
+ return this.observed.dirty = value;
15
+ }
16
+ },
17
+ record: {
18
+ after_initialize: function() {
19
+ Object.defineProperty(this, 'dirty', dirtyable.descriptor);
20
+ this.observed.dirty = !!this._id;
21
+ return this.subscribe(function(added, removed, changed, past) {
22
+ return this.dirty || (this.dirty = !!Object.keys(changed).filter(dirtyable.change).length);
23
+ });
24
+ }
25
+ }
26
+ };
27
+
28
+ model = window.model;
29
+
30
+ record = window.record;
31
+
32
+ model.dirtyable = true;
33
+
34
+ record.mix(function(recordable) {
35
+ return recordable.after_initialize.push(dirtyable.record.after_initialize);
36
+ });
37
+
38
+ model.mix(function(modelable) {});
39
+
40
+ export default dirtyable;
@@ -14,8 +14,8 @@ queryable = {
14
14
  }
15
15
  return this.storage.store(key);
16
16
  },
17
- every: function() {
18
- return this.storage.values();
17
+ every: function(callback) {
18
+ return callback(this.storage.values());
19
19
  },
20
20
  where: function() {
21
21
  throw new Error('queryable.where: Not implemented yet');
@@ -37,7 +37,7 @@ descriptors = {
37
37
  }
38
38
  route = '/';
39
39
  if (this.parent != null) {
40
- route += "" + this.parent.route + "/" + this.parent._id + "/";
40
+ route += ("" + this.parent.route + "/" + this.parent._id) + "/";
41
41
  }
42
42
  if (this.resource.scope != null) {
43
43
  route += this.resource.scope + '/';
@@ -1,4 +1,4 @@
1
- var $, request;
1
+ var $, data_for, request;
2
2
 
3
3
  $ = require('jquery');
4
4
 
@@ -17,7 +17,7 @@ module.exports = {
17
17
  }
18
18
  };
19
19
 
20
- request = function(method, url, data) {
20
+ data_for = function(data) {
21
21
  var param_name;
22
22
 
23
23
  param_name = this.resource.param_name || this.resource.toString();
@@ -29,6 +29,11 @@ request = function(method, url, data) {
29
29
  delete data[param_name]['id'];
30
30
  delete data[param_name]['_id'];
31
31
  }
32
+ return data;
33
+ };
34
+
35
+ request = function(method, url, data) {
36
+ data = data_for.call(this, data);
32
37
  return $.ajax({
33
38
  url: url,
34
39
  data: data,
@@ -13,6 +13,8 @@ rest = require('./rest.js');
13
13
 
14
14
  root = typeof exports !== "undefined" && exports !== null ? exports : this;
15
15
 
16
+ import './dirtyable.js';
17
+
16
18
  util = {
17
19
  model: {
18
20
  map: function(records) {
@@ -85,7 +87,11 @@ restful = {
85
87
  data = {};
86
88
  }
87
89
  old_route = this.route;
88
- default_route = "/" + (model.pluralize(this.resource.name));
90
+ default_route = '/';
91
+ if (this.resource.scope != null) {
92
+ default_route += this.resource.scope + '/';
93
+ }
94
+ default_route += this.resource.singular ? this.resource.name : model.pluralize(this.resource.name);
89
95
  if (default_route !== this.route) {
90
96
  this.route = default_route;
91
97
  }
@@ -141,13 +147,14 @@ restful = {
141
147
  return promise;
142
148
  },
143
149
  assign_attributes: function(attributes) {
144
- var association, association_attributes, association_name, associations_attributes, attribute, message, name, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results;
150
+ var association, association_attributes, association_name, associations_attributes, attribute, message, name, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _results;
145
151
 
146
152
  _ref = model[this.resource.toString()].has_many;
147
153
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
148
154
  association_name = _ref[_i];
149
- associations_attributes = attributes[association_name];
155
+ associations_attributes = attributes[association_name + "_attributes"] || attributes[association_name];
150
156
  delete attributes[association_name];
157
+ delete attributes[association_name + '_attributes'];
151
158
  association = this[association_name];
152
159
  if (association == null) {
153
160
  message = "Association '" + association_name + "' not found. \n";
@@ -185,6 +192,16 @@ restful = {
185
192
  this[association_name] = this["build_" + association_name](association_attributes);
186
193
  }
187
194
  }
195
+ _ref3 = model[this.resource.toString()].belongs_to;
196
+ for (_m = 0, _len4 = _ref3.length; _m < _len4; _m++) {
197
+ association_name = _ref3[_m];
198
+ association_attributes = (_ref4 = (_ref5 = attributes[association_name]) != null ? typeof _ref5.json === "function" ? _ref5.json() : void 0 : void 0) != null ? _ref4 : attributes[association_name];
199
+ delete attributes[association_name];
200
+ delete attributes[association_name + "_attributes"];
201
+ if (association_attributes) {
202
+ this[association_name] = this["build_" + association_name](association_attributes);
203
+ }
204
+ }
188
205
  _results = [];
189
206
  for (name in attributes) {
190
207
  attribute = attributes[name];
@@ -339,11 +356,11 @@ restful = {
339
356
  return JSON.stringify(serialized);
340
357
  }
341
358
  },
342
- json: function(methods) {
343
- var definition, json, name, nature, nested, value;
359
+ json: function(options) {
360
+ var definition, json, method, name, nature, nested, value, _ref, _ref1;
344
361
 
345
- if (methods == null) {
346
- methods = {};
362
+ if (options == null) {
363
+ options = {};
347
364
  }
348
365
  json = {};
349
366
  definition = model[this.resource.toString()];
@@ -369,15 +386,15 @@ restful = {
369
386
  console.warn("json: Tryied to serialize nested attribute '" + name + "' without serialization method!");
370
387
  continue;
371
388
  }
372
- json["" + name + "_attributes"] = value.json(methods[name]);
389
+ json["" + name + "_attributes"] = value.json(options[name]);
373
390
  } else if ((value.toJSON != null) || (value.json != null)) {
374
391
  if (value.resource) {
375
392
  continue;
376
393
  }
377
394
  if (value.json != null) {
378
- json[name] = value.json(methods[name]);
395
+ json[name] = value.json(options[name]);
379
396
  } else {
380
- json[name] = value.toJSON(methods[name]);
397
+ json[name] = value.toJSON(options[name]);
381
398
  }
382
399
  } else {
383
400
  continue;
@@ -387,6 +404,16 @@ restful = {
387
404
  }
388
405
  }
389
406
  json = observable.unobserve(json);
407
+ _ref1 = (_ref = options.methods) != null ? _ref : {};
408
+ for (name in _ref1) {
409
+ value = _ref1[name];
410
+ method = this[name];
411
+ if (typeof method === 'function') {
412
+ json[name] = method();
413
+ } else {
414
+ json[name] = method;
415
+ }
416
+ }
390
417
  delete json.dirty;
391
418
  delete json.resource;
392
419
  delete json.route;
@@ -60,14 +60,16 @@ scopable = {
60
60
  fail: [],
61
61
  declared: [],
62
62
  fetch: function(data, done, fail) {
63
- var deferred, scope;
63
+ var deferred, method, scope;
64
64
 
65
65
  if (typeof data === 'function') {
66
66
  done = data;
67
67
  data = {};
68
68
  }
69
69
  scope = extend({}, this.scope.data);
70
- observable.unobserve(scope);
70
+ for (method in observable.methods) {
71
+ delete scope[method];
72
+ }
71
73
  if (scope.noned != null) {
72
74
  deferred = $.Deferred();
73
75
  deferred.resolveWith(this, [[]]);
@@ -124,7 +126,7 @@ scopable = {
124
126
  return this.scope.fetch.call(this, data, done, fail);
125
127
  },
126
128
  forward_scopes_to_associations: function() {
127
- var associated_factory, associated_resource, association, association_name, factory, forwarder, generate_forwarder, scope, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;
129
+ var associated_factory, associated_resource, association, association_name, factory, scope, _i, _j, _len, _len1, _ref, _ref1;
128
130
 
129
131
  factory = model[this.resource.name];
130
132
  _ref = factory.has_many;
@@ -144,46 +146,6 @@ scopable = {
144
146
  association.scope(scope, associated_factory["$" + scope]);
145
147
  }
146
148
  }
147
- _ref2 = factory.has_one;
148
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
149
- associated_resource = _ref2[_k];
150
- if (!model[associated_resource]) {
151
- console.warn("Associated factory not found for associated resource: " + associated_resource);
152
- continue;
153
- }
154
- _ref3 = model[associated_resource].scope.declared;
155
- for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
156
- scope = _ref3[_l];
157
- this[associated_resource][scope] = factory[scope];
158
- }
159
- }
160
- if (factory.belongs_to.length) {
161
- generate_forwarder = function(associated_resource) {
162
- var declared_scopes;
163
-
164
- associated_factory = model[associated_resource];
165
- if (!associated_factory) {
166
- return console.warn("Associated factory not found for associated resource: " + associated_resource);
167
- }
168
- declared_scopes = associated_factory.scope.declared;
169
- return function() {
170
- var _len4, _m, _results;
171
-
172
- _results = [];
173
- for (_m = 0, _len4 = declared_scopes.length; _m < _len4; _m++) {
174
- scope = declared_scopes[_m];
175
- _results.push(this[associated_resource][scope] = associated_factory[scope]);
176
- }
177
- return _results;
178
- };
179
- };
180
- _ref4 = factory.belongs_to;
181
- for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {
182
- associated_resource = _ref4[_m];
183
- forwarder = generate_forwarder(associated_resource);
184
- this.after("build_" + associated_resource, forwarder);
185
- }
186
- }
187
149
  return true;
188
150
  }
189
151
  },
@@ -283,11 +245,13 @@ if (model.associable) {
283
245
  promises.push(this.scope.fetch.call(this, data, null, scopable.record.failed));
284
246
  reload = $.when.apply(jQuery, promises);
285
247
  reload.done(function(records, status) {
286
- var association_name, singular_resource, _i, _j, _len, _len1, _ref;
248
+ var association_name, create, index, singular_resource, target, _i, _j, _k, _len, _len1, _len2, _ref;
287
249
 
288
- Array.prototype.splice.call(this, 0);
289
250
  if (!records.length) {
290
- return;
251
+ if (this.length) {
252
+ Array.prototype.splice.call(this, 0);
253
+ }
254
+ return true;
291
255
  }
292
256
  singular_resource = model.singularize(this.resource);
293
257
  for (_i = 0, _len = records.length; _i < _len; _i++) {
@@ -299,7 +263,16 @@ if (model.associable) {
299
263
  delete record[association_name];
300
264
  }
301
265
  }
302
- this.add.apply(this, records);
266
+ create = [];
267
+ for (index = _k = 0, _len2 = records.length; _k < _len2; index = ++_k) {
268
+ record = records[index];
269
+ if (target = this.find(record._id)) {
270
+ target.assign_attributes(record);
271
+ } else {
272
+ create.push(record);
273
+ }
274
+ }
275
+ this.add.apply(this, create);
303
276
  records.splice(0);
304
277
  return records.push.apply(records, this);
305
278
  });
@@ -6,6 +6,17 @@ merge = extend.withStrategy('deep');
6
6
 
7
7
  stampit = require('../../vendor/stampit');
8
8
 
9
+ Object.values || (Object.values = (typeof _ !== "undefined" && _ !== null ? _.values : void 0) || function(object) {
10
+ var key, value, _results;
11
+
12
+ _results = [];
13
+ for (key in object) {
14
+ value = object[key];
15
+ _results.push(value);
16
+ }
17
+ return _results;
18
+ });
19
+
9
20
  storable = stampit({
10
21
  store: function(keypath, value, options) {
11
22
  var collection, entry, key, _i, _len;