view_component 2.50.0 → 2.69.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.

Potentially problematic release.


This version of view_component might be problematic. Click here for more details.

Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/app/assets/vendor/prism.css +3 -195
  4. data/app/assets/vendor/prism.min.js +11 -11
  5. data/app/controllers/concerns/view_component/preview_actions.rb +97 -0
  6. data/app/controllers/view_components_controller.rb +1 -87
  7. data/app/helpers/preview_helper.rb +5 -5
  8. data/app/views/view_components/preview.html.erb +2 -2
  9. data/docs/CHANGELOG.md +427 -1
  10. data/lib/rails/generators/abstract_generator.rb +7 -9
  11. data/lib/rails/generators/component/component_generator.rb +5 -4
  12. data/lib/rails/generators/locale/component_generator.rb +1 -1
  13. data/lib/rails/generators/preview/component_generator.rb +1 -1
  14. data/lib/view_component/base.rb +152 -51
  15. data/lib/view_component/collection.rb +9 -2
  16. data/lib/view_component/compiler.rb +39 -18
  17. data/lib/view_component/config.rb +159 -0
  18. data/lib/view_component/content_areas.rb +1 -1
  19. data/lib/view_component/docs_builder_component.rb +1 -1
  20. data/lib/view_component/engine.rb +16 -30
  21. data/lib/view_component/polymorphic_slots.rb +28 -1
  22. data/lib/view_component/preview.rb +12 -9
  23. data/lib/view_component/render_component_helper.rb +1 -0
  24. data/lib/view_component/render_component_to_string_helper.rb +1 -1
  25. data/lib/view_component/render_to_string_monkey_patch.rb +1 -1
  26. data/lib/view_component/rendering_component_helper.rb +1 -1
  27. data/lib/view_component/rendering_monkey_patch.rb +1 -1
  28. data/lib/view_component/slot_v2.rb +4 -10
  29. data/lib/view_component/slotable.rb +5 -6
  30. data/lib/view_component/slotable_v2.rb +69 -21
  31. data/lib/view_component/test_helpers.rb +80 -8
  32. data/lib/view_component/translatable.rb +13 -14
  33. data/lib/view_component/version.rb +1 -1
  34. data/lib/view_component.rb +1 -0
  35. metadata +47 -18
  36. data/lib/view_component/previewable.rb +0 -62
@@ -9,7 +9,7 @@ module ViewComponent
9
9
 
10
10
  RESERVED_NAMES = {
11
11
  singular: %i[content render].freeze,
12
- plural: %i[contents renders].freeze,
12
+ plural: %i[contents renders].freeze
13
13
  }.freeze
14
14
 
15
15
  # Setup component slot state
@@ -17,9 +17,19 @@ module ViewComponent
17
17
  # Hash of registered Slots
18
18
  class_attribute :registered_slots
19
19
  self.registered_slots = {}
20
+
21
+ class_attribute :_warn_on_deprecated_slot_setter
22
+ self._warn_on_deprecated_slot_setter = false
20
23
  end
21
24
 
22
25
  class_methods do
26
+ ##
27
+ # Enables deprecations coming to the Slots API in ViewComponent v3
28
+ #
29
+ def warn_on_deprecated_slot_setter
30
+ self._warn_on_deprecated_slot_setter = true
31
+ end
32
+
23
33
  ##
24
34
  # Registers a sub-component
25
35
  #
@@ -61,20 +71,34 @@ module ViewComponent
61
71
  # = Setting sub-component content
62
72
  #
63
73
  # Consumers of the component can render a sub-component by calling a
64
- # helper method with the same name as the slot.
74
+ # helper method with the same name as the slot prefixed with `with_`.
65
75
  #
66
76
  # <%= render_inline(MyComponent.new) do |component| %>
67
- # <% component.header(classes: "Foo") do %>
77
+ # <% component.with_header(classes: "Foo") do %>
68
78
  # <p>Bar</p>
69
79
  # <% end %>
