jbuilder 1.5.3 → 2.11.5

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.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +108 -0
  3. data/.gitignore +4 -1
  4. data/Appraisals +25 -0
  5. data/CONTRIBUTING.md +106 -0
  6. data/Gemfile +4 -5
  7. data/MIT-LICENSE +2 -2
  8. data/README.md +182 -40
  9. data/Rakefile +15 -10
  10. data/gemfiles/rails_5_0.gemfile +10 -0
  11. data/gemfiles/rails_5_1.gemfile +10 -0
  12. data/gemfiles/rails_5_2.gemfile +10 -0
  13. data/gemfiles/rails_6_0.gemfile +10 -0
  14. data/gemfiles/rails_6_1.gemfile +10 -0
  15. data/gemfiles/rails_head.gemfile +10 -0
  16. data/jbuilder.gemspec +25 -8
  17. data/lib/generators/rails/jbuilder_generator.rb +13 -2
  18. data/lib/generators/rails/scaffold_controller_generator.rb +9 -3
  19. data/lib/generators/rails/templates/api_controller.rb +63 -0
  20. data/lib/generators/rails/templates/controller.rb +18 -22
  21. data/lib/generators/rails/templates/index.json.jbuilder +1 -4
  22. data/lib/generators/rails/templates/partial.json.jbuilder +16 -0
  23. data/lib/generators/rails/templates/show.json.jbuilder +1 -1
  24. data/lib/jbuilder/blank.rb +11 -0
  25. data/lib/jbuilder/collection_renderer.rb +109 -0
  26. data/lib/jbuilder/dependency_tracker.rb +61 -0
  27. data/lib/jbuilder/errors.rb +24 -0
  28. data/lib/jbuilder/jbuilder.rb +7 -0
  29. data/lib/jbuilder/jbuilder_template.rb +228 -67
  30. data/lib/jbuilder/key_formatter.rb +34 -0
  31. data/lib/jbuilder/railtie.rb +31 -6
  32. data/lib/jbuilder.rb +144 -137
  33. data/test/jbuilder_dependency_tracker_test.rb +72 -0
  34. data/test/jbuilder_generator_test.rb +31 -4
  35. data/test/jbuilder_template_test.rb +319 -163
  36. data/test/jbuilder_test.rb +613 -298
  37. data/test/scaffold_api_controller_generator_test.rb +70 -0
  38. data/test/scaffold_controller_generator_test.rb +62 -19
  39. data/test/test_helper.rb +36 -0
  40. metadata +47 -22
  41. data/.travis.yml +0 -38
  42. data/Gemfile.old +0 -7
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+ require 'rails/generators/test_case'
3
+ require 'generators/rails/scaffold_controller_generator'
4
+
5
+ if Rails::VERSION::MAJOR > 4
6
+
7
+ class ScaffoldApiControllerGeneratorTest < Rails::Generators::TestCase
8
+ tests Rails::Generators::ScaffoldControllerGenerator
9
+ arguments %w(Post title body:text images:attachments --api)
10
+ destination File.expand_path('../tmp', __FILE__)
11
+ setup :prepare_destination
12
+
13
+ test 'controller content' do
14
+ run_generator
15
+
16
+ assert_file 'app/controllers/posts_controller.rb' do |content|
17
+ assert_instance_method :index, content do |m|
18
+ assert_match %r{@posts = Post\.all}, m
19
+ end
20
+
21
+ assert_instance_method :show, content do |m|
22
+ assert m.blank?
23
+ end
24
+
25
+ assert_instance_method :create, content do |m|
26
+ assert_match %r{@post = Post\.new\(post_params\)}, m
27
+ assert_match %r{@post\.save}, m
28
+ assert_match %r{render :show, status: :created, location: @post}, m
29
+ assert_match %r{render json: @post\.errors, status: :unprocessable_entity}, m
30
+ end
31
+
32
+ assert_instance_method :update, content do |m|
33
+ assert_match %r{render :show, status: :ok, location: @post}, m
34
+ assert_match %r{render json: @post.errors, status: :unprocessable_entity}, m
35
+ end
36
+
37
+ assert_instance_method :destroy, content do |m|
38
+ assert_match %r{@post\.destroy}, m
39
+ end
40
+
41
+ assert_match %r{def post_params}, content
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
47
+ end
48
+ end
49
+
50
+ test "don't use require and permit if there are no attributes" do
51
+ run_generator %w(Post --api)
52
+
53
+ assert_file 'app/controllers/posts_controller.rb' do |content|
54
+ assert_match %r{def post_params}, content
55
+ assert_match %r{params\.fetch\(:post, \{\}\)}, content
56
+ end
57
+ end
58
+
59
+
60
+ if Rails::VERSION::MAJOR >= 6
61
+ test 'handles virtual attributes' do
62
+ run_generator ["Message", "content:rich_text", "video:attachment", "photos:attachments"]
63
+
64
+ assert_file 'app/controllers/messages_controller.rb' do |content|
65
+ assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,9 +1,10 @@
1
+ require 'test_helper'
1
2
  require 'rails/generators/test_case'
