jbuilder 2.8.0 → 2.9.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/.travis.yml +36 -32
- data/Appraisals +13 -3
- data/Gemfile +0 -1
- data/README.md +19 -16
- data/gemfiles/rails_4_2.gemfile +0 -1
- data/gemfiles/rails_5_0.gemfile +1 -2
- data/gemfiles/rails_5_1.gemfile +1 -2
- data/gemfiles/rails_5_2.gemfile +10 -0
- data/gemfiles/rails_head.gemfile +10 -0
- data/jbuilder.gemspec +1 -2
- data/lib/generators/rails/jbuilder_generator.rb +8 -2
- data/lib/generators/rails/scaffold_controller_generator.rb +6 -0
- data/lib/generators/rails/templates/api_controller.rb +1 -1
- data/lib/generators/rails/templates/controller.rb +1 -1
- data/lib/generators/rails/templates/index.json.jbuilder +1 -1
- data/lib/generators/rails/templates/partial.json.jbuilder +1 -1
- data/lib/jbuilder.rb +2 -2
- data/lib/jbuilder/jbuilder_template.rb +5 -4
- data/test/jbuilder_generator_test.rb +13 -5
- data/test/jbuilder_template_test.rb +193 -338
- data/test/jbuilder_test.rb +1 -1
- data/test/scaffold_api_controller_generator_test.rb +6 -2
- data/test/scaffold_controller_generator_test.rb +6 -2
- data/test/test_helper.rb +24 -7
- metadata +5 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 780a2d0395698145f0e1c9e96a7a2079b70def4be27846b74537ec90786b9495
|
4
|
+
data.tar.gz: da6e2704a1060b023c7a78d4539ad39da447dba6e3d7c657834a81badcd47afa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c088b1a55e41c650bccd49901ab964ac9b4b715bdab5d51d68a5b34b6a3bb18adcb37ade32548fa1f69ecd4d2cb29c8f34f747dd4af80daa4c8115e99bd80489
|
7
|
+
data.tar.gz: 23e2b31830276ba589c941a484ac6d9b80dc0e3a0f4c4767f8d534f1bdfae5d9e76d1e75a31127103a045afba127c6eb2a7e87f35327860729ef7f08aafdd766
|
data/.travis.yml
CHANGED
@@ -1,56 +1,60 @@
|
|
1
1
|
language: ruby
|
2
2
|
|
3
|
-
sudo: false
|
4
3
|
cache: bundler
|
5
4
|
|
6
5
|
before_install:
|
7
|
-
- gem update --system
|
8
|
-
- gem install bundler
|
6
|
+
- "gem update --system 2.7.9"
|
7
|
+
- "gem install bundler -v '<2'"
|
9
8
|
|
10
9
|
rvm:
|
11
|
-
- 1.9
|
12
|
-
- 2.0
|
13
|
-
- 2.1
|
14
10
|
- 2.2.10
|
15
|
-
- 2.3.
|
16
|
-
- 2.4.
|
17
|
-
- 2.5.
|
11
|
+
- 2.3.8
|
12
|
+
- 2.4.6
|
13
|
+
- 2.5.5
|
14
|
+
- 2.6.2
|
18
15
|
- ruby-head
|
19
|
-
-
|
20
|
-
- rbx
|
16
|
+
- rbx-3.107
|
21
17
|
|
22
18
|
gemfile:
|
23
19
|
- gemfiles/rails_4_2.gemfile
|
24
20
|
- gemfiles/rails_5_0.gemfile
|
25
21
|
- gemfiles/rails_5_1.gemfile
|
22
|
+
- gemfiles/rails_5_2.gemfile
|
23
|
+
- gemfiles/rails_head.gemfile
|
26
24
|
|
27
25
|
matrix:
|
28
|
-
|
29
|
-
- rvm: jruby-19mode
|
30
|
-
- rvm: rbx
|
31
|
-
- rvm: ruby-head
|
32
|
-
fast_finish: true
|
33
|
-
exclude:
|
34
|
-
- rvm: 1.9
|
35
|
-
gemfile: gemfiles/rails_5_0.gemfile
|
26
|
+
include:
|
36
27
|
- rvm: 1.9
|
37
|
-
gemfile: gemfiles/
|
28
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
38
29
|
- rvm: 2.0
|
39
|
-
gemfile: gemfiles/
|
40
|
-
- rvm: 2.0
|
41
|
-
gemfile: gemfiles/rails_5_1.gemfile
|
42
|
-
- rvm: 2.1
|
43
|
-
gemfile: gemfiles/rails_5_0.gemfile
|
30
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
44
31
|
- rvm: 2.1
|
45
|
-
gemfile: gemfiles/
|
32
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
33
|
+
- rvm: 2.3
|
34
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
46
35
|
- rvm: jruby-19mode
|
47
|
-
gemfile: gemfiles/
|
36
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
37
|
+
- rvm: rbx-3.107
|
38
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
39
|
+
exclude:
|
40
|
+
- rvm: 2.4.6
|
41
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
42
|
+
- rvm: 2.5.5
|
43
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
44
|
+
- rvm: 2.6.2
|
45
|
+
gemfile: gemfiles/rails_4_2.gemfile
|
46
|
+
- rvm: 2.2.10
|
47
|
+
gemfile: gemfiles/rails_head.gemfile
|
48
|
+
- rvm: 2.3.8
|
49
|
+
gemfile: gemfiles/rails_head.gemfile
|
50
|
+
- rvm: 2.4.6
|
51
|
+
gemfile: gemfiles/rails_head.gemfile
|
52
|
+
allow_failures:
|
48
53
|
- rvm: jruby-19mode
|
49
|
-
|
50
|
-
- rvm:
|
51
|
-
|
52
|
-
|
53
|
-
gemfile: gemfiles/rails_5_1.gemfile
|
54
|
+
- rvm: rbx-3.107
|
55
|
+
- rvm: ruby-head
|
56
|
+
- gemfile: gemfiles/rails_head.gemfile
|
57
|
+
fast_finish: true
|
54
58
|
|
55
59
|
notifications:
|
56
60
|
email: false
|
data/Appraisals
CHANGED
@@ -1,13 +1,23 @@
|
|
1
1
|
appraise "rails-4-2" do
|
2
|
-
gem "rails",
|
2
|
+
gem "rails", "~> 4.2.0"
|
3
3
|
end
|
4
4
|
|
5
5
|
if RUBY_VERSION >= "2.2.2"
|
6
6
|
appraise "rails-5-0" do
|
7
|
-
gem "rails",
|
7
|
+
gem "rails", "~> 5.0.0"
|
8
8
|
end
|
9
9
|
|
10
10
|
appraise "rails-5-1" do
|
11
|
-
gem "rails",
|
11
|
+
gem "rails", "~> 5.1.0"
|
12
|
+
end
|
13
|
+
|
14
|
+
appraise "rails-5-2" do
|
15
|
+
gem "rails", "~> 5.2.0"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if RUBY_VERSION >= "2.5.0"
|
20
|
+
appraise "rails-head" do
|
21
|
+
gem "rails", github: "rails/rails"
|
12
22
|
end
|
13
23
|
end
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -156,7 +156,6 @@ if current_user.admin?
|
|
156
156
|
end
|
157
157
|
```
|
158
158
|
|
159
|
-
|
160
159
|
You can use partials as well. The following will render the file
|
161
160
|
`views/comments/_comments.json.jbuilder`, and set a local variable
|
162
161
|
`comments` with all this message's comments, which you can use inside
|
@@ -184,6 +183,25 @@ json.partial! partial: 'posts/post', collection: @posts, as: :post
|
|
184
183
|
json.comments @post.comments, partial: 'comments/comment', as: :comment
|
185
184
|
```
|
186
185
|
|
186
|
+
The `as: :some_symbol` is used with partials. It will take care of mapping the passed in object to a variable for the partial. If the value is a collection (either implicitly or explicitly by using the `collection:` option, then each value of the collection is passed to the partial as the variable `some_symbol`. If the value is a singular object, then the object is passed to the partial as the variable `some_symbol`.
|
187
|
+
|
188
|
+
Be sure not to confuse the `as:` option to mean nesting of the partial. For example:
|
189
|
+
|
190
|
+
```ruby
|
191
|
+
# Use the default `views/comments/_comment.json.jbuilder`, putting @comment as the comment local variable.
|
192
|
+
# Note, `comment` attributes are "inlined".
|
193
|
+
json.partial! @comment, as: :comment
|
194
|
+
```
|
195
|
+
|
196
|
+
is quite different than:
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
# comment attributes are nested under a "comment" property
|
200
|
+
json.comment do
|
201
|
+
json.partial! "/comments/comment.json.jbuilder", comment: @comment
|
202
|
+
end
|
203
|
+
```
|
204
|
+
|
187
205
|
You can pass any objects into partial templates with or without `:locals` option.
|
188
206
|
|
189
207
|
```ruby
|
@@ -256,21 +274,6 @@ environment.rb for example):
|
|
256
274
|
Jbuilder.key_format camelize: :lower
|
257
275
|
```
|
258
276
|
|
259
|
-
Faster JSON backends
|
260
|
-
--------------------
|
261
|
-
|
262
|
-
Jbuilder uses MultiJson, which by default will use the JSON gem. That gem is
|
263
|
-
currently tangled with ActiveSupport's all-Ruby `#to_json` implementation,
|
264
|
-
which is slow (fixed in Rails >= 4.1). For faster Jbuilder rendering, you can
|
265
|
-
specify something like the Yajl JSON generator instead. You'll need to include
|
266
|
-
the `yajl-ruby` gem in your Gemfile and then set the following configuration
|
267
|
-
for MultiJson:
|
268
|
-
|
269
|
-
``` ruby
|
270
|
-
require 'multi_json'
|
271
|
-
MultiJson.use :yajl
|
272
|
-
```
|
273
|
-
|
274
277
|
## Contributing to Jbuilder
|
275
278
|
|
276
279
|
Jbuilder is the work of many contributors. You're encouraged to submit pull requests, propose
|
data/gemfiles/rails_4_2.gemfile
CHANGED
data/gemfiles/rails_5_0.gemfile
CHANGED
data/gemfiles/rails_5_1.gemfile
CHANGED
data/jbuilder.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jbuilder'
|
3
|
-
s.version = '2.
|
3
|
+
s.version = '2.9.0'
|
4
4
|
s.authors = 'David Heinemeier Hansson'
|
5
5
|
s.email = 'david@basecamp.com'
|
6
6
|
s.summary = 'Create JSON structures via a Builder-style DSL'
|
@@ -10,7 +10,6 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.required_ruby_version = '>= 1.9.3'
|
11
11
|
|
12
12
|
s.add_dependency 'activesupport', '>= 4.2.0'
|
13
|
-
s.add_dependency 'multi_json', '>= 1.2'
|
14
13
|
|
15
14
|
s.files = `git ls-files`.split("\n")
|
16
15
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
@@ -10,6 +10,8 @@ module Rails
|
|
10
10
|
|
11
11
|
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
12
12
|
|
13
|
+
class_option :timestamps, type: :boolean, default: true
|
14
|
+
|
13
15
|
def create_root_folder
|
14
16
|
path = File.join('app/views', controller_file_path)
|
15
17
|
empty_directory path unless File.directory?(path)
|
@@ -33,8 +35,12 @@ module Rails
|
|
33
35
|
[name, :json, :jbuilder] * '.'
|
34
36
|
end
|
35
37
|
|
36
|
-
def
|
37
|
-
|
38
|
+
def full_attributes_list
|
39
|
+
if options[:timestamps]
|
40
|
+
attributes_list(attributes_names + %w(created_at updated_at))
|
41
|
+
else
|
42
|
+
attributes_list(attributes_names)
|
43
|
+
end
|
38
44
|
end
|
39
45
|
|
40
46
|
def attributes_list(attributes = attributes_names)
|
@@ -7,6 +7,12 @@ module Rails
|
|
7
7
|
source_paths << File.expand_path('../templates', __FILE__)
|
8
8
|
|
9
9
|
hook_for :jbuilder, type: :boolean, default: true
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def permitted_params
|
14
|
+
attributes_names.map { |name| ":#{name}" }.join(', ')
|
15
|
+
end unless private_method_defined? :permitted_params
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
@@ -56,7 +56,7 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
56
56
|
<%- if attributes_names.empty? -%>
|
57
57
|
params.fetch(<%= ":#{singular_table_name}" %>, {})
|
58
58
|
<%- else -%>
|
59
|
-
params.require(<%= ":#{singular_table_name}" %>).permit(<%=
|
59
|
+
params.require(<%= ":#{singular_table_name}" %>).permit(<%= permitted_params %>)
|
60
60
|
<%- end -%>
|
61
61
|
end
|
62
62
|
end
|
@@ -77,7 +77,7 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
77
77
|
<%- if attributes_names.empty? -%>
|
78
78
|
params.fetch(<%= ":#{singular_table_name}" %>, {})
|
79
79
|
<%- else -%>
|
80
|
-
params.require(<%= ":#{singular_table_name}" %>).permit(<%=
|
80
|
+
params.require(<%= ":#{singular_table_name}" %>).permit(<%= permitted_params %>)
|
81
81
|
<%- end -%>
|
82
82
|
end
|
83
83
|
end
|
@@ -1 +1 @@
|
|
1
|
-
json.array! @<%= plural_table_name %>, partial:
|
1
|
+
json.array! @<%= plural_table_name %>, partial: "<%= plural_table_name %>/<%= singular_table_name %>", as: :<%= singular_table_name %>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
json.extract! <%= singular_table_name %>, <%=
|
1
|
+
json.extract! <%= singular_table_name %>, <%= full_attributes_list %>
|
2
2
|
json.url <%= singular_table_name %>_url(<%= singular_table_name %>, format: :json)
|
data/lib/jbuilder.rb
CHANGED
@@ -2,7 +2,7 @@ require 'jbuilder/jbuilder'
|
|
2
2
|
require 'jbuilder/blank'
|
3
3
|
require 'jbuilder/key_formatter'
|
4
4
|
require 'jbuilder/errors'
|
5
|
-
require '
|
5
|
+
require 'json'
|
6
6
|
require 'ostruct'
|
7
7
|
|
8
8
|
class Jbuilder
|
@@ -247,7 +247,7 @@ class Jbuilder
|
|
247
247
|
|
248
248
|
# Encodes the current builder as JSON.
|
249
249
|
def target!
|
250
|
-
::
|
250
|
+
::JSON.dump(@attributes)
|
251
251
|
end
|
252
252
|
|
253
253
|
private
|
@@ -104,7 +104,7 @@ class JbuilderTemplate < Jbuilder
|
|
104
104
|
private
|
105
105
|
|
106
106
|
def _render_partial_with_options(options)
|
107
|
-
options.reverse_merge! locals:
|
107
|
+
options.reverse_merge! locals: options.except(:partial, :as, :collection)
|
108
108
|
options.reverse_merge! ::JbuilderTemplate.template_lookup_options
|
109
109
|
as = options[:as]
|
110
110
|
|
@@ -222,11 +222,12 @@ end
|
|
222
222
|
|
223
223
|
class JbuilderHandler
|
224
224
|
cattr_accessor :default_format
|
225
|
-
self.default_format =
|
225
|
+
self.default_format = :json
|
226
226
|
|
227
|
-
def self.call(template)
|
227
|
+
def self.call(template, source = nil)
|
228
|
+
source ||= template.source
|
228
229
|
# this juggling is required to keep line numbers right in the error
|
229
|
-
%{__already_defined = defined?(json); json||=JbuilderTemplate.new(self); #{
|
230
|
+
%{__already_defined = defined?(json); json||=JbuilderTemplate.new(self); #{source}
|
230
231
|
json.target! unless (__already_defined && __already_defined != "method")}
|
231
232
|
end
|
232
233
|
end
|
@@ -21,18 +21,26 @@ class JbuilderGeneratorTest < Rails::Generators::TestCase
|
|
21
21
|
run_generator
|
22
22
|
|
23
23
|
assert_file 'app/views/posts/index.json.jbuilder' do |content|
|
24
|
-
assert_match %r{json
|
24
|
+
assert_match %r{json\.array! @posts, partial: "posts/post", as: :post}, content
|
25
25
|
end
|
26
26
|
|
27
27
|
assert_file 'app/views/posts/show.json.jbuilder' do |content|
|
28
|
-
assert_match %r{json
|
28
|
+
assert_match %r{json\.partial! "posts/post", post: @post}, content
|
29
29
|
end
|
30
|
-
|
31
|
-
assert_file 'app/views/posts/_post.json.jbuilder' do |content|
|
30
|
+
|
31
|
+
assert_file 'app/views/posts/_post.json.jbuilder' do |content|
|
32
32
|
assert_match %r{json\.extract! post, :id, :title, :body}, content
|
33
|
+
assert_match %r{:created_at, :updated_at}, content
|
33
34
|
assert_match %r{json\.url post_url\(post, format: :json\)}, content
|
34
35
|
end
|
35
|
-
|
36
|
+
end
|
36
37
|
|
38
|
+
test 'timestamps are not generated in partial with --no-timestamps' do
|
39
|
+
run_generator %w(Post title body:text --no-timestamps)
|
40
|
+
|
41
|
+
assert_file 'app/views/posts/_post.json.jbuilder' do |content|
|
42
|
+
assert_match %r{json\.extract! post, :id, :title, :body$}, content
|
43
|
+
assert_no_match %r{:created_at, :updated_at}, content
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
@@ -1,457 +1,312 @@
|
|
1
1
|
require "test_helper"
|
2
|
-
require "mocha/setup"
|
3
|
-
require "active_model"
|
4
|
-
require "action_view"
|
5
2
|
require "action_view/testing/resolvers"
|
6
|
-
require "active_support/cache"
|
7
|
-
require "jbuilder/jbuilder_template"
|
8
|
-
|
9
|
-
BLOG_POST_PARTIAL = <<-JBUILDER
|
10
|
-
json.extract! blog_post, :id, :body
|
11
|
-
json.author do
|
12
|
-
first_name, last_name = blog_post.author_name.split(nil, 2)
|
13
|
-
json.first_name first_name
|
14
|
-
json.last_name last_name
|
15
|
-
end
|
16
|
-
JBUILDER
|
17
|
-
|
18
|
-
COLLECTION_PARTIAL = <<-JBUILDER
|
19
|
-
json.extract! collection, :id, :name
|
20
|
-
JBUILDER
|
21
|
-
|
22
|
-
RACER_PARTIAL = <<-JBUILDER
|
23
|
-
json.extract! racer, :id, :name
|
24
|
-
JBUILDER
|
25
|
-
|
26
|
-
class Racer
|
27
|
-
extend ActiveModel::Naming
|
28
|
-
include ActiveModel::Conversion
|
29
|
-
|
30
|
-
def initialize(id, name)
|
31
|
-
@id, @name = id, name
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_reader :id, :name
|
35
|
-
end
|
36
|
-
|
37
3
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
"_partial.json.jbuilder" => "foo ||= 'hello'; json.content foo",
|
48
|
-
"_blog_post.json.jbuilder" => BLOG_POST_PARTIAL,
|
49
|
-
"racers/_racer.json.jbuilder" => RACER_PARTIAL,
|
50
|
-
"_collection.json.jbuilder" => COLLECTION_PARTIAL
|
51
|
-
}
|
52
|
-
|
53
|
-
module Rails
|
54
|
-
def self.cache
|
55
|
-
@cache ||= ActiveSupport::Cache::MemoryStore.new
|
56
|
-
end
|
57
|
-
end
|
4
|
+
class JbuilderTemplateTest < ActiveSupport::TestCase
|
5
|
+
POST_PARTIAL = <<-JBUILDER
|
6
|
+
json.extract! post, :id, :body
|
7
|
+
json.author do
|
8
|
+
first_name, last_name = post.author_name.split(nil, 2)
|
9
|
+
json.first_name first_name
|
10
|
+
json.last_name last_name
|
11
|
+
end
|
12
|
+
JBUILDER
|
58
13
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
Rails.cache.clear
|
63
|
-
end
|
14
|
+
COLLECTION_PARTIAL = <<-JBUILDER
|
15
|
+
json.extract! collection, :id, :name
|
16
|
+
JBUILDER
|
64
17
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
partials["test.json.jbuilder"] = source
|
69
|
-
resolver = ActionView::FixtureResolver.new(partials)
|
70
|
-
lookup_context.view_paths = [resolver]
|
71
|
-
template = ActionView::Template.new(source, "test", JbuilderHandler, virtual_path: "test")
|
72
|
-
json = template.render(self, {}).strip
|
73
|
-
MultiJson.load(json)
|
74
|
-
end
|
18
|
+
RACER_PARTIAL = <<-JBUILDER
|
19
|
+
json.extract! racer, :id, :name
|
20
|
+
JBUILDER
|
75
21
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
22
|
+
PARTIALS = {
|
23
|
+
"_partial.json.jbuilder" => "json.content content",
|
24
|
+
"_post.json.jbuilder" => POST_PARTIAL,
|
25
|
+
"racers/_racer.json.jbuilder" => RACER_PARTIAL,
|
26
|
+
"_collection.json.jbuilder" => COLLECTION_PARTIAL,
|
83
27
|
|
84
|
-
|
85
|
-
|
28
|
+
# Ensure we find only Jbuilder partials from within Jbuilder templates.
|
29
|
+
"_post.html.erb" => "Hello world!"
|
30
|
+
}
|
86
31
|
|
87
|
-
|
88
|
-
|
89
|
-
assert_equal "post body 5", result[4]["body"]
|
90
|
-
assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
|
91
|
-
assert_equal "Pavel", result[5]["author"]["first_name"]
|
92
|
-
end
|
32
|
+
AUTHORS = [ "David Heinemeier Hansson", "Pavel Pravosud" ].cycle
|
33
|
+
POSTS = (1..10).collect { |i| Post.new(i, "Post ##{i}", AUTHORS.next) }
|
93
34
|
|
94
|
-
|
95
|
-
result = jbuild(<<-JBUILDER)
|
96
|
-
json.content "hello"
|
97
|
-
JBUILDER
|
35
|
+
setup { Rails.cache.clear }
|
98
36
|
|
37
|
+
test "basic template" do
|
38
|
+
result = render('json.content "hello"')
|
99
39
|
assert_equal "hello", result["content"]
|
100
40
|
end
|
101
41
|
|
102
|
-
test "
|
103
|
-
result =
|
104
|
-
|
105
|
-
json.camel_style "for JS"
|
106
|
-
JBUILDER
|
107
|
-
|
108
|
-
assert_equal ["camelStyle"], result.keys
|
109
|
-
end
|
110
|
-
|
111
|
-
test "key_format! propagates to child elements" do
|
112
|
-
result = jbuild(<<-JBUILDER)
|
113
|
-
json.key_format! :upcase
|
114
|
-
json.level1 "one"
|
115
|
-
json.level2 do
|
116
|
-
json.value "two"
|
117
|
-
end
|
118
|
-
JBUILDER
|
119
|
-
|
120
|
-
assert_equal "one", result["LEVEL1"]
|
121
|
-
assert_equal "two", result["LEVEL2"]["VALUE"]
|
42
|
+
test "partial by name with top-level locals" do
|
43
|
+
result = render('json.partial! "partial", content: "hello"')
|
44
|
+
assert_equal "hello", result["content"]
|
122
45
|
end
|
123
46
|
|
124
|
-
test "partial
|
125
|
-
result =
|
126
|
-
json.partial! "partial"
|
127
|
-
JBUILDER
|
128
|
-
|
47
|
+
test "partial by name with nested locals" do
|
48
|
+
result = render('json.partial! "partial", locals: { content: "hello" }')
|
129
49
|
assert_equal "hello", result["content"]
|
130
50
|
end
|
131
51
|
|
132
|
-
test "partial
|
133
|
-
result =
|
134
|
-
|
135
|
-
JBUILDER
|
136
|
-
|
137
|
-
assert_equal "howdy", result["content"]
|
52
|
+
test "partial by options containing nested locals" do
|
53
|
+
result = render('json.partial! partial: "partial", locals: { content: "hello" }')
|
54
|
+
assert_equal "hello", result["content"]
|
138
55
|
end
|
139
56
|
|
140
|
-
test "partial
|
141
|
-
result =
|
142
|
-
|
143
|
-
JBUILDER
|
144
|
-
|
145
|
-
assert_equal "goodbye", result["content"]
|
57
|
+
test "partial by options containing top-level locals" do
|
58
|
+
result = render('json.partial! partial: "partial", content: "hello"')
|
59
|
+
assert_equal "hello", result["content"]
|
146
60
|
end
|
147
61
|
|
148
|
-
test "partial
|
149
|
-
result =
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
assert_collection_rendered result
|
62
|
+
test "partial for Active Model" do
|
63
|
+
result = render('json.partial! @racer', racer: Racer.new(123, "Chris Harris"))
|
64
|
+
assert_equal 123, result["id"]
|
65
|
+
assert_equal "Chris Harris", result["name"]
|
154
66
|
end
|
155
67
|
|
156
|
-
test "partial
|
157
|
-
result =
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
68
|
+
test "partial collection by name with symbol local" do
|
69
|
+
result = render('json.partial! "post", collection: @posts, as: :post', posts: POSTS)
|
70
|
+
assert_equal 10, result.count
|
71
|
+
assert_equal "Post #5", result[4]["body"]
|
72
|
+
assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
|
73
|
+
assert_equal "Pavel", result[5]["author"]["first_name"]
|
162
74
|
end
|
163
75
|
|
164
|
-
test "partial
|
165
|
-
result =
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
assert_equal
|
76
|
+
test "partial collection by name with string local" do
|
77
|
+
result = render('json.partial! "post", collection: @posts, as: "post"', posts: POSTS)
|
78
|
+
assert_equal 10, result.count
|
79
|
+
assert_equal "Post #5", result[4]["body"]
|
80
|
+
assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
|
81
|
+
assert_equal "Pavel", result[5]["author"]["first_name"]
|
170
82
|
end
|
171
83
|
|
172
|
-
test "partial
|
173
|
-
result =
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
assert_equal
|
84
|
+
test "partial collection by options" do
|
85
|
+
result = render('json.partial! partial: "post", collection: @posts, as: :post', posts: POSTS)
|
86
|
+
assert_equal 10, result.count
|
87
|
+
assert_equal "Post #5", result[4]["body"]
|
88
|
+
assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
|
89
|
+
assert_equal "Pavel", result[5]["author"]["first_name"]
|
178
90
|
end
|
179
91
|
|
180
|
-
test "partial
|
181
|
-
|
182
|
-
json.partial! partial: "blog_post", collection: BLOG_POST_COLLECTION, as: :blog_post
|
183
|
-
JBUILDER
|
184
|
-
|
185
|
-
assert_collection_rendered result
|
92
|
+
test "nil partial collection by name" do
|
93
|
+
assert_equal [], render('json.partial! "post", collection: @posts, as: :post', posts: nil)
|
186
94
|
end
|
187
95
|
|
188
|
-
test "partial
|
189
|
-
|
190
|
-
json.partial! partial: "blog_post", collection: nil, as: :blog_post
|
191
|
-
JBUILDER
|
192
|
-
|
193
|
-
assert_equal [], result
|
96
|
+
test "nil partial collection by options" do
|
97
|
+
assert_equal [], render('json.partial! partial: "post", collection: @posts, as: :post', posts: nil)
|
194
98
|
end
|
195
99
|
|
196
|
-
test "
|
197
|
-
result =
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
100
|
+
test "array of partials" do
|
101
|
+
result = render('json.array! @posts, partial: "post", as: :post', posts: POSTS)
|
102
|
+
assert_equal 10, result.count
|
103
|
+
assert_equal "Post #5", result[4]["body"]
|
104
|
+
assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
|
105
|
+
assert_equal "Pavel", result[5]["author"]["first_name"]
|
202
106
|
end
|
203
107
|
|
204
|
-
test "
|
205
|
-
|
206
|
-
json.array! nil, partial: "blog_post", as: :blog_post
|
207
|
-
JBUILDER
|
208
|
-
|
209
|
-
assert_equal [], result
|
108
|
+
test "empty array of partials from nil collection" do
|
109
|
+
assert_equal [], render('json.array! @posts, partial: "post", as: :post', posts: nil)
|
210
110
|
end
|
211
111
|
|
212
|
-
test "
|
213
|
-
result =
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
112
|
+
test "array of partials under key" do
|
113
|
+
result = render('json.posts @posts, partial: "post", as: :post', posts: POSTS)
|
114
|
+
assert_equal 10, result["posts"].count
|
115
|
+
assert_equal "Post #5", result["posts"][4]["body"]
|
116
|
+
assert_equal "Heinemeier Hansson", result["posts"][2]["author"]["last_name"]
|
117
|
+
assert_equal "Pavel", result["posts"][5]["author"]["first_name"]
|
218
118
|
end
|
219
119
|
|
220
|
-
test "
|
221
|
-
result =
|
222
|
-
json.posts nil, partial: "blog_post", as: :blog_post
|
223
|
-
JBUILDER
|
224
|
-
|
120
|
+
test "empty array of partials under key from nil collection" do
|
121
|
+
result = render('json.posts @posts, partial: "post", as: :post', posts: nil)
|
225
122
|
assert_equal [], result["posts"]
|
226
123
|
end
|
227
124
|
|
228
|
-
test "
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
json.cache! "nothing" do
|
125
|
+
test "object fragment caching" do
|
126
|
+
render(<<-JBUILDER)
|
127
|
+
json.cache! "cache-key" do
|
128
|
+
json.name "Hit"
|
233
129
|
end
|
234
130
|
JBUILDER
|
235
131
|
|
236
|
-
|
237
|
-
|
238
|
-
assert_nothing_raised do
|
239
|
-
result = jbuild(<<-JBUILDER)
|
240
|
-
json.foo "bar"
|
241
|
-
json.cache! "nothing" do
|
242
|
-
end
|
243
|
-
JBUILDER
|
244
|
-
end
|
245
|
-
|
246
|
-
assert_equal "bar", result["foo"]
|
132
|
+
hit = render('json.cache! "cache-key" do; end')
|
133
|
+
assert_equal "Hit", hit["name"]
|
247
134
|
end
|
248
135
|
|
249
|
-
test "fragment caching
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
json.cache! "cachekey" do
|
254
|
-
json.name "Cache"
|
136
|
+
test "conditional object fragment caching" do
|
137
|
+
render(<<-JBUILDER)
|
138
|
+
json.cache_if! true, "cache-key" do
|
139
|
+
json.a "Hit"
|
255
140
|
end
|
256
|
-
JBUILDER
|
257
141
|
|
258
|
-
|
259
|
-
|
260
|
-
json.name "Miss"
|
142
|
+
json.cache_if! false, "cache-key" do
|
143
|
+
json.b "Hit"
|
261
144
|
end
|
262
145
|
JBUILDER
|
263
146
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
test "conditionally fragment caching a JSON object" do
|
268
|
-
undef_context_methods :fragment_name_with_digest, :cache_fragment_name
|
269
|
-
|
270
|
-
jbuild <<-JBUILDER
|
271
|
-
json.cache_if! true, "cachekey" do
|
272
|
-
json.test1 "Cache"
|
147
|
+
result = render(<<-JBUILDER)
|
148
|
+
json.cache_if! true, "cache-key" do
|
149
|
+
json.a "Miss"
|
273
150
|
end
|
274
|
-
json.cache_if! false, "cachekey" do
|
275
|
-
json.test2 "Cache"
|
276
|
-
end
|
277
|
-
JBUILDER
|
278
151
|
|
279
|
-
|
280
|
-
|
281
|
-
json.test1 "Miss"
|
282
|
-
end
|
283
|
-
json.cache_if! false, "cachekey" do
|
284
|
-
json.test2 "Miss"
|
152
|
+
json.cache_if! false, "cache-key" do
|
153
|
+
json.b "Miss"
|
285
154
|
end
|
286
155
|
JBUILDER
|
287
156
|
|
288
|
-
assert_equal "
|
289
|
-
assert_equal "Miss", result["
|
157
|
+
assert_equal "Hit", result["a"]
|
158
|
+
assert_equal "Miss", result["b"]
|
290
159
|
end
|
291
160
|
|
292
|
-
test "fragment caching
|
293
|
-
|
161
|
+
test "object fragment caching with expiry" do
|
162
|
+
travel_to "2018-05-12 11:29:00 -0400"
|
294
163
|
|
295
|
-
|
296
|
-
json.cache! "
|
297
|
-
json.
|
164
|
+
render <<-JBUILDER
|
165
|
+
json.cache! "cache-key", expires_in: 1.minute do
|
166
|
+
json.name "Hit"
|
298
167
|
end
|
299
168
|
JBUILDER
|
300
169
|
|
301
|
-
|
302
|
-
|
303
|
-
|
170
|
+
travel 30.seconds
|
171
|
+
|
172
|
+
result = render(<<-JBUILDER)
|
173
|
+
json.cache! "cache-key", expires_in: 1.minute do
|
174
|
+
json.name "Miss"
|
304
175
|
end
|
305
176
|
JBUILDER
|
306
177
|
|
307
|
-
assert_equal
|
308
|
-
end
|
309
|
-
|
310
|
-
test "fragment caching works with current cache digests" do
|
311
|
-
undef_context_methods :fragment_name_with_digest
|
178
|
+
assert_equal "Hit", result["name"]
|
312
179
|
|
313
|
-
|
314
|
-
ActiveSupport::Cache.expects :expand_cache_key
|
180
|
+
travel 31.seconds
|
315
181
|
|
316
|
-
|
317
|
-
json.cache! "
|
318
|
-
json.name "
|
182
|
+
result = render(<<-JBUILDER)
|
183
|
+
json.cache! "cache-key", expires_in: 1.minute do
|
184
|
+
json.name "Miss"
|
319
185
|
end
|
320
186
|
JBUILDER
|
321
|
-
end
|
322
187
|
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
@context.expects(:combined_fragment_cache_key).with("cachekey")
|
188
|
+
assert_equal "Miss", result["name"]
|
189
|
+
end
|
327
190
|
|
328
|
-
|
329
|
-
|
330
|
-
|
191
|
+
test "object root caching" do
|
192
|
+
render <<-JBUILDER
|
193
|
+
json.cache_root! "cache-key" do
|
194
|
+
json.name "Hit"
|
331
195
|
end
|
332
196
|
JBUILDER
|
333
|
-
end
|
334
|
-
|
335
|
-
test "fragment caching instrumentation" do
|
336
|
-
undef_context_methods :fragment_name_with_digest, :cache_fragment_name
|
337
197
|
|
338
|
-
|
339
|
-
ActiveSupport::Notifications.subscribe("read_fragment.action_controller") { |*args| payloads[:read_fragment] = args.last }
|
340
|
-
ActiveSupport::Notifications.subscribe("write_fragment.action_controller") { |*args| payloads[:write_fragment] = args.last }
|
198
|
+
assert_equal JSON.dump(name: "Hit"), Rails.cache.read("jbuilder/root/cache-key")
|
341
199
|
|
342
|
-
|
343
|
-
json.
|
344
|
-
json.name "
|
200
|
+
result = render(<<-JBUILDER)
|
201
|
+
json.cache_root! "cache-key" do
|
202
|
+
json.name "Miss"
|
345
203
|
end
|
346
204
|
JBUILDER
|
347
205
|
|
348
|
-
assert_equal "
|
349
|
-
assert_equal "jbuilder/cachekey", payloads[:write_fragment][:key]
|
206
|
+
assert_equal "Hit", result["name"]
|
350
207
|
end
|
351
208
|
|
352
|
-
test "
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
ActiveSupport::Cache.expects :expand_cache_key
|
357
|
-
|
358
|
-
jbuild <<-JBUILDER
|
359
|
-
json.cache! "cachekey", skip_digest: true do
|
360
|
-
json.name "Cache"
|
209
|
+
test "array fragment caching" do
|
210
|
+
render <<-JBUILDER
|
211
|
+
json.cache! "cache-key" do
|
212
|
+
json.array! %w[ a b c ]
|
361
213
|
end
|
362
214
|
JBUILDER
|
363
|
-
end
|
364
215
|
|
365
|
-
|
366
|
-
undef_context_methods :fragment_name_with_digest
|
367
|
-
|
368
|
-
@context.expects(:cache_fragment_name).with("cachekey", {})
|
369
|
-
|
370
|
-
jbuild <<-JBUILDER
|
371
|
-
json.cache! "cachekey", expires_in: 1.minute do
|
372
|
-
json.name "Cache"
|
373
|
-
end
|
374
|
-
JBUILDER
|
216
|
+
assert_equal %w[ a b c ], render('json.cache! "cache-key" do; end')
|
375
217
|
end
|
376
218
|
|
377
|
-
test "
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
json.cache_root! "cachekey" do
|
382
|
-
json.name "Miss"
|
219
|
+
test "array root caching" do
|
220
|
+
render <<-JBUILDER
|
221
|
+
json.cache_root! "cache-key" do
|
222
|
+
json.array! %w[ a b c ]
|
383
223
|
end
|
384
224
|
JBUILDER
|
385
225
|
|
386
|
-
|
387
|
-
|
388
|
-
|
226
|
+
assert_equal JSON.dump(%w[ a b c ]), Rails.cache.read("jbuilder/root/cache-key")
|
227
|
+
|
228
|
+
assert_equal %w[ a b c ], render(<<-JBUILDER)
|
229
|
+
json.cache_root! "cache-key" do
|
230
|
+
json.array! %w[ d e f ]
|
389
231
|
end
|
390
232
|
JBUILDER
|
391
|
-
|
392
|
-
assert_equal cache_miss_result, cache_hit_result
|
393
233
|
end
|
394
234
|
|
395
|
-
test "failing to cache root after
|
235
|
+
test "failing to cache root after JSON structures have been defined" do
|
396
236
|
assert_raises ActionView::Template::Error, "cache_root! can't be used after JSON structures have been defined" do
|
397
|
-
|
237
|
+
render <<-JBUILDER
|
398
238
|
json.name "Kaboom"
|
399
|
-
json.cache_root! "
|
239
|
+
json.cache_root! "cache-key" do
|
400
240
|
json.name "Miss"
|
401
241
|
end
|
402
242
|
JBUILDER
|
403
243
|
end
|
404
244
|
end
|
405
245
|
|
406
|
-
test "
|
407
|
-
|
246
|
+
test "empty fragment caching" do
|
247
|
+
render 'json.cache! "nothing" do; end'
|
408
248
|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
249
|
+
result = nil
|
250
|
+
|
251
|
+
assert_nothing_raised do
|
252
|
+
result = render(<<-JBUILDER)
|
253
|
+
json.foo "bar"
|
254
|
+
json.cache! "nothing" do; end
|
255
|
+
JBUILDER
|
256
|
+
end
|
414
257
|
|
415
|
-
assert_equal
|
258
|
+
assert_equal "bar", result["foo"]
|
416
259
|
end
|
417
260
|
|
418
|
-
test "
|
419
|
-
|
261
|
+
test "cache instrumentation" do
|
262
|
+
payloads = {}
|
420
263
|
|
421
|
-
|
422
|
-
|
264
|
+
ActiveSupport::Notifications.subscribe("read_fragment.action_controller") { |*args| payloads[:read] = args.last }
|
265
|
+
ActiveSupport::Notifications.subscribe("write_fragment.action_controller") { |*args| payloads[:write] = args.last }
|
266
|
+
|
267
|
+
render <<-JBUILDER
|
268
|
+
json.cache! "cache-key" do
|
269
|
+
json.name "Cache"
|
270
|
+
end
|
423
271
|
JBUILDER
|
424
272
|
|
425
|
-
assert_equal
|
426
|
-
assert_equal "
|
427
|
-
assert_equal "David", result["post"]["author"]["first_name"]
|
273
|
+
assert_equal "jbuilder/cache-key", payloads[:read][:key]
|
274
|
+
assert_equal "jbuilder/cache-key", payloads[:write][:key]
|
428
275
|
end
|
429
276
|
|
430
|
-
test "
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
json.partial! @racer
|
277
|
+
test "camelized keys" do
|
278
|
+
result = render(<<-JBUILDER)
|
279
|
+
json.key_format! camelize: [:lower]
|
280
|
+
json.first_name "David"
|
435
281
|
JBUILDER
|
436
282
|
|
437
|
-
assert_equal
|
438
|
-
assert_equal 123, result["id"]
|
439
|
-
assert_equal "Chris Harris", result["name"]
|
283
|
+
assert_equal "David", result["firstName"]
|
440
284
|
end
|
441
285
|
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
}
|
286
|
+
private
|
287
|
+
def render(*args)
|
288
|
+
JSON.load render_without_parsing(*args)
|
289
|
+
end
|
447
290
|
|
448
|
-
|
291
|
+
def render_without_parsing(source, assigns = {})
|
292
|
+
view = build_view(fixtures: PARTIALS.merge("source.json.jbuilder" => source), assigns: assigns)
|
293
|
+
view.render(template: "source.json.jbuilder")
|
294
|
+
end
|
449
295
|
|
450
|
-
|
451
|
-
|
452
|
-
|
296
|
+
def build_view(options = {})
|
297
|
+
resolver = ActionView::FixtureResolver.new(options.fetch(:fixtures))
|
298
|
+
lookup_context = ActionView::LookupContext.new([ resolver ], {}, [""])
|
299
|
+
controller = ActionView::TestCase::TestController.new
|
453
300
|
|
454
|
-
|
455
|
-
|
456
|
-
|
301
|
+
# TODO: Use with_empty_template_cache unconditionally after dropping support for Rails <6.0.
|
302
|
+
view = if ActionView::Base.respond_to?(:with_empty_template_cache)
|
303
|
+
ActionView::Base.with_empty_template_cache.new(lookup_context, options.fetch(:assigns, {}), controller)
|
304
|
+
else
|
305
|
+
ActionView::Base.new(lookup_context, options.fetch(:assigns, {}), controller)
|
306
|
+
end
|
307
|
+
|
308
|
+
def view.view_cache_dependencies; []; end
|
309
|
+
|
310
|
+
view
|
311
|
+
end
|
457
312
|
end
|
data/test/jbuilder_test.rb
CHANGED
@@ -6,7 +6,7 @@ if Rails::VERSION::MAJOR > 4
|
|
6
6
|
|
7
7
|
class ScaffoldApiControllerGeneratorTest < Rails::Generators::TestCase
|
8
8
|
tests Rails::Generators::ScaffoldControllerGenerator
|
9
|
-
arguments %w(Post title body:text --api)
|
9
|
+
arguments %w(Post title body:text images:attachments --api)
|
10
10
|
destination File.expand_path('../tmp', __FILE__)
|
11
11
|
setup :prepare_destination
|
12
12
|
|
@@ -39,7 +39,11 @@ if Rails::VERSION::MAJOR > 4
|
|
39
39
|
end
|
40
40
|
|
41
41
|
assert_match %r{def post_params}, content
|
42
|
-
|
42
|
+
if Rails::VERSION::MAJOR >= 6
|
43
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, images: \[\]\)}, content
|
44
|
+
else
|
45
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, :images\)}, content
|
46
|
+
end
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
@@ -4,7 +4,7 @@ require 'generators/rails/scaffold_controller_generator'
|
|
4
4
|
|
5
5
|
class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
6
6
|
tests Rails::Generators::ScaffoldControllerGenerator
|
7
|
-
arguments %w(Post title body:text)
|
7
|
+
arguments %w(Post title body:text images:attachments)
|
8
8
|
destination File.expand_path('../tmp', __FILE__)
|
9
9
|
setup :prepare_destination
|
10
10
|
|
@@ -51,7 +51,11 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
|
51
51
|
end
|
52
52
|
|
53
53
|
assert_match %r{def post_params}, content
|
54
|
-
|
54
|
+
if Rails::VERSION::MAJOR >= 6
|
55
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, images: \[\]\)}, content
|
56
|
+
else
|
57
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, :images\)}, content
|
58
|
+
end
|
55
59
|
end
|
56
60
|
end
|
57
61
|
|
data/test/test_helper.rb
CHANGED
@@ -1,16 +1,33 @@
|
|
1
1
|
require "bundler/setup"
|
2
|
+
|
2
3
|
require "active_support"
|
3
|
-
require
|
4
|
+
require "active_support/core_ext/array/access"
|
5
|
+
require "active_support/cache/memory_store"
|
6
|
+
require "active_model"
|
7
|
+
require "action_view"
|
4
8
|
require "rails/version"
|
9
|
+
|
5
10
|
require "jbuilder"
|
6
11
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
12
|
+
require "active_support/testing/autorun"
|
13
|
+
require "mocha/setup"
|
14
|
+
|
15
|
+
ActiveSupport.test_order = :random
|
16
|
+
|
17
|
+
class << Rails
|
18
|
+
def cache
|
19
|
+
@cache ||= ActiveSupport::Cache::MemoryStore.new
|
20
|
+
end
|
11
21
|
end
|
12
22
|
|
23
|
+
class Post < Struct.new(:id, :body, :author_name); end
|
13
24
|
|
14
|
-
|
15
|
-
|
25
|
+
class Racer < Struct.new(:id, :name)
|
26
|
+
extend ActiveModel::Naming
|
27
|
+
include ActiveModel::Conversion
|
16
28
|
end
|
29
|
+
|
30
|
+
ActionView::Template.register_template_handler :jbuilder, JbuilderHandler
|
31
|
+
|
32
|
+
ActionView::Base.remove_possible_method :fragment_name_with_digest
|
33
|
+
ActionView::Base.remove_possible_method :cache_fragment_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.2.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: multi_json
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.2'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.2'
|
41
27
|
description:
|
42
28
|
email: david@basecamp.com
|
43
29
|
executables: []
|
@@ -56,6 +42,8 @@ files:
|
|
56
42
|
- gemfiles/rails_4_2.gemfile
|
57
43
|
- gemfiles/rails_5_0.gemfile
|
58
44
|
- gemfiles/rails_5_1.gemfile
|
45
|
+
- gemfiles/rails_5_2.gemfile
|
46
|
+
- gemfiles/rails_head.gemfile
|
59
47
|
- jbuilder.gemspec
|
60
48
|
- lib/generators/rails/jbuilder_generator.rb
|
61
49
|
- lib/generators/rails/scaffold_controller_generator.rb
|
@@ -98,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
86
|
- !ruby/object:Gem::Version
|
99
87
|
version: '0'
|
100
88
|
requirements: []
|
101
|
-
|
102
|
-
rubygems_version: 2.7.6
|
89
|
+
rubygems_version: 3.0.3
|
103
90
|
signing_key:
|
104
91
|
specification_version: 4
|
105
92
|
summary: Create JSON structures via a Builder-style DSL
|