jbuilder 1.5.3 → 2.11.5

Sign up to get free protection for your applications and to get access to all the features.
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'