70
80
  # <% end %>
71
81
  def renders_one(slot_name, callable = nil)
72
82
  validate_singular_slot_name(slot_name)
83
+ validate_plural_slot_name(ActiveSupport::Inflector.pluralize(slot_name).to_sym)
84
+
85
+ define_method :"with_#{slot_name}" do |*args, &block|
86
+ set_slot(slot_name, nil, *args, &block)
87
+ end
88
+ ruby2_keywords(:"with_#{slot_name}") if respond_to?(:ruby2_keywords, true)
73
89
 
74
90
  define_method slot_name do |*args, &block|
75
91
  if args.empty? && block.nil?
76
92
  get_slot(slot_name)
77
93
  else
94
+ if _warn_on_deprecated_slot_setter
95
+ stack = caller_locations(3)
96
+ msg = "Setting a slot with `##{slot_name}` is deprecated and will be removed in ViewComponent v3.0.0. " \
97
+ "Use `#with_#{slot_name}` to set the slot instead."
98
+
99
+ ViewComponent::Deprecation.warn(msg, stack)
100
+ end
101
+
78
102
  set_slot(slot_name, nil, *args, &block)
79
103
  end
80
104
  end
@@ -92,11 +116,11 @@ module ViewComponent
92
116
  #
93
117
  # = Example
94
118
  #
95
- # render_many :items, -> (name:) { ItemComponent.new(name: name }
119
+ # renders_many :items, -> (name:) { ItemComponent.new(name: name }
96
120
  #
97
121
  # # OR
98
122
  #
99
- # render_many :items, ItemComponent
123
+ # renders_many :items, ItemComponent
100
124
  #
101
125
  # = Rendering sub-components
102
126
  #
@@ -112,37 +136,63 @@ module ViewComponent
112
136
  # = Setting sub-component content
113
137
  #
114
138
  # Consumers of the component can set the content of a slot by calling a
115
- # helper method with the same name as the slot. The method can be
116
- # called multiple times to append to the slot.
139
+ # helper method with the same name as the slot prefixed with `with_`. The
140
+ # method can be called multiple times to append to the slot.
117
141
  #
118
142
  # <%= render_inline(MyComponent.new) do |component| %>
119
- # <% component.item(name: "Foo") do %>
143
+ # <% component.with_item(name: "Foo") do %>
120
144
  # <p>One</p>
121
145
  # <% end %>
122
146
  #
123
- # <% component.item(name: "Bar") do %>
147
+ # <% component.with_item(name: "Bar") do %>
124
148
  # <p>two</p>
125
149
  # <% end %>
126
150
  # <% end %>
127
151
  def renders_many(slot_name, callable = nil)
128
- validate_plural_slot_name(slot_name)
129
-
130
152
  singular_name = ActiveSupport::Inflector.singularize(slot_name)
153
+ validate_plural_slot_name(slot_name)
154
+ validate_singular_slot_name(ActiveSupport::Inflector.singularize(slot_name).to_sym)
131
155
 
132
156
  # Define setter for singular names
133
157
  # for example `renders_many :items` allows fetching all tabs with
134
158
  # `component.tabs` and setting a tab with `component.tab`
159
+
135
160
  define_method singular_name do |*args, &block|
161
+ if _warn_on_deprecated_slot_setter
162
+ ViewComponent::Deprecation.warn(
163
+ "Setting a slot with `##{singular_name}` is deprecated and will be removed in ViewComponent v3.0.0. " \
164
+ "Use `#with_#{singular_name}` to set the slot instead."
165
+ )
166
+ end
167
+
136
168
  set_slot(slot_name, nil, *args, &block)
137
169
  end
138
170
  ruby2_keywords(singular_name.to_sym) if respond_to?(:ruby2_keywords, true)
139
171
 
