ende 0.5.1 → 0.5.2

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