2
3
  require 'generators/rails/scaffold_controller_generator'
3
4
 
4
5
  class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
5
6
  tests Rails::Generators::ScaffoldControllerGenerator
6
- arguments %w(Post title body:text)
7
+ arguments %w(Post title body:text images:attachments)
7
8
  destination File.expand_path('../tmp', __FILE__)
8
9
  setup :prepare_destination
9
10
 
@@ -12,7 +13,7 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
12
13
 
13
14
  assert_file 'app/controllers/posts_controller.rb' do |content|
14
15
  assert_instance_method :index, content do |m|
15
- assert_match /@posts = Post\.all/, m
16
+ assert_match %r{@posts = Post\.all}, m
16
17
  end
17
18
 
18
19
  assert_instance_method :show, content do |m|
@@ -20,7 +21,7 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
20
21
  end
21
22
 
22
23
  assert_instance_method :new, content do |m|
23
- assert_match /@post = Post\.new/, m
24
+ assert_match %r{@post = Post\.new}, m
24
25
  end
25
26
 
26
27
  assert_instance_method :edit, content do |m|
@@ -28,29 +29,71 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
28
29
  end
29
30
 
30
31
  assert_instance_method :create, content do |m|
31
- assert_match /@post = Post\.new\(post_params\)/, m
32
- assert_match /@post\.save/, m
33
- assert_match /format\.html \{ redirect_to @post, notice: 'Post was successfully created\.' \}/, m
34
- assert_match /format\.json \{ render action: 'show', status: :created, location: @post \}/, m
35
- assert_match /format\.html \{ render action: 'new' \}/, m
36
- assert_match /format\.json \{ render json: @post\.errors, status: :unprocessable_entity \}/, m
32
+ assert_match %r{@post = Post\.new\(post_params\)}, m
33
+ assert_match %r{@post\.save}, m
34
+ assert_match %r{format\.html \{ redirect_to post_url\(@post\), notice: "Post was successfully created\." \}}, m
35
+ assert_match %r{format\.json \{ render :show, status: :created, location: @post \}}, m
36
+ assert_match %r{format\.html \{ render :new, status: :unprocessable_entity \}}, m
37
+ assert_match %r{format\.json \{ render json: @post\.errors, status: :unprocessable_entity \}}, m
37
38
  end
38
39
 
39
40
  assert_instance_method :update, content do |m|
40
- assert_match /format\.html \{ redirect_to @post, notice: 'Post was successfully updated\.' \}/, m
41
- assert_match /format\.json \{ head :no_content \}/, m
42
- assert_match /format\.html \{ render action: 'edit' \}/, m
43
- assert_match /format\.json \{ render json: @post.errors, status: :unprocessable_entity \}/, m
41
+ assert_match %r{format\.html \{ redirect_to post_url\(@post\), notice: "Post was successfully updated\." \}}, m
42
+ assert_match %r{format\.json \{ render :show, status: :ok, location: @post \}}, m
43
+ assert_match %r{format\.html \{ render :edit, status: :unprocessable_entity \}}, m
44
+ assert_match %r{format\.json \{ render json: @post.errors, status: :unprocessable_entity \}}, m
44
45
  end
45
46
 
46
47
  assert_instance_method :destroy, content do |m|
47
- assert_match /@post\.destroy/, m
48
- assert_match /format\.html { redirect_to posts_url \}/, m
49
- assert_match /format\.json \{ head :no_content \}/, m
48
+ assert_match %r{@post\.destroy}, m
49
+ assert_match %r{format\.html \{ redirect_to posts_url, notice: "Post was successfully destroyed\." \}}, m
50
+ assert_match %r{format\.json \{ head :no_content \}}, m
50
51
  end
51
52
 
52
- assert_match(/def post_params/, content)
53
- assert_match(/params\.require\(:post\)\.permit\(:title, :body\)/, content)
53
+ assert_match %r{def post_params}, content
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
59
+ end
60
+ end
61
+
62
+ if Rails::VERSION::MAJOR >= 6
63
+ test 'controller with namespace' do
64
+ run_generator %w(Admin::Post --model-name=Post)
65
+ assert_file 'app/controllers/admin/posts_controller.rb' do |content|
66
+ assert_instance_method :create, content do |m|
67
+ assert_match %r{format\.html \{ redirect_to admin_post_url\(@post\), notice: "Post was successfully created\." \}}, m
68
+ end
69
+
70
+ assert_instance_method :update, content do |m|
71
+ assert_match %r{format\.html \{ redirect_to admin_post_url\(@post\), notice: "Post was successfully updated\." \}}, m
72
+ end
73
+
74
+ assert_instance_method :destroy, content do |m|
75
+ assert_match %r{format\.html \{ redirect_to admin_posts_url, notice: "Post was successfully destroyed\." \}}, m
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ test "don't use require and permit if there are no attributes" do
82
+ run_generator %w(Post)
83
+
84
+ assert_file 'app/controllers/posts_controller.rb' do |content|
85
+ assert_match %r{def post_params}, content
86
+ assert_match %r{params\.fetch\(:post, \{\}\)}, content
87
+ end
88
+ end
89
+
90
+ if Rails::VERSION::MAJOR >= 6
91
+ test 'handles virtual attributes' do
92
+ run_generator %w(Message content:rich_text video:attachment photos:attachments)
93
+
94
+ assert_file 'app/controllers/messages_controller.rb' do |content|
95
+ assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content
96
+ end
54
97
  end
55
98
  end
56
- end
99
+ end
@@ -0,0 +1,36 @@
1
+ require "bundler/setup"
2
+
3
+ require "rails"
4
+
5
+ require "jbuilder"
6
+
7
+ require "active_support/core_ext/array/access"
8
+ require "active_support/cache/memory_store"
9
+ require "active_support/json"
10
+ require "active_model"
11
+
12
+ require "active_support/testing/autorun"
13
+ require "mocha/minitest"
14
+
15
+ ActiveSupport.test_order = :random
16
+
17
+ class << Rails
18
+ def cache
19
+ @cache ||= ActiveSupport::Cache::MemoryStore.new
20
+ end
21
+ end
22
+
23
+ Jbuilder::CollectionRenderer.collection_cache = Rails.cache
24
+
25
+ class Post < Struct.new(:id, :body, :author_name)
26
+ def cache_key
27
+ "post-#{id}"
28
+ end
29
+ end
30
+
31
+ class Racer < Struct.new(:id, :name)
32
+ extend ActiveModel::Naming
33
+ include ActiveModel::Conversion
34
+ end
35
+
36
+ ActionView::Template.register_template_handler :jbuilder, JbuilderHandler
metadata CHANGED
@@ -1,95 +1,120 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 2.11.5
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: 2013-12-03 00:00:00.000000000 Z
11
+ date: 2021-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
19
+ version: 5.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0
26
+ version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: multi_json
28
+ name: actionview
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2.0
33
+ version: 5.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2.0
40
+ version: 5.0.0
41
41
  description:
42
- email: david@37signals.com
42
+ email: david@basecamp.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
- - .gitignore
48
- - .travis.yml
47
+ - ".github/workflows/ruby.yml"
48
+ - ".gitignore"
49
+ - Appraisals
50
+ - CONTRIBUTING.md
49
51
  - Gemfile
50
- - Gemfile.old
51
52
  - MIT-LICENSE
52
53
  - README.md
53
54
  - Rakefile
55
+ - gemfiles/rails_5_0.gemfile
56
+ - gemfiles/rails_5_1.gemfile
57
+ - gemfiles/rails_5_2.gemfile
58
+ - gemfiles/rails_6_0.gemfile
59
+ - gemfiles/rails_6_1.gemfile
60
+ - gemfiles/rails_head.gemfile
54
61
  - jbuilder.gemspec
55
62
  - lib/generators/rails/jbuilder_generator.rb
