rabl 0.10.1 → 0.11.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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +10 -0
- data/Gemfile +1 -0
- data/README.md +0 -1
- data/fixtures/sinatra_test/app.rb +3 -0
- data/lib/rabl/digestor.rb +5 -5
- data/lib/rabl/engine.rb +17 -8
- data/lib/rabl/helpers.rb +24 -6
- data/lib/rabl/tracker.rb +2 -2
- data/lib/rabl/version.rb +1 -1
- data/test/engine_test.rb +21 -1
- data/test/helpers_test.rb +10 -0
- data/test/teststrap.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTQ1YmY1YjA4YWM5YmIwNmI1Y2M3NDYzYjg0OWRmOGE3NTRiMjJiMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
N2QxNDFjMjUwOTk2NTRhYmVmMWNiMjE3ZWQ5MmU4OWEyZTI5YzNlMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmE2N2I2MGZhNWM1ZWM3YTFkMDNmNzMyODhlNGM2NTFiMTRhYWE5MjJlOTlj
|
10
|
+
YjljMzc5YWEzMmJjZjdjNDRkZTAyYjE2NDA1MTMxODg3NzE3NWU2ODZlNTNk
|
11
|
+
MjczY2Y1YjgxNGI0YTBhNzE5NTY3MWQzOGIzZGFlNGQ5OTgxNjc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzBjMDE4YjY4ZjBiNmEzODY5NDZlMzI2OTI0ZjY4Mjk0M2YyMjVkYzY3YWZl
|
14
|
+
MWQ1MWMxNjM3NDlmMTc1ZmVmOGRiODkxOTc3YTU4YTM1NWJlNjc5YWVkMjBi
|
15
|
+
ZjNlNDZmNGZmODFiZWI5ZmJlNDAzYmQ3NjgyM2NiZGI2NmEwYzg=
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.11.0 (August 16th)
|
4
|
+
|
5
|
+
* Restore ruby 1.8 compatibility (@s01ipsist, @patrickdavey)
|
6
|
+
* Fix Rabl::Tracker to match paths with numbers (@szimek)
|
7
|
+
* Fix caching of a recursive template (@bonobos)
|
8
|
+
* Fix cache for non-rails apps (@t-k)
|
9
|
+
* Escape output all at once to properly escape content (@bholzer)
|
10
|
+
* Add hashie mash to known object list (@nguyenmighty)
|
11
|
+
* Remove root object when set to false value (@mrThe)
|
12
|
+
|
3
13
|
## 0.10.1 (May 28th)
|
4
14
|
|
5
15
|
* Fix nasty formatting bug that broke XML (@bhicks)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -171,7 +171,6 @@ Additionally, anything within child, glue and partial will also be cached separa
|
|
171
171
|
To cache just a single template, see the section titled 'Caching' below.
|
172
172
|
|
173
173
|
If `escape_all_output` is set to `true` and ActiveSupport is available, attribute output will be escaped using [ERB::Util.html_escape](http://corelib.rubyonrails.org/classes/ERB/Util.html).
|
174
|
-
Custom nodes will not be escaped, use `ERB::Util.h(value)`.
|
175
174
|
|
176
175
|
If `view_paths` is set to a path, this view path will be checked for every rabl template within your application.
|
177
176
|
Add to this path especially when including Rabl in an engine and using view paths within a another Rails app.
|
data/lib/rabl/digestor.rb
CHANGED
@@ -2,11 +2,11 @@ module Rabl
|
|
2
2
|
class Digestor < ActionView::Digestor
|
3
3
|
# Override the original digest function to ignore partial which
|
4
4
|
# rabl doesn't use the Rails conventional _ symbol.
|
5
|
-
if Rails.version
|
5
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('4.1')
|
6
6
|
def self.digest(options = {})
|
7
7
|
cache_key = [options[:name]] + Array.wrap(options[:dependencies])
|
8
8
|
@@cache[cache_key.join('.')] ||= begin
|
9
|
-
Digestor.new({ name
|
9
|
+
Digestor.new({ :name => options[:name], :finder => options[:finder] }.merge!(options)).digest
|
10
10
|
end
|
11
11
|
end
|
12
12
|
else
|
@@ -20,9 +20,9 @@ module Rabl
|
|
20
20
|
|
21
21
|
private
|
22
22
|
def dependency_digest
|
23
|
-
template_digests = dependencies.collect do |template_name|
|
24
|
-
if Rails.version
|
25
|
-
Digestor.digest(name
|
23
|
+
template_digests = (dependencies - [template.virtual_path]).collect do |template_name|
|
24
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('4.1')
|
25
|
+
Digestor.digest(:name => template_name, :finder => finder)
|
26
26
|
else
|
27
27
|
Digestor.digest(template_name, format, finder)
|
28
28
|
end
|
data/lib/rabl/engine.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Rabl
|
2
2
|
class Engine
|
3
3
|
include Rabl::Partials
|
4
|
+
include Rabl::Helpers::Escaper
|
4
5
|
|
5
6
|
# List of supported rendering formats
|
6
7
|
FORMATS = [:json, :xml, :plist, :bson, :msgpack]
|
@@ -35,12 +36,12 @@ module Rabl
|
|
35
36
|
options[:root_name] = determine_object_root(data, root_name, options[:root])
|
36
37
|
|
37
38
|
if is_object?(data) || !data # object @user
|
38
|
-
builder.build(data, options)
|
39
|
+
result = builder.build(data, options)
|
39
40
|
elsif is_collection?(data) # collection @users
|
40
41
|
result = data.map { |object| builder.build(object, options) }
|
41
42
|
result = result.map(&:presence).compact if Rabl.configuration.exclude_empty_values_in_collections
|
42
|
-
result
|
43
43
|
end
|
44
|
+
Rabl.configuration.escape_all_output ? escape_output(result) : result
|
44
45
|
end
|
45
46
|
|
46
47
|
# Returns a json representation of the data object
|
@@ -109,6 +110,10 @@ module Rabl
|
|
109
110
|
current_data = (@_locals[:object].nil? || template_data == false) ? template_data : @_locals[:object]
|
110
111
|
@_data_object = data_object(current_data)
|
111
112
|
@_data_name = data_name(template_data.is_a?(Hash) && !current_data.is_a?(Hash) ? template_data : current_data)
|
113
|
+
if @_data_name == false
|
114
|
+
@_object_root_name = false
|
115
|
+
@_collection_name = false
|
116
|
+
end
|
112
117
|
end
|
113
118
|
|
114
119
|
# Returns the current object that is the topic of this template
|
@@ -277,10 +282,10 @@ module Rabl
|
|
277
282
|
_cache = @_cache if defined?(@_cache)
|
278
283
|
cache_key, cache_options = *_cache || nil
|
279
284
|
if template_cache_configured? && cache_key
|
280
|
-
|
281
|
-
|
282
|
-
else # fallback for Rails 3
|
283
|
-
|
285
|
+
result_cache_key = if digestor_available?
|
286
|
+
cache_key_with_digest(cache_key)
|
287
|
+
else # fallback for Rails 3, and Non-Rails app
|
288
|
+
cache_key_simple(cache_key)
|
284
289
|
end
|
285
290
|
fetch_result_from_cache(result_cache_key, cache_options, &block)
|
286
291
|
else # skip caching
|
@@ -288,11 +293,15 @@ module Rabl
|
|
288
293
|
end
|
289
294
|
end
|
290
295
|
|
296
|
+
def digestor_available?
|
297
|
+
defined?(Rails) && Rails.version =~ /^[4]/
|
298
|
+
end
|
299
|
+
|
291
300
|
def cache_key_with_digest(cache_key)
|
292
301
|
template = @_options[:template] || @virtual_path
|
293
302
|
|
294
|
-
if Rails.version
|
295
|
-
digested = Digestor.digest(name
|
303
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('4.1')
|
304
|
+
digested = Digestor.digest(:name => template, :finder => lookup_context)
|
296
305
|
else
|
297
306
|
digested = Digestor.digest(template, :rabl, lookup_context)
|
298
307
|
end
|
data/lib/rabl/helpers.rb
CHANGED
@@ -3,7 +3,7 @@ require 'active_support/inflector' # for the sake of pluralizing
|
|
3
3
|
module Rabl
|
4
4
|
module Helpers
|
5
5
|
# Set of class names known to be objects, not collections
|
6
|
-
KNOWN_OBJECT_CLASSES = ['Struct']
|
6
|
+
KNOWN_OBJECT_CLASSES = ['Struct', 'Hashie::Mash']
|
7
7
|
|
8
8
|
# data_object(data) => <AR Object>
|
9
9
|
# data_object(@user => :person) => @user
|
@@ -15,7 +15,7 @@ module Rabl
|
|
15
15
|
|
16
16
|
# data_object_attribute(data) => @_object.send(data)
|
17
17
|
def data_object_attribute(data)
|
18
|
-
|
18
|
+
@_object.__send__(data)
|
19
19
|
end
|
20
20
|
|
21
21
|
# data_name(data) => "user"
|
@@ -119,10 +119,28 @@ module Rabl
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
122
|
+
module Escaper
|
123
|
+
def escape_output(response)
|
124
|
+
case response
|
125
|
+
when Hash
|
126
|
+
response.each{|k,v| response[k] = escape_value(v) }
|
127
|
+
when Array
|
128
|
+
response.map!{|v| escape_value(v) }
|
129
|
+
else
|
130
|
+
response
|
131
|
+
end
|
132
|
+
end
|
126
133
|
|
134
|
+
def escape_value(value)
|
135
|
+
case value
|
136
|
+
when String
|
137
|
+
ERB::Util.h(value)
|
138
|
+
when Array, Hash
|
139
|
+
escape_output(value)
|
140
|
+
else
|
141
|
+
value
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
127
145
|
end
|
128
146
|
end
|
data/lib/rabl/tracker.rb
CHANGED
@@ -6,7 +6,7 @@ module Rabl
|
|
6
6
|
EXTENDS_DEPENDENCY = /
|
7
7
|
extends\s* # extends, followed by optional whitespace
|
8
8
|
\(? # start an optional parenthesis for the extends call
|
9
|
-
\s*["']([
|
9
|
+
\s*["']([0-9a-z_\/\.]+) # the template name itself
|
10
10
|
/x
|
11
11
|
|
12
12
|
# Matches:
|
@@ -14,7 +14,7 @@ module Rabl
|
|
14
14
|
PARTIAL_DEPENDENCY = /
|
15
15
|
partial\s* # partial, followed by optional whitespace
|
16
16
|
\(? # start an optional parenthesis for the partial call
|
17
|
-
\s*["']([
|
17
|
+
\s*["']([0-9a-z_\/\.]+) # the template name itself
|
18
18
|
/x
|
19
19
|
|
20
20
|
def self.call(name, template)
|
data/lib/rabl/version.rb
CHANGED
data/test/engine_test.rb
CHANGED
@@ -37,7 +37,7 @@ context "Rabl::Engine" do
|
|
37
37
|
|
38
38
|
context "with a specified format" do
|
39
39
|
setup do
|
40
|
-
template = RablTemplate.new("code", format
|
40
|
+
template = RablTemplate.new("code", :format => 'xml') { "" }
|
41
41
|
template.render(Object.new)
|
42
42
|
engine = template.instance_eval('@engine')
|
43
43
|
engine.instance_eval('@_options')[:format]
|
@@ -132,6 +132,26 @@ context "Rabl::Engine" do
|
|
132
132
|
template.render(scope)
|
133
133
|
end.equals "{\"person\":{}}"
|
134
134
|
|
135
|
+
asserts "that it can set false root node" do
|
136
|
+
template = rabl %q{
|
137
|
+
object @user => false
|
138
|
+
}
|
139
|
+
scope = Object.new
|
140
|
+
scope.instance_variable_set :@user, User.new
|
141
|
+
template.render(scope)
|
142
|
+
end.equals "{}"
|
143
|
+
|
144
|
+
asserts "that it can set false root node and correctly render object without root node" do
|
145
|
+
template = rabl %q{
|
146
|
+
object @user => false
|
147
|
+
attribute :name
|
148
|
+
}
|
149
|
+
user = User.new(:name => "John Doe")
|
150
|
+
scope = Object.new
|
151
|
+
scope.instance_variable_set :@user, user
|
152
|
+
template.render(scope)
|
153
|
+
end.equals "{\"name\":\"John Doe\"}"
|
154
|
+
|
135
155
|
asserts "that it can use non-ORM objects" do
|
136
156
|
template = rabl %q{
|
137
157
|
object @other
|
data/test/helpers_test.rb
CHANGED
@@ -85,6 +85,11 @@ context "Rabl::Helpers" do
|
|
85
85
|
@helper_class.is_object?(obj.new('foo'))
|
86
86
|
end.equals(true)
|
87
87
|
|
88
|
+
asserts "returns true for a Hashie::Mash" do
|
89
|
+
obj = Hashie::Mash.new({:name => 'hello'})
|
90
|
+
@helper_class.is_object?(obj)
|
91
|
+
end.equals(true)
|
92
|
+
|
88
93
|
asserts "returns false for an array" do
|
89
94
|
@helper_class.is_object?([@user])
|
90
95
|
end.equals(false)
|
@@ -116,5 +121,10 @@ context "Rabl::Helpers" do
|
|
116
121
|
asserts "returns true for an array" do
|
117
122
|
@helper_class.is_collection?([@user])
|
118
123
|
end.equals(true)
|
124
|
+
|
125
|
+
asserts "returns true for an array" do
|
126
|
+
obj = Hashie::Mash.new({:name => 'hello'})
|
127
|
+
@helper_class.is_collection?(obj)
|
128
|
+
end.equals(false)
|
119
129
|
end # is_collection method
|
120
130
|
end
|
data/test/teststrap.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Esquenazi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|