modularity-rails 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -8,6 +8,11 @@ that allows to compose functionally rich web pages in a clean and testable way
8
8
  out of well structured and reusable components.
9
9
 
10
10
 
11
+ ## Authors
12
+ * [Kevin Goslar](https://github.com/kevgo) (kevin.goslar@gmail.com)
13
+ * [Alex David](https://github.com/alexdavid)
14
+
15
+
11
16
  # Installation
12
17
 
13
18
  Add this line to your application's Gemfile:
@@ -112,6 +117,20 @@ Including this mixin makes a module closable. The mixin searches for an embedded
112
117
  * The _closable_closed_ hook of the closable class is called.
113
118
 
114
119
 
120
+ ## Tools
121
+
122
+ ### Loader
123
+ A generic cached loader for parallel and repeated GET requests.
124
+ Prevents duplicate requests, caches the responses.
125
+
126
+ The first request triggers the ajax request. Subsequent requests while the resquest is running are accumulated without causing new requests.
127
+ Once the response arrives, all currently requesting clients are answered. Subsequent requests are answered immediately using the cached data.
128
+
129
+ ```coffeescript
130
+ Module.loader.get '/test.json', (data) ->
131
+ # Use data here.
132
+ ```
133
+
115
134
  # Development
116
135
 
117
136
  ## Contributing
@@ -1,3 +1,3 @@
1
1
  module ModularityRails
2
- VERSION = "0.7.1"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -0,0 +1,85 @@
1
+ #= require spec_helper
2
+
3
+ describe 'test environment setup', ->
4
+
5
+  it 'loading libraries', ->
6
+ load_modularity()
7
+    loadCS "/vendor/assets/javascripts/tools/ajax_loader.coffee"
8
+
9
+
10
+ describe 'ajax_loader', ->
11
+  
12
+  describe 'get', ->
13
+ spy = null
14
+ beforeEach ->
15
+ spyOn(jQuery, 'get')
16
+ spy = jasmine.createSpy()
17
+ Module.loader.cache = {}
18
+
19
+ url = "user/4"
20
+
21
+ describe 'the data has already been loaded', ->
22
+    it 'calls the callback with the cached data', ->
23
+ spy = jasmine.createSpy()
24
+ url = "/users/4"
25
+
26
+ Module.loader.cache[url] = "my data"
27
+ Module.loader.get(url, spy)
28
+
29
+ expect(spy).toHaveBeenCalled()
30
+ expect(spy.argsForCall[0][0]).toEqual("my data")
31
+
32
+
33
+ describe 'the request is already in progress', ->
34
+
35
+ beforeEach ->
36
+ Module.loader.cache[url] = []
37
+ Module.loader.get(url, spy)
38
+
39
+
40
+ it 'adds the callback to the callback array', ->
41
+ expect(Module.loader.cache[url].length).toEqual(1)
42
+ expect(Module.loader.cache[url][0]).toEqual(spy)
43
+
44
+
45
+ it 'returns without calling the callback', ->
46
+ expect(spy).not.toHaveBeenCalled()
47
+
48
+
49
+ it 'does not make another ajax request', ->
50
+ expect(jQuery.get).not.toHaveBeenCalled()
51
+
52
+
53
+
54
+ describe 'first time request', ->
55
+
56
+ beforeEach ->
57
+ Module.loader.get(url, spy)
58
+
59
+ it 'makes an ajax request', ->
60
+ expect(jQuery.get).toHaveBeenCalled()
61
+
62
+
63
+ it 'saves the callback for later', ->
64
+ expect(Module.loader.cache[url].length).toEqual(1)
65
+ expect(Module.loader.cache[url][0]).toEqual(spy)
66
+
67
+ it 'returns without calling the callback', ->
68
+ expect(spy).not.toHaveBeenCalled()
69
+
70
+
71
+
72
+ describe 'ajax request successful', ->
73
+
74
+ beforeEach ->
75
+ jquery_callback = null
76
+ jQuery.get = (url, callback) -> jquery_callback = callback
77
+ Module.loader.get url, spy
78
+ jquery_callback('result')
79
+
80
+ it 'calls the given callbacks', ->
81
+ expect(spy).toHaveBeenCalled()
82
+ expect(spy.argsForCall[0][0]).toEqual('result')
83
+
84
+ it 'replaces the cache callbacks with returned data', ->
85
+ expect(Module.loader.cache[url]).toEqual('result')
@@ -0,0 +1,28 @@
1
+ # A generic ajax loader for parallel GET requests.
2
+ # Prevents duplicate requests, caches the responses
3
+ # to answer subsequent requests immediately
4
+ # without additional server requests.
5
+ #
6
+ # Warning: Caches the responses, so once a request is cached,
7
+ # any new content on the same URL will not be visible!
8
+ Module.loader =
9
+
10
+ cache: {}
11
+
12
+ get: (url, callback) ->
13
+ cache = Module.loader.cache[url]
14
+
15
+ # New request --> start GET call, store callback.
16
+ unless cache?
17
+ Module.loader.cache[url] = [callback]
18
+ return jQuery.get url, (data) ->
19
+ cb(data) for cb in Module.loader.cache[url]
20
+ Module.loader.cache[url] = data
21
+
22
+ # Request while the GET call is still pending -->
23
+ # add the given callback to the list of waiting callbacks.
24
+ if cache.constructor is Array
25
+ return cache.push callback
26
+
27
+ # There is a cached response for this request --> answer the request immediately.
28
+ callback(cache)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modularity-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-02 00:00:00.000000000 Z
12
+ date: 2012-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70310922324920 !ruby/object:Gem::Requirement
16
+ requirement: &70363417911480 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70310922324920
24
+ version_requirements: *70363417911480
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: capybara-webkit
27
- requirement: &70310922324500 !ruby/object:Gem::Requirement
27
+ requirement: &70363417911000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70310922324500
35
+ version_requirements: *70363417911000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: evergreen
38
- requirement: &70310922324020 !ruby/object:Gem::Requirement
38
+ requirement: &70363417910480 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70310922324020
46
+ version_requirements: *70363417910480
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rb-fsevent
49
- requirement: &70310922323560 !ruby/object:Gem::Requirement
49
+ requirement: &70363417909960 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70310922323560
57
+ version_requirements: *70363417909960
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard-livereload
60
- requirement: &70310922323080 !ruby/object:Gem::Requirement
60
+ requirement: &70363417909540 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70310922323080
68
+ version_requirements: *70363417909540
69
69
  description: Description of ModularityRails.
70
70
  email:
71
71
  - kevin.goslar@gmail.com
@@ -96,11 +96,13 @@ files:
96
96
  - spec/javascripts/templates/button.html
97
97
  - spec/javascripts/templates/closable.html
98
98
  - spec/javascripts/templates/test.html
99
+ - spec/javascripts/tools/ajax_loader_spec.coffee
99
100
  - vendor/assets/javascripts/mixins/clickable.coffee
100
101
  - vendor/assets/javascripts/mixins/closable.coffee
101
102
  - vendor/assets/javascripts/modularity.js.coffee
102
103
  - vendor/assets/javascripts/modules/button.coffee
103
104
  - vendor/assets/javascripts/modules/counter_button.coffee
105
+ - vendor/assets/javascripts/tools/ajax_loader.coffee
104
106
  homepage: http://github.com/kevgo/modularity-rails
105
107
  licenses: []
106
108
  post_install_message: