rabl 0.14.0 → 0.14.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 0f39e37962add4e967db96ddb7970e8b5567180494024c83ab1cd0f40b215789
4
- data.tar.gz: f61f64c38bb2baf81ce33885feb2fb7a9fc3a9e3587a8767f08d29cacb88a455
2
+ SHA1:
3
+ metadata.gz: 3278a66ba6ca1b6bbbba630f618972311efa3ffa
4
+ data.tar.gz: 8b01a9837edb00add1cc9ba51a4fbd81c5b0cd15
5
5
  SHA512:
6
- metadata.gz: fffcd3104d9a52f11ea39205040858112b12199df5062ad7e3bce56d5ef12f02c97718974bb11765cc2afbde585a8190d0aa93630e655b588d76d66a503854f2
7
- data.tar.gz: 8a780a5d5dc6ca50da1183a71d2292bee13be1abbaffa8f7c7972854c009265c32543710a8879f8de1cbc1d7186cfd48b5d2528907e184a918832b07675f6d50
6
+ metadata.gz: 6b7e34e9c1f6b7ee7f5660147805671bf6ee54252be2199cd7cecf5f78ce4b3ff876884fe072bb2b1633288542e5e9cc8db79990b139086bb718b2ee4eb483da
7
+ data.tar.gz: 735b6dc4e773a9ea3613aada27e2ee57afe987a5defd8c5260962ac690191b05fce69722765793d6858083910b685d4b9cde8eaaa5aaadbbd91cae235f15f995
data/CHANGELOG.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.14.0 (October 31st, 2018)
3
+ ## 0.14.1 (April 28th, 2019)
4
4
 
5
- * Compatibility with Rails 5 API mode
5
+ * Many adjustments and various non-breaking fixes
6
+ * Improvements to caching (@zenspider)
7
+ * Fix tests for Rails 5 (@robertoz)
6
8
 
7
9
  ## 0.13.1 (October 21st, 2016)
8
10
 
data/CONTRIBUTING.md CHANGED
@@ -3,7 +3,7 @@ We love pull requests. Here's a quick guide:
3
3
  1. Fork the repo.
4
4
 
5
5
  2. Run the tests. We only take pull requests with passing tests, and it's great
6
- to know that you have a clean slate: `bundle && rake test`
6
+ to know that you have a clean slate: `bundle && bundle exec rake test`
7
7
 
8
8
  3. Add a test for your change. Only refactoring and documentation changes
9
9
  require no new tests. If you are adding functionality or fixing a bug, we need
@@ -34,4 +34,4 @@ Syntax:
34
34
 
35
35
  And in case we didn't emphasize it enough: we love tests!
36
36
 
37
- NOTE: Adapted from https://raw.github.com/thoughtbot/factory_girl_rails/master/CONTRIBUTING.md
37
+ NOTE: Adapted from https://raw.github.com/thoughtbot/factory_girl_rails/master/CONTRIBUTING.md
data/Gemfile CHANGED
@@ -21,6 +21,7 @@ group :test do
21
21
  gem 'sqlite3'
22
22
  gem 'sinatra', '>= 1.2.0'
23
23
  gem 'hashie'
24
+ gem 'riot'
24
25
  end
25
26
 
26
27
  group :development, :test do
data/lib/rabl/builder.rb CHANGED
@@ -137,7 +137,10 @@ module Rabl
137
137
  # attribute :foo, :as => "bar"
138
138
  # attribute :foo, :as => "bar", :if => lambda { |m| m.foo }
139
139
  def attribute(name, options = {})
140
- return unless @_object && attribute_present?(name) && resolve_condition(options)
140
+ return unless
141
+ @_object &&
142
+ attribute_present?(name) &&
143
+ resolve_condition(options)
141
144
 
142
145
  attribute = data_object_attribute(name)
143
146
  name = create_key(options[:as] || name)
@@ -200,10 +203,11 @@ module Rabl
200
203
 
201
204
  # Evaluate conditions given a symbol/proc/lambda/variable to evaluate
202
205
  def call_condition_proc(condition, object)
203
- # This will evaluate lambda, proc & symbol and call it with 1 argument
204
- return condition.to_proc.call(object) if condition.is_a?(Proc) || condition.is_a?(Symbol)
205
- # Else we send directly the object
206
- condition
206
+ case condition
207
+ when Proc then condition.call(object)
208
+ when Symbol then condition.to_proc.call(object)
209
+ else condition
210
+ end
207
211
  end
208
212
 
209
213
  # resolve_condition(:if => true) => true
@@ -213,8 +217,10 @@ module Rabl
213
217
  # resolve_condition(:unless => lambda { |m| false }, :if => proc { true}) => true
214
218
  def resolve_condition(options)
215
219
  result = true
216
- result &&= call_condition_proc(options[:if], @_object) if options.key?(:if)
217
- result &&= !call_condition_proc(options[:unless], @_object) if options.key?(:unless)
220
+ result &&= call_condition_proc(options[:if], @_object) if
221
+ options.key?(:if)
222
+ result &&= !call_condition_proc(options[:unless], @_object) if
223
+ options.key?(:unless)
218
224
  result
219
225
  end
220
226
 
@@ -222,13 +228,9 @@ module Rabl
222
228
  # Checks if an attribute is present. If not, check if the configuration specifies that this is an error
223
229
  # attribute_present?(created_at) => true
224
230
  def attribute_present?(name)
225
- if @_object.respond_to?(name)
226
- true
227
- elsif Rabl.configuration.raise_on_missing_attribute
228
- raise "Failed to render missing attribute #{name}"
229
- else
230
- false
231
- end
231
+ @_object.respond_to?(name) ||
232
+ (Rabl.configuration.raise_on_missing_attribute &&
233
+ raise("Failed to render missing attribute #{name}"))
232
234
  end
233
235
 
234
236
  # Returns a guess at the format in this context_scope
@@ -5,8 +5,35 @@
5
5
  # config.cache_engine = AdvancedCacheEngine.new
6
6
  #
7
7
 
8
+ class LRU < Hash
9
+ attr_accessor :max_size
10
+
11
+ def initialize
12
+ super
13
+ self.max_size = 100_000
14
+ end
15
+
16
+ def []= k,v
17
+ r = super
18
+ limit_size
19
+ r
20
+ end
21
+
22
+ def limit_size
23
+ if size > max_size then
24
+ delete keys.shift while size > max_size
25
+ end
26
+ end
27
+ end
28
+
8
29
  module Rabl
9
30
  class CacheEngine
31
+ def initialize
32
+ unless defined?(Rails)
33
+ @cache = LRU.new
34
+ end
35
+ end
36
+
10
37
 
11
38
  # Fetch given a key and options and a fallback block attempts to find the key in the cache
12
39
  # and stores the block result in there if no key is found.
@@ -17,13 +44,15 @@ module Rabl
17
44
  if defined?(Rails)
18
45
  Rails.cache.fetch(key, cache_options, &block)
19
46
  else
20
- yield
47
+ @cache[key] ||= yield
21
48
  end
22
49
  end
23
50
 
24
51
  def write(key, value, options = {})
25
52
  if defined?(Rails)
26
53
  Rails.cache.write(key, value, options)
54
+ else
55
+ @cache[key] = yield
27
56
  end
28
57
  end
29
58
 
data/lib/rabl/engine.rb CHANGED
@@ -60,7 +60,7 @@ module Rabl
60
60
  if digestor_available? && respond_to?(:lookup_context) && lookup_context
61
61
  template = @_options[:template] || @virtual_path
62
62
 
63
- digest = \
63
+ digest =
64
64
  if Gem::Version.new(Rails.version) >= Gem::Version.new('4.1')
65
65
  Digestor.digest(:name => template, :finder => lookup_context)
66
66
  else
@@ -83,7 +83,7 @@ module Rabl
83
83
 
84
84
  options[:root_name] = determine_object_root(data, root_name, options[:root])
85
85
 
86
- result = \
86
+ result =
87
87
  if is_object?(data) || !data # object @user
88
88
  Builder.new(data, @_settings, options).to_hash
89
89
  elsif is_collection?(data) # collection @users
@@ -167,6 +167,7 @@ module Rabl
167
167
  @_root_name_data = @_root_name_data.values.first if @_root_name_data.is_a?(Hash)
168
168
 
169
169
  # If we turn this around, `@_root_name_date ==` may trigger data to be loaded unnecessarily.
170
+ # TODO: is nil a different semantic? otherwise don't use `false ==`, use !
170
171
  if false == @_root_name_data
171
172
  @_object_root_name = false
172
173
  @_collection_name = false
@@ -409,15 +410,21 @@ module Rabl
409
410
  end
410
411
 
411
412
  def eval_source(locals, &block)
412
- # Note: locals and block may be used by the eval'ed source
413
-
414
413
  return unless @_source.present?
415
414
 
416
- if @_options[:source_location]
417
- instance_eval(@_source, @_options[:source_location])
418
- else
419
- instance_eval(@_source)
415
+ msg = "cached_source_#{@_source.hash.abs}"
416
+
417
+ unless self.respond_to? msg then
418
+ src = "def #{msg} locals, &block\n#{@_source}\nend"
419
+
420
+ if @_options[:source_location]
421
+ self.class.class_eval(src, @_options[:source_location])
422
+ else
423
+ self.class.class_eval(src)
424
+ end
420
425
  end
426
+
427
+ send msg, locals, &block
421
428
  end
422
429
  end
423
430
  end
data/lib/rabl/helpers.rb CHANGED
@@ -14,7 +14,9 @@ module Rabl
14
14
  # data_object_attribute(data) => @_object.send(data)
15
15
  def data_object_attribute(data)
16
16
  attribute = @_object.__send__(data)
17
- attribute = attribute.as_json if is_collection?(attribute, false) && attribute.respond_to?(:as_json)
17
+ attribute = attribute.as_json if
18
+ is_collection?(attribute, false) &&
19
+ attribute.respond_to?(:as_json)
18
20
  attribute
19
21
  end
20
22
 
@@ -81,8 +83,10 @@ module Rabl
81
83
  # is_collection?([]) => true
82
84
  def is_collection?(obj, follow_symbols = true)
83
85
  data_obj = follow_symbols ? data_object(obj) : obj
84
- data_obj && data_obj.respond_to?(:map) && data_obj.respond_to?(:each) &&
85
- !(data_obj.is_a?(Struct) || defined?(Hashie::Mash) && data_obj.is_a?(Hashie::Mash))
86
+ data_obj &&
87
+ data_obj.is_a?(Enumerable) &&
88
+ !(data_obj.is_a?(Struct) ||
89
+ defined?(Hashie::Mash) && data_obj.is_a?(Hashie::Mash))
86
90
  end
87
91
 
88
92
  # Returns the context_scope wrapping this engine, used for retrieving data, invoking methods, etc
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.14.0"
2
+ VERSION = "0.14.1"
3
3
  end
data/test/silence.rb CHANGED
@@ -3,6 +3,15 @@ module Kernel
3
3
  with_warnings(nil) { yield }
4
4
  end
5
5
 
6
+ def with_warnings(flag)
7
+ old_verbose, $VERBOSE = $VERBOSE, flag
8
+ yield
9
+ ensure
10
+ $VERBOSE = old_verbose
11
+ end
12
+ end unless Kernel.respond_to? :silence_warnings
13
+
14
+ module Kernel
6
15
  def silence_stream(stream)
7
16
  old_stream = stream.dup
8
17
  stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
@@ -11,11 +20,4 @@ module Kernel
11
20
  ensure
12
21
  stream.reopen(old_stream)
13
22
  end
14
-
15
- def with_warnings(flag)
16
- old_verbose, $VERBOSE = $VERBOSE, flag
17
- yield
18
- ensure
19
- $VERBOSE = old_verbose
20
- end
21
- end unless Kernel.respond_to? :silence_warnings
23
+ end unless Kernel.respond_to? :silence_stream
data/test/teststrap.rb CHANGED
@@ -22,7 +22,12 @@ silence_warnings do
22
22
  require File.expand_path('../models/user', __FILE__)
23
23
  end
24
24
 
25
- Riot.pretty_dots
25
+ if $stdout.tty? then
26
+ Riot.pretty_dots
27
+ else
28
+ Riot.dots
29
+ Riot.plain!
30
+ end
26
31
 
27
32
  class Riot::Situation
28
33
  def char_split(str)
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.14.0
4
+ version: 0.14.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: 2018-10-31 00:00:00.000000000 Z
11
+ date: 2019-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -631,7 +631,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
631
631
  version: '0'
632
632
  requirements: []
633
633
  rubyforge_project: rabl
634
- rubygems_version: 2.7.7
634
+ rubygems_version: 2.6.7
635
635
  signing_key:
636
636
  specification_version: 4
637
637
  summary: General ruby templating with json, bson, xml and msgpack support