rabl 0.11.5 → 0.11.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e537c7beaab5536e66f93405989bf5cee8eb01c
4
- data.tar.gz: ba40dd0c56d79991be8348f316012fe7d0642653
3
+ metadata.gz: 852d10093718c0d837774cbb5503b64cd7474305
4
+ data.tar.gz: 39d7b1d6c51be9b181431d127b8e19456bcda4a3
5
5
  SHA512:
6
- metadata.gz: 9120f78fa8c6c01522b56df715e95fa5fdf23851f0d6ce485a797c43a82d182b9141fa5bbd58884a484dce88619bc591e4d3ea9a25d41df5b184b84aa58671e5
7
- data.tar.gz: 7b8cae3fed1ef957e4ef39b6b4af16366e4444eb2d591a8bb1320426cabf4af16d3beda7344600efa53abd8929ab54989602e8a25326fcc75a379bb0419a5432
6
+ metadata.gz: 46aaee2c97be7740ec16880d9fa59fec495cc136e11854a9685137e593c06c8325e3fd4e9a07e929fe0d2c3b22b1aa8ab6a8319c90048f8882474779316d380f
7
+ data.tar.gz: a574e74f6489c8bbb40ce57c1d6ad8738d1d634f9fe9bc793eabf5a0dea6421329ad94a0f1ff22927ba6b31c69bb9499c087ba7eef12457627717fe7a100277f
data/.travis.yml CHANGED
@@ -3,6 +3,8 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.3
5
5
  - 2.0.0
6
+ - 2.1
7
+ - 2.2
6
8
  gemfile: Gemfile.ci
7
9
  notifications:
8
10
  recipients:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.11.6 (January 26th)
4
+
5
+ * Fix resolve_condition and simplify call_condition_proc (@vmeyet)
6
+ * Respect eagerly loaded collections by not always calling #to_ary (@DouweM)
7
+ * Move creation of options and engine in tilt template to avoid threading issues (@jseriff)
8
+
3
9
  ## 0.11.5 (December 5th)
4
10
 
5
11
  * Check if context_scope includes ".settings.views" for Sinatra (@LTe)
data/Gemfile CHANGED
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in rabl.gemspec
4
4
  gemspec
5
5
 
6
- gem 'rake', :require => false
7
6
  gem 'i18n', '~> 0.6'
8
7
 
9
8
  platforms :mri_18 do
@@ -12,7 +11,7 @@ platforms :mri_18 do
12
11
  end
13
12
 
14
13
  group :test do
15
- # RABL TEST
14
+ # RABL TEST
16
15
  gem 'builder'
17
16
 
18
17
  # FIXTURES
@@ -46,4 +46,4 @@ gem 'jquery-rails'
46
46
  # gem 'capistrano', group: :development
47
47
 
48
48
  # Use debugger
49
- gem 'debugger', group: [:development, :test]
49
+ gem 'byebug', group: [:development, :test]
data/lib/rabl/builder.rb CHANGED
@@ -45,7 +45,7 @@ module Rabl
45
45
  @_object = object if object
46
46
  @options.merge!(options) if options
47
47
  @settings.merge!(settings) if settings
48
-
48
+
49
49
  cache_results do
50
50
  @_result = {}
51
51
 
@@ -196,37 +196,23 @@ module Rabl
196
196
  engines << partial_as_engine(file, options, &block)
197
197
  end
198
198
 
199
- # Evaluate conditions given a symbol to evaluate
200
- def call_condition_proc(condition, object, &block)
201
- block = lambda { |v| v } unless block_given?
202
-
203
- if condition.respond_to?(:call)
204
- # condition is a block to pass to the block
205
- block.call(condition.call(object))
206
- elsif condition.is_a?(Symbol) && object.respond_to?(condition)
207
- # condition is a property of the object
208
- block.call(object.send(condition))
209
- else
210
- false
211
- end
199
+ # Evaluate conditions given a symbol/proc/lambda/variable to evaluate
200
+ def call_condition_proc(condition, object)
201
+ # This will evaluate lambda, proc & symbol and call it with 1 argument
202
+ return condition.to_proc.call(object) if condition.respond_to?(:to_proc)
203
+ # Else we send directly the object
204
+ condition
212
205
  end