172
+ define_method :"with_#{singular_name}" do |*args, &block|
173
+ set_slot(slot_name, nil, *args, &block)
174
+ end
175
+ ruby2_keywords(:"with_#{singular_name}") if respond_to?(:ruby2_keywords, true)
176
+
177
+ define_method :"with_#{slot_name}" do |collection_args = nil, &block|
178
+ collection_args.map do |args|
179
+ set_slot(slot_name, nil, **args, &block)
180
+ end
181
+ end
182
+
140
183
  # Instantiates and and adds multiple slots forwarding the first
141
184
  # argument to each slot constructor
142
185
  define_method slot_name do |collection_args = nil, &block|
143
186
  if collection_args.nil? && block.nil?
144
187
  get_slot(slot_name)
145
188
  else
189
+ if _warn_on_deprecated_slot_setter
190
+ ViewComponent::Deprecation.warn(
191
+ "Setting a slot with `##{slot_name}` is deprecated and will be removed in ViewComponent v3.0.0. " \
192
+ "Use `#with_#{slot_name}` to set the slot instead."
193
+ )
194
+ end
195
+
146
196
  collection_args.map do |args|
147
197
  set_slot(slot_name, nil, **args, &block)
148
198
  end
@@ -170,20 +220,20 @@ module ViewComponent
170
220
  # Clone slot configuration into child class
171
221
  # see #test_slots_pollution
172
222
  def inherited(child)
173
- child.registered_slots = self.registered_slots.clone
223
+ child.registered_slots = registered_slots.clone
174
224
  super
175
225
  end
176
226
 
177
227
  private
178
228
 
179
229
  def register_slot(slot_name, **kwargs)
180
- self.registered_slots[slot_name] = define_slot(slot_name, **kwargs)
230
+ registered_slots[slot_name] = define_slot(slot_name, **kwargs)
181
231
  end
182
232
 
183
233
  def define_slot(slot_name, collection:, callable:)
184
234
  # Setup basic slot data
185
235
  slot = {
186
- collection: collection,
236
+ collection: collection
187
237
  }
188
238
  return slot unless callable
189
239
 
@@ -234,7 +284,7 @@ module ViewComponent
234
284
  end
235
285
 
236
286
  def raise_if_slot_registered(slot_name)
237
- if self.registered_slots.key?(slot_name)
287
+ if registered_slots.key?(slot_name)
238
288
  # TODO remove? This breaks overriding slots when slots are inherited
