ende 0.4.20 → 0.4.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -3
  3. data/build/build.css +111 -0
  4. data/component.json +1 -0
  5. data/lib/assets/javascripts/aura/extensions/models.js.coffee.erb +4 -13
  6. data/lib/assets/javascripts/aura/extensions/platform.js.coffee +2 -8
  7. data/lib/assets/javascripts/aura/extensions/rivets.js.coffee +21 -10
  8. data/lib/assets/javascripts/aura/extensions/states.js.coffee +25 -27
  9. data/lib/assets/javascripts/aura/extensions/widget/eventable.js.coffee +28 -23
  10. data/lib/assets/javascripts/aura/extensions/widget/lifecycleable.js.coffee +21 -34
  11. data/lib/assets/javascripts/aura/extensions/widget/napable.js.coffee +17 -13
  12. data/lib/assets/javascripts/config/load_components.js.coffee +5 -7
  13. data/lib/assets/javascripts/widgets/dialog/main.js.coffee +1 -2
  14. data/lib/assets/javascripts/widgets/list/presenter.js.coffee +5 -4
  15. data/lib/assets/javascripts/widgets/support/adapters/olark.js +1 -1
  16. data/lib/assets/javascripts/widgets/tray/main.js.coffee +16 -22
  17. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +39 -102
  18. data/lib/assets/javascripts/widgets/viewer/plugins/scopable.js.coffee +7 -1
  19. data/lib/ende/version.rb +1 -1
  20. data/vendor/assets/components/ende_build.js +5732 -1047
  21. data/vendor/components/indefinido-indemma/build/development.js +2 -2
  22. data/vendor/components/indefinido-indemma/build/release.js +9 -4
  23. data/vendor/components/indefinido-indemma/build/test.js +115 -21916
  24. data/vendor/components/indefinido-indemma/component.json +0 -1
  25. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +7 -2
  26. data/vendor/components/indefinido-indemma/lib/record/validatable.js +2 -2
  27. data/vendor/components/indefinido-indemma/src/lib/record/persistable.coffee +2 -0
  28. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +3 -2
  29. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +16 -4
  30. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +3 -3
  31. data/vendor/components/indefinido-observable/.gitignore +15 -0
  32. data/vendor/components/indefinido-observable/.ruby-gemset +1 -0
  33. data/vendor/components/indefinido-observable/.ruby-version +1 -0
  34. data/vendor/components/indefinido-observable/Gemfile +13 -0
  35. data/vendor/components/indefinido-observable/Guardfile +39 -0
  36. data/vendor/components/indefinido-observable/History.md +0 -0
  37. data/vendor/components/indefinido-observable/Readme.md +116 -0
  38. data/vendor/components/indefinido-observable/build/build.js +14798 -0
  39. data/vendor/components/indefinido-observable/build/development.js +339 -0
  40. data/vendor/components/indefinido-observable/build/release.js +14937 -0
  41. data/vendor/components/indefinido-observable/build/test.js +339 -0
  42. data/vendor/components/indefinido-observable/component.json +7 -3
  43. data/vendor/components/indefinido-observable/components/chaijs-chai/component.json +46 -0
  44. data/vendor/components/indefinido-observable/components/chaijs-chai/index.js +1 -0
  45. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/assertion.js +132 -0
  46. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  47. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/error.js +60 -0
  48. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/interface/assert.js +1060 -0
  49. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  50. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  51. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  52. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  53. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  54. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/eql.js +124 -0
  55. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  56. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  57. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  58. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  59. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  60. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  61. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  62. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  63. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/inspect.js +316 -0
  64. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  65. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  66. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  67. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  68. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  69. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  70. data/vendor/components/indefinido-observable/components/chaijs-chai/lib/chai.js +79 -0
  71. data/vendor/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  72. data/vendor/components/indefinido-observable/components/component-jquery/component.json +14 -0
  73. data/vendor/components/indefinido-observable/components/component-jquery/index.js +9601 -0
  74. data/vendor/components/indefinido-observable/components/kapit-observe-shim/component.json +11 -0
  75. data/vendor/components/indefinido-observable/components/kapit-observe-utils/component.json +13 -0
  76. data/vendor/components/indefinido-observable/karma.conf.js +92 -0
  77. data/vendor/components/indefinido-observable/lib/observable.js +9 -19
  78. data/vendor/components/indefinido-observable/spec/legacy/observable_spec.js +126 -0
  79. data/vendor/components/indefinido-observable/spec/observable_spec.js +92 -0
  80. data/vendor/components/indefinido-observable/spec/spec_helper.js +8 -0
  81. data/vendor/components/indefinido-observable/spec/vendor/accessors_spec.js +63 -0
  82. data/vendor/components/indefinido-observable/src/lib/adapters/rivets.js.coffee +15 -0
  83. data/vendor/components/indefinido-observable/src/spec/legacy/observable_spec.coffee +132 -0
  84. data/vendor/components/indefinido-observable/src/spec/observable_spec.coffee +85 -0
  85. data/vendor/components/indefinido-observable/src/spec/spec_helper.coffee +5 -0
  86. data/vendor/components/indefinido-observable/src/spec/vendor/accessors_spec.coffee +59 -0
  87. data/vendor/components/indefinido-observable/vendor/spec/boot.js +104 -0
  88. data/vendor/components/indefinido-observable/vendor/spec/jasmine.js +2054 -0
  89. metadata +60 -8
  90. data/lib/assets/javascripts/aura/extensions/domain.js.coffee +0 -55
  91. data/lib/assets/javascripts/aura/extensions/stamps.js.coffee +0 -35
  92. data/lib/assets/javascripts/aura/extensions/widget/composable.js.coffee +0 -135
  93. data/lib/assets/javascripts/aura/extensions/widget/flowable.js.coffee +0 -65
  94. data/lib/assets/javascripts/widgets/attachable/main.js.coffee +0 -77
  95. /data/{lib/assets/javascripts/aura/extensions/stamps → vendor/assets/javascripts/stampit}/stampit.js +0 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "observe-shim",