213
206
 
214
207
  # resolve_condition(:if => true) => true
208
+ # resolve_condition(:if => 'Im truthy') => true
215
209
  # resolve_condition(:if => lambda { |m| false }) => false
216
- # resolve_condition(:unless => lambda { |m| true }) => true
210
+ # resolve_condition(:unless => lambda { |m| false }) => true
211
+ # resolve_condition(:unless => lambda { |m| false }, :if => proc { true}) => true
217
212
  def resolve_condition(options)
218
- return true if options[:if].nil? && options[:unless].nil?
219
-
220
- result = nil
221
- if options.has_key?(:if)
222
- result = options[:if] == true || call_condition_proc(options[:if], @_object)
223
- end
224
-
225
- if options.has_key?(:unless)
226
- inverse_proc = lambda { |r| !r }
227
- result = options[:unless] == false || call_condition_proc(options[:unless], @_object, &inverse_proc)
228
- end
229
-
213
+ result = true
214
+ result &&= call_condition_proc(options[:if], @_object) if options.key?(:if)
215
+ result &&= !call_condition_proc(options[:unless], @_object) if options.key?(:unless)
230
216
  result
231
217
  end
232
218
 
data/lib/rabl/engine.rb CHANGED
@@ -163,9 +163,11 @@ module Rabl
163
163
  def object(template_data)
164
164
  current_data = (@_locals[:object].nil? || template_data == false) ? template_data : @_locals[:object]
165
165
  @_data_object = data_object(current_data)
166
- @_data_name = data_name(template_data.is_a?(Hash) && !current_data.is_a?(Hash) ? template_data : current_data)
166
+ @_root_name_data = template_data.is_a?(Hash) && !current_data.is_a?(Hash) ? template_data : current_data
167
+ @_root_name_data = @_root_name_data.values.first if @_root_name_data.is_a?(Hash)
167
168
 
168
- if @_data_name == false
169
+ # If we turn this around, `@_root_name_date ==` may trigger data to be loaded unnecessarily.
170
+ if false == @_root_name_data
169
171
  @_object_root_name = false
170
172
  @_collection_name = false
171
173
  end
@@ -185,7 +187,7 @@ module Rabl
185
187
  return @_data_name if defined?(@_data_name)
186
188
 
187
189
  @_data_name = @_options[:object_root_name] || begin
188
- data = @_locals[:object].nil? ? root_object : @_locals[:object]
190
+ data = defined?(@_root_name_data) ? @_root_name_data : (@_locals[:object].nil? ? root_object : @_locals[:object])
189
191
  data_name(data)
190
192
  end
191
193
  end
@@ -201,7 +203,7 @@ module Rabl
201
203
 
202
204
  @_object_root_name = options[:object_root] if options.has_key?(:object_root)
203
205
 
204
- object(Array(data_object(data)))
206
+ object(data_object(data) || [])
205
207
  end
206
208
 
207
209
  # Sets the cache key to be used by ActiveSupport::Cache.expand_cache_key
data/lib/rabl/helpers.rb CHANGED
@@ -35,7 +35,8 @@ module Rabl
35
35
  data = data_object(data_token)
36
36
 
37
37
  if is_collection?(data) # data is a collection
38
- object_name = data.table_name if data.respond_to?(:table_name)
38
+ object_name = collection_root_name if collection_root_name
39
+ object_name ||= data.table_name if data.respond_to?(:table_name)
39
40
 
40
41
  if object_name.nil? && data.respond_to?(:first)
41
42
  first = data.first
data/lib/rabl/template.rb CHANGED
@@ -7,12 +7,12 @@ if defined?(Tilt)
7
7
  end
8
8
 
9
9
  def prepare
