express_admin 1.4.5 → 1.4.6

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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/components/express_admin/smart_form.rb +4 -3
  3. data/app/components/express_admin/smart_table.rb +0 -4
  4. data/app/controllers/express_admin/standard_controller.rb +13 -0
  5. data/lib/express_admin/standard_actions.rb +155 -0
  6. data/lib/express_admin/version.rb +1 -1
  7. data/lib/generators/express_admin/install/install_generator.rb +0 -5
  8. data/lib/generators/express_admin/scaffold/templates/controller/controller.rb +1 -8
  9. data/test/controllers/standard_controller_test.rb +97 -0
  10. data/test/dummy/db/test.sqlite3 +0 -0
  11. data/test/dummy/test/components/smart_form_test.rb +1 -1
  12. data/test/lib/generators/express_admin/install_generator_test.rb +0 -7
  13. data/test/lib/generators/express_admin/scaffold_generator_test.rb +1 -4
  14. data/test/test_helper.rb +5 -0
  15. data/vendor/gems/express_templates/express_templates-0.9.5.gem +0 -0
  16. data/vendor/gems/express_templates/lib/arbre/patches.rb +14 -0
  17. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +46 -10
  18. data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +2 -2
  19. data/vendor/gems/express_templates/lib/express_templates/components/forms/express_form.rb +1 -1
  20. data/vendor/gems/express_templates/lib/express_templates/components/forms/option_support.rb +10 -6
  21. data/vendor/gems/express_templates/lib/express_templates/version.rb +1 -1
  22. data/vendor/gems/express_templates/test/components/configurable_test.rb +13 -0
  23. data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +0 -4
  24. data/vendor/gems/express_templates/test/dummy/log/test.log +963 -0
  25. metadata +9 -5
  26. data/lib/generators/express_admin/install/templates/controllers/admin_controller.rb.erb +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4e4c3c080c9d417ad96cec7a4f482d681998e89
4
- data.tar.gz: 39e8700c94d154d98d25930090d3794c81d16aa0
3
+ metadata.gz: 50d6a3fea68da45a25497be729e3f4122d3073ec
4
+ data.tar.gz: 1ffe48826b7a7a330a6adf849bcfd92b20562de0
5
5
  SHA512:
6
- metadata.gz: 64e004b1571753b064868e753d29035a198b079316b12745ac77d1ce2856a0030562a70fe8a34805bfdcb6eec65c1e3fbc650a13333d3dd57646c2569dbc9265
7
- data.tar.gz: 886a1812ab705290b6cf3a97a242495371b46e56e8b3b6fdd1e7a8469d84e957137b33f0d2963bd6c39e127ee13571131c554d8e48bb46c05c19b167ea6a2021
6
+ metadata.gz: 5de456daa50c148a1eff7f6119f3edb0213589fb4111ae344fd9e70b9630c436a51d0c9cfa2b068ab7576beb8873b7f4ae0b2276fbfee9469144853646910961
7
+ data.tar.gz: 7c543198ff8aabf901bc459cb48bde95afede6f011e3c4507e7e6936daf74ce68ccd995e83ae1658470ed470eea30fcf8bbd42cc337835f4b0eff1422ce81d08
@@ -4,9 +4,10 @@ module ExpressAdmin
4
4
  class SmartForm < ExpressTemplates::Components::Forms::ExpressForm
5
5
  TIMESTAMPS = %w(updated_at created_at)
6
6
 
7
- has_option :virtual, 'Override the list of virtual attributes of the resource to be displayed'
8
- has_option :exclude, 'Attributes not to be included in the form'
9
- has_option :only, 'Respects the order the attributes are listed in'
7
+ has_option :virtual, 'Override the list of virtual attributes of the resource to be displayed', type: :array,
8
+ values: -> (*) { resource_class.respond_to?(:virtual_attributes) ? resource_class.virtual_attributes : [] }
9
+ has_option :exclude, 'Attributes not to be included in the form', type: :array
10
+ has_option :only, 'Respects the order the attributes are listed in', type: :array
10
11
  has_option :show_timestamps, 'Set to true to show timestamps as labels'
11
12
 
