rabl 0.16.1 → 0.18.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.
data/lib/rabl.rb CHANGED
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support'
4
+ require 'active_support/core_ext/array/extract_options'
2
5
  require 'active_support/core_ext/string/inflections'
3
6
  require 'active_support/core_ext/object/blank'
4
7
  require 'active_support/core_ext/hash/reverse_merge'
@@ -15,11 +18,12 @@ require 'rabl/multi_builder'
15
18
  require 'rabl/configuration'
16
19
  require 'rabl/renderer'
17
20
  require 'rabl/cache_engine'
21
+ require 'rabl/template_cache_key'
18
22
 
19
23
  if defined?(Rails) && Rails.respond_to?(:version)
20
- require 'rabl/tracker' if Rails.version =~ /^[4567]/
21
- require 'rabl/digestor' if Rails.version =~ /^[4567]/
22
- require 'rabl/railtie' if Rails.version =~ /^[34567]/
24
+ require 'rabl/tracker' if Rails.version =~ /^[45678]/
25
+ require 'rabl/digestor' if Rails.version =~ /^[45678]/
26
+ require 'rabl/railtie' if Rails.version =~ /^[345678]/
23
27
  end
24
28
 
25
29
  # Rabl.register!
@@ -54,16 +58,18 @@ module Rabl
54
58
  end
55
59
 
56
60
  # Fetches from the source_cache, stores block result in cache if nil
57
- # Used to cache the contents and paths to various rabl templates
58
- # source_cache("users/index", "path/to/view") { "/full/path/to/template/users/index" }
59
- def source_cache(file, view_path, &block)
61
+ # Used to cache the contents and paths to various rabl templates, keyed by
62
+ # everything the lookup depends on (the file, the view path and the lookup details)
63
+ # source_cache("users/index", ["path/to/view"], [:json]) { "/full/path/to/template/users/index" }
64
+ def source_cache(file, view_path, lookup = nil)
60
65
  return yield unless Rabl.configuration.cache_sources
61
66
 
62
- cache_key = [file, view_path].compact.join(":")
63
-
64
67
  @_source_cache ||= {}
65
68
 
66
- @_source_cache[cache_key] ||= yield
69
+ # stores a frozen copy of the key, so later changes to the caller's strings don't reach it
70
+ @_source_cache.fetch([file, view_path, lookup]) do
71
+ @_source_cache[frozen_copy([file, view_path, lookup])] = yield
72
+ end
67
73
  end
68
74
 
69
75
  # Resets the RABL source cache
@@ -71,6 +77,16 @@ module Rabl
71
77
  @_source_cache = {}
72
78
  end
73
79
 
80
+ # Returns a copy of value whose Strings and Arrays are frozen, for cache keys that
81
+ # must not change when the caller's objects do
82
+ def frozen_copy(value)
83
+ case value
84
+ when Array then value.map { |item| frozen_copy(item) }.freeze
85
+ when String then value.frozen? ? value : value.dup.freeze
86
+ else value
87
+ end
88
+ end
89
+
74
90
  # Renders an object using a specified template within an application.
75
91
  # render(@post, 'posts/show', :view_path => "/path/to/app/views")
76
92
  def render(object, source, options = {})
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.16.1
4
+ version: 0.18.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: 2022-10-10 00:00:00.000000000 Z
11
+ date: 2026-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,118 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.3.14
27
- - !ruby/object:Gem::Dependency
28
- name: riot
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 0.12.3
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 0.12.3
41
- - !ruby/object:Gem::Dependency
42
- name: rr
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: tilt
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: oj
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: msgpack
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: 1.0.0
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: 1.0.0
111
- - !ruby/object:Gem::Dependency
112
- name: bson
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 1.7.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 1.7.0
125
- - !ruby/object:Gem::Dependency
126
- name: plist
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
27
  description: General ruby templating with json, bson, xml and msgpack support
140
28
  email:
141
29
  - nesquena@gmail.com
@@ -163,6 +51,7 @@ files:
163
51
  - lib/rabl/renderer.rb
164
52
  - lib/rabl/sources.rb
165
53
  - lib/rabl/template.rb
54
+ - lib/rabl/template_cache_key.rb
166
55
  - lib/rabl/tracker.rb
167
56
  - lib/rabl/version.rb
168
57
  homepage: https://github.com/nesquena/rabl
@@ -177,14 +66,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
66
  requirements:
178
67
  - - ">="
179
68
  - !ruby/object:Gem::Version
180
- version: '0'
69
+ version: '2.7'
181
70
  required_rubygems_version: !ruby/object:Gem::Requirement
182
71
  requirements:
183
72
  - - ">="
184
73
  - !ruby/object:Gem::Version
185
74
  version: '0'
186
75
  requirements: []
187
- rubygems_version: 3.0.6
76
+ rubygems_version: 3.5.22
188
77
  signing_key:
189
78
  specification_version: 4
190
79
  summary: General ruby templating with json, bson, xml and msgpack support