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
|
@@ -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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *70363417911480
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: capybara-webkit
|
27
|
-
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: *
|
35
|
+
version_requirements: *70363417911000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: evergreen
|
38
|
-
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: *
|
46
|
+
version_requirements: *70363417910480
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rb-fsevent
|
49
|
-
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: *
|
57
|
+
version_requirements: *70363417909960
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: guard-livereload
|
60
|
-
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: *
|
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:
|