12
13
  contains {
@@ -69,10 +69,6 @@ module ExpressAdmin
69
69
  !!config[:show_actions]
70
70
  end
71
71
 
72
- def resource_path(item)
73
- helpers.send(resource_path_helper, item.to_param)
74
- end
75
-
76
72
  def should_show_delete?(item)
77
73
  if item.respond_to?(:can_delete?) && item.can_delete?
78
74
  true
@@ -0,0 +1,13 @@
1
+ require 'express_admin/standard_actions'
2
+
3
+ module ExpressAdmin
4
+ class StandardController < ::ApplicationController
5
+
6
+ include StandardActions
7
+
8
+ def initialize(*args)
9
+ raise "StandardController must be subclassed" if self.class.eql?(StandardController)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,155 @@
1
+ module ExpressAdmin
2
+ module StandardActions
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ extend ClassMethods
7
+ include InstanceMethods
8
+ helper_method :collection
9
+ helper_method :resource
10
+
11
+ class_attribute :defaults
12
+ self.defaults = {layout: 'layouts/express_admin/admin'}
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def inherited(base)
18
+ base.class_eval <<-RUBY
19
+ def #{base.resource_name}_params
20
+ params.require(:#{base.resource_name}).permit!
21
+ end
22
+ RUBY
23
+ end
24
+
25
+ def resource_name
26
+ self.to_s.demodulize.gsub(/Controller$/, '').singularize.underscore
27
+ end
28
+ end
29
+
30
+ module InstanceMethods
31
+ def index
32
+ build_resource
33
+ load_collection
34
+ respond_to do |format|
35
+ format.html { render :index, layout: defaults[:layout] }
36
+ end
37
+ end
38
+
39
+ def new
40
+ build_resource
41
+ respond_to do |format|
42
+ format.html { render :new, layout: defaults[:layout] }
43
+ end
44
+ end
45
+
46
+ def create
47
+ build_resource(resource_params)
48
+ if resource.save
49
+ respond_to do |format|
50
+ format.html { redirect_to resource_path }
51
+ end
52
+ else
53
+ respond_to do |format|
54
+ format.html { render :new, layout: defaults[:layout] }
55
+ end
56
+ end
57
+ end
58
+
59
+ def show
60
+ load_resource
61
+ load_collection
62
+ respond_to do |format|
63
+ format.html { render :show, layout: defaults[:layout] }
64
+ end
65
+ end
66
+
67
+ def edit
68
+ load_resource
69
+ respond_to do |format|
70
+ format.html { render :edit, layout: defaults[:layout] }
71
+ end
72
+ end
73
+
74
+ def update
75
+ load_resource
76
+ if resource.update_attributes(resource_params)
77
+ respond_to do |format|
78
+ format.html { redirect_to resource_path }
79
+ end
80
+ else
81
+ respond_to do |format|
82
+ format.html { render :edit, layout: defaults[:layout] }
83
+ end
84
+ end
85
+ end
86
+
87
+ def destroy
88
+ load_resource
89
+ resource.destroy!
90
+ respond_to do |format|
91
+ format.html { redirect_to :index }
92
+ end
93
+ end
94
+
95
+ protected
96
+ def resource_path
97
+ namespace_route_proxy.send("#{resource_name}_path", resource)
98
+ end
99
+
100
+ def namespace_route_proxy
101
+ if parent_namespace = self.class.to_s.match(/(\w+)::/).try(:[], 1)
102
+ self.send(parent_namespace.underscore)
103
+ else
104
+ self
105
+ end
106
+ end
107
+
108
+ def resource_params
109
+ self.send("#{resource_name}_params")
110
+ end
111
+
112
+ def load_collection
113
+ self.instance_variable_set(collection_ivar, resource_class.all)
114
+ end
115
+
116
+ def collection_ivar
117
+ "@#{collection_name}".to_sym
118
+ end
119
+
120
+ def collection
121
+ self.instance_variable_get(collection_ivar)
122
+ end
123
+
124
+ def collection_name
125
+ self.class.to_s.demodulize.gsub(/Controller$/, '').pluralize.underscore
126
+ end
127
+
128
+ def resource
129
+ self.instance_variable_get(resource_ivar)
130
+ end
131
+
132
+ def build_resource(*args)
133
+ self.instance_variable_set(resource_ivar, resource_class.new(*args))
134
+ end
135
+
136
+ def load_resource
137
+ self.instance_variable_set(resource_ivar, resource_class.find(params[:id]))
138
+ end
139
+
140
+ def resource_ivar
141
+ "@#{resource_name}".to_sym
142
+ end
143
+
144
+ def resource_class
145
+ self.class.to_s.gsub(/Controller$/, '').singularize.classify.constantize
146
+ end
147
+
148
+ # Foo::WidgetsController -> widget
149
+ def resource_name
150
+ self.class.resource_name
151
+ end
152
+ end
153
+
154
+ end
155
+ end
@@ -1,3 +1,3 @@
1
1
  module ExpressAdmin
2
- VERSION = "1.4.5"
2
+ VERSION = "1.4.6"
3
3
  end
@@ -19,11 +19,6 @@ module ExpressAdmin
19
19
  File.join('test/lib/generators', @project_name, 'install', 'install_generator_test.rb')
20
20
  end
21
21
 
22
- def create_admin_controller
23
- template 'controllers/admin_controller.rb.erb',
24
- File.join('app/controllers', @project_name, 'admin_controller.rb')
25
- end
26
-
27
22
  def create_admin_layout
28
23
  template 'views/layouts/admin.html.et',
29
24
  File.join('app/views/layouts', @project_name, 'admin.html.et')
@@ -1,12 +1,5 @@
1
1
  <% module_namespacing do -%>
2
- class <%= controller_class_name %>Controller < AdminController
2
+ class <%= controller_class_name %>Controller < ExpressAdmin::StandardController
3
3
 
4
- defaults resource_class: <%= model_class_name %>
5
-
6
- private
7
-
8
- def <%= singular_table_name %>_params
9
- params.require(:<%= singular_table_name %>).permit!
10
- end
11
4
  end
12
5
  <% end -%>
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ module ExpressAdmin
4
+
5
+ class StandardControllerTest < ActiveSupport::TestCase
6
+
7
+ class WidgetsController < StandardController
8
+ def resource_class
9
+ Widget
10
+ end
11
+ end
12
+
13
+ def widgets_controller(params = {})
14
+ @widgets_controller ||= WidgetsController.new
15
+ eigenclass = class << @widgets_controller ; self ; end
16
+ eigenclass.send(:define_method, :params) do
17
+ ActionController::Parameters.new(params.with_indifferent_access)
18
+ end
19
+ eigenclass.send(:define_method, :respond_to) do |&block|
20
+ block.call(ActionController::MimeResponds::Collector.new([], 'text/html'))
21
+ end
22
+ @widgets_controller
23
+ end
24
+
25
+ test "it should have all the standard actions" do
26
+ [:new, :create, :show, :index, :edit, :update, :destroy].each do |action|
27
+ assert StandardController.instance_methods.include?(action), "StandardController does not implement ##{action}"
28
+ end
29
+ end
30
+
31
+ test "should require a subclass for instantiation" do
32
+ assert_raises(RuntimeError) do
33
+ StandardController.new
34
+ end
35
+ end
36
+
37
+ def resource
38
+ widgets_controller.instance_variable_get(:@widget)
39
+ end
40
+
41
+ def collection
42
+ widgets_controller.instance_variable_get(:@widgets)
43
+ end
44
+
45
+ test "#new should expose a new instance of resource" do
46
+ widgets_controller.new
47
+ assert resource, "@widget not provided by #new"
48
+ refute resource.persisted?, "@widget should not be persisted"
49
+ end
50
+
51
+ test "#create should expose an instance of resource" do
52
+ widgets_controller(widget: {column2: 'nothing'}).create
53
+ assert resource, "@widget not provided by #create"
54
+ assert resource.persisted?, "@widget not saved"
55
+ end
56
+
57
+ test "#show should expose an instance of resource if found" do
58
+ widgets_controller(id: widgets(:one).id).show
59
+ assert resource, "@widget not provided by #show"
60
+ assert resource.persisted?, "@widget not saved"
61
+ end
62
+
63
+ test "#index should expose a collection of resources" do
64
+ widgets_controller.index
65
+ assert collection, "@widgets not provided by #index"
66
+ refute collection.empty?, "@widgets is empty"
67
+ end
68
+
69
+ test "#edit should expose an instance of resource if found" do
70
+ widgets_controller(id: widgets(:one).id).edit
71
+ assert resource, "@widget not provided by #edit"
72
+ assert resource.persisted?, "@widget not saved"
73
+ end
74
+
75
+ test "#update should expose an updated instance of resource if found" do
76
+ widgets_controller(id: widgets(:one).id, widget: {column2: "Updated"}).update
77
+ assert resource, "@widget not provided by #update"
78
+ assert_equal "Updated", resource.column2
79
+ assert resource.persisted?, "@widget not saved"
80
+ end
81
+
82
+ test "#destroy destroys" do
83
+ @widget = Widget.create!(column2: 'Destroy Me')
84
+ assert @widget.persisted?
85
+ widgets_controller(id: @widget.id).destroy
86
+ assert_raises(ActiveRecord::RecordNotFound) do
87
+ Widget.find(@widget.id)
88
+ end
89
+ end
90
+
91
+ # test "it should provide collection and resource helpers"
92
+
93
+ # test "it should provide a default strong params"
94
+
95
+ # test "for nested resources it should try to expose a current method for parent resources"
96
+ end
97
+ end
Binary file
@@ -5,7 +5,7 @@ module ExpressAdmin
5
5
  class SmartFormTest < ActiveSupport::TestCase
6
6
 
7
7
  def resource_assigns
8
- {resource: Widget.new, collection: Widget.all}
8
+ {resource: Widget.new, collection: Widget.all, example_engine: ExampleEngine::MockRouteProxy.new}
9
9
  end
10
10
 
11
11
  def helpers
@@ -10,13 +10,6 @@ class ExpressAdmin::Generators::InstallGeneratorTest < Rails::Generators::TestCa
10
10
  def test_install_on_invoke
11
11
  run_generator
12
12
 
13
- assert_file 'app/controllers/tmp/admin_controller.rb' do |content|
14
- assert_match /module Tmp/, content
15
- assert_match /class AdminController < ApplicationController/, content
16
- assert_match /before_filter :authenticate_user! if defined\?\(Devise\)/, content
17
- assert_match /layout "tmp\/admin"/, content
18
- end
19
-
20
13
  assert_file 'app/views/layouts/tmp/admin.html.et' do |content|
21
14
  assert_match /render\(template: 'layouts\/express_admin\/admin'\)/, content
22
15
  end
@@ -22,10 +22,7 @@ class ExpressAdmin::Generators::ScaffoldGeneratorTest < Rails::Generators::TestC
22
22
 
23
23
  # Controller
24
24
  assert_file "app/controllers/agents_controller.rb" do |content|
25
- assert_match(/class AgentsController < AdminController/, content)
26
-
27
- assert_match(/defaults resource_class: Agent/, content)
28
- assert_match(/def agent_params()/, content)
25
+ assert_match(/class AgentsController < ExpressAdmin::StandardController/, content)
29
26
  end
30
27
 
31
28
  # Routes
data/test/test_helper.rb CHANGED
@@ -36,6 +36,11 @@ module ExampleEngine
36
36
  class Category < ::Category
37
37
  has_many :widgets, class_name: 'ExampleEngine::Widget'
38
38
  end
39
+ class MockRouteProxy
40
+ def method_missing(*args)
41
+ return '/whatever'
42
+ end
43
+ end
39
44
  end
40
45
  module AdditionalHelpers
41
46
 
@@ -25,6 +25,16 @@ module Arbre
25
25
  end
26
26
  end
27
27
 
28
+ def possible_route_proxy(name)
29
+ if helpers.controller.class.parent &&
30
+ helpers.respond_to?(namespace = helpers.controller.class.parent.to_s.underscore)
31
+ if (route_proxy = helpers.send(namespace)).respond_to?(name)
32
+ return route_proxy
33
+ end
34
+ end
35
+ return nil
36
+ end
37
+
28
38
  # Implements the method lookup chain. When you call a method that
29
39
  # doesn't exist, we:
30
40
  #
@@ -40,6 +50,8 @@ module Arbre
40
50
  assigns[name]
41
51
  elsif helpers.respond_to?(name)
42
52
  helper_method(name, *args, &block)
53
+ elsif route_proxy = possible_route_proxy(name)
54
+ route_proxy.send(name, *args, &block)
43
55
  else
44
56
  super
45
57
  end
@@ -52,6 +64,8 @@ module Arbre
52
64
  def helper_method(name, *args, &block)
53
65
  if name.match /_path$/
54
66
  helpers.send(name, *args, &block)
67
+ elsif (const_get([name, 'engine'].join('/').classify) rescue nil)
68
+ helpers.send(name, *args, &block)
55
69
  else
56
70
  current_arbre_element.add_child helpers.send(name, *args, &block)
57
71
  end
@@ -8,10 +8,13 @@ module ExpressTemplates
8
8
  base.class_eval do
9
9
  has_argument :id, "The name of the collection", type: :symbol, optional: false
10
10
  has_option :collection, 'Provide an explicit collection as a resource.'
11
- has_option :collection_path, 'Provide an explicit path for the collection resource.'
11
+ has_option :collection_path, 'Provide an explicit path for the collection resource.', type: [:string, :proc]
12
12
  has_option :resource_class, 'Overrides namespaced resource_class for using resources from a different module or namespace.'
13
- has_option :resource_path, 'Overides the resource path which is otherwise inferred from the class name.'
13
+ has_option :resource_path, 'Overides the resource path which is otherwise inferred from the class name.', type: [:string, :proc]
14
14
  has_option :path_prefix, 'Rarely used. Override inferred path_prefix for path helpers.'
15
+ # note there is some duplication here.
16
+ # resource_path can be specified as a proc which can specify a namespace
17
+ # TODO: investigate which approach is better and deprecate if desirable
15
18
  has_option :namespace, 'Rarely used. Overrides inferred namespace for resources.'
16
19
  end
17
20
  end
@@ -123,10 +126,21 @@ module ExpressTemplates
123
126
 
124
127
  def collection_path
125
128
  if config[:collection_path]
126
- config[:collection_path]
129
+ if config[:collection_path].respond_to?(:call)
130
+ config[:collection_path].call()
131
+ else
132
+ config[:collection_path]
133
+ end
127
134
  else
128
- #super
129
- helpers.instance_eval "#{collection_name_with_prefix}_path"
135
+ helpers.instance_eval collection_path_helper
136
+ end
137
+ end
138
+
139
+ def collection_path_helper
140
+ if path_namespace
141
+ "#{path_namespace}.#{collection_name_with_prefix}_path"
142
+ else
143
+ "#{collection_name_with_prefix}_path"
130
144
  end
131
145
  end
132
146
 
@@ -139,15 +153,37 @@ module ExpressTemplates
139
153
  end
140
154
 
141
155
  def resource_path_helper
142
- "#{resource_name_with_path_prefix}_path"
156
+ if path_namespace
157
+ "#{path_namespace}.#{resource_name_with_path_prefix}_path"
158
+ else
159
+ "#{resource_name_with_path_prefix}_path"
160
+ end
161
+ end
162
+
163
+ def path_namespace
164
+ resource_class_name = resource_class.to_s
165
+ resource_class_name.match(/::/) ?
166
+ resource_class_name.split("::").first.try(:underscore) : nil
143
167
  end
144
168
 
145
- def resource_path(ivar=false)
169
+ # accepts boolean to indicate whether to use an ivar or not
170
+ # and also may accept a resource on which we call to_param
171
+ def resource_path(ivar_or_resource = nil)
146
172
  if config[:resource_path]
147
- config[:resource_path]
173
+ if config[:resource_path].respond_to?(:call) &&
174
+ ivar_or_resource.respond_to?(:to_param) &&
175
+ ![true, false].include?(ivar_or_resource)
176
+ config[:resource_path].call(ivar_or_resource)
177
+ else
178
+ config[:resource_path]
179
+ end
148
180
  else
149
- # super
150
- helpers.instance_eval("#{resource_path_helper}(#{ivar ? '@' : ''}#{resource_name})")
181
+ if ivar_or_resource.respond_to?(:to_param) &&
182
+ ![true, false].include?(ivar_or_resource)
183
+ helpers.instance_eval("#{resource_path_helper}('#{ivar_or_resource.to_param}')")
184
+ else
185
+ helpers.instance_eval("#{resource_path_helper}(#{ivar_or_resource ? '@' : ''}#{resource_name})")
186
+ end
151
187
  end
152
188
  end
153
189
 
@@ -47,10 +47,10 @@ module ExpressTemplates
47
47
  @config ||= {}
48
48
  end
49
49
 
50
- def self.has_option(name, description, type: :text, required: nil, default: nil, attribute: nil)
50
+ def self.has_option(name, description, type: :string, required: nil, default: nil, attribute: nil, values: nil)
51
51
  raise "name must be a symbol" unless name.kind_of?(Symbol)
52
52
  option_definition = {description: description}
53
- option_definition.merge!(type: type, required: required, default: default, attribute: attribute)
53
+ option_definition.merge!(type: type, required: required, default: default, attribute: attribute, values: values)
54
54
  self.supported_options =
55
55
  self.supported_options.merge(name => option_definition)
56
56
  end
@@ -28,7 +28,7 @@ module ExpressTemplates
28
28
  end
29
29
 
30
30
  def form_action
31
- config[:action] || (resource.try(:persisted?) ? resource_path(ivar: true) : collection_path)
31
+ config[:action] || (resource.try(:persisted?) ? resource_path(true) : collection_path)
32
32
  end
33
33
 
34
34
  end
@@ -7,18 +7,22 @@ module ExpressTemplates
7
7
  module OptionSupport
8
8
 
9
9
  def has_many_through_association
10
- reflection = resource_class.reflect_on_association(field_name.to_sym)
11
- return reflection if reflection && reflection.macro.eql?(:has_many) && reflection.options.keys.include?(:through)
10
+ if resource_class.respond_to?(:reflect_on_association)
11
+ reflection = resource_class.reflect_on_association(field_name.to_sym)
12
+ return reflection if reflection && reflection.macro.eql?(:has_many) && reflection.options.keys.include?(:through)
13
+ end
12
14
  end
13
15
 
14
16
  # Reflect on any association and return it if the association type
15
17
  # is :belongs_to. Returns false if the association is not :belongs_to.
16
18
  # Returns nil if there was a problem reflecting.
17
19
  def belongs_to_association
18
- # assumes the belongs_to association uses <name>_id
19
- reflection = resource_class.reflect_on_association(field_name.gsub(/_id$/, '').to_sym)
20
- if reflection && reflection.macro.eql?(:belongs_to)
21
- return reflection
20
+ if resource_class.respond_to?(:reflect_on_association)
21
+ # assumes the belongs_to association uses <name>_id
22
+ reflection = resource_class.reflect_on_association(field_name.gsub(/_id$/, '').to_sym)
23
+ if reflection && reflection.macro.eql?(:belongs_to)
24
+ return reflection
25
+ end
22
26
  end
23
27
  end
24
28
 
@@ -1,3 +1,3 @@
1
1
  module ExpressTemplates
2
- VERSION = "0.9.4"
2
+ VERSION = "0.9.5"
3
3
  end
@@ -72,6 +72,19 @@ class ConfigurableTest < ActiveSupport::TestCase
72
72
  assert render { config_with_required_options(title: 'foo') }
73
73
  end
74
74
 
75
+ class ConfigWithOptionValues < ETCC
76
+ has_option :virtual, 'gets the virtual_attributes of a resource', values: -> (*) { resource_class.virtual_attributes }
77
+
78
+ def resource_class
79
+ OpenStruct.new(virtual_attributes: [:password, :password_confirmation])
80
+ end
81
+ end
82
+
83
+ test "values can be set for options" do
84
+ component = ConfigWithOptionValues.new
85
+ assert_equal [:password, :password_confirmation], component.instance_eval(&ConfigWithOptionValues.new.supported_options[:virtual][:values])
86
+ end
87
+
75
88
  class ConfigSubclass < ConfigWithRequiredOptions
76
89
  has_option :status, 'something'
77
90
  end
@@ -6,10 +6,6 @@ require 'test_helper'
6
6
 
7
7
  class ExpressFormTest < ActiveSupport::TestCase
8
8
 
9
- def assigns
10
- {resource: resource}
11
- end
12
-
13
9
  def simplest_form
14
10
  arbre {
15
11
  express_form(:resource) {