56
63
  - lib/generators/rails/scaffold_controller_generator.rb
64
+ - lib/generators/rails/templates/api_controller.rb
57
65
  - lib/generators/rails/templates/controller.rb
58
66
  - lib/generators/rails/templates/index.json.jbuilder
67
+ - lib/generators/rails/templates/partial.json.jbuilder
59
68
  - lib/generators/rails/templates/show.json.jbuilder
60
69
  - lib/jbuilder.rb
70
+ - lib/jbuilder/blank.rb
71
+ - lib/jbuilder/collection_renderer.rb
72
+ - lib/jbuilder/dependency_tracker.rb
73
+ - lib/jbuilder/errors.rb
74
+ - lib/jbuilder/jbuilder.rb
61
75
  - lib/jbuilder/jbuilder_template.rb
76
+ - lib/jbuilder/key_formatter.rb
62
77
  - lib/jbuilder/railtie.rb
78
+ - test/jbuilder_dependency_tracker_test.rb
63
79
  - test/jbuilder_generator_test.rb
64
80
  - test/jbuilder_template_test.rb
65
81
  - test/jbuilder_test.rb
82
+ - test/scaffold_api_controller_generator_test.rb
66
83
  - test/scaffold_controller_generator_test.rb
67
- homepage:
84
+ - test/test_helper.rb
85
+ homepage: https://github.com/rails/jbuilder
68
86
  licenses:
69
87
  - MIT
70
- metadata: {}
88
+ metadata:
89
+ bug_tracker_uri: https://github.com/rails/jbuilder/issues
90
+ changelog_uri: https://github.com/rails/jbuilder/releases/tag/v2.11.5
91
+ mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
92
+ source_code_uri: https://github.com/rails/jbuilder/tree/v2.11.5
93
+ rubygems_mfa_required: 'true'
71
94
  post_install_message:
72
95
  rdoc_options: []
73
96
  require_paths:
74
97
  - lib
75
98
  required_ruby_version: !ruby/object:Gem::Requirement
76
99
  requirements:
77
- - - '>='
100
+ - - ">="
78
101
  - !ruby/object:Gem::Version
79
- version: '0'
102
+ version: 2.2.2
80
103
  required_rubygems_version: !ruby/object:Gem::Requirement
81
104
  requirements:
82
- - - '>='
105
+ - - ">="
83
106
  - !ruby/object:Gem::Version
84
107
  version: '0'
85
108
  requirements: []
86
- rubyforge_project:
87
- rubygems_version: 2.0.14
109
+ rubygems_version: 3.2.32
88
110
  signing_key:
89
111
  specification_version: 4
90
112
  summary: Create JSON structures via a Builder-style DSL
91
113
  test_files:
114
+ - test/jbuilder_dependency_tracker_test.rb
92
115
  - test/jbuilder_generator_test.rb
93
116
  - test/jbuilder_template_test.rb
94
117
  - test/jbuilder_test.rb
118
+ - test/scaffold_api_controller_generator_test.rb
95
119
  - test/scaffold_controller_generator_test.rb
120
+ - test/test_helper.rb
data/.travis.yml DELETED
@@ -1,38 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 1.8.7
5
- - 1.9.2
6
- - 1.9.3
7
- - 2.0.0
8
- - ruby-head
9
- - ree
10
- - jruby-18mode
11
- - jruby-19mode
12
- - rbx-18mode
13
- - rbx-19mode
14
-
15
- gemfile:
16
- - Gemfile.old
17
- - Gemfile
18
-
19
- matrix:
20
- exclude:
21
- # Edge Rails is only compatible with 1.9.3+
22
- - gemfile: Gemfile
23
- rvm: 1.8.7
24
- - gemfile: Gemfile
25
- rvm: 1.9.2
26
- - gemfile: Gemfile
27
- rvm: ree
28
- - gemfile: Gemfile
29
- rvm: jruby-18mode
30
- - gemfile: Gemfile
31
- rvm: rbx-18mode
32
- allow_failures:
33
- - rvm: ruby-head
34
- - rvm: rbx-18mode
35
- - rvm: rbx-19mode
36
-
37
- notifications:
38
- email: false
data/Gemfile.old DELETED
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- gem 'rake'
6
- gem 'mocha', :require => false
7
- gem 'actionpack', '~> 3.0'