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 +4 -4
- data/.github/workflows/main.yml +5 -39
- data/.gitignore +2 -0
- data/CHANGELOG.md +35 -0
- data/README.md +102 -88
- data/gemfiles/{rails_60.gemfile → rails_7.1.gemfile} +1 -1
- data/gemfiles/{rails_61.gemfile → rails_7.2.gemfile} +1 -1
- data/gemfiles/{rails_51.gemfile → rails_8.0.gemfile} +2 -1
- data/gemfiles/{rails_52.gemfile → rails_8.1.gemfile} +2 -1
- data/lib/simple_json/simple_json_renderable.rb +10 -4
- data/lib/simple_json/simple_json_renderer.rb +28 -9
- data/lib/simple_json/simple_json_template.rb +27 -2
- data/lib/simple_json/version.rb +1 -1
- data/lib/simple_json.rb +2 -3
- data/simple_json.gemspec +5 -4
- metadata +31 -22
- data/gemfiles/rails_42.gemfile +0 -9
- data/gemfiles/rails_50.gemfile +0 -8
- data/lib/simple_json/json.rb +0 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9a291f4db8583e29927c04cd48fc264d352cef336473a1557f47c312fe12d79f
|
|
4
|
+
data.tar.gz: ada55b0635efe7edb401ba408fec5a2bb61b6e0c6bbd63e3e519ef6cef183e62
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a00c58cb111dd69b6df8fb318f4b4f17419decffb5df83d8317d213710aeb705c049e234e33d6bf135b0a5a11bb6f354a13c2873670cb1aec87c687a4914c913
|
|
7
|
+
data.tar.gz: 87c14d778121b155790859c492789a2ff6253fb34f96b82c575adcc44e0afd0ac38f2b7b6389ad72ffb56bdcdb4641240aacd5a47dde67429afedd347cd7910f
|
data/.github/workflows/main.yml
CHANGED
|
@@ -6,52 +6,18 @@ jobs:
|
|
|
6
6
|
build:
|
|
7
7
|
strategy:
|
|
8
8
|
matrix:
|
|
9
|
-
|
|
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.
|
|
15
|
+
BUNDLE_GEMFILE: gemfiles/rails_${{ matrix.rails }}.gemfile
|
|
47
16
|
|
|
48
17
|
steps:
|
|
49
|
-
- uses: actions/checkout@
|
|
18
|
+
- uses: actions/checkout@v4
|
|
50
19
|
- uses: ruby/setup-ruby@v1
|
|
51
20
|
with:
|
|
52
|
-
ruby-version: ${{ matrix.
|
|
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
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
|
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
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
|
|
180
|
-
jbuilder
|
|
181
|
-
|
|
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
|
|
184
|
-
jbuilder
|
|
185
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
|
215
|
-
jbuilder
|
|
216
|
-
|
|
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
|
|
219
|
-
jbuilder
|
|
220
|
-
|
|
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.254 (± 1.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
|
-
|
|
224
|
-
jb:
|
|
225
|
-
|
|
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
|
|
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
|
|
231
|
-
jbuilder
|
|
232
|
-
|
|
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
|
|
235
|
-
jbuilder
|
|
236
|
-
|
|
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
|
-
|
|
240
|
-
jb:
|
|
241
|
-
|
|
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
|
|
|
@@ -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 ||=
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
48
|
-
|
|
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
|
-
@
|
|
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] ||
|
|
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
|
-
|
|
93
|
+
send(method_name, **params)
|
|
75
94
|
else
|
|
76
|
-
|
|
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
|
|
11
|
-
|
|
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
|
data/lib/simple_json/version.rb
CHANGED
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
|
-
|
|
14
|
+
template_cache_enabled: false,
|
|
16
15
|
template_paths: ['app/views'],
|
|
17
16
|
cache_key_prefix: 'simple_json/views',
|
|
18
|
-
default_json_module:
|
|
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.
|
|
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 '
|
|
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.
|
|
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:
|
|
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:
|
|
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: '
|
|
20
|
-
type: :
|
|
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: '
|
|
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:
|
|
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: '
|
|
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: '
|
|
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/
|
|
143
|
-
- gemfiles/
|
|
144
|
-
- gemfiles/
|
|
145
|
-
- gemfiles/
|
|
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.
|
|
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:
|
|
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: []
|
data/gemfiles/rails_42.gemfile
DELETED
data/gemfiles/rails_50.gemfile
DELETED
data/lib/simple_json/json.rb
DELETED
|
@@ -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
|