rabl-rails 0.3.2 → 0.3.3
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/CHANGELOG.md +3 -0
- data/README.md +6 -3
- data/lib/rabl-rails/compiler.rb +8 -3
- data/lib/rabl-rails/renderers/base.rb +35 -12
- data/lib/rabl-rails/renderers/json.rb +4 -0
- data/lib/rabl-rails/renderers/plist.rb +4 -0
- data/lib/rabl-rails/renderers/xml.rb +4 -0
- data/lib/rabl-rails/template.rb +2 -1
- data/lib/rabl-rails/version.rb +1 -1
- data/test/base_renderer_test.rb +33 -1
- data/test/compiler_test.rb +32 -0
- data/test/renderers/json_renderer_test.rb +12 -0
- metadata +2 -2
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# RABL for Rails
|
1
|
+
# RABL for Rails [](https://travis-ci.org/ccocchi/rabl-rails)
|
2
2
|
|
3
3
|
RABL (Ruby API Builder Language) is a ruby templating system for rendering resources in different format (JSON, XML, BSON, ...). You can find documentation [here](http://github.com/nesquena/rabl).
|
4
4
|
|
@@ -94,7 +94,7 @@ RablRails.configure do |config|
|
|
94
94
|
# config.json_engine = :oj
|
95
95
|
# config.xml_engine = 'LibXML'
|
96
96
|
# config.use_custom_responder = false
|
97
|
-
|
97
|
+
# config.default_responder_template = 'show'
|
98
98
|
# config.enable_jsonp_callbacks = false
|
99
99
|
end
|
100
100
|
```
|
@@ -285,7 +285,10 @@ You can find more informations about how to use this method in the [wiki](http:/
|
|
285
285
|
|
286
286
|
### Other features
|
287
287
|
|
288
|
-
|
288
|
+
* [Caching](https://github.com/ccocchi/rabl-rails/wiki/Caching)
|
289
|
+
* [Custom responder](https://github.com/ccocchi/rabl-rails/wiki/Using-custom-responder)
|
290
|
+
|
291
|
+
And more in the [WIKI](https://github.com/ccocchi/rabl-rails/wiki)
|
289
292
|
|
290
293
|
## Performance
|
291
294
|
|
data/lib/rabl-rails/compiler.rb
CHANGED
@@ -65,11 +65,12 @@ module RablRails
|
|
65
65
|
def child(name_or_data, options = {})
|
66
66
|
data, name = extract_data_and_name(name_or_data)
|
67
67
|
name = options[:root] if options.has_key? :root
|
68
|
-
|
68
|
+
|
69
|
+
@template[name] = if options[:partial]
|
69
70
|
template = Library.instance.compile_template_from_path(options[:partial])
|
70
|
-
|
71
|
+
template.merge!(:_data => data)
|
71
72
|
elsif block_given?
|
72
|
-
|
73
|
+
sub_compile(data) { yield }
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -140,6 +141,10 @@ module RablRails
|
|
140
141
|
@template[sequence('if')] = Condition.new(proc, sub_compile(nil) { yield })
|
141
142
|
end
|
142
143
|
|
144
|
+
def cache(&block)
|
145
|
+
@template.cache_key = block_given? ? block : nil
|
146
|
+
end
|
147
|
+
|
143
148
|
protected
|
144
149
|
|
145
150
|
#
|
@@ -27,10 +27,13 @@ module RablRails
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
collection_or_resource ||= @_resource
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
|
31
|
+
render_with_cache(template.cache_key, collection_or_resource) do
|
32
|
+
output_hash = collection_or_resource.respond_to?(:each) ? render_collection(collection_or_resource, template.source)
|
33
|
+
: render_resource(collection_or_resource, template.source)
|
34
|
+
_options[:root_name] = template.root_name
|
35
|
+
format_output(output_hash)
|
36
|
+
end
|
34
37
|
end
|
35
38
|
|
36
39
|
#
|
@@ -43,6 +46,16 @@ module RablRails
|
|
43
46
|
|
44
47
|
protected
|
45
48
|
|
49
|
+
def render_with_cache(key, collection_or_resource, &block)
|
50
|
+
if !key.is_a?(FalseClass) && ActionController::Base.perform_caching
|
51
|
+
Rails.cache.fetch(resolve_cache_key(key, collection_or_resource)) do
|
52
|
+
yield
|
53
|
+
end
|
54
|
+
else
|
55
|
+
yield
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
46
59
|
#
|
47
60
|
# Render a single resource as a hash, according to the compiled
|
48
61
|
# template source passed.
|
@@ -68,14 +81,7 @@ module RablRails
|
|
68
81
|
instance_exec data, &(value.last)
|
69
82
|
when Hash
|
70
83
|
current_value = value.dup
|
71
|
-
|
72
|
-
object = if data_symbol == nil
|
73
|
-
data
|
74
|
-
else
|
75
|
-
data_symbol.to_s.start_with?('@') ? instance_variable_get(data_symbol)
|
76
|
-
: data.respond_to?(data_symbol) ? data.send(data_symbol)
|
77
|
-
: send(data_symbol)
|
78
|
-
end
|
84
|
+
object = object_from_data(data, current_value.delete(:_data))
|
79
85
|
|
80
86
|
if key.to_s.start_with?('_') # glue
|
81
87
|
output.merge!(render_resource(object, current_value))
|
@@ -133,6 +139,23 @@ module RablRails
|
|
133
139
|
@_context.respond_to?(name) ? @_context.send(name, *args, &block) : super
|
134
140
|
end
|
135
141
|
|
142
|
+
def resolve_cache_key(key, data)
|
143
|
+
return data.cache_key unless key
|
144
|
+
key.is_a?(Proc) ? instance_exec(data, &key) : key
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def object_from_data(data, symbol)
|
150
|
+
return data if symbol == nil
|
151
|
+
|
152
|
+
if symbol.to_s.start_with?('@')
|
153
|
+
instance_variable_get(symbol)
|
154
|
+
else
|
155
|
+
data.respond_to?(symbol) ? data.send(symbol) : send(symbol)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
136
159
|
#
|
137
160
|
# Copy assigns from controller's context into this
|
138
161
|
# renderer context to include instances variables when
|
data/lib/rabl-rails/template.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module RablRails
|
2
2
|
class CompiledTemplate
|
3
|
-
attr_accessor :source, :data, :root_name
|
3
|
+
attr_accessor :source, :data, :root_name, :cache_key
|
4
4
|
|
5
5
|
delegate :[], :[]=, :merge!, :to => :source
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@source = {}
|
9
|
+
@cache_key = false
|
9
10
|
end
|
10
11
|
|
11
12
|
def initialize_dup(other)
|
data/lib/rabl-rails/version.rb
CHANGED
data/test/base_renderer_test.rb
CHANGED
@@ -15,7 +15,11 @@ class TestBaseRenderer < ActiveSupport::TestCase
|
|
15
15
|
@context.assigns['data'] = @data
|
16
16
|
|
17
17
|
@template = RablRails::CompiledTemplate.new
|
18
|
+
@template.source = {}
|
18
19
|
@template.data = :@data
|
20
|
+
|
21
|
+
@cache = mock
|
22
|
+
Rails.stub(:cache).and_return(@cache)
|
19
23
|
end
|
20
24
|
|
21
25
|
def render_hash
|
@@ -29,7 +33,35 @@ class TestBaseRenderer < ActiveSupport::TestCase
|
|
29
33
|
|
30
34
|
test "properly handle assigns with symbol keys" do
|
31
35
|
@context.assigns[:foo] = 'bar'
|
32
|
-
@template.source = {}
|
33
36
|
assert_nothing_raised { render_hash }
|
34
37
|
end
|
38
|
+
|
39
|
+
test "cache should be applied if no cache key is given" do
|
40
|
+
@cache.should_not_receive(:fetch)
|
41
|
+
render_hash
|
42
|
+
end
|
43
|
+
|
44
|
+
test "cache should not be used if disabled in Rails configuration" do
|
45
|
+
ActionController::Base.stub(:perform_caching).and_return(false)
|
46
|
+
@cache.should_not_receive(:fetch)
|
47
|
+
@template.cache_key = 'something'
|
48
|
+
render_hash
|
49
|
+
end
|
50
|
+
|
51
|
+
test "cache shoud use #cache_key as default" do
|
52
|
+
ActionController::Base.stub(:perform_caching).and_return(true)
|
53
|
+
@data.stub(:cache_key).and_return('data_cache_key')
|
54
|
+
@cache.should_receive(:fetch).with('data_cache_key').and_return({ some: 'hash' })
|
55
|
+
@template.cache_key = nil
|
56
|
+
|
57
|
+
assert_equal({ some: 'hash' }, render_hash)
|
58
|
+
end
|
59
|
+
|
60
|
+
test "cache should use the proc if given" do
|
61
|
+
ActionController::Base.stub(:perform_caching).and_return(true)
|
62
|
+
@template.cache_key = ->(u) { 'proc_cache_key' }
|
63
|
+
@cache.should_receive(:fetch).with('proc_cache_key').and_return({ some: 'hash' })
|
64
|
+
|
65
|
+
assert_equal({ some: 'hash' }, render_hash)
|
66
|
+
end
|
35
67
|
end
|
data/test/compiler_test.rb
CHANGED
@@ -58,6 +58,21 @@ class CompilerTest < ActiveSupport::TestCase
|
|
58
58
|
assert_equal false, t.root_name
|
59
59
|
end
|
60
60
|
|
61
|
+
test "template should not have a cache key if cache is not enable" do
|
62
|
+
t = @compiler.compile_source('')
|
63
|
+
assert_equal false, t.cache_key
|
64
|
+
end
|
65
|
+
|
66
|
+
test "cache can take no argument" do
|
67
|
+
t = @compiler.compile_source(%{ cache })
|
68
|
+
assert_nil t.cache_key
|
69
|
+
end
|
70
|
+
|
71
|
+
test "cache can take a block" do
|
72
|
+
t = @compiler.compile_source(%( cache { 'foo' }))
|
73
|
+
assert_instance_of Proc, t.cache_key
|
74
|
+
end
|
75
|
+
|
61
76
|
# Compilation
|
62
77
|
|
63
78
|
test "simple attributes are compiled to hash" do
|
@@ -152,6 +167,23 @@ class CompilerTest < ActiveSupport::TestCase
|
|
152
167
|
assert_equal({ :id => :id }, t.source)
|
153
168
|
end
|
154
169
|
|
170
|
+
test "extends should not overwrite nodes previously defined" do
|
171
|
+
skip('Bug reported by @abrisse')
|
172
|
+
|
173
|
+
template = mock('file_template', :source => %(condition(-> { true }) { 'foo' }))
|
174
|
+
lookup_context = mock
|
175
|
+
lookup_context.stub(:find_template).with('users/xtnd', [], false).and_return(template)
|
176
|
+
RablRails::Library.reset_instance
|
177
|
+
RablRails::Library.instance.instance_variable_set(:@lookup_context, lookup_context)
|
178
|
+
|
179
|
+
t = @compiler.compile_source(%{
|
180
|
+
condition(-> { false }) { 'bar' }
|
181
|
+
extends('users/xtnd')
|
182
|
+
})
|
183
|
+
|
184
|
+
assert_equal 2, t.source.keys.size
|
185
|
+
end
|
186
|
+
|
155
187
|
test "node are compiled without evaluating the block" do
|
156
188
|
t = @compiler.compile_source(%{ node(:foo) { bar } })
|
157
189
|
assert_not_nil t.source[:foo]
|
@@ -174,4 +174,16 @@ class TestJsonRenderer < ActiveSupport::TestCase
|
|
174
174
|
@template.source = { :name => :name }
|
175
175
|
assert_equal %q[some_callback({"name":"foobar"})], render_json_output
|
176
176
|
end
|
177
|
+
|
178
|
+
test "cache key should be different from Base to avoid name collisions" do
|
179
|
+
ActionController::Base.stub(:perform_caching).and_return(true)
|
180
|
+
@data.stub(:cache_key).and_return('data_cache_key')
|
181
|
+
@template.cache_key = nil
|
182
|
+
|
183
|
+
@cache = mock
|
184
|
+
@cache.should_receive(:fetch).with('data_cache_key.json').and_return(%("some":"json"))
|
185
|
+
Rails.stub(:cache).and_return(@cache)
|
186
|
+
|
187
|
+
assert_equal %("some":"json"), render_json_output
|
188
|
+
end
|
177
189
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabl-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|