Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rubygem-jbuilder for openSUSE:Factory checked in at 2021-02-20 22:12:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-jbuilder (Old) and /work/SRC/openSUSE:Factory/.rubygem-jbuilder.new.28504 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-jbuilder" Sat Feb 20 22:12:05 2021 rev:24 rq:869948 version:2.11.2 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-jbuilder/rubygem-jbuilder.changes 2020-10-05 19:31:44.696852394 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-jbuilder.new.28504/rubygem-jbuilder.changes 2021-02-20 22:12:12.687034050 +0100 @@ -1,0 +2,7 @@ +Sat Feb 6 11:30:12 UTC 2021 - Manuel Schnitzer <mschnit...@suse.com> + +- updated to version 2.11.2 + + * Improve key formatting for nested hashes and disable by default + +------------------------------------------------------------------- Old: ---- jbuilder-2.10.1.gem New: ---- jbuilder-2.11.2.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-jbuilder.spec ++++++ --- /var/tmp/diff_new_pack.fuHi1J/_old 2021-02-20 22:12:13.099034487 +0100 +++ /var/tmp/diff_new_pack.fuHi1J/_new 2021-02-20 22:12:13.099034487 +0100 @@ -1,7 +1,7 @@ # # spec file for package rubygem-jbuilder # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-jbuilder -Version: 2.10.1 +Version: 2.11.2 Release: 0 %define mod_name jbuilder %define mod_full_name %{mod_name}-%{version} ++++++ jbuilder-2.10.1.gem -> jbuilder-2.11.2.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md --- old/CHANGELOG.md 2020-09-12 16:41:21.000000000 +0200 +++ new/CHANGELOG.md 2021-01-27 13:37:14.000000000 +0100 @@ -1,12 +1,35 @@ # Changelog +2.11.2 +------ + +* [Improve key formatting for nested hashes and disable by default](https://github.com/rails/jbuilder/pull/497) + +2.11.1 +------ + +* Use symbols instead of strings for before_action filters [DHH] +* Slim down comments in generated scaffold code [DHH] + +2.11.0 +------ + +* [Allow jbuilder instance to be passed to #merge!](https://github.com/rails/jbuilder/pull/485) +* [Fix for key_format! when using nested hashes](https://github.com/rails/jbuilder/pull/486) +* [Include rich_text, attachment, and attachments fields in json partial](https://github.com/rails/jbuilder/pull/459) + +2.10.2 +------ + +* Update scaffold generator to use double quotes, 422 form error responds, and modern string-of-arrays syntax [DHH] + 2.10.1 ----------- +------ * Fix keyword arguments warning on Ruby 2.7 2.10.0 ----------- +------ * Requires Rails 5+ and Ruby 2.2+ * Nested hashes are deep-merged diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CONTRIBUTING.md new/CONTRIBUTING.md --- old/CONTRIBUTING.md 2020-09-12 16:41:21.000000000 +0200 +++ new/CONTRIBUTING.md 2021-01-27 13:37:14.000000000 +0100 @@ -13,7 +13,7 @@ #### Fork the Project -Fork the [project on Github](https://github.com/rails/jbuilder) and check out your copy. +Fork the [project on GitHub](https://github.com/rails/jbuilder) and check out your copy. ``` git clone https://github.com/contributor/jbuilder.git diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2020-09-12 16:41:21.000000000 +0200 +++ new/README.md 2021-01-27 13:37:14.000000000 +0100 @@ -274,6 +274,25 @@ Jbuilder.key_format camelize: :lower ``` +By default, key format is not applied to keys of hashes that are +passed to methods like `set!`, `array!` or `merge!`. You can opt into +deeply transforming these as well: + +``` ruby +json.key_format! camelize: :lower +json.deep_format_keys! +json.settings([{some_value: "abc"}]) + +# => { "settings": [{ "someValue": "abc" }]} +``` + +You can set this globally with the class method `deep_format_keys` (from inside your +environment.rb for example): + +``` ruby +Jbuilder.deep_format_keys true +``` + ## Contributing to Jbuilder Jbuilder is the work of many contributors. You're encouraged to submit pull requests, propose Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jbuilder.gemspec new/jbuilder.gemspec --- old/jbuilder.gemspec 2020-09-12 16:41:21.000000000 +0200 +++ new/jbuilder.gemspec 2021-01-27 13:37:14.000000000 +0100 @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = 'jbuilder' - s.version = '2.10.1' + s.version = '2.11.2' s.authors = 'David Heinemeier Hansson' s.email = 'da...@basecamp.com' s.summary = 'Create JSON structures via a Builder-style DSL' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/generators/rails/jbuilder_generator.rb new/lib/generators/rails/jbuilder_generator.rb --- old/lib/generators/rails/jbuilder_generator.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/lib/generators/rails/jbuilder_generator.rb 2021-01-27 13:37:14.000000000 +0100 @@ -50,6 +50,10 @@ attributes.map { |a| ":#{a}"} * ', ' end + + def virtual_attributes + attributes.select {|name| name.respond_to?(:virtual?) && name.virtual? } + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/generators/rails/templates/api_controller.rb new/lib/generators/rails/templates/api_controller.rb --- old/lib/generators/rails/templates/api_controller.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/lib/generators/rails/templates/api_controller.rb 2021-01-27 13:37:14.000000000 +0100 @@ -4,7 +4,7 @@ <% end -%> <% module_namespacing do -%> class <%= controller_class_name %>Controller < ApplicationController - before_action :set_<%= singular_table_name %>, only: [:show, :update, :destroy] + before_action :set_<%= singular_table_name %>, only: %i[ show update destroy ] # GET <%= route_url %> # GET <%= route_url %>.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/generators/rails/templates/controller.rb new/lib/generators/rails/templates/controller.rb --- old/lib/generators/rails/templates/controller.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/lib/generators/rails/templates/controller.rb 2021-01-27 13:37:14.000000000 +0100 @@ -4,16 +4,14 @@ <% end -%> <% module_namespacing do -%> class <%= controller_class_name %>Controller < ApplicationController - before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy] + before_action :set_<%= singular_table_name %>, only: %i[ show edit update destroy ] - # GET <%= route_url %> - # GET <%= route_url %>.json + # GET <%= route_url %> or <%= route_url %>.json def index @<%= plural_table_name %> = <%= orm_class.all(class_name) %> end - # GET <%= route_url %>/1 - # GET <%= route_url %>/1.json + # GET <%= route_url %>/1 or <%= route_url %>/1.json def show end @@ -26,42 +24,39 @@ def edit end - # POST <%= route_url %> - # POST <%= route_url %>.json + # POST <%= route_url %> or <%= route_url %>.json def create @<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %> respond_to do |format| if @<%= orm_instance.save %> - format.html { redirect_to @<%= singular_table_name %>, notice: <%= "'#{human_name} was successfully created.'" %> } + format.html { redirect_to @<%= singular_table_name %>, notice: <%= %("#{human_name} was successfully created.") %> } format.json { render :show, status: :created, location: <%= "@#{singular_table_name}" %> } else - format.html { render :new } + format.html { render :new, status: :unprocessable_entity } format.json { render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity } end end end - # PATCH/PUT <%= route_url %>/1 - # PATCH/PUT <%= route_url %>/1.json + # PATCH/PUT <%= route_url %>/1 or <%= route_url %>/1.json def update respond_to do |format| if @<%= orm_instance.update("#{singular_table_name}_params") %> - format.html { redirect_to @<%= singular_table_name %>, notice: <%= "'#{human_name} was successfully updated.'" %> } + format.html { redirect_to @<%= singular_table_name %>, notice: <%= %("#{human_name} was successfully updated.") %> } format.json { render :show, status: :ok, location: <%= "@#{singular_table_name}" %> } else - format.html { render :edit } + format.html { render :edit, status: :unprocessable_entity } format.json { render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity } end end end - # DELETE <%= route_url %>/1 - # DELETE <%= route_url %>/1.json + # DELETE <%= route_url %>/1 or <%= route_url %>/1.json def destroy @<%= orm_instance.destroy %> respond_to do |format| - format.html { redirect_to <%= index_helper %>_url, notice: <%= "'#{human_name} was successfully destroyed.'" %> } + format.html { redirect_to <%= index_helper %>_url, notice: <%= %("#{human_name} was successfully destroyed.") %> } format.json { head :no_content } end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/generators/rails/templates/partial.json.jbuilder new/lib/generators/rails/templates/partial.json.jbuilder --- old/lib/generators/rails/templates/partial.json.jbuilder 2020-09-12 16:41:21.000000000 +0200 +++ new/lib/generators/rails/templates/partial.json.jbuilder 2021-01-27 13:37:14.000000000 +0100 @@ -1,2 +1,16 @@ json.extract! <%= singular_table_name %>, <%= full_attributes_list %> json.url <%= singular_table_name %>_url(<%= singular_table_name %>, format: :json) +<%- virtual_attributes.each do |attribute| -%> +<%- if attribute.type == :rich_text -%> +json.<%= attribute.name %> <%= singular_table_name %>.<%= attribute.name %>.to_s +<%- elsif attribute.type == :attachment -%> +json.<%= attribute.name %> url_for(<%= singular_table_name %>.<%= attribute.name %>) +<%- elsif attribute.type == :attachments -%> +json.<%= attribute.name %> do + json.array!(<%= singular_table_name %>.<%= attribute.name %>) do |<%= attribute.singular_name %>| + json.id <%= attribute.singular_name %>.id + json.url url_for(<%= attribute.singular_name %>) + end +end +<%- end -%> +<%- end -%> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/jbuilder.rb new/lib/jbuilder.rb --- old/lib/jbuilder.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/lib/jbuilder.rb 2021-01-27 13:37:14.000000000 +0100 @@ -9,12 +9,14 @@ class Jbuilder @@key_formatter = nil @@ignore_nil = false + @@deep_format_keys = false def initialize(options = {}) @attributes = {} @key_formatter = options.fetch(:key_formatter){ @@key_formatter ? @@key_formatter.clone : nil} @ignore_nil = options.fetch(:ignore_nil, @@ignore_nil) + @deep_format_keys = options.fetch(:deep_format_keys, @@deep_format_keys) yield self if ::Kernel.block_given? end @@ -43,11 +45,11 @@ # json.age 32 # json.person another_jbuilder # { "age": 32, "person": { ... } - value.attributes! + _format_keys(value.attributes!) else # json.age 32 # { "age": 32 } - value + _format_keys(value) end elsif _is_collection?(value) # json.comments @post.comments, :content, :created_at @@ -131,6 +133,31 @@ @@ignore_nil = value end + # Deeply apply key format to nested hashes and arrays passed to + # methods like set!, merge! or array!. + # + # Example: + # + # json.key_format! camelize: :lower + # json.settings({some_value: "abc"}) + # + # { "settings": { "some_value": "abc" }} + # + # json.key_format! camelize: :lower + # json.deep_format_keys! + # json.settings({some_value: "abc"}) + # + # { "settings": { "someValue": "abc" }} + # + def deep_format_keys!(value = true) + @deep_format_keys = value + end + + # Same as instance method deep_format_keys! except sets the default. + def self.deep_format_keys(value = true) + @@deep_format_keys = value + end + # Turns the current element into an array and yields a builder to add a hash. # # Example: @@ -190,10 +217,10 @@ elsif attributes.any? _map_collection(collection) { |element| extract! element, *attributes } else - collection.to_a + _format_keys(collection.to_a) end - merge! array + @attributes = _merge_values(@attributes, array) end # Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON. @@ -241,9 +268,10 @@ @attributes end - # Merges hash or array into current builder. - def merge!(hash_or_array) - @attributes = _merge_values(@attributes, hash_or_array) + # Merges hash, array, or Jbuilder instance into current builder. + def merge!(object) + hash_or_array = ::Jbuilder === object ? object.attributes! : object + @attributes = _merge_values(@attributes, _format_keys(hash_or_array)) end # Encodes the current builder as JSON. @@ -254,11 +282,11 @@ private def _extract_hash_values(object, attributes) - attributes.each{ |key| _set_value key, object.fetch(key) } + attributes.each{ |key| _set_value key, _format_keys(object.fetch(key)) } end def _extract_method_values(object, attributes) - attributes.each{ |key| _set_value key, object.public_send(key) } + attributes.each{ |key| _set_value key, _format_keys(object.public_send(key)) } end def _merge_block(key) @@ -286,6 +314,18 @@ @key_formatter ? @key_formatter.format(key) : key.to_s end + def _format_keys(hash_or_array) + return hash_or_array unless @deep_format_keys + + if ::Array === hash_or_array + hash_or_array.map { |value| _format_keys(value) } + elsif ::Hash === hash_or_array + ::Hash[hash_or_array.collect { |k, v| [_key(k), _format_keys(v)] }] + else + hash_or_array + end + end + def _set_value(key, value) raise NullError.build(key) if @attributes.nil? raise ArrayError.build(key) if ::Array === @attributes @@ -301,12 +341,12 @@ end def _scope - parent_attributes, parent_formatter = @attributes, @key_formatter + parent_attributes, parent_formatter, parent_deep_format_keys = @attributes, @key_formatter, @deep_format_keys @attributes = BLANK yield @attributes ensure - @attributes, @key_formatter = parent_attributes, parent_formatter + @attributes, @key_formatter, @deep_format_keys = parent_attributes, parent_formatter, parent_deep_format_keys end def _is_collection?(object) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2020-09-12 16:41:21.000000000 +0200 +++ new/metadata 2021-01-27 13:37:14.000000000 +0100 @@ -1,14 +1,14 @@ --- !ruby/object:Gem::Specification name: jbuilder version: !ruby/object:Gem::Version - version: 2.10.1 + version: 2.11.2 platform: ruby authors: - David Heinemeier Hansson -autorequire: +autorequire: bindir: bin cert_chain: [] -date: 2020-09-12 00:00:00.000000000 Z +date: 2021-01-27 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: activesupport @@ -24,7 +24,7 @@ - - ">=" - !ruby/object:Gem::Version version: 5.0.0 -description: +description: email: da...@basecamp.com executables: [] extensions: [] @@ -71,7 +71,7 @@ licenses: - MIT metadata: {} -post_install_message: +post_install_message: rdoc_options: [] require_paths: - lib @@ -87,7 +87,7 @@ version: '0' requirements: [] rubygems_version: 3.1.2 -signing_key: +signing_key: specification_version: 4 summary: Create JSON structures via a Builder-style DSL test_files: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/jbuilder_generator_test.rb new/test/jbuilder_generator_test.rb --- old/test/jbuilder_generator_test.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/test/jbuilder_generator_test.rb 2021-01-27 13:37:14.000000000 +0100 @@ -43,4 +43,16 @@ assert_no_match %r{:created_at, :updated_at}, content end end + + if Rails::VERSION::MAJOR >= 6 + test 'handles virtual attributes' do + run_generator %w(Message content:rich_text video:attachment photos:attachments) + + assert_file 'app/views/messages/_message.json.jbuilder' do |content| + assert_match %r{json\.content message\.content\.to_s}, content + assert_match %r{json\.video url_for\(message\.video\)}, content + assert_match %r{json\.photos do\n json\.array!\(message\.photos\) do \|photo\|\n json\.id photo\.id\n json\.url url_for\(photo\)\n end\nend}, content + end + end + end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/jbuilder_test.rb new/test/jbuilder_test.rb --- old/test/jbuilder_test.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/test/jbuilder_test.rb 2021-01-27 13:37:14.000000000 +0100 @@ -196,6 +196,18 @@ assert_equal 'Pavel', result['author']['name'] end + test 'support merge! method with Jbuilder instance' do + obj = jbuild do |json| + json.foo 'bar' + end + + result = jbuild do |json| + json.merge! obj + end + + assert_equal 'bar', result['foo'] + end + test 'blocks are additive via extract syntax' do person = Person.new('Pavel', 27) @@ -554,6 +566,36 @@ assert_equal 'one', result['level1'] end + test 'key_format! can be changed in child elements' do + result = jbuild do |json| + json.key_format! camelize: :lower + + json.level_one do + json.key_format! :upcase + json.value 'two' + end + end + + assert_equal ['levelOne'], result.keys + assert_equal ['VALUE'], result['levelOne'].keys + end + + test 'key_format! can be changed in array!' do + result = jbuild do |json| + json.key_format! camelize: :lower + + json.level_one do + json.array! [{value: 'two'}] do |object| + json.key_format! :upcase + json.value object[:value] + end + end + end + + assert_equal ['levelOne'], result.keys + assert_equal ['VALUE'], result['levelOne'][0].keys + end + test 'key_format! with no parameter' do result = jbuild do |json| json.key_format! :upcase @@ -581,6 +623,161 @@ assert_equal ['oats and friends'], result.keys end + test 'key_format! is not applied deeply by default' do + names = { first_name: 'camel', last_name: 'case' } + result = jbuild do |json| + json.key_format! camelize: :lower + json.set! :all_names, names + end + + assert_equal %i[first_name last_name], result['allNames'].keys + end + + test 'applying key_format! deeply can be enabled per scope' do + names = { first_name: 'camel', last_name: 'case' } + result = jbuild do |json| + json.key_format! camelize: :lower + json.scope do + json.deep_format_keys! + json.set! :all_names, names + end + json.set! :all_names, names + end + + assert_equal %w[firstName lastName], result['scope']['allNames'].keys + assert_equal %i[first_name last_name], result['allNames'].keys + end + + test 'applying key_format! deeply can be disabled per scope' do + names = { first_name: 'camel', last_name: 'case' } + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.set! :all_names, names + json.scope do + json.deep_format_keys! false + json.set! :all_names, names + end + end + + assert_equal %w[firstName lastName], result['allNames'].keys + assert_equal %i[first_name last_name], result['scope']['allNames'].keys + end + + test 'applying key_format! deeply can be enabled globally' do + names = { first_name: 'camel', last_name: 'case' } + + Jbuilder.deep_format_keys true + result = jbuild do |json| + json.key_format! camelize: :lower + json.set! :all_names, names + end + + assert_equal %w[firstName lastName], result['allNames'].keys + Jbuilder.send(:class_variable_set, '@@deep_format_keys', false) + end + + test 'deep key_format! with merge!' do + hash = { camel_style: 'for JS' } + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.merge! hash + end + + assert_equal ['camelStyle'], result.keys + end + + test 'deep key_format! with merge! deep' do + hash = { camel_style: { sub_attr: 'for JS' } } + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.merge! hash + end + + assert_equal ['subAttr'], result['camelStyle'].keys + end + + test 'deep key_format! with set! array of hashes' do + names = [{ first_name: 'camel', last_name: 'case' }] + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.set! :names, names + end + + assert_equal %w[firstName lastName], result['names'][0].keys + end + + test 'deep key_format! with set! extracting hash from object' do + comment = Struct.new(:author).new({ first_name: 'camel', last_name: 'case' }) + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.set! :comment, comment, :author + end + + assert_equal %w[firstName lastName], result['comment']['author'].keys + end + + test 'deep key_format! with array! of hashes' do + names = [{ first_name: 'camel', last_name: 'case' }] + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.array! names + end + + assert_equal %w[firstName lastName], result[0].keys + end + + test 'deep key_format! with merge! array of hashes' do + names = [{ first_name: 'camel', last_name: 'case' }] + new_names = [{ first_name: 'snake', last_name: 'case' }] + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.array! names + json.merge! new_names + end + + assert_equal %w[firstName lastName], result[1].keys + end + + test 'deep key_format! is applied to hash extracted from object' do + comment = Struct.new(:author).new({ first_name: 'camel', last_name: 'case' }) + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.extract! comment, :author + end + + assert_equal %w[firstName lastName], result['author'].keys + end + + test 'deep key_format! is applied to hash extracted from hash' do + comment = {author: { first_name: 'camel', last_name: 'case' }} + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.extract! comment, :author + end + + assert_equal %w[firstName lastName], result['author'].keys + end + + test 'deep key_format! is applied to hash extracted directly from array' do + comments = [Struct.new(:author).new({ first_name: 'camel', last_name: 'case' })] + result = jbuild do |json| + json.key_format! camelize: :lower + json.deep_format_keys! + json.array! comments, :author + end + + assert_equal %w[firstName lastName], result[0]['author'].keys + end + test 'default key_format!' do Jbuilder.key_format camelize: :lower result = jbuild{ |json| json.camel_style 'for JS' } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/scaffold_api_controller_generator_test.rb new/test/scaffold_api_controller_generator_test.rb --- old/test/scaffold_api_controller_generator_test.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/test/scaffold_api_controller_generator_test.rb 2021-01-27 13:37:14.000000000 +0100 @@ -55,5 +55,16 @@ assert_match %r{params\.fetch\(:post, \{\}\)}, content end end + + + if Rails::VERSION::MAJOR >= 6 + test 'handles virtual attributes' do + run_generator ["Message", "content:rich_text", "video:attachment", "photos:attachments"] + + assert_file 'app/controllers/messages_controller.rb' do |content| + assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content + end + end + end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/scaffold_controller_generator_test.rb new/test/scaffold_controller_generator_test.rb --- old/test/scaffold_controller_generator_test.rb 2020-09-12 16:41:21.000000000 +0200 +++ new/test/scaffold_controller_generator_test.rb 2021-01-27 13:37:14.000000000 +0100 @@ -31,22 +31,22 @@ assert_instance_method :create, content do |m| assert_match %r{@post = Post\.new\(post_params\)}, m assert_match %r{@post\.save}, m - assert_match %r{format\.html \{ redirect_to @post, notice: 'Post was successfully created\.' \}}, m + assert_match %r{format\.html \{ redirect_to @post, notice: "Post was successfully created\." \}}, m assert_match %r{format\.json \{ render :show, status: :created, location: @post \}}, m - assert_match %r{format\.html \{ render :new \}}, m + assert_match %r{format\.html \{ render :new, status: :unprocessable_entity \}}, m assert_match %r{format\.json \{ render json: @post\.errors, status: :unprocessable_entity \}}, m end assert_instance_method :update, content do |m| - assert_match %r{format\.html \{ redirect_to @post, notice: 'Post was successfully updated\.' \}}, m + assert_match %r{format\.html \{ redirect_to @post, notice: "Post was successfully updated\." \}}, m assert_match %r{format\.json \{ render :show, status: :ok, location: @post \}}, m - assert_match %r{format\.html \{ render :edit \}}, m + assert_match %r{format\.html \{ render :edit, status: :unprocessable_entity \}}, m assert_match %r{format\.json \{ render json: @post.errors, status: :unprocessable_entity \}}, m end assert_instance_method :destroy, content do |m| assert_match %r{@post\.destroy}, m - assert_match %r{format\.html \{ redirect_to posts_url, notice: 'Post was successfully destroyed\.' \}}, m + assert_match %r{format\.html \{ redirect_to posts_url, notice: "Post was successfully destroyed\." \}}, m assert_match %r{format\.json \{ head :no_content \}}, m end @@ -67,4 +67,14 @@ assert_match %r{params\.fetch\(:post, \{\}\)}, content end end + + if Rails::VERSION::MAJOR >= 6 + test 'handles virtual attributes' do + run_generator %w(Message content:rich_text video:attachment photos:attachments) + + assert_file 'app/controllers/messages_controller.rb' do |content| + assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content + end + end + end end