modularity-rails 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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: