rabl 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +5 -0
- data/README.md +40 -10
- data/lib/rabl/builder.rb +19 -2
- data/lib/rabl/version.rb +1 -1
- data/test/builder_test.rb +36 -0
- data/test/engine_test.rb +36 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjAzMDNhYTIyNjk1OTg1YjE5N2NiNzNhYThmMGIyMTQzY2Y2MTk1NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzI2ZGQ3MDQ0ZjY0NDk5NTFjZmRhZmJkYjEzMjNiYjMzMWM1N2MzNw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OWViYTRkNWFjZTQ1MWU2NWRlMTUwNTlkNzQ5NzBkNjQyZGJlZjQ3OGU5Yjcy
|
10
|
+
NzhkNWE5YTM0MmYzMTEzZDE0OWIxN2E0YzYzOTUwNzg4OTQ5MDNmYjhmMDI3
|
11
|
+
YWUxMjNmZTIyZjE2NGRmMzE4N2VhYmYxYmI0YmJiMWM1MGMzYmQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OTRiYTVjMTkxZTVkOWNmMGI4MjgyYTA2MTcwNzcxOGZlMzdkYjAwZGNjZGI3
|
14
|
+
NDEyYjRlMTM0MGI0YWI0ZjhhMWM4ZDhjYjI0ZGIxNjlhZmQxNDlkZDljYjgz
|
15
|
+
NzcwOGM0OThiZDI4ODFjZTc5ZDkwM2FjZWVjNTU2MDU4NDdjNmQ=
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.9.1 (November 17 2013)
|
4
|
+
|
5
|
+
* NEW #507 Resolve conditionals for extends (Thanks @micahcraig)
|
6
|
+
* NEW #453 Support for symbol conditionals (Thanks @leoc)
|
7
|
+
|
3
8
|
## 0.9.0 (October 14 2013)
|
4
9
|
|
5
10
|
* FIX #497 Renderer should support partial caching and a digestor bug fixed (Thanks @siong1987)
|
data/README.md
CHANGED
@@ -364,15 +364,6 @@ node :full_name do |u|
|
|
364
364
|
end
|
365
365
|
```
|
366
366
|
|
367
|
-
or a custom node that exists only if a condition is true:
|
368
|
-
|
369
|
-
```ruby
|
370
|
-
# m is the object being rendered, also supports :unless
|
371
|
-
node(:foo, :if => lambda { |m| m.has_foo? }) do |m|
|
372
|
-
m.foo
|
373
|
-
end
|
374
|
-
```
|
375
|
-
|
376
367
|
or don't pass a name and have the node block merged into the response:
|
377
368
|
|
378
369
|
```ruby
|
@@ -460,6 +451,45 @@ node(:comments) { |post| post.comments } unless locals[:hide_comments]
|
|
460
451
|
|
461
452
|
This can be useful as an advanced tool when extending or rendering partials.
|
462
453
|
|
454
|
+
### Conditions ###
|
455
|
+
|
456
|
+
You can provide conditions to all kinds of nodes, attributes, extends, etc. which includes a given element only if the specified condition is true.
|
457
|
+
|
458
|
+
```ruby
|
459
|
+
collection @posts
|
460
|
+
# m is the object being rendered, also supports :unless
|
461
|
+
node(:coolness, :if => lambda { |m| m.coolness > 5 }) do |m|
|
462
|
+
m.coolness
|
463
|
+
end
|
464
|
+
```
|
465
|
+
|
466
|
+
Because attributes take conditional options as well, we could simplify the example with:
|
467
|
+
|
468
|
+
```ruby
|
469
|
+
collection @posts
|
470
|
+
# m is the object being rendered, also supports :unless
|
471
|
+
attribute(:coolness, :if => lambda { |m| m.coolness > 5 })
|
472
|
+
```
|
473
|
+
|
474
|
+
The value for the `:if` and `:unless` options may be a simple `Boolean`, `Proc` or a `Symbol`. If it is a `Symbol` and the specific `@object` responds to its, the method will be called. Thus the example above can be rewritten as:
|
475
|
+
|
476
|
+
```ruby
|
477
|
+
class Post
|
478
|
+
def cool?
|
479
|
+
coolness > 5
|
480
|
+
end
|
481
|
+
end
|
482
|
+
```
|
483
|
+
|
484
|
+
and then:
|
485
|
+
|
486
|
+
```ruby
|
487
|
+
collection @posts
|
488
|
+
attribute :coolness, if: :cool?
|
489
|
+
```
|
490
|
+
|
491
|
+
Using conditions allows for easy control over when certain elements render.
|
492
|
+
|
463
493
|
### Template Scope ###
|
464
494
|
|
465
495
|
In RABL, you have access to everything you need to build an API response. Each RABL template has full access to the controllers
|
@@ -667,5 +697,5 @@ Thanks again for all of these great projects.
|
|
667
697
|
|
668
698
|
## Copyright ##
|
669
699
|
|
670
|
-
Copyright © 2011-
|
700
|
+
Copyright © 2011-2013 Nathan Esquenazi. See [MIT-LICENSE](https://github.com/nesquena/rabl/blob/master/MIT-LICENSE) for details.
|
671
701
|
|
data/lib/rabl/builder.rb
CHANGED
@@ -120,18 +120,35 @@ module Rabl
|
|
120
120
|
# Extends an existing rabl template with additional attributes in the block
|
121
121
|
# extends("users/show") { attribute :full_name }
|
122
122
|
def extends(file, options={}, &block)
|
123
|
+
return unless resolve_condition(options)
|
123
124
|
options = @options.slice(:child_root).merge(:object => @_object).merge(options)
|
124
125
|
result = self.partial(file, options, &block)
|
125
126
|
@_result.merge!(result) if result.is_a?(Hash)
|
126
127
|
end
|
127
128
|
|
129
|
+
def call_condition_proc(condition, object, &blk)
|
130
|
+
blk = lambda { |v| v } unless block_given?
|
131
|
+
if condition.respond_to?(:call)
|
132
|
+
blk.call(condition.call(object))
|
133
|
+
elsif condition.is_a?(Symbol) && object.respond_to?(condition)
|
134
|
+
blk.call(object.send(condition))
|
135
|
+
else
|
136
|
+
false
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
128
140
|
# resolve_condition(:if => true) => true
|
129
141
|
# resolve_condition(:if => lambda { |m| false }) => false
|
130
142
|
# resolve_condition(:unless => lambda { |m| true }) => true
|
131
143
|
def resolve_condition(options)
|
132
144
|
return true if options[:if].nil? && options[:unless].nil?
|
133
|
-
result =
|
134
|
-
|
145
|
+
result = nil
|
146
|
+
if options.has_key?(:if)
|
147
|
+
result = options[:if] == true || call_condition_proc(options[:if], @_object)
|
148
|
+
end
|
149
|
+
if options.has_key?(:unless)
|
150
|
+
result = options[:unless] == false || call_condition_proc(options[:unless], @_object, &:!)
|
151
|
+
end
|
135
152
|
result
|
136
153
|
end
|
137
154
|
|
data/lib/rabl/version.rb
CHANGED
data/test/builder_test.rb
CHANGED
@@ -180,4 +180,40 @@ context "Rabl::Builder" do
|
|
180
180
|
b.build(false)
|
181
181
|
end.equivalent_to({:user => 'xyz'})
|
182
182
|
end
|
183
|
+
|
184
|
+
context "#resolve_conditionals" do
|
185
|
+
class ArbObj
|
186
|
+
def cool?
|
187
|
+
false
|
188
|
+
end
|
189
|
+
|
190
|
+
def smooth?
|
191
|
+
true
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
asserts "that it can use symbols on if condition and return false if method returns false" do
|
196
|
+
scope = Rabl::Builder.new
|
197
|
+
scope.instance_variable_set(:@_object, ArbObj.new)
|
198
|
+
scope.send(:resolve_condition, { :if => :cool? })
|
199
|
+
end.equals(false)
|
200
|
+
|
201
|
+
asserts "that it can use symbols on if condition and return true if method returns true" do
|
202
|
+
scope = Rabl::Builder.new
|
203
|
+
scope.instance_variable_set(:@_object, ArbObj.new)
|
204
|
+
scope.send :resolve_condition, { :if => :smooth? }
|
205
|
+
end.equals(true)
|
206
|
+
|
207
|
+
asserts "that it can use symbols as unless condition and return true if method returns false" do
|
208
|
+
scope = Rabl::Builder.new
|
209
|
+
scope.instance_variable_set(:@_object, ArbObj.new)
|
210
|
+
scope.send :resolve_condition, { :unless => :cool? }
|
211
|
+
end.equals(true)
|
212
|
+
|
213
|
+
asserts "that it can use symbols as unmless condition and return false if method returns true" do
|
214
|
+
scope = Rabl::Builder.new
|
215
|
+
scope.instance_variable_set(:@_object, ArbObj.new)
|
216
|
+
scope.send :resolve_condition, { :unless => :smooth? }
|
217
|
+
end.equals(false)
|
218
|
+
end
|
183
219
|
end
|
data/test/engine_test.rb
CHANGED
@@ -680,6 +680,42 @@ context "Rabl::Engine" do
|
|
680
680
|
end.equals JSON.parse("{\"name\":\"leo\"}")
|
681
681
|
end
|
682
682
|
|
683
|
+
context "#extends" do
|
684
|
+
helper(:tmp_path) { @tmp_path ||= Pathname.new(Dir.mktmpdir) }
|
685
|
+
setup do
|
686
|
+
Rabl.configure do |config|
|
687
|
+
config.view_paths = tmp_path
|
688
|
+
end
|
689
|
+
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
690
|
+
f.puts %q{
|
691
|
+
attributes :age
|
692
|
+
}
|
693
|
+
end
|
694
|
+
end
|
695
|
+
|
696
|
+
asserts "that it extends the template with attributes from the file" do
|
697
|
+
template = rabl %{
|
698
|
+
object @user
|
699
|
+
attribute :name
|
700
|
+
extends 'test'
|
701
|
+
}
|
702
|
+
scope = Object.new
|
703
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :age => 12)
|
704
|
+
JSON.parse(template.render(scope))
|
705
|
+
end.equals JSON.parse("{\"name\":\"leo\",\"age\":12}")
|
706
|
+
|
707
|
+
asserts "that it can be passed conditionals" do
|
708
|
+
template = rabl %{
|
709
|
+
object @user
|
710
|
+
attribute :name
|
711
|
+
extends('test', {:if => lambda { |i| false }})
|
712
|
+
}
|
713
|
+
scope = Object.new
|
714
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :age => 12)
|
715
|
+
JSON.parse(template.render(scope))
|
716
|
+
end.equals JSON.parse("{\"name\":\"leo\"}")
|
717
|
+
end
|
718
|
+
|
683
719
|
teardown do
|
684
720
|
Rabl.reset_configuration!
|
685
721
|
end
|
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.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Esquenazi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|