3
+ "version": "0.1.1",
4
+ "main": "lib/observe-shim.js",
5
+ "devDependencies": {
6
+ "mocha": "~1.8.x",
7
+ "expect": "~0.2.0",
8
+ "sinon": "http://sinonjs.org/releases/sinon-1.6.0.js"
9
+ },
10
+ "repo": "https://raw.github.com/kapit/observe-shim"
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "observe-utils",
3
+ "version": "0.1.0",
4
+ "main": "lib/observe-utils.js",
5
+ "devDependencies": {
6
+ "expect": "~0.2.0",
7
+ "sinon": "http://sinonjs.org/releases/sinon-1.6.0.js",
8
+ "observe-shim": "https://github.com/KapIT/observe-shim.git",
9
+ "mocha": "~1.8.1",
10
+ "es5-shim": "~2.0.8"
11
+ },
12
+ "repo": "https://raw.github.com/kapit/observe-utils"
13
+ }
@@ -0,0 +1,92 @@
1
+ // Karma configuration
2
+
3
+ module.exports = function(config) {
4
+ config.set({
5
+ // base path, that will be used to resolve files and exclude
6
+ basePath: '',
7
+
8
+ // list of files / patterns to load in the browser
9
+ files: [
10
+
11
+ // Test environment
12
+ //MOCHA, Switch to mocha when not testing ie
13
+ //MOCHA_ADAPTER,
14
+ JASMINE,
15
+ JASMINE_ADAPTER,
16
+ 'components/cjohansen-sinon/sinon.js',
17
+
18
+ // Test dependencies
19
+ 'build/test.js',
20
+
21
+ // Test Source files
22
+ 'spec/spec_helper.js',
23
+ 'spec/**/*.js'
24
+ ],
25
+
26
+
27
+ // list of files to exclude
28
+ exclude: [
29
+ 'spec/coverage'
30
+ ],
31
+
32
+ // Custom frameworks
33
+ frameworks: ['jasmine'],
34
+
35
+
36
+ // test results reporter to use
37
+ // possible values: 'dots', 'progress', 'junit'
38
+ reporters: ['progress'], // , 'coverage'],
39
+
40
+
41
+ // web server port
42
+ port: 9876,
43
+
44
+
45
+ // cli runner port
46
+ runnerPort: 9100,
47
+
48
+
49
+ // enable / disable colors in the output (reporters and logs)
50
+ colors: true,
51
+
52
+
53
+ // level of logging
54
+ // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
55
+ logLevel: LOG_INFO,
56
+
57
+
58
+ // enable / disable watching file and executing tests whenever any file changes
59
+ autoWatch: true,
60
+
61
+
62
+ // Start these browsers, currently available:
63
+ // - Chrome
64
+ // - ChromeCanary
65
+ // - Firefox
66
+ // - Opera
67
+ // - Safari (only Mac)
68
+ // - PhantomJS
69
+ // - IE (only Windows)
70
+ browsers: ['Chrome'],
71
+
72
+
73
+ // If browser does not capture in given timeout [ms], kill it
74
+ captureTimeout: 60000,
75
+
76
+
77
+ // Continuous Integration mode
78
+ // if true, it capture browsers, run tests and exit
79
+ singleRun: false,
80
+
81
+ // Coverage preprocessors
82
+ // preprocessors: {
83
+ // '**/lib/*.js': 'coverage'
84
+ // },
85
+
86
+ // Converage configuration
87
+ coverageReporter: {
88
+ type : 'html',
89
+ dir : 'spec/coverage'
90
+ }
91
+ });
92
+ }
@@ -223,31 +223,21 @@ generator = {
223
223
  },
224
224
 
225
225
  observable_for: function (object) {
226
- var toJSON;
227
-
228
226
  Object.defineProperty(object, 'observed', {
229
227
  configurable: true,
230
228
  enumerable: false,
231
229
  value: {}
232
230
  });
233
231
 
234
- // TODO remove json in favor of the toJSON convention
235
- toJSON = object.json || object.toJSON
236
-
237
- if (toJSON) {
238
- return Object.defineProperty(object, 'toJSON', {
239
- enumerable: false,
240
- value: function () {
241
- var json;
242
-
243
- // TODO remove underscore dependency
244
- // TODO ? move toJSON and observed to other methods
245
- json = toJSON.apply(this, arguments);
246
- return observable.unobserve(_.omit(json, observable.ignores, ['toJSON', 'observed']));
247
- }
248
- });
249
-
250
- }
232
+ // TODO call the current object.toJSON after this method
233
+ return Object.defineProperty(object, 'toJSON', {
234
+ enumerable: false,
235
+ value: function () {
236
+ // TODO remove underscore dependency
237
+ return observable.unobserve(_.omit(this, observable.ignores));
238
+ // old_to_json()
239
+ }
240
+ });
251
241
  },
252
242
 
253
243
  // TODO improve readability
@@ -0,0 +1,126 @@
1
+ var $, observable, root;
2
+
3
+ observable = require('observable').mixin;
4
+
5
+ root = typeof exports !== "undefined" && exports !== null ? exports : window;
6
+
7
+ $ = require('jquery');
8
+
9
+ describe('observable #()', function() {
10
+ var object;
11
+
12
+ object = null;
13
+ beforeEach(function() {
14
+ return object = {
15
+ property: 'value'
16
+ };
17
+ });
18
+ it('should not have observed property', function() {
19
+ return expect(object.observed).toBeUndefined();
20
+ });
21
+ xit('should let element unsubscribe to property', function() {});
22
+ describe('#subscribe', function() {
23
+ var called;
24
+
25
+ called = null;
26
+ beforeEach(function() {
27
+ object = observable({});
28
+ called = false;
29
+ return true;
30
+ });
31
+ it('should subscribe to property', function() {
32
+ var spy;
33
+
34
+ spy = sinon.spy();
35
+ object.subscribe('other', spy);
36
+ object.other = 'mafagafo';
37
+ return expect(spy.called).toBe(true);
38
+ });
39
+ it('should let multiple function subscriptions to property', function() {
40
+ var also_also_called, also_called;
41
+
42
+ also_called = false;
43
+ also_also_called = false;
44
+ object.subscribe('other', function() {
45
+ return called = true;
46
+ });
47
+ object.subscribe('other', function() {
48
+ return also_called = true;
49
+ });
50
+ object.subscribe('other', function() {
51
+ return also_also_called = true;
52
+ });
53
+ object.other = 'mafagafo';
54
+ expect(called).toBe(true);
55
+ return expect(also_called).toBe(true);
56
+ });
57
+ it('should handle truth comparisons well', function() {
58
+ var block_called, spy;
59
+
60
+ spy = sinon.spy;
61
+ block_called = false;
62
+ object.invert = true;
63
+ object.truthy = true;
64
+ object.falsey = false;
65
+ object.subscribe('truthy', spy);
66
+ object.subscribe('falsey', spy);
67
+ object.subscribe('invert', spy);
68
+ block_called = false;
69
+ if (object.truthy) {
70
+ block_called = true;
71
+ }
72
+ expect(block_called).toBe(true);
73
+ block_called = false;
74
+ if (!object.falsey) {
75
+ block_called = true;
76
+ }
77
+ expect(block_called).toBe(true);
78
+ block_called = false;
79
+ if (object.invert) {
80
+ block_called = true;
81
+ }
82
+ object.invert = false;
83
+ block_called = false;
84
+ if (object.invert === false) {
85
+ block_called = true;
86
+ }
87
+ return expect(block_called).toBe(true);
88
+ });
89
+ describe('subscribes to properties of type array', function() {
90
+ it('should observe objects added to array', function() {
91
+ var friend, spy;
92
+
93
+ spy = sinon.spy();
94
+ friend = {
95
+ domo: 1
96
+ };
97
+ object.friends = [];
98
+ object.subscribe('friends', function() {});
99
+ object.friends = [friend];
100
+ friend = object.friends[0];
101
+ expect(friend.domo).toBeDefined();
102
+ expect(friend.observed).toBeDefined();
103
+ friend.subscribe('domo', spy);
104
+ friend.domo = 2;
105
+ return expect(spy.callCount).toBe(1);
106
+ });
107
+ it('should override native methods');
108
+ return it('should preserve array bindings when setting new array', function() {
109
+ var spy;
110
+
111
+ spy = sinon.spy();
112
+ object.friends = [];
113
+ object.subscribe('friends', spy);
114
+ object.friends.push(1);
115
+ object.friends = [];
116
+ object.friends.push(2);
117
+ expect(object.friends.length).toBe(1);
118
+ return expect(spy.callCount).toBe(3);
119
+ });
120
+ });
121
+ return it('should create a observed property', function() {});
122
+ });
123
+ return xdescribe('#publish', function() {
124
+ return xit('should let element publish to property', function() {});
125
+ });
126
+ });
@@ -0,0 +1,92 @@
1
+ var observable, root;
2
+
3
+ observable = require('observable').mixin;
4
+
5
+ root = typeof exports !== "undefined" && exports !== null ? exports : window;
6
+
7
+ describe('observable #()', function() {
8
+ var object;
9
+
10
+ if (!root.should) {
11
+ return;
12
+ }
13
+ object = null;
14
+ beforeEach(function() {
15
+ return object = {
16
+ property: 'value'
17
+ };
18
+ });
19
+ it('should not have observed property', function() {
20
+ return object.should.not.have.property('observed');
21
+ });
22
+ xit('should let element unsubscribe to property', function() {});
23
+ describe('#subscribe', function() {
24
+ var called;
25
+
26
+ called = null;
27
+ beforeEach(function() {
28
+ object = observable({});
29
+ called = false;
30
+ return true;
31
+ });
32
+ it('should subscribe to property', function() {
33
+ var spy;
34
+
35
+ spy = sinon.spy();
36
+ object.subscribe('other', spy);
37
+ object.other = 'mafagafo';
38
+ return spy.called.should.be["true"];
39
+ });
40
+ it('should let multiple function subscriptions to property', function() {
41
+ var also_called;
42
+
43
+ also_called = false;
44
+ object.subscribe('other', function() {
45
+ return called = true;
46
+ });
47
+ object.subscribe('other', function() {
48
+ return also_called = true;
49
+ });
50
+ object.other = 'mafagafo';
51
+ called.should.be["true"];
52
+ return also_called.should.be["true"];
53
+ });
54
+ describe('subscribes to properties of type array', function() {
55
+ it('should observe objects added to array', function() {
56
+ var friend, spy;
57
+
58
+ spy = sinon.spy();
59
+ friend = {
60
+ domo: 1
61
+ };
62
+ object.friends = [];
63
+ object.subscribe('friends', function() {});
64
+ object.friends = [friend];
65
+ object.friends[0].should.be.eq(friend);
66
+ friend.should.have.property('observed');
67
+ friend.subscribe('domo', spy);
68
+ friend.domo = 2;
69
+ return spy.callCount.should.be.eq(1);
70
+ });
71
+ xit('should override native methods');
72
+ return it('should preserve array bindings when setting new array', function() {
73
+ var spy;
74
+
75
+ spy = sinon.spy();
76
+ object.friends = [];
77
+ object.subscribe('friends', spy);
78
+ object.friends.push(1);
79
+ object.friends = [];
80
+ object.friends.push(2);
81
+ object.friends.length.should.be.eq(1);
82
+ return spy.callCount.should.be.eq(3);
83
+ });
84
+ });
85
+ return it('should create a observed property', function() {
86
+ return object.should.have.property('observed');
87
+ });
88
+ });
89
+ return xdescribe('#publish', function() {
90
+ return xit('should let element publish to property', function() {});
91
+ });
92
+ });
@@ -0,0 +1,8 @@
1
+ var chai, root;
2
+
3
+ root = typeof exports !== "undefined" && exports !== null ? exports : window;
4
+
5
+ if (Object.prototype.defineProperty) {
6
+ chai = require('chaijs-chai');
7
+ root.should = chai.should();
8
+ }
@@ -0,0 +1,63 @@
1
+ var $;
2
+
3
+ require('observable/vendor/shims/accessors.js');
4
+
5
+ $ = require('jquery');
6
+
7
+ describe('Object #defineProperty', function() {
8
+ describe('on dom elements', function() {
9
+ var object, spy;
10
+
11
+ spy = object = null;
12
+ beforeEach(function() {
13
+ object = document.createElement('domo');
14
+ document.body.appendChild(object);
15
+ return spy = sinon.spy();
16
+ });
17
+ it('should define property', function(done) {
18
+ return Object.defineProperty(object, 'kun', {});
19
+ });
20
+ it('should define property getter', function(done) {
21
+ var getter;
22
+
23
+ getter = sinon.stub().returns(42);
24
+ Object.defineProperty(object, 'kun', {
25
+ get: getter
26
+ });
27
+ expect(object.kun + 1).toBe(43);
28
+ return expect(getter.called).toBe(true);
29
+ });
30
+ return it('should define property setter', function(done) {
31
+ Object.defineProperty(object, 'kun', {
32
+ set: spy
33
+ });
34
+ object.kun = 10;
35
+ return expect(spy.calledWith(10)).toBe(true);
36
+ });
37
+ });
38
+ return describe('off dom elements', function() {
39
+ beforeEach(function() {
40
+ this.object = {};
41
+ return this.spy = sinon.spy();
42
+ });
43
+ it('should not define property setter', function(done) {
44
+ var _this = this;
45
+
46
+ return expect(function() {
47
+ return Object.defineProperty(_this.object, 'kun', {
48
+ set: _this.spy
49
+ });
50
+ }).toThrow();
51
+ });
52
+ return it('should define property getter', function(done) {
53
+ var getter;
54
+
55
+ getter = sinon.stub().returns(42);
56
+ Object.defineProperty(this.object, 'kun', {
57
+ get: getter
58
+ });
59
+ expect(this.object.kun + 1).toBe(43);
60
+ return expect(getter.called).toBe(true);
61
+ });
62
+ });
63
+ });
@@ -0,0 +1,15 @@
1
+ exports.adapter =
2
+ subscribe: (record, attribute_path, callback) ->
3
+ throw new TypeError 'observable.adapters.rivets.subscribe: No record provided for subscription' unless record?
4
+ # TODO parse aura widget attributes options, remove, add as a
5
+ # comentary, and let rivets bindings flow, and remove the if check
6
+ record.subscribe attribute_path, callback if attribute_path
7
+ unsubscribe: (record, attribute_path, callback) ->
8
+ throw new TypeError 'observable.adapters.rivets.unsubscribe: No record provided for subscription' unless record?
9
+ record.unsubscribe attribute_path, callback
10
+ read: (record, attribute_path) ->
11
+ throw new TypeError 'observable.adapters.rivets.read: No record provided for subscription' unless record?
12
+ record[attribute_path]
13
+ publish: (record, attribute_path, value) ->
14
+ throw new TypeError 'observable.adapters.rivets.publish: No record provided for subscription' unless record?
15
+ record[attribute_path] = value
@@ -0,0 +1,132 @@
1
+ observable = require('observable').mixin
2
+ root = exports ? window
3
+ $ = require 'jquery'
4
+
5
+ describe 'observable #()', ->
6
+
7
+ object = null
8
+
9
+ beforeEach ->
10
+ object = property: 'value'
11
+
12
+ it 'should not have observed property', ->
13
+ expect(object.observed).toBeUndefined()
14
+
15
+ xit 'should let element unsubscribe to property', ->
16
+
17
+ describe '#subscribe', ->
18
+ called = null
19
+
20
+ beforeEach ->
21
+ object = observable({})
22
+ called = false
23
+ true
24
+
25
+ it 'should subscribe to property', ->
26
+ spy = sinon.spy()
27
+ object.subscribe 'other', spy
28
+ object.other = 'mafagafo'
29
+
30
+ expect(spy.called).toBe true
31
+
32
+
33
+ it 'should let multiple function subscriptions to property', ->
34
+ also_called = false
35
+ also_also_called = false
36
+
37
+ object.subscribe 'other', -> called = true
38
+
39
+ object.subscribe 'other', -> also_called = true
40
+
41
+ object.subscribe 'other', -> also_also_called = true
42
+
43
+ object.other = 'mafagafo'
44
+
45
+ expect(called).toBe true
46
+ expect(also_called).toBe true
47
+
48
+ it 'should handle truth comparisons well', ->
49
+ spy = sinon.spy
50
+ block_called = false
51
+ object.invert = true
52
+ object.truthy = true
53
+ object.falsey = false
54
+
55
+ object.subscribe 'truthy', spy
56
+ object.subscribe 'falsey' , spy
57
+ object.subscribe 'invert', spy
58
+
59
+ block_called = false
60
+ if object.truthy
61
+ # dump 'truthy'
62
+ block_called = true
63
+
64
+ expect(block_called).toBe true
65
+
66
+ block_called = false
67
+ # dump (object.falsey + '') == 'false'
68
+ unless object.falsey
69
+ # dump 'falsey'
70
+ block_called = true
71
+
72
+ expect(block_called).toBe true
73
+
74
+ block_called = false
75
+ if object.invert
76
+ # dump 'invert'
77
+ block_called = true
78
+
79
+ object.invert = false
80
+
81
+ block_called = false
82
+ if object.invert == false
83
+ # dump 'inverted'
84
+ block_called = true
85
+
86
+ expect(block_called).toBe true
87
+
88
+
89
+ describe 'subscribes to properties of type array', ->
90
+ it 'should observe objects added to array', ->
91
+ spy = sinon.spy()
92
+ friend = {domo: 1}
93
+
94
+ # TODO implement a one time setter to solve this
95
+ # Specifically on array types
96
+ # property must be an array before subscribing
97
+ object.friends = []
98
+
99
+ # Remember, you must subscribe to new properties to
100
+ # turn then into observable ones
101
+ object.subscribe 'friends', ->
102
+
103
+ object.friends = [friend]
104
+ friend = object.friends[0]
105
+
106
+ expect(friend.domo ).toBeDefined()
107
+ expect(friend.observed).toBeDefined()
108
+
109
+ friend.subscribe 'domo', spy
110
+ friend.domo = 2
111
+ expect(spy.callCount).toBe 1
112
+
113
+ it 'should override native methods'
114
+
115
+ it 'should preserve array bindings when setting new array', ->
116
+ spy = sinon.spy()
117
+ object.friends = []
118
+ object.subscribe 'friends', spy
119
+
120
+ object.friends.push 1
121
+ object.friends = []
122
+ object.friends.push 2
123
+
124
+ expect(object.friends.length).toBe 1
125
+ expect(spy.callCount).toBe 3
126
+
127
+ it 'should create a observed property', ->
128
+ # object.should.have.property 'observed'
129
+
130
+ xdescribe '#publish', ->
131
+
132
+ xit 'should let element publish to property', ->
@@ -0,0 +1,85 @@
1
+ observable = require('observable').mixin
2
+ root = exports ? window
3
+
4
+ describe 'observable #()', ->
5
+ return unless root.should
6
+
7
+ object = null
8
+
9
+ beforeEach ->
10
+ object = property: 'value'
11
+
12
+ it 'should not have observed property', ->
13
+ object.should.not.have.property 'observed'
14
+
15
+ xit 'should let element unsubscribe to property', ->
16
+
17
+ describe '#subscribe', ->
18
+ called = null
19
+
20
+ beforeEach ->
21
+ object = observable({})
22
+ called = false
23
+ true
24
+
25
+ it 'should subscribe to property', ->
26
+ spy = sinon.spy()
27
+ object.subscribe 'other', spy
28
+
29
+ object.other = 'mafagafo'
30
+ spy.called.should.be.true
31
+
32
+ it 'should let multiple function subscriptions to property', ->
33
+ also_called = false
34
+
35
+ object.subscribe 'other', -> called = true
36
+
37
+ object.subscribe 'other', -> also_called = true
38
+
39
+ object.other = 'mafagafo'
40
+ called.should.be.true
41
+ also_called.should.be.true
42
+
43
+ describe 'subscribes to properties of type array', ->
44
+ it 'should observe objects added to array', ->
45
+ spy = sinon.spy()
46
+ friend = {domo: 1}
47
+
48
+ # TODO implement a one time setter to solve this
49
+ # Specifically on array types
50
+ # property must be an array before subscribing
51
+ object.friends = []
52
+
53
+ # Remember, you must subscribe to new properties to
54
+ # turn then into observable ones
55
+ object.subscribe 'friends', ->
56
+
57
+ object.friends = [friend]
58
+
59
+ object.friends[0].should.be.eq friend
60
+ friend.should.have.property 'observed'
61
+
62
+ friend.subscribe 'domo', spy
63
+ friend.domo = 2
64
+ spy.callCount.should.be.eq 1
65
+
66
+ xit 'should override native methods'
67
+ it 'should preserve array bindings when setting new array', ->
68
+ spy = sinon.spy()
69
+ object.friends = []
70
+ object.subscribe 'friends', spy
71
+
72
+ object.friends.push 1
73
+ object.friends = []
74
+ object.friends.push 2
75
+
76
+ object.friends.length.should.be.eq 1
77
+ spy.callCount.should.be.eq 3
78
+
79
+
80
+ it 'should create a observed property', ->
81
+ object.should.have.property 'observed'
82
+
83
+ xdescribe '#publish', ->
84
+
85
+ xit 'should let element publish to property', ->
@@ -0,0 +1,5 @@
1
+ root = exports ? window
2
+
3
+ if Object.prototype.defineProperty
4
+ chai = require 'chaijs-chai'
5
+ root.should = chai.should()