10
- options = @options.merge(:format => @options[:format], :source_location => file)
11
- @engine = ::Rabl::Engine.new(data, options)
10
+ #left empty so each invocation has a new hash of options and new rabl engine for thread safety
12
11
  end
13
12
 
14
13
  def evaluate(context_scope, locals, &block)
15
- @engine.apply(context_scope, locals, &block).render
14
+ options = @options.merge(:source_location => file)
15
+ ::Rabl::Engine.new(data, options).apply(context_scope, locals, &block).render
16
16
  end
17
17
  end
18
18
 
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.11.5"
2
+ VERSION = "0.11.6"
3
3
  end
data/test/builder_test.rb CHANGED
@@ -299,9 +299,59 @@ context "Rabl::Builder" do
299
299
  scope.send :resolve_condition, { :unless => :cool? }
300
300
  end.equals(true)
301
301
 
302
- asserts "that it can use symbols as unmless condition and return false if method returns true" do
302
+ asserts "that it can use symbols as unless condition and return false if method returns true" do
303
303
  scope = Rabl::Builder.new(ArbObj.new)
304
304
  scope.send :resolve_condition, { :unless => :smooth? }
305
305
  end.equals(false)
306
+
307
+ asserts "that it can use :unless and :if at the same time and return true when if is true and unless is false" do
308
+ scope = Rabl::Builder.new(ArbObj.new)
309
+ scope.send :resolve_condition, { :if => true, :unless => false }
310
+ end.equals(true)
311
+
312
+ asserts "that it can use :unless and :if at the same time and return false when if is false and unless is false" do
313
+ scope = Rabl::Builder.new(ArbObj.new)
314
+ scope.send :resolve_condition, { :if => false, :unless => false }
315
+ end.equals(false)
316
+
317
+ asserts "that it can use :unless and :if at the same time and return false when if is true and unless is true" do
318
+ scope = Rabl::Builder.new(ArbObj.new)
319
+ scope.send :resolve_condition, { :if => true, :unless => true }
320
+ end.equals(false)
321
+
322
+ asserts "that it can use :unless and :if at the same time and return false when if is false and unless is true" do
323
+ scope = Rabl::Builder.new(ArbObj.new)
324
+ scope.send :resolve_condition, { :if => false, :unless => true }
325
+ end.equals(false)
326
+
327
+ asserts "that it can use lambda on if condition and return false if lambda returns false" do
328
+ scope = Rabl::Builder.new(ArbObj.new)
329
+ scope.send(:resolve_condition, { :if => lambda { |obj| false } })
330
+ end.equals(false)
331
+
332
+ asserts "that it can use lambda on if condition and return true if lambda returns true" do
333
+ scope = Rabl::Builder.new(ArbObj.new)
334
+ scope.send(:resolve_condition, { :if => lambda { |obj| true } })
335
+ end.equals(true)
336
+
337
+ asserts "that it can use proc on if condition and return false if proc returns false" do
338
+ scope = Rabl::Builder.new(ArbObj.new)
339
+ scope.send(:resolve_condition, { :if => proc { false } })
340
+ end.equals(false)
341
+
342
+ asserts "that it can use proc on if condition and return true if proc returns true" do
343
+ scope = Rabl::Builder.new(ArbObj.new)
344
+ scope.send(:resolve_condition, { :if => proc { true } })
345
+ end.equals(true)
346
+
347
+ asserts "that it can use a variable on if condition and return true if variable is truthy" do
348
+ scope = Rabl::Builder.new(ArbObj.new)
349
+ scope.send(:resolve_condition, { :if => 'Im truthy' })
350
+ end.equals('Im truthy')
351
+
352
+ asserts "that it can use a variable on if condition and return false if variable is falsy" do
353
+ scope = Rabl::Builder.new(ArbObj.new)
354
+ scope.send(:resolve_condition, { :if => nil })
355
+ end.equals(nil)
306
356
  end
307
357
  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.11.5
4
+ version: 0.11.6
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-12-05 00:00:00.000000000 Z
11
+ date: 2015-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport