simple_json 0.0.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a953753f69b04c130d99f00368fbc35f914b6017ae0dda0a61c9f10444b4b2b
4
- data.tar.gz: 239878f64920bd695cac483c9b26106442eab3fa0f46e5c7d90e8caa4295de96
3
+ metadata.gz: 9a291f4db8583e29927c04cd48fc264d352cef336473a1557f47c312fe12d79f
4
+ data.tar.gz: ada55b0635efe7edb401ba408fec5a2bb61b6e0c6bbd63e3e519ef6cef183e62
5
5
  SHA512:
6
- metadata.gz: 78466fb47ace2acc5c4470b2bc38b0b81d0c0aa0dd0018429259fcbe5be8604d98178f00e58a93b6366a774d0322edf0d349ab8801c3ee0863413da4fc3b6658
7
- data.tar.gz: f3235154d6594c49fc48ba65180f6ef80048b3d49d57a7f55cff933e95eb5409172dc8e002b0f48ef93db5afb57c2362a2ea1d0d99bf4f3738e3fff2f4718cfc
6
+ metadata.gz: a00c58cb111dd69b6df8fb318f4b4f17419decffb5df83d8317d213710aeb705c049e234e33d6bf135b0a5a11bb6f354a13c2873670cb1aec87c687a4914c913
7
+ data.tar.gz: 87c14d778121b155790859c492789a2ff6253fb34f96b82c575adcc44e0afd0ac38f2b7b6389ad72ffb56bdcdb4641240aacd5a47dde67429afedd347cd7910f
@@ -6,52 +6,18 @@ jobs:
6
6
  build:
7
7
  strategy:
8
8
  matrix:
9
- ruby_version: ['3.0', '2.7', '2.6']
10
-
11
- gemfile:
12
- - gemfiles/rails_61.gemfile
13
- - gemfiles/rails_60.gemfile
14
-
15
- include:
16
- - ruby_version: ruby-head
17
- gemfile: gemfiles/rails_edge.gemfile
18
- allow_failures: 'true'
19
- - ruby_version: '3.0'
20
- gemfile: gemfiles/rails_edge.gemfile
21
- allow_failures: 'true'
22
-
23
- - ruby_version: '2.7'
24
- gemfile: gemfiles/rails_edge.gemfile
25
- allow_failures: 'true'
26
-
27
- - ruby_version: '2.6'
28
- gemfile: gemfiles/rails_52.gemfile
29
- - ruby_version: '2.6'
30
- gemfile: gemfiles/rails_51.gemfile
31
- - ruby_version: '2.6'
32
- gemfile: gemfiles/rails_50.gemfile
33
- - ruby_version: '2.6'
34
- gemfile: gemfiles/rails_42.gemfile
35
- bundler_version: '1'
36
-
37
- - ruby_version: '2.5'
38
- gemfile: gemfiles/rails_52.gemfile
39
- - ruby_version: '2.5'
40
- gemfile: gemfiles/rails_42.gemfile
41
- bundler_version: '1'
9
+ ruby: ['3.2', '3.3', '3.4', "4.0"]
10
+ rails: ["7.1", "7.2", "8.0", "8.1"]
42
11
 
43
12
  runs-on: ubuntu-latest
44
13
 
45
14
  env:
46
- BUNDLE_GEMFILE: ${{ matrix.gemfile }}
15
+ BUNDLE_GEMFILE: gemfiles/rails_${{ matrix.rails }}.gemfile
47
16
 
48
17
  steps:
49
- - uses: actions/checkout@v2
18
+ - uses: actions/checkout@v4
50
19
  - uses: ruby/setup-ruby@v1
51
20
  with:
52
- ruby-version: ${{ matrix.ruby_version }}
53
- bundler: ${{ matrix.bundler_version }}
21
+ ruby-version: ${{ matrix.ruby }}
54
22
  bundler-cache: true
55
- continue-on-error: ${{ matrix.allow_failures == 'true' }}
56
23
  - run: bundle exec rake
57
- continue-on-error: ${{ matrix.allow_failures == 'true' }}
data/.gitignore CHANGED
@@ -9,3 +9,5 @@ gemfiles/*.lock
9
9
  /spec/reports/
10
10
  /tmp/
11
11
  /test/dummy_app/log/*
12
+ /test/dummy_app/tmp/*
13
+ /vendor/bundle
data/CHANGELOG.md ADDED
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
5
+
6
+ ## [Unreleased]
7
+
8
+ ## [1.0.0] - 2026-01-28
9
+ ### Breaking
10
+ - Templates are no longer executed by invoking lambdas directly; they are compiled into methods.
11
+
12
+ ### Changed
13
+ - Cache template methods by code hash to reduce Ruby method cache invalidation.
14
+ - Use a renderer subclass that includes helpers instead of extending instances.
15
+
16
+ ### Fixed
17
+ - Rename the config key `cache_enabled` to `template_cache_enabled`.
18
+ - Add `/vendor/bundle` to `.gitignore`.
19
+
20
+ ## [0.1.0] - 2025-09-10
21
+ ### Changed
22
+ - Default JSON serializer switched from Oj to ActiveSupport::JSON to better align with Rails defaults.
23
+ - Development dependencies refreshed and benchmark script fixed for the latest Ruby/Rails stacks.
24
+ - README formatting and examples improved for clarity.
25
+
26
+ ### Fixed
27
+ - Resolved `MissingTemplate` errors introduced by the Rails 8 upgrade.
28
+ - Added coverage for rendering when template/action names differ to avoid regressions.
29
+
30
+ ## [0.0.0] - 2021-11-02
31
+ ### Added
32
+ - Initial SimpleJson renderer, templates (`.simple_json.rb` lambdas), and `SimpleJson::SimpleJsonRenderable` integration.
33
+ - Template caching toggle and configurable template paths.
34
+ - Rails generator hooks and dummy app scaffolding for getting started.
35
+ - Migration helpers for comparing SimpleJson output against existing Jbuilder views.
data/README.md CHANGED
@@ -1,13 +1,17 @@
1
1
  # SimpleJson
2
+
2
3
  A simple & fast solution for Rails JSON rendering.
3
4
 
4
5
  ## Get started
6
+
5
7
  In Gemfile
8
+
6
9
  ```ruby
7
10
  gem 'simple_json'
8
11
  ```
9
12
 
10
13
  In controller
14
+
11
15
  ```ruby
12
16
  class ApplicationController < ActionController::Base
13
17
  include SimpleJson::SimpleJsonRenderable
@@ -44,10 +48,13 @@ That's all!
44
48
  Have fun!
45
49
 
46
50
  ## Special thanks
51
+
47
52
  This project is built on work of [jb](https://github.com/amatsuda/jb).
48
53
 
49
54
  ## Template Syntax
50
- SimpleJson templates are simply lambda objects that return data(Hashes or Arrays) for json.
55
+
56
+ SimpleJson templates should be written in Ruby lambda format. The template code is converted into a method and then invoked to produce data (Hashes or Arrays) for JSON.
57
+
51
58
  ```ruby
52
59
  -> {
53
60
  {
@@ -55,7 +62,9 @@ SimpleJson templates are simply lambda objects that return data(Hashes or Arrays
55
62
  }
56
63
  }
57
64
  ```
65
+
58
66
  When no parameters specified, `-> {` and `}` can be omitted.
67
+
59
68
  ```ruby
60
69
  {
61
70
  key: @value,
@@ -82,14 +91,16 @@ Use `partial!` method to call another template in template. Note that path is al
82
91
  }
83
92
  ```
84
93
 
85
- Cache helpers of jbuilder is similar.
94
+ Cache helpers of simple_json is similar to jbuilder.
95
+
86
96
  ```ruby
87
97
  cache! key, options do
88
98
  data_to_cache
89
99
  end
90
100
  ```
91
101
 
92
- Cache helpers uses `Rails.cache` to cache, so Multiple key, expiration is available. Make sure `perform_caching` is enabled.
102
+ Cache helpers uses `Rails.cache` to cache, so array keys, expirations are available. Make sure `perform_caching` is enabled.
103
+
93
104
  ```ruby
94
105
  cache! [key1, key2], expires_in: 10.minutes do
95
106
  data_to_cache
@@ -97,6 +108,7 @@ end
97
108
  ```
98
109
 
99
110
  `cache_if!` is also available
111
+
100
112
  ```ruby
101
113
  cache_if! boolean, key1, options do
102
114
  data_to_cache
@@ -104,151 +116,153 @@ end
104
116
  ```
105
117
 
106
118
  You can set key_prefix for caching like this
119
+
107
120
  ```ruby
108
121
  SimpleJson.cache_key_prefix = "MY_PREFIX"
109
122
  ```
110
123
 
111
- ## configurations
124
+ ## Configurations
125
+
112
126
  Load all templates on boot. (For production)
113
127
  Templates loaded will not load again, so it is not recommended in development environment.
128
+
114
129
  ```ruby
115
130
  # config/environments/production.rb
116
131
  SimpleJson.enable_template_cache
117
132
  ```
118
133
 
119
134
  The default path for templates is `app/views`, you can change it by
135
+
120
136
  ```ruby
121
137
  SimpleJson.template_paths.append("app/simple_jsons")
122
138
  # or
123
139
  SimpleJson.template_paths=["app/views", "app/simple_jsons"]
124
140
  ```
141
+
125
142
  Note that these paths should not be eager loaded cause using .rb as suffix.
126
143
 
127
- SimpleJson uses Oj as json serializer by default. Modules with `#encode` and `#decode` method can be used here.
144
+ SimpleJson uses ActiveSupport::JSON as the default JSON serializer. If you want to change to a module that has `#encode` and `#decode` methods, such as the Oj gem, you can do so as follows.
145
+
128
146
  ```ruby
129
- SimpleJson.json_module = ActiveSupport::JSON
147
+
148
+ # define Custom Json class
149
+ # ex. config/initializers/simple_json/json.rb
150
+ module SimpleJson
151
+ module Json
152
+ class Oj
153
+ def self.encode(json)
154
+ ::Oj.dump(json, mode: :rails)
155
+ end
156
+
157
+ def self.decode(json_string)
158
+ ::Oj.load(json_string, mode: :rails)
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ SimpleJson.json_module = SimpleJson::Json::Oj
130
165
  ```
131
166
 
132
167
  ## The Generator
168
+
133
169
  SimpleJson extends the default Rails scaffold generator and adds some simple_json templates. If you don't need them, please configure like so.
170
+
134
171
  ```rb
135
172
  Rails.application.config.generators.simple_json false
136
173
  ```
137
174
 
138
175
  ## Benchmarks
176
+
139
177
  Here're the results of a benchmark (which you can find [here](https://github.com/aktsk/simple_json/blob/master/test/dummy_app/app/controllers/benchmarks_controller.rb) in this repo) rendering a collection to JSON.
140
178
 
141
- ### RAILS_ENV=development
142
179
  ```
143
180
  % ./bin/benchmark.sh
144
181
 
145
- * Rendering 10 partials via render_partial
146
- Warming up --------------------------------------
147
- jb 257.000 i/100ms
148
- jbuilder 108.000 i/100ms
149
- simple_json 2.039k i/100ms
150
- Calculating -------------------------------------
151
- jb 2.611k (± 7.1%) i/s - 13.107k in 5.046110s
152
- jbuilder 1.084k (± 3.5%) i/s - 5.508k in 5.088845s
153
- simple_json 20.725k (± 4.4%) i/s - 103.989k in 5.026914s
154
-
155
- Comparison:
156
- simple_json: 20725.5 i/s
157
- jb: 2610.5 i/s - 7.94x (± 0.00) slower
158
- jbuilder: 1083.8 i/s - 19.12x (± 0.00) slower
159
-
160
-
161
- * Rendering 100 partials via render_partial
162
- Warming up --------------------------------------
163
- jb 88.000 i/100ms
164
- jbuilder 14.000 i/100ms
165
- simple_json 290.000 i/100ms
166
- Calculating -------------------------------------
167
- jb 928.202 (± 5.0%) i/s - 4.664k in 5.037314s
168
- jbuilder 137.980 (± 6.5%) i/s - 700.000 in 5.094658s
169
- simple_json 2.931k (± 5.2%) i/s - 14.790k in 5.060707s
170
-
171
- Comparison:
172
- simple_json: 2931.1 i/s
173
- jb: 928.2 i/s - 3.16x (± 0.00) slower
174
- jbuilder: 138.0 i/s - 21.24x (± 0.00) slower
175
-
182
+ SimpleJson Benchmark
183
+ ruby: 4.0.1
184
+ rails: 8.1.1
185
+ json: 2.15.2
186
+ oj: 3.16.11
187
+ ----------------------
176
188
 
177
- * Rendering 1000 partials via render_partial
189
+ * Rendering 10 partials via render_to_string
190
+ ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin24]
178
191
  Warming up --------------------------------------
179
- jb 11.000 i/100ms
180
- jbuilder 1.000 i/100ms
181
- simple_json 29.000 i/100ms
192
+ jb 23.000 i/100ms
193
+ jbuilder 30.000 i/100ms
194
+ simple_json(oj) 40.000 i/100ms
195
+ simple_json(AS::json)
196
+ 46.000 i/100ms
182
197
  Calculating -------------------------------------
183
- jb 106.150 5.7%) i/s - 539.000 in 5.094255s
184
- jbuilder 13.012 7.7%) i/s - 65.000 in 5.054016s
185
- simple_json 271.683 5.2%) i/s - 1.363k in 5.030646s
198
+ jb 298.518 23.4%) i/s (3.35 ms/i) - 1.426k in 5.019370s
199
+ jbuilder 255.925 4.3%) i/s (3.91 ms/i) - 1.290k in 5.052973s
200
+ simple_json(oj) 270.192 3.7%) i/s (3.70 ms/i) - 1.360k in 5.039635s
201
+ simple_json(AS::json)
202
+ 297.476 (±10.1%) i/s (3.36 ms/i) - 1.518k in 5.145803s
186
203
 
187
204
  Comparison:
188
- simple_json: 271.7 i/s
189
- jb: 106.1 i/s - 2.56x (± 0.00) slower
190
- jbuilder: 13.0 i/s - 20.88x (± 0.00) slower
191
- ```
192
- ### RAILS_ENV=production
193
- ```
194
- % RAILS_ENV=production ./bin/benchmark.sh
205
+ jb: 298.5 i/s
206
+ simple_json(AS::json): 297.5 i/s - same-ish: difference falls within error
207
+ simple_json(oj): 270.2 i/s - same-ish: difference falls within error
208
+ jbuilder: 255.9 i/s - same-ish: difference falls within error
195
209
 
196
- * Rendering 10 partials via render_partial
197
- Warming up --------------------------------------
198
- jb 246.000 i/100ms
199
- jbuilder 97.000 i/100ms
200
- simple_json 1.957k i/100ms
201
- Calculating -------------------------------------
202
- jb 2.611k (± 4.1%) i/s - 13.038k in 5.002304s
203
- jbuilder 972.031 (± 4.7%) i/s - 4.850k in 5.001200s
204
- simple_json 20.383k (± 3.8%) i/s - 101.764k in 4.999989s
205
210
 
206
- Comparison:
207
- simple_json: 20382.8 i/s
208
- jb: 2611.3 i/s - 7.81x (± 0.00) slower
209
- jbuilder: 972.0 i/s - 20.97x (± 0.00) slower
210
-
211
-
212
- * Rendering 100 partials via render_partial
211
+ * Rendering 100 partials via render_to_string
212
+ ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin24]
213
213
  Warming up --------------------------------------
214
- jb 90.000 i/100ms
215
- jbuilder 11.000 i/100ms
216
- simple_json 280.000 i/100ms
214
+ jb 19.000 i/100ms
215
+ jbuilder 14.000 i/100ms
216
+ simple_json(oj) 15.000 i/100ms
217
+ simple_json(AS::json)
218
+ 26.000 i/100ms
217
219
  Calculating -------------------------------------
218
- jb 883.446 4.8%) i/s - 4.410k in 5.003438s
219
- jbuilder 119.932 8.3%) i/s - 605.000 in 5.085382s
220
- simple_json 2.886k4.2%) i/s - 14.560k in 5.054327s
220
+ jb 186.051 12.9%) i/s (5.37 ms/i) - 912.000 in 5.075117s
221
+ jbuilder 144.279 2.1%) i/s (6.93 ms/i) - 728.000 in 5.048538s
222
+ simple_json(oj) 159.2541.9%) i/s (6.28 ms/i) - 810.000 in 5.088178s
223
+ simple_json(AS::json)
224
+ 249.690 (± 6.0%) i/s (4.00 ms/i) - 1.248k in 5.017042s
221
225
 
222
226
  Comparison:
223
- simple_json: 2885.7 i/s
224
- jb: 883.4 i/s - 3.27x (± 0.00) slower
225
- jbuilder: 119.9 i/s - 24.06x (± 0.00) slower
227
+ simple_json(AS::json): 249.7 i/s
228
+ jb: 186.1 i/s - 1.34x slower
229
+ simple_json(oj): 159.3 i/s - 1.57x slower
230
+ jbuilder: 144.3 i/s - 1.73x slower
226
231
 
227
232
 
228
- * Rendering 1000 partials via render_partial
233
+ * Rendering 1000 partials via render_to_string
234
+ ruby 4.0.1 (2026-01-13 revision e04267a14b) +PRISM [arm64-darwin24]
229
235
  Warming up --------------------------------------
230
- jb 12.000 i/100ms
231
- jbuilder 1.000 i/100ms
232
- simple_json 32.000 i/100ms
236
+ jb 4.000 i/100ms
237
+ jbuilder 2.000 i/100ms
238
+ simple_json(oj) 2.000 i/100ms
239
+ simple_json(AS::json)
240
+ 10.000 i/100ms
233
241
  Calculating -------------------------------------
234
- jb 124.627 4.8%) i/s - 624.000 in 5.018515s
235
- jbuilder 12.710 7.9%) i/s - 64.000 in 5.073018s
236
- simple_json 314.896 3.2%) i/s - 1.600k in 5.086509s
242
+ jb 48.691 2.1%) i/s (20.54 ms/i) - 244.000 in 5.013815s
243
+ jbuilder 27.930 3.6%) i/s (35.80 ms/i) - 140.000 in 5.016897s
244
+ simple_json(oj) 29.083 6.9%) i/s (34.38 ms/i) - 146.000 in 5.039076s
245
+ simple_json(AS::json)
246
+ 99.792 (± 7.0%) i/s (10.02 ms/i) - 500.000 in 5.037716s
237
247
 
238
248
  Comparison:
239
- simple_json: 314.9 i/s
240
- jb: 124.6 i/s - 2.53x (± 0.00) slower
241
- jbuilder: 12.7 i/s - 24.78x (± 0.00) slower
249
+ simple_json(AS::json): 99.8 i/s
250
+ jb: 48.7 i/s - 2.05x slower
251
+ simple_json(oj): 29.1 i/s - 3.43x slower
252
+ jbuilder: 27.9 i/s - 3.57x slower
242
253
  ```
243
254
 
244
255
  ## Migrating from Jbuilder
256
+
245
257
  When migrating from Jbuilder, you can include `Migratable` in controller for migrating mode.
258
+
246
259
  ```
247
260
  include SimpleJson::SimpleJsonRenderable
248
261
  include SimpleJson::Migratable
249
262
  ```
250
263
 
251
264
  In migrating mode
265
+
252
266
  - Comparision will be performed for simple_json and ActionView render(Jbuilder) result.
253
267
  - simple_json partials not found will use Jbuilder partial as an alternative.
254
268
 
@@ -256,7 +270,7 @@ Note that render will be performed twice, so using it in production mode is not
256
270
 
257
271
  ## Contributing
258
272
 
259
- Pull requests are welcome on GitHub at https://github.com/aktsk/simple_json.
273
+ Pull requests are welcome on GitHub at <https://github.com/aktsk/simple_json>.
260
274
 
261
275
  ## License
262
276
 
@@ -5,5 +5,5 @@ source 'https://rubygems.org'
5
5
  gemspec path: '../'
6
6
 
7
7
  gem 'jbuilder'
8
- gem 'rails', '~> 6.0.0'
8
+ gem 'rails', '~> 7.1.0'
9
9
  gem 'selenium-webdriver'
@@ -5,5 +5,5 @@ source 'https://rubygems.org'
5
5
  gemspec path: '../'
6
6
 
7
7
  gem 'jbuilder'
8
- gem 'rails', '~> 6.1.0'
8
+ gem 'rails', '~> 7.2.0'
9
9
  gem 'selenium-webdriver'
@@ -5,4 +5,5 @@ source 'https://rubygems.org'
5
5
  gemspec path: '../'
6
6
 
7
7
  gem 'jbuilder'
8
- gem 'rails', '~> 5.1.0'
8
+ gem 'rails', '~> 8.0.0'
9
+ gem 'selenium-webdriver'
@@ -5,4 +5,5 @@ source 'https://rubygems.org'
5
5
  gemspec path: '../'
6
6
 
7
7
  gem 'jbuilder'
8
- gem 'rails', '~> 5.2.0'
8
+ gem 'rails', '~> 8.1.0'
9
+ gem 'selenium-webdriver'
@@ -29,7 +29,7 @@ module SimpleJson
29
29
  # use super when any of [:body, :plain, :html] exist in options
30
30
  return super if self.class::RENDER_FORMATS_IN_PRIORITY.any? { |key| options.key? key }
31
31
 
32
- template_name = template_name(options[:template] || action_name)
32
+ template_name = template_name(options[:template] || options[:action] || action_name)
33
33
  if options.key?(:json)
34
34
  process_options(options)
35
35
  @rendered_format = 'application/json; charset=utf-8'
@@ -54,9 +54,7 @@ module SimpleJson
54
54
  end
55
55
 
56
56
  def simple_renderer
57
- @simple_renderer ||= SimpleJsonRenderer.new(self).tap do |r|
58
- r.extend(_helpers) if respond_to?(:_helpers)
59
- end
57
+ @simple_renderer ||= self.class.simple_json_renderer_class.new(self)
60
58
  end
61
59
 
62
60
  def render_json_template(template_name, **_options)
@@ -68,6 +66,14 @@ module SimpleJson
68
66
  if SimpleJson.template_cache_enabled? && !SimpleJsonRenderer.templates_loaded?
69
67
  SimpleJsonRenderer.load_all_templates!
70
68
  end
69
+
70
+ def self.simple_json_renderer_class
71
+ @simple_json_renderer_class ||= begin
72
+ klass = Class.new(SimpleJsonRenderer)
73
+ klass.include(_helpers) if method_defined?(:_helpers)
74
+ klass
75
+ end
76
+ end
71
77
  end
72
78
 
73
79
  def template_path
@@ -20,7 +20,7 @@ module SimpleJson
20
20
  template_files = Rails.root.glob("#{path}/**/*.simple_json.rb")
21
21
  template_files.each do |file_path|
22
22
  template_path = file_path.relative_path_from(Rails.root.join(path)).to_path.delete_suffix('.simple_json.rb')
23
- @renderers[template_path] = SimpleJsonTemplate.new(file_path.to_path).renderer
23
+ define_template_method(template_path, file_path.to_path)
24
24
  end
25
25
  end
26
26
  @templates_loaded = true
@@ -29,7 +29,7 @@ module SimpleJson
29
29
  def load_template(template_path)
30
30
  if SimpleJson.template_cache_enabled?
31
31
  load_all_templates! unless templates_loaded?
32
- renderers[template_path]
32
+ render_methods[template_path]
33
33
  else
34
34
  load_template_from_file(template_path)
35
35
  end
@@ -38,18 +38,36 @@ module SimpleJson
38
38
  def load_template_from_file(template_path)
39
39
  SimpleJson.template_paths.each do |path|
40
40
  file_path = Rails.root.join("#{path}/#{template_path}.simple_json.rb").to_path
41
- return SimpleJsonTemplate.new(file_path).renderer if File.exist?(file_path)
41
+
42
+ return define_template_method(template_path, file_path) if File.exist?(file_path)
42
43
  end
43
44
 
44
45
  nil
45
46
  end
46
47
 
47
- def renderers
48
- @renderers ||= {}
48
+ def define_template_method(template_path, file_path)
49
+ template = SimpleJsonTemplate.new(file_path)
50
+ code_hash = template.code.hash
51
+
52
+ render_methods[template_path] = render_methods_cache.fetch(code_hash) do
53
+ @template_num ||= 0
54
+ @template_num += 1
55
+ method_name = :"template_#{@template_num}"
56
+ template.define_to_class(self, method_name)
57
+ render_methods_cache[code_hash] = method_name
58
+ end
59
+ end
60
+
61
+ def render_methods
62
+ @render_methods ||= {}
63
+ end
64
+
65
+ def render_methods_cache
66
+ @render_methods_cache ||= {}
49
67
  end
50
68
 
51
69
  def clear_renderers
52
- @renderers = {}
70
+ @render_methods = {}
53
71
  @templates_loaded = false
54
72
  end
55
73
  end
@@ -60,7 +78,7 @@ module SimpleJson
60
78
  end
61
79
 
62
80
  def renderer(template_path)
63
- renderers[template_path] || self.class.load_template(template_path).tap do |renderer|
81
+ renderers[template_path] || SimpleJson::SimpleJsonRenderer.load_template(template_path).tap do |renderer|
64
82
  renderers[template_path] = renderer
65
83
  end
66
84
  end
@@ -70,10 +88,11 @@ module SimpleJson
70
88
  end
71
89
 
72
90
  def render(template_name, **params)
91
+ method_name = renderer(template_name)
73
92
  if !params.empty?
74
- instance_exec(**params, &renderer(template_name))
93
+ send(method_name, **params)
75
94
  else
76
- instance_exec(&renderer(template_name))
95
+ send(method_name)
77
96
  end
78
97
  end
79
98
 
@@ -7,8 +7,11 @@ module SimpleJson
7
7
  @source = File.read(path)
8
8
  end
9
9
 
10
- def renderer
11
- @renderer ||= eval(code, TOPLEVEL_BINDING, @path) # rubocop:disable Security/Eval
10
+ def define_to_class(klass, method_name)
11
+ method_string = to_method_string(method_name)
12
+ klass.class_eval(method_string, @path)
13
+
14
+ method_name
12
15
  end
13
16
 
14
17
  def code
@@ -22,5 +25,27 @@ module SimpleJson
22
25
 
23
26
  "-> { #{source} }"
24
27
  end
28
+
29
+ def method_string_from_lambda(source, method_name)
30
+ pattern = %r{
31
+ \A(?<prefix>(?:\s*\#.*\n|\s+)*)
32
+ ->\s*
33
+ (?:\((?<params_p>.*?)\)|(?<params_n>[^\{ ]*?))
34
+ \s*(?:\{(?<body>.*)\}|do(?<body>.*)end)
35
+ (?<suffix>(?:\s*\#.*|\s+)*)\z
36
+ }mx
37
+
38
+ match = source.match(pattern)
39
+ raise :parse_error unless match
40
+
41
+ params = (match[:params_p] || match[:params_n] || "").strip
42
+ arg_part = params.empty? ? "" : "(#{params})"
43
+
44
+ "#{match[:prefix]}def #{method_name}#{arg_part};#{match[:body]};end#{match[:suffix]}"
45
+ end
46
+
47
+ def to_method_string(method_name)
48
+ method_string_from_lambda(code, method_name)
49
+ end
25
50
  end
26
51
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleJson
4
- VERSION = '0.0.0'
4
+ VERSION = '1.0.0'
5
5
  end
data/lib/simple_json.rb CHANGED
@@ -8,14 +8,13 @@ require 'simple_json/simple_json_template'
8
8
 
9
9
  require 'simple_json/migratable'
10
10
  require 'simple_json/simple_json_renderer_for_migration'
11
- require 'simple_json/json'
12
11
 
13
12
  module SimpleJson
14
13
  @config = {
15
- cache_enabled: false,
14
+ template_cache_enabled: false,
16
15
  template_paths: ['app/views'],
17
16
  cache_key_prefix: 'simple_json/views',
18
- default_json_module: Json::Oj
17
+ default_json_module: ActiveSupport::JSON
19
18
  }
20
19
 
21
20
  class << self
data/simple_json.gemspec CHANGED
@@ -20,15 +20,16 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_dependency 'oj', '~> 3.13'
23
+ spec.add_development_dependency 'oj'
24
24
 
25
25
  spec.add_development_dependency 'action_args'
26
26
  spec.add_development_dependency 'bundler'
27
- spec.add_development_dependency 'byebug'
28
- spec.add_development_dependency 'rails'
27
+ spec.add_development_dependency 'debug'
28
+ spec.add_development_dependency 'rails', '>= 7.1'
29
29
  spec.add_development_dependency 'rake'
30
30
  spec.add_development_dependency 'selenium-webdriver'
31
31
  spec.add_development_dependency 'test-unit-rails'
32
+ spec.add_development_dependency 'mutex_m'
32
33
 
33
- spec.required_ruby_version = '>= 2.5.0'
34
+ spec.required_ruby_version = '>= 3.2.0'
34
35
  end
metadata CHANGED
@@ -1,29 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jingyuan Zhao
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2021-11-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: oj
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '3.13'
20
- type: :runtime
18
+ version: '0'
19
+ type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '3.13'
25
+ version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: action_args
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +52,7 @@ dependencies:
53
52
  - !ruby/object:Gem::Version
54
53
  version: '0'
55
54
  - !ruby/object:Gem::Dependency
56
- name: byebug
55
+ name: debug
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ">="
@@ -72,14 +71,14 @@ dependencies:
72
71
  requirements:
73
72
  - - ">="
74
73
  - !ruby/object:Gem::Version
75
- version: '0'
74
+ version: '7.1'
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
- version: '0'
81
+ version: '7.1'
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: rake
85
84
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +121,20 @@ dependencies:
122
121
  - - ">="
123
122
  - !ruby/object:Gem::Version
124
123
  version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: mutex_m
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
125
138
  description: Faster and simpler JSON renderer for Rails
126
139
  email:
127
140
  - jingyuan.zhao@aktsk.jp
@@ -131,6 +144,7 @@ extra_rdoc_files: []
131
144
  files:
132
145
  - ".github/workflows/main.yml"
133
146
  - ".gitignore"
147
+ - CHANGELOG.md
134
148
  - Gemfile
135
149
  - LICENSE.txt
136
150
  - README.md
@@ -139,19 +153,16 @@ files:
139
153
  - bin/console
140
154
  - bin/setup
141
155
  - gemfiles/benchmark.gemfile
142
- - gemfiles/rails_42.gemfile
143
- - gemfiles/rails_50.gemfile
144
- - gemfiles/rails_51.gemfile
145
- - gemfiles/rails_52.gemfile
146
- - gemfiles/rails_60.gemfile
147
- - gemfiles/rails_61.gemfile
156
+ - gemfiles/rails_7.1.gemfile
157
+ - gemfiles/rails_7.2.gemfile
158
+ - gemfiles/rails_8.0.gemfile
159
+ - gemfiles/rails_8.1.gemfile
148
160
  - gemfiles/rails_edge.gemfile
149
161
  - lib/generators/rails/scaffold_controller_generator.rb
150
162
  - lib/generators/rails/simple_json_generator.rb
151
163
  - lib/generators/rails/templates/index.simple_json.rb
152
164
  - lib/generators/rails/templates/show.simple_json.rb
153
165
  - lib/simple_json.rb
154
- - lib/simple_json/json.rb
155
166
  - lib/simple_json/migratable.rb
156
167
  - lib/simple_json/railtie.rb
157
168
  - lib/simple_json/simple_json_renderable.rb
@@ -164,7 +175,6 @@ homepage: https://github.com/aktsk/simple_json
164
175
  licenses:
165
176
  - MIT
166
177
  metadata: {}
167
- post_install_message:
168
178
  rdoc_options: []
169
179
  require_paths:
170
180
  - lib
@@ -172,15 +182,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
182
  requirements:
173
183
  - - ">="
174
184
  - !ruby/object:Gem::Version
175
- version: 2.5.0
185
+ version: 3.2.0
176
186
  required_rubygems_version: !ruby/object:Gem::Requirement
177
187
  requirements:
178
188
  - - ">="
179
189
  - !ruby/object:Gem::Version
180
190
  version: '0'
181
191
  requirements: []
182
- rubygems_version: 3.0.3
183
- signing_key:
192
+ rubygems_version: 4.0.3
184
193
  specification_version: 4
185
194
  summary: Faster and simpler Jbuilder alternative
186
195
  test_files: []
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec path: '../'
6
-
7
- gem 'jbuilder'
8
- gem 'nokogiri', RUBY_VERSION < '2.1' ? '~> 1.6.0' : '>= 1.7'
9
- gem 'rails', '~> 4.2.0'
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec path: '../'
6
-
7
- gem 'jbuilder'
8
- gem 'rails', '~> 5.0.0'
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'oj'
4
-
5
- module SimpleJson
6
- module Json
7
- class Oj
8
- def self.encode(json)
9
- ::Oj.dump(json, mode: :rails)
10
- end
11
-
12
- def self.decode(json_string)
13
- ::Oj.load(json_string, mode: :rails)
14
- end
15
- end
16
- end
17
- end