239
289
  raise ArgumentError.new(
240
290
  "#{self} declares the #{slot_name} slot multiple times.\n\n" \
@@ -246,8 +296,8 @@ module ViewComponent
246
296
  def raise_if_slot_ends_with_question_mark(slot_name)
247
297
  if slot_name.to_s.ends_with?("?")
248
298
  raise ArgumentError.new(
249
- "#{self} declares a slot named #{slot_name}, which ends with a question mark.\n\n"\
250
- "This is not allowed because the ViewComponent framework already provides predicate "\
299
+ "#{self} declares a slot named #{slot_name}, which ends with a question mark.\n\n" \
300
+ "This is not allowed because the ViewComponent framework already provides predicate " \
251
301
  "methods ending in `?`.\n\n" \
252
302
  "To fix this issue, choose a different name."
253
303
  )
@@ -267,8 +317,6 @@ module ViewComponent
267
317
 
268
318
  if slot[:collection]
269
319
  []
270
- else
271
- nil
272
320
  end
273
321
  end
274
322
 
@@ -285,7 +333,7 @@ module ViewComponent
285
333
  # 2. Since we've to pass block content to components when calling
286
334
  # `render`, evaluating the block here would require us to call
287
335
  # `view_context.capture` twice, which is slower
288
- slot.__vc_content_block = block if block_given?
336
+ slot.__vc_content_block = block if block
289
337
 
290
338
  # If class
291
339
  if slot_definition[:renderable]
@@ -301,7 +349,7 @@ module ViewComponent
301
349
  # methods like `content_tag` as well as parent component state.
302
350
  renderable_function = slot_definition[:renderable_function].bind(self)
303
351
  renderable_value =
304
- if block_given?
352
+ if block
305
353
  renderable_function.call(*args) do |*rargs|
306
354
  view_context.capture(*rargs, &block)
307
355
  end
@@ -4,10 +4,11 @@ module ViewComponent
4
4
  module TestHelpers
5
5
  begin
6
6
  require "capybara/minitest"
7
+
7
8
  include Capybara::Minitest::Assertions
8
9
 
9
10
  def page
10
- Capybara::Node::Simple.new(@rendered_component)
11
+ @page ||= Capybara::Node::Simple.new(rendered_content)
11
12
  end
12
13
 
13
14
  def refute_component_rendered
@@ -19,8 +20,8 @@ module ViewComponent
19
20
  # :nocov:
20
21
  if ENV["DEBUG"]
21
22
  warn(
22
- "WARNING in `ViewComponent::TestHelpers`: You must add `capybara` " \
23
- "to your Gemfile to use Capybara assertions."
23
+ "WARNING in `ViewComponent::TestHelpers`: Add `capybara` " \
24
+ "to Gemfile to use Capybara assertions."
24
25
  )
25
26
  end
26
27
 
@@ -28,7 +29,19 @@ module ViewComponent
28
29
  end
29
30
 
30
31
  # @private
31
- attr_reader :rendered_component
32
+ attr_reader :rendered_content
33
+
34
+ # Returns the result of a render_inline call.
35
+ #
36
+ # @return [String]
37
+ def rendered_component
38
+ ViewComponent::Deprecation.warn(
39
+ "`rendered_component` is deprecated and will be removed in v3.0.0. " \
40
+ "Use `page` instead."
41
+ )
42
+
43
+ rendered_content
44
+ end
32
45
 
33
46
  # Render a component inline. Internally sets `page` to be a `Capybara::Node::Simple`,
34
47
  # allowing for Capybara assertions to be used:
@@ -41,14 +54,72 @@ module ViewComponent
41
54
  # @param component [ViewComponent::Base, ViewComponent::Collection] The instance of the component to be rendered.
42
55
  # @return [Nokogiri::HTML]
43
56
  def render_inline(component, **args, &block)
44
- @rendered_component =
57
+ @page = nil
58
+ @rendered_content =
45
59
  if Rails.version.to_f >= 6.1
46
60
  controller.view_context.render(component, args, &block)
47
61
  else
48
62
  controller.view_context.render_component(component, &block)
49
63
  end
50
64
 
51
- Nokogiri::HTML.fragment(@rendered_component)
65
+ Nokogiri::HTML.fragment(@rendered_content)
66
+ end
67
+
68
+ # Render a preview inline. Internally sets `page` to be a `Capybara::Node::Simple`,
69
+ # allowing for Capybara assertions to be used:
70
+ #
71
+ # ```ruby
72
+ # render_preview(:default)
73
+ # assert_text("Hello, World!")
74
+ # ```
75
+ #
76
+ # Note: `#rendered_preview` expects a preview to be defined with the same class
77
+ # name as the calling test, but with `Test` replaced with `Preview`:
78
+ #
79
+ # MyComponentTest -> MyComponentPreview etc.
80
+ #
81
+ # In RSpec, `Preview` is appended to `described_class`.
82
+ #
83
+ # @param preview [String] The name of the preview to be rendered.
84
+ # @return [Nokogiri::HTML]
85
+ def render_preview(name)
86
+ begin
87
+ preview_klass = if respond_to?(:described_class)
88
+ raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
89
+
90
+ "#{described_class}Preview"
91
+ else
92
+ self.class.name.gsub("Test", "Preview")
93
+ end
94
+ preview_klass = preview_klass.constantize
95
+ rescue NameError
96
+ raise NameError, "`render_preview` expected to find #{preview_klass}, but it does not exist."
97
+ end
98
+
99
+ previews_controller = build_controller(Rails.application.config.view_component.preview_controller.constantize)
100
+ previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
101
+ previews_controller.response = ActionDispatch::Response.new
102
+ result = previews_controller.previews
103
+
104
+ @rendered_content = result
105
+
106
+ Nokogiri::HTML.fragment(@rendered_content)
107
+ end
108
+
109
+ # Execute the given block in the view context. Internally sets `page` to be a
110
+ # `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
111
+ #
112
+ # ```ruby
113
+ # render_in_view_context do
114
+ # render(MyComponent.new)
115
+ # end
116
+ #
117
+ # assert_text("Hello, World!")
118
+ # ```
119
+ def render_in_view_context(&block)
120
+ @page = nil
121
+ @rendered_content = controller.view_context.instance_exec(&block)
122
+ Nokogiri::HTML.fragment(@rendered_content)
52
123
  end
53
124
 
54
125
  # @private
@@ -119,10 +190,11 @@ module ViewComponent
119
190
  old_request_query_string = request.query_string
120
191
  old_controller = defined?(@controller) && @controller
121
192
 
193
+ path, query = path.split("?", 2)
122
194
  request.path_info = path
123
195
  request.path_parameters = Rails.application.routes.recognize_path(path)
124
- request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_query(path.split("?")[1]))
125
- request.set_header(Rack::QUERY_STRING, path.split("?")[1])
196
+ request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(query))
197
+ request.set_header(Rack::QUERY_STRING, query)
126
198
  yield
127
199
  ensure
128
200
  request.path_info = old_request_path_info
@@ -3,14 +3,13 @@
3
3
  require "erb"
4
4
  require "set"
5
5
  require "i18n"
6
- require "action_view/helpers/translation_helper"
7
6
  require "active_support/concern"
8
7
 
9
8
  module ViewComponent
10
9
  module Translatable
11
10
  extend ActiveSupport::Concern
12
11
 
13
- HTML_SAFE_TRANSLATION_KEY = /(?:_|\b)html\z/.freeze
12
+ HTML_SAFE_TRANSLATION_KEY = /(?:_|\b)html\z/
14
13
 
15
14
  included do
16
15
  class_attribute :i18n_backend, instance_writer: false, instance_predicate: false
@@ -21,19 +20,16 @@ module ViewComponent
21
20
  @i18n_scope ||= virtual_path.sub(%r{^/}, "").gsub(%r{/_?}, ".")
22
21
  end
23
22
 
24
- def _after_compile
25
- super
26
-
23
+ def build_i18n_backend
27
24
  return if CompileCache.compiled? self
28
25
 
29
- if (translation_files = _sidecar_files(%w[yml yaml])).any?
30
- self.i18n_backend = I18nBackend.new(
26
+ self.i18n_backend = if (translation_files = _sidecar_files(%w[yml yaml])).any?
27
+ # Returning nil cleans up if translations file has been removed since the last compilation
28
+
29
+ I18nBackend.new(
31
30
  i18n_scope: i18n_scope,
32
- load_paths: translation_files,
31
+ load_paths: translation_files
33
32
  )
34
- else
35
- # Cleanup if translations file has been removed since the last compilation
36
- self.i18n_backend = nil
37
33
  end
38
34
  end
39
35
  end
@@ -53,7 +49,7 @@ module ViewComponent
53
49
 
54
50
  def scope_data(data)
55
51
  @i18n_scope.reverse_each do |part|
56
- data = { part => data }
52
+ data = {part => data}
57
53
  end
58
54
  data
59
55
  end
@@ -68,7 +64,10 @@ module ViewComponent
68
64
  return key.map { |k| translate(k, **options) } if key.is_a?(Array)
69
65
 
70
66
  locale = options.delete(:locale) || ::I18n.locale
67
+ scope = options.delete(:scope)
68
+ scope = scope.join(".") if scope.is_a? Array
71
69
  key = key&.to_s unless key.is_a?(String)
70
+ key = "#{scope}.#{key}" if scope
72
71
  key = "#{i18n_scope}#{key}" if key.start_with?(".")
73
72
 
74
73
  if HTML_SAFE_TRANSLATION_KEY.match?(key)
@@ -95,7 +94,7 @@ module ViewComponent
95
94
  super(key, locale: locale, **options)
96
95
  end
97
96
  end
98
- alias :t :translate
97
+ alias_method :t, :translate
99
98
 
100
99
  # Exposes .i18n_scope as an instance method
101
100
  def i18n_scope
@@ -109,7 +108,7 @@ module ViewComponent
109
108
  # It's assumed here that objects loaded by the i18n backend will respond to `#html_safe?`.
110
109
  # It's reasonable that if we're in Rails, `active_support/core_ext/string/output_safety.rb`
111
110
  # will provide this to `Object`.
112
- translation.html_safe # rubocop:disable Rails/OutputSafety
111
+ translation.html_safe
113
112
  end
114
113
  end
115
114
 
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 50
6
+ MINOR = 69
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
@@ -10,6 +10,7 @@ module ViewComponent
10
10
  autoload :Compiler
11
11
  autoload :CompileCache
12
12
  autoload :ComponentError
13
+ autoload :Config
13
14
  autoload :Deprecation
14
15
  autoload :Instrumentation
15
16
  autoload :Preview
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_component
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.50.0
4
+ version: 2.69.0
5
5
  platform: ruby
6
6
  authors:
7
- - GitHub Open Source
7
+ - ViewComponent Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-10 00:00:00.000000000 Z
11
+ date: 2022-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '1.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: concurrent-ruby
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: appraisal
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -90,16 +104,16 @@ dependencies:
90
104
  name: bundler
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
- - - ">="
107
+ - - "~>"
94
108
  - !ruby/object:Gem::Version
95
- version: 1.15.0
109
+ version: '2'
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - ">="
114
+ - - "~>"
101
115
  - !ruby/object:Gem::Version
102
- version: 1.15.0
116
+ version: '2'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: erb_lint
105
119
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +156,20 @@ dependencies:
142
156
  - - "~>"
143
157
  - !ruby/object:Gem::Version
144
158
  version: '2'
159
+ - !ruby/object:Gem::Dependency
160
+ name: m
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1'
145
173
  - !ruby/object:Gem::Dependency
146
174
  name: minitest
147
175
  requirement: !ruby/object:Gem::Requirement
@@ -185,19 +213,19 @@ dependencies:
185
213
  - !ruby/object:Gem::Version
186
214
  version: '13.0'
187
215
  - !ruby/object:Gem::Dependency
188
- name: rubocop-github
216
+ name: standard
189
217
  requirement: !ruby/object:Gem::Requirement
190
218
  requirements:
191
219
  - - "~>"
192
220
  - !ruby/object:Gem::Version
193
- version: 0.16.1
221
+ version: '1'
194
222
  type: :development
195
223
  prerelease: false
196
224
  version_requirements: !ruby/object:Gem::Requirement
197
225
  requirements:
198
226
  - - "~>"
199
227
  - !ruby/object:Gem::Version
200
- version: 0.16.1
228
+ version: '1'
201
229
  - !ruby/object:Gem::Dependency
202
230
  name: simplecov
203
231
  requirement: !ruby/object:Gem::Requirement
@@ -272,19 +300,18 @@ dependencies:
272
300
  name: yard-activesupport-concern
273
301
  requirement: !ruby/object:Gem::Requirement
274
302
  requirements:
275
- - - ">="
303
+ - - "~>"
276
304
  - !ruby/object:Gem::Version
277
- version: '0'
305
+ version: 0.0.1
278
306
  type: :development
279
307
  prerelease: false
280
308
  version_requirements: !ruby/object:Gem::Requirement
281
309
  requirements:
282
- - - ">="
310
+ - - "~>"
283
311
  - !ruby/object:Gem::Version
284
- version: '0'
312
+ version: 0.0.1
285
313
  description:
286
314
  email:
287
- - opensource+view_component@github.com
288
315
  executables: []
289
316
  extensions: []
290
317
  extra_rdoc_files: []
@@ -293,6 +320,7 @@ files:
293
320
  - README.md
294
321
  - app/assets/vendor/prism.css
295
322
  - app/assets/vendor/prism.min.js
323
+ - app/controllers/concerns/view_component/preview_actions.rb
296
324
  - app/controllers/view_components_controller.rb
297
325
  - app/helpers/preview_helper.rb
298
326
  - app/views/test_mailer/test_email.html.erb
@@ -328,6 +356,7 @@ files:
328
356
  - lib/view_component/compile_cache.rb
329
357
  - lib/view_component/compiler.rb
330
358
  - lib/view_component/component_error.rb
359
+ - lib/view_component/config.rb
331
360
  - lib/view_component/content_areas.rb
332
361
  - lib/view_component/deprecation.rb
333
362
  - lib/view_component/docs_builder_component.html.erb
@@ -337,7 +366,6 @@ files:
337
366
  - lib/view_component/polymorphic_slots.rb
338
367
  - lib/view_component/preview.rb
339
368
  - lib/view_component/preview_template_error.rb
340
- - lib/view_component/previewable.rb
341
369
  - lib/view_component/rails/tasks/view_component.rake
342
370
  - lib/view_component/render_component_helper.rb
343
371
  - lib/view_component/render_component_to_string_helper.rb
@@ -356,7 +384,7 @@ files:
356
384
  - lib/view_component/version.rb
357
385
  - lib/view_component/with_content_helper.rb
358
386
  - lib/yard/mattr_accessor_handler.rb
359
- homepage: https://github.com/github/view_component
387
+ homepage: https://viewcomponent.org
360
388
  licenses:
361
389
  - MIT
362
390
  metadata:
@@ -379,5 +407,6 @@ requirements: []
379
407
  rubygems_version: 3.2.32
380
408
  signing_key:
381
409
  specification_version: 4
382
- summary: View components for Rails
410
+ summary: A framework for building reusable, testable & encapsulated view components
411
+ in Ruby on Rails.
383
412
  test_files: []
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/concern"
4
-
5
- module ViewComponent
6
- module Previewable
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- # Enable or disable component previews:
11
- #
12
- # config.view_component.show_previews = true
13
- #
14
- # Defaults to `true` in development.
15
- #
16
- mattr_accessor :show_previews, instance_writer: false
17
-
18
- # Enable or disable source code previews in component previews:
19
- #
20
- # config.view_component.show_previews_source = true
21
- #
22
- # Defaults to `false`.
23
- #
24
- mattr_accessor :show_previews_source, instance_writer: false, default: false
25
-
26
- # Set a custom default layout used for preview index and individual previews:
27
- #
28
- # config.view_component.default_preview_layout = "component_preview"
29
- #
30
- mattr_accessor :default_preview_layout, instance_writer: false
31
-
32
- # Set the location of component previews:
33
- #
34
- # config.view_component.preview_paths << "#{Rails.root}/lib/component_previews"
35
- #
36
- mattr_accessor :preview_paths, instance_writer: false
37
-
38
- # @deprecated Use `preview_paths` instead. Will be removed in v3.0.0.
39
- mattr_accessor :preview_path, instance_writer: false
40
-
41
- # Set the entry route for component previews:
42
- #
43
- # config.view_component.preview_route = "/previews"
44
- #
45
- # Defaults to `/rails/view_components` when `show_previews` is enabled.
46
- #
47
- mattr_accessor :preview_route, instance_writer: false do
48
- "/rails/view_components"
49
- end
50
-
51
- # Set the controller used for previewing components:
52
- #
53
- # config.view_component.preview_controller = "MyPreviewController"
54
- #
55
- # Defaults to `ViewComponentsController`.
56
- #
57
- mattr_accessor :preview_controller, instance_writer: false do
58
- "ViewComponentsController"
59
- end
60
- end
61
- end
62
- end