modularity-rails 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/{LICENSE → MIT-LICENSE} +0 -0
  2. data/README.md +16 -15
  3. data/Rakefile +3 -14
  4. data/{vendor → app}/assets/javascripts/modularity/data/ajax_loader.coffee +0 -0
  5. data/{vendor → app}/assets/javascripts/modularity/data/cache.coffee +5 -0
  6. data/{vendor → app}/assets/javascripts/modularity/data/indexed_cache.coffee +8 -2
  7. data/{vendor → app}/assets/javascripts/modularity/data/persistence_manager.coffee +11 -0
  8. data/{vendor → app}/assets/javascripts/modularity/mixins/clickable.coffee +2 -2
  9. data/{vendor → app}/assets/javascripts/modularity/mixins/closable.coffee +0 -0
  10. data/{vendor/assets/javascripts/modularity.js.coffee → app/assets/javascripts/modularity/modularity.coffee} +3 -0
  11. data/{vendor → app}/assets/javascripts/modularity/modules/autogrow_textarea.coffee +2 -1
  12. data/{vendor → app}/assets/javascripts/modularity/modules/button.coffee +0 -0
  13. data/{vendor → app}/assets/javascripts/modularity/tools/array_tools.coffee +1 -0
  14. data/{vendor → app}/assets/javascripts/modularity/tools/object_tools.coffee +0 -0
  15. data/config/initializers/konacha.rb +6 -0
  16. data/lib/modularity-rails.rb +0 -1
  17. data/lib/modularity-rails/engine.rb +1 -0
  18. data/lib/modularity-rails/version.rb +1 -1
  19. metadata +80 -100
  20. data/.evergreen +0 -6
  21. data/.gitignore +0 -20
  22. data/.travis.yml +0 -8
  23. data/Gemfile +0 -4
  24. data/Guardfile +0 -8
  25. data/demo/.gitignore +0 -15
  26. data/demo/Gemfile +0 -23
  27. data/demo/README.rdoc +0 -261
  28. data/demo/Rakefile +0 -7
  29. data/demo/app/assets/images/rails.png +0 -0
  30. data/demo/app/assets/javascripts/application.coffee +0 -2
  31. data/demo/app/assets/stylesheets/application.css +0 -13
  32. data/demo/app/controllers/application_controller.rb +0 -3
  33. data/demo/app/helpers/application_helper.rb +0 -2
  34. data/demo/app/mailers/.gitkeep +0 -0
  35. data/demo/app/models/.gitkeep +0 -0
  36. data/demo/app/views/layouts/application.html.erb +0 -14
  37. data/demo/config.ru +0 -4
  38. data/demo/config/application.rb +0 -59
  39. data/demo/config/boot.rb +0 -6
  40. data/demo/config/database.yml +0 -25
  41. data/demo/config/environment.rb +0 -5
  42. data/demo/config/environments/development.rb +0 -37
  43. data/demo/config/environments/production.rb +0 -67
  44. data/demo/config/environments/test.rb +0 -37
  45. data/demo/config/initializers/backtrace_silencers.rb +0 -7
  46. data/demo/config/initializers/inflections.rb +0 -15
  47. data/demo/config/initializers/konacha.rb +0 -5
  48. data/demo/config/initializers/mime_types.rb +0 -5
  49. data/demo/config/initializers/secret_token.rb +0 -7
  50. data/demo/config/initializers/session_store.rb +0 -8
  51. data/demo/config/initializers/wrap_parameters.rb +0 -14
  52. data/demo/config/locales/en.yml +0 -5
  53. data/demo/config/routes.rb +0 -58
  54. data/demo/db/seeds.rb +0 -7
  55. data/demo/lib/assets/.gitkeep +0 -0
  56. data/demo/lib/tasks/.gitkeep +0 -0
  57. data/demo/log/.gitkeep +0 -0
  58. data/demo/public/404.html +0 -26
  59. data/demo/public/422.html +0 -26
  60. data/demo/public/500.html +0 -25
  61. data/demo/public/favicon.ico +0 -0
  62. data/demo/public/index.html +0 -241
  63. data/demo/public/robots.txt +0 -5
  64. data/demo/script/rails +0 -6
  65. data/demo/spec/javascripts/data/ajax_loader_spec.coffee +0 -132
  66. data/demo/spec/javascripts/data/cache_spec.coffee +0 -103
  67. data/demo/spec/javascripts/data/indexed_cache_spec.coffee +0 -51
  68. data/demo/spec/javascripts/data/persistence_manager_spec.coffee +0 -283
  69. data/demo/spec/javascripts/konacha_config.coffee +0 -2
  70. data/demo/spec/javascripts/mixins/closable_spec.coffee +0 -98
  71. data/demo/spec/javascripts/modularity_spec.coffee +0 -329
  72. data/demo/spec/javascripts/modules/autogrow_textarea_spec.coffee +0 -43
  73. data/demo/spec/javascripts/modules/button_spec.coffee +0 -39
  74. data/demo/spec/javascripts/modules/counter_button_spec.coffee +0 -57
  75. data/demo/spec/javascripts/sinon-chai.js +0 -116
  76. data/demo/spec/javascripts/sinon.js +0 -3555
  77. data/demo/spec/javascripts/spec_helper.coffee +0 -10
  78. data/demo/spec/javascripts/templates/autogrow_textarea.jst.ejs +0 -2
  79. data/demo/spec/javascripts/templates/button.jst.ejs +0 -3
  80. data/demo/spec/javascripts/templates/closable.jst.ejs +0 -14
  81. data/demo/spec/javascripts/templates/modularity.jst.ejs +0 -6
  82. data/demo/spec/javascripts/tools/array_tools_spec.coffee +0 -12
  83. data/demo/spec/javascripts/tools/object_tools_spec.coffee +0 -46
  84. data/demo/vendor/assets/javascripts/.gitkeep +0 -0
  85. data/demo/vendor/assets/stylesheets/.gitkeep +0 -0
  86. data/demo/vendor/plugins/.gitkeep +0 -0
  87. data/modularity-rails.gemspec +0 -22
  88. data/run_tests +0 -6
  89. data/vendor/assets/javascripts/modularity/modules/counter_button.coffee +0 -17
@@ -1,2 +0,0 @@
1
- Konacha.mochaOptions.ignoreLeaks = true
2
-
@@ -1,98 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/mixins/closable
3
-
4
- # A standard closable module.
5
- class window.ClosableModule1 extends modularity.Module
6
- @mixin modularity.closable
7
-
8
-
9
- describe 'Closable', ->
10
-
11
- spy_alert = null
12
- beforeEach ->
13
- template 'closable'
14
- spy_alert = sinon.stub window, 'alert'
15
-
16
- afterEach ->
17
- spy_alert.restore()
18
-
19
- describe 'constructor', ->
20
- it 'shows an alert if there is no close button', ->
21
- new ClosableModule1('#konacha #closable3')
22
- window.alert.should.have.been.called
23
- window.alert.args[0][0].should.match(/close button not found/i)
24
-
25
- it 'shows no alert if there is a close button', ->
26
- new ClosableModule1('#konacha #closable1')
27
- window.alert.should.not.have.been.called
28
-
29
- it 'finds the close button div automatically', ->
30
- new ClosableModule1('#konacha #closable1')
31
- $('#konacha #closable1 .CloseButton').click()
32
- $('#konacha #closable1').should.have.length 0
33
-
34
-
35
- describe 'when clicking the close button', ->
36
-
37
- it "calls the closable_closing hook on the object if it exists", ->
38
-
39
- # A closable module with the 'closing' hook.
40
- class ClosableModule extends modularity.Module
41
- @mixin modularity.closable
42
-
43
- constructor: ->
44
- super
45
- @closing_hook_got_called = no
46
-
47
- closable_closing: => @closing_hook_got_called = yes
48
-
49
- module = new ClosableModule('#konacha #closable1')
50
- $('#konacha #closable1 .CloseButton').click()
51
- module.closing_hook_got_called.should.be.true
52
-
53
-
54
- it "calls the closable_closed hook on the object if it exists", ->
55
-
56
- # A closable module with the 'closed' hook.
57
- class ClosableModule extends modularity.Module
58
- @mixin modularity.closable
59
-
60
- constructor: ->
61
- super
62
- @closed_hook_got_called = no
63
-
64
- closable_closed: => @closed_hook_got_called = yes
65
-
66
- module = new ClosableModule('#konacha #closable1')
67
- $('#konacha #closable1 .CloseButton').click()
68
- module.closed_hook_got_called.should.be.true
69
-
70
-
71
- it "aborts the close operation if the closable_closing method returns false", ->
72
-
73
- class ClosableModuleWithHookThatReturnsFalse extends modularity.Module
74
- @mixin modularity.closable
75
- closable_closing: -> false
76
-
77
- module = new ClosableModuleWithHookThatReturnsFalse('#konacha #closable1')
78
- module.bind_event('closed', (spy = sinon.spy()))
79
-
80
- $('#konacha #closable1 .CloseButton').click()
81
-
82
- spy.should.not.have.been.called
83
-
84
-
85
- it 'removes the container', ->
86
- new ClosableModule1('#konacha #closable1')
87
- $('#konacha #closable1 .CloseButton').click()
88
-
89
- $('#konacha #closable1').should.have.length 0
90
-
91
-
92
- it "fires the 'closed' event", ->
93
- closable_module = new ClosableModule1('#konacha #closable1')
94
- closable_module.bind_event('closed', (spy = sinon.spy()))
95
-
96
- $('#konacha #closable1 .CloseButton').click()
97
-
98
- spy.should.have.been.calledOnce
@@ -1,329 +0,0 @@
1
- #= require spec_helper
2
-
3
- class window.TestModule extends modularity.Module
4
-
5
-
6
- describe 'modularity', ->
7
-
8
- alert_stub = null
9
- beforeEach ->
10
- template 'modularity'
11
- alert_stub = sinon.stub window, 'alert'
12
-
13
- afterEach ->
14
- alert_stub.restore()
15
-
16
-
17
- describe 'constructor', ->
18
-
19
- it "is defined on the 'window' object", ->
20
- modularity.Module.should.not.be.undefined
21
-
22
- it 'shows an error if no container is given', ->
23
- new TestModule()
24
- window.alert.should.have.been.called
25
-
26
- it 'tries to load the DOM if the given container is a string', ->
27
- new TestModule('#konacha #module_container')
28
- window.alert.should.not.have.been.called
29
-
30
- it 'shows an error if the container is not a jQuery object', ->
31
- new TestModule({})
32
- window.alert.should.have.been.called
33
-
34
- it 'shows an error if the container is an empty jQuery object', ->
35
- new TestModule($('#konacha .zonk'))
36
- window.alert.should.have.been.called
37
-
38
- it 'shows an error if the container has more than one elements', ->
39
- new TestModule($('#konacha .double'))
40
- window.alert.should.have.been.called
41
-
42
- it "allows to provide 'testing' in tests", ->
43
- new TestModule('testing')
44
- window.alert.should.not.have.been.called
45
-
46
-
47
- describe 'assert', ->
48
-
49
- it 'shows an alert with the given message if the given condition is false', ->
50
- modularity.assert false, 'Message'
51
- expect(window.alert.calledWith "Message").to.be.true
52
-
53
- it 'fails when the condition is null', ->
54
- modularity.assert null, 'Message'
55
- expect(window.alert.calledWith "Message").to.be.true
56
-
57
- it 'fails when the condition is undefined', ->
58
- modularity.assert undefined, 'Message'
59
- expect(window.alert.calledWith "Message").to.be.true
60
-
61
- it 'fails when the condition is an empty array', ->
62
- modularity.assert [], 'Message'
63
- expect(window.alert.calledWith "Message").to.be.true
64
-
65
- it 'fails when the condition is an empty string', ->
66
- modularity.assert '', 'Message'
67
- expect(window.alert.calledWith "Message").to.be.true
68
-
69
- it 'passes when the condition is a string', ->
70
- modularity.assert '123', 'Message'
71
- window.alert.should.not.have.been.called
72
-
73
- it "returns false if the condition doesn't pass", ->
74
- modularity.assert(false).should.be.false
75
-
76
- it "returns true if the condition passes", ->
77
- modularity.assert('123').should.be.true
78
-
79
-
80
- describe '@$ notation', ->
81
-
82
- it 'returns a new jQuery object relative to container', ->
83
- module = new TestModule $ '#module_container'
84
- insideObject = module.$ '.inside_module,.outside_module'
85
- insideObject.length.should.equal 1
86
- insideObject.hasClass('inside_module').should.be.true
87
-
88
-
89
- describe 'jQuery Integration', ->
90
-
91
- it 'works', ->
92
- $('#konacha #module_container').module(TestModule)
93
- window.alert.should.not.have.been.called
94
-
95
- it 'returns the created instance', ->
96
- result = $('#konacha #module_container').module(modularity.Module)
97
- result.should.exist
98
- result.should.be.instanceOf modularity.Module
99
-
100
- it 'returns an error if the given parameter is not a class', ->
101
- $('#konacha').module()
102
- window.alert.should.have.been.called
103
-
104
- it 'returns an error if the jQuery object is empty.', ->
105
- $('#konacha #zonk').module(modularity.Module)
106
- window.alert.should.have.been.called
107
-
108
-
109
- describe 'event handling', ->
110
-
111
- module = null
112
- mockContainer = null
113
-
114
- beforeEach ->
115
- mockContainer = $('#konacha #module_container')
116
- module = new TestModule(mockContainer)
117
-
118
- describe 'bind_event', ->
119
-
120
- beforeEach ->
121
- sinon.spy mockContainer, 'bind'
122
-
123
- it 'binds the given custom jQuery event type and the given callback to the container', ->
124
- myCallback = ->
125
- module.bind_event 'myEventType', myCallback
126
- mockContainer.bind.should.have.been.called
127
- mockContainer.bind.args[0][0].should.equal 'myEventType'
128
- mockContainer.bind.args[0][1].should.equal myCallback
129
- window.alert.should.not.have.been.called
130
-
131
- it "throws an error if no parameters are given", ->
132
- module.bind_event()
133
- window.alert.should.have.been.called
134
- mockContainer.bind.should.not.have.been.called
135
-
136
- it "throws an error if the given event type doesn't exist", ->
137
- module.bind_event undefined, ->
138
- window.alert.should.have.been.called
139
- mockContainer.bind.should.not.have.been.called
140
-
141
- it 'throws an error if the given event type is not a string', ->
142
- module.bind_event {}, ->
143
- window.alert.should.have.been.called
144
- mockContainer.bind.should.not.have.been.called
145
-
146
- it "throws an error if the given callback doesn't exist", ->
147
- module.bind_event '123'
148
- window.alert.should.have.been.called
149
- mockContainer.bind.should.not.have.been.called
150
-
151
- it 'throws an error if the given callback is not a function', ->
152
- module.bind_event '123', {}
153
- window.alert.should.have.been.called
154
- mockContainer.bind.should.not.have.been.called
155
-
156
-
157
- describe 'fire_event', ->
158
-
159
- beforeEach ->
160
- sinon.spy mockContainer, 'trigger'
161
-
162
- it 'triggers a custom jQuery event with the given event type on the container object', ->
163
- module.fire_event 'event type', 'event data'
164
- mockContainer.trigger.should.have.been.called
165
- mockContainer.trigger.args[0][0].should.equal 'event type'
166
- mockContainer.trigger.args[0][1].should.equal 'event data'
167
-
168
- describe 'when no payload is given', ->
169
- it 'provides an empty object as payload', ->
170
- module.fire_event 'event type'
171
- mockContainer.trigger.should.have.been.called
172
- mockContainer.trigger.args[0][1].should.eql({})
173
-
174
- it "doesn't change the original payload variable", ->
175
- data = undefined
176
- module.fire_event 'event type', data
177
- expect(data).to.be.undefined
178
-
179
- it 'provides 0 as payload if 0 is given', ->
180
- module.fire_event 'event type', 0
181
- mockContainer.trigger.should.have.been.called
182
- mockContainer.trigger.args[0][1].should.equal(0)
183
-
184
- it 'throws an error if the given event type is not a string', ->
185
- module.fire_event {}
186
- mockContainer.trigger.should.not.have.been.called
187
- window.alert.should.have.been.called
188
-
189
-
190
- describe 'global events', ->
191
-
192
- mockGlobalContainer = null
193
- beforeEach ->
194
- mockGlobalContainer = $('#test #module_container')
195
- sinon.stub(modularity, 'global_event_container').returns(mockGlobalContainer)
196
-
197
- afterEach ->
198
- modularity.global_event_container.restore()
199
-
200
-
201
- describe 'bind_global_event', ->
202
-
203
- beforeEach ->
204
- sinon.spy mockGlobalContainer, 'bind'
205
-
206
- afterEach ->
207
- mockGlobalContainer.bind.restore()
208
-
209
- it 'binds the given event type and callback method to the global event container', ->
210
- callback = ->
211
- modularity.bind_global_event '123', callback
212
- mockGlobalContainer.bind.should.have.been.called
213
- mockGlobalContainer.bind.args[0][0].should.equal '123'
214
- mockGlobalContainer.bind.args[0][1].should.equal callback
215
-
216
- it "throws an error if no parameters are given", ->
217
- modularity.bind_global_event()
218
- window.alert.should.have.been.called
219
- mockGlobalContainer.bind.should.not.have.been.called
220
-
221
- it "throws an error if the given event type doesn't exist", ->
222
- modularity.bind_global_event undefined, ->
223
- window.alert.should.have.been.called
224
- mockGlobalContainer.bind.should.not.have.been.called
225
-
226
- it 'throws an error if the given event type is not a string', ->
227
- modularity.bind_global_event {}, ->
228
- window.alert.should.have.been.called
229
- mockGlobalContainer.bind.should.not.have.been.called
230
-
231
- it "throws an error if the given callback doesn't exist", ->
232
- modularity.bind_global_event '123'
233
- window.alert.should.have.been.called
234
- mockGlobalContainer.bind.should.not.have.been.called
235
-
236
- it 'throws an error if the given callback is not a function', ->
237
- modularity.bind_global_event '123', {}
238
- window.alert.should.have.been.called
239
- mockGlobalContainer.bind.should.not.have.been.called
240
-
241
-
242
- describe 'fire_global_event', ->
243
-
244
- beforeEach ->
245
- sinon.spy mockGlobalContainer, 'trigger'
246
-
247
- afterEach ->
248
- mockGlobalContainer.trigger.restore()
249
-
250
-
251
- it 'triggers a custom jQuery event with the given event type on the global event container object', ->
252
- modularity.fire_global_event 'event type', 'event data'
253
- mockGlobalContainer.trigger.should.have.been.called
254
- mockGlobalContainer.trigger.args[0][0].should.equal 'event type'
255
- mockGlobalContainer.trigger.args[0][1].should.equal 'event data'
256
-
257
- describe 'when no payload is given', ->
258
- it 'provides an empty object as payload', ->
259
- modularity.fire_global_event 'event type'
260
- mockGlobalContainer.trigger.should.have.been.called
261
- mockGlobalContainer.trigger.args[0][1].should.eql({})
262
-
263
- it "doesn't change the original payload variable", ->
264
- data = undefined
265
- modularity.fire_global_event 'event type', data
266
- expect(data).to.equal.undefined
267
-
268
- it 'provides 0 as payload if 0 is given', ->
269
- modularity.fire_global_event 'event type', 0
270
- mockGlobalContainer.trigger.should.have.been.called
271
- mockGlobalContainer.trigger.args[0][1].should.equal(0)
272
-
273
- it 'throws an error if the given event type is not a string', ->
274
- modularity.fire_global_event {}
275
- mockGlobalContainer.trigger.should.not.have.been.called
276
- window.alert.should.have.been.called
277
-
278
-
279
- describe 'mixins', ->
280
-
281
- myMixin = instance = recordedSelf = Test = null
282
- myMixin =
283
- constructor: -> recordedSelf = @
284
- method1: ->
285
- method2: ->
286
-
287
- beforeEach ->
288
- class Test extends modularity.Module
289
- @mixin myMixin
290
-
291
-
292
- it 'adds all methods from the mixin object to the class prototype', ->
293
- instance = new Test('testing')
294
- instance.method1.should.be.a("function")
295
-
296
-
297
- it 'calls the proper mixin method when calling from the implementing module', ->
298
- sinon.spy myMixin, 'method1'
299
- sinon.spy myMixin, 'method2'
300
- instance = new Test('testing')
301
- instance.method1()
302
- myMixin.method1.should.have.been.called
303
- myMixin.method2.should.not.have.been.called
304
- myMixin.method1.restore()
305
- myMixin.method2.restore()
306
-
307
- it 'calls the mixin with the proper paramaters', ->
308
- sinon.spy myMixin, 'method1'
309
- instance = new Test('testing')
310
- instance.method1("arg1", "arg2")
311
- expect(myMixin.method1.calledWith("arg1", "arg2")).to.be.true
312
- myMixin.method1.restore()
313
-
314
-
315
- it 'calls the constructor of the mixin', ->
316
- sinon.spy myMixin, 'constructor'
317
- instance = new Test('testing')
318
- myMixin.constructor.should.have.been.called
319
-
320
-
321
- it 'calls the constructor with the this object pointing to the instance', ->
322
- instance = new Test('testing')
323
- recordedSelf.should.equal instance
324
-
325
- it "can handle mixins that don't define a constructor"
326
-
327
- it "shows an error message if the given mixin is undefined"
328
-
329
- it 'provides arguments to the @mixin method to the mixin constructor'
@@ -1,43 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/modules/autogrow_textarea
3
-
4
-
5
- describe 'AutogrowTextArea', ->
6
-
7
- autogrow = null
8
- beforeEach ->
9
- template 'autogrow_textarea'
10
- autogrow = new modularity.AutogrowTextArea '#konacha #autogrow_area'
11
-
12
-
13
- describe 'lines', ->
14
-
15
- it 'works for empty lines', ->
16
- modularity.AutogrowTextArea.lines(4, "\n\n\n").should == 3
17
-
18
- it 'works for short lines', ->
19
- modularity.AutogrowTextArea.lines(4, "1\n12\n123\n").should == 3
20
-
21
- it 'works for a long line', ->
22
- modularity.AutogrowTextArea.lines(4, "123456").should == 2
23
-
24
- it 'works for several long lines', ->
25
- modularity.AutogrowTextArea.lines(4, "123456\n123456").should == 4
26
-
27
-
28
- describe 'grow()', ->
29
- it 'sets the number of rows of the textarea according to the content area', ->
30
- autogrow.textarea.value = "111\n222\n333\n444\n555"
31
- autogrow.grow()
32
- autogrow.textarea.rows.should.equal(5)
33
-
34
- it 'sets the minimal number of rows if the content is less', ->
35
- $(autogrow.textarea).val('one')
36
- autogrow.grow()
37
- autogrow.textarea.rows.should.equal 3
38
-
39
- it 'can handle empty content', ->
40
- $(autogrow.textarea).val('')
41
- autogrow.grow()
42
- autogrow.textarea.rows.should.equal 3
43
-