view_component 2.54.0 → 2.56.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.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4b1f5b50f3ff33ba025588ac11f83362684484dae4aafea6b3be2a866944b3c
4
- data.tar.gz: bdc4bf615413d7b3ab8e936c6df0ffd12b8915e03f44c5a8f6ad6989eb5fb5b5
3
+ metadata.gz: eb12aeca73f2c8cbd2e34b616060492b7a511a3578df16ec57736e4e0c99c25a
4
+ data.tar.gz: 13de0099bbf28122b3a722cd105ad77f15f025a420434a156ffa1dc9899bc216
5
5
  SHA512:
6
- metadata.gz: 98ce9d4ac6888dd6b6fed5987f2a6a95b6589c12930886bb35ec1009cdf385f507d3b199e63d27bd93f2125294cc5b8f7e085de27fd67ed6e45c613534bc41cb
7
- data.tar.gz: '058bdd0c93a6af548eb77feaafb432fe5a6fa9ded2730b4576b7e87c713a403c81e6db5340aa70a78444b4ce8b9b95f729294391e98ff946ecc50f4c86837d48'
6
+ metadata.gz: 3845987cc4992cca1e52eefe1f28df12d38edf53a8c7e82fd8bad8af2d47c9630522485d9a51a2111b2ec4dc5b74109f76ab2fb5509b34318e3d4f5b5f5c894e
7
+ data.tar.gz: 9942a4e3ca9a1d84ad25cb10b50cc416acf823611dc1a77811a529974ae78c0fb25882694e6d216624eac466993df1c8a0888cdcaecc59b89020e1011bf42557
@@ -8,7 +8,6 @@ module ViewComponent
8
8
  prepend_view_path File.expand_path("../../../views", __dir__)
9
9
 
10
10
  around_action :set_locale, only: :previews
11
- before_action :find_preview, only: :previews
12
11
  before_action :require_local!, unless: :show_previews?
13
12
 
14
13
  if respond_to?(:content_security_policy)
@@ -23,6 +22,8 @@ module ViewComponent
23
22
  end
24
23
 
25
24
  def previews
25
+ find_preview
26
+
26
27
  if params[:path] == @preview.preview_name
27
28
  @page_title = "Component Previews for #{@preview.preview_name}"
28
29
  render "view_components/previews", **determine_layout
data/docs/CHANGELOG.md CHANGED
@@ -9,13 +9,68 @@ title: Changelog
9
9
 
10
10
  ## main
11
11
 
12
+ ## 2.56.0
13
+
14
+ * Introduce experimental `render_preview` test helper. Note: `@rendered_component` in `TestHelpers` has been renamed to `@rendered_content`.
15
+
16
+ *Joel Hawksley*
17
+
18
+ * Move framework tests into sandbox application.
19
+
20
+ *Joel Hawksley*
21
+
22
+ * Add G2 to list of companies that use ViewComponent.
23
+
24
+ *Jack Shuff*
25
+
26
+ * Add Within3 to list of companies that use ViewComponent.
27
+
28
+ *Drew Bragg*
29
+
30
+ * Add Mission Met to list of companies that use ViewComponent.
31
+
32
+ *Nick Smith*
33
+
34
+ * Fix `#with_request_url` test helper not parsing nested query parameters into nested hashes.
35
+
36
+ *Richard Marbach*
37
+
38
+ ## 2.55.0
39
+
40
+ * Add `render_parent` convenience method to avoid confusion between `<%= super %>` and `<% super %>` in template code.
41
+
42
+ *Cameron Dutro*
43
+
44
+ * Add note about discouraging inheritance.
45
+
46
+ *Joel Hawksley*
47
+
48
+ * Clean up grammar in documentation.
49
+
50
+ *Joel Hawksley*
51
+
52
+ * The ViewComponent team at GitHub is hiring! We're looking for a Rails engineer with accessibility experience: [https://boards.greenhouse.io/github/jobs/4020166](https://boards.greenhouse.io/github/jobs/4020166). Reach out to joelhawksley@github.com with any questions!
53
+
54
+ * The ViewComponent team is hosting a happy hour at RailsConf. Join us for snacks, drinks, and stickers: [https://www.eventbrite.com/e/viewcomponent-happy-hour-tickets-304168585427](https://www.eventbrite.com/e/viewcomponent-happy-hour-tickets-304168585427)
55
+
56
+ ## 2.54.1
57
+
58
+ * Update docs dependencies.
59
+
60
+ *Joel Hawksley*
61
+
62
+ * Resolve warning in slots API.
63
+ * Raise in the test environment when ViewComponent code emits a warning.
64
+
65
+ *Blake Williams*
66
+
12
67
  ## 2.54.0
13
68
 
14
69
  * Add `with_*` slot API for defining slots. Note: we plan to deprecate the non `with_*` API for slots in an upcoming release.
15
70
 
16
71
  *Blake Williams*
17
72
 
18
- * Add QuickNode to list of companies that heavily rely on ViewComponent.
73
+ * Add QuickNode to list of companies that use ViewComponent.
19
74
 
20
75
  *Luc Castera*
21
76
 
@@ -49,7 +104,7 @@ title: Changelog
49
104
 
50
105
  *Jason Swett*
51
106
 
52
- * Add Bearer to list of companies that heavily rely on ViewComponent.
107
+ * Add Bearer to list of companies that use ViewComponent.
53
108
 
54
109
  *Yaroslav Shmarov*
55
110
 
@@ -57,6 +112,10 @@ title: Changelog
57
112
 
58
113
  *Joel Hawksley*
59
114
 
115
+ * Enable rendering arbitrary block contents in the view context in tests.
116
+
117
+ *Cameron Dutro*
118
+
60
119
  ## 2.52.0
61
120
 
62
121
  * Add ADR for separate slot getter/setter API.
@@ -70,7 +70,7 @@ module ViewComponent
70
70
  @view_context = view_context
71
71
  self.__vc_original_view_context ||= view_context
72
72
 
73
- @output_buffer = ActionView::OutputBuffer.new unless @global_buffer_in_use
73
+ @output_buffer = ActionView::OutputBuffer.new unless defined?(@global_buffer_in_use) && @global_buffer_in_use
74
74
 
75
75
  @lookup_context ||= view_context.lookup_context
76
76
 
@@ -117,6 +117,20 @@ module ViewComponent
117
117
  render_template_for(@__vc_variant).to_s + _output_postamble
118
118
  end
119
119
 
120
+ # Subclass components that call `super` inside their template code will cause a
121
+ # double render if they accidentally emit the result:
122
+ #
123
+ # <%= super %> # double-renders
124
+ #
125
+ # <% super %> # does not double-render
126
+ #
127
+ # Calls `super`, returning nil to avoid rendering the result twice.
128
+ def render_parent
129
+ mtd = @__vc_variant ? "call_#{@__vc_variant}" : "call"
130
+ method(mtd).super_method.call
131
+ nil
132
+ end
133
+
120
134
  # :nocov:
121
135
  def render_template_for(variant = nil)
122
136
  # Force compilation here so the compiler always redefines render_template_for.
@@ -30,7 +30,8 @@ module ViewComponent # :nodoc:
30
30
  class << self
31
31
  # Returns all component preview classes.
32
32
  def all
33
- load_previews if descendants.empty?
33
+ load_previews
34
+
34
35
  descendants
35
36
  end
36
37
 
@@ -98,14 +99,14 @@ module ViewComponent # :nodoc:
98
99
  source[1...(source.size - 1)].join("\n")
99
100
  end
100
101
 
101
- private
102
-
103
102
  def load_previews
104
103
  Array(preview_paths).each do |preview_path|
105
104
  Dir["#{preview_path}/**/*_preview.rb"].sort.each { |file| require_dependency file }
106
105
  end
107
106
  end
108
107
 
108
+ private
109
+
109
110
  def preview_paths
110
111
  Base.preview_paths
111
112
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ViewComponent
4
+ module RenderPreviewHelper
5
+ # Render a preview inline. Internally sets `page` to be a `Capybara::Node::Simple`,
6
+ # allowing for Capybara assertions to be used:
7
+ #
8
+ # ```ruby
9
+ # render_preview(:default)
10
+ # assert_text("Hello, World!")
11
+ # ```
12
+ #
13
+ # Note: `#rendered_preview` expects a preview to be defined with the same class
14
+ # name as the calling test, but with `Test` replaced with `Preview`:
15
+ #
16
+ # MyComponentTest -> MyComponentPreview etc.
17
+ #
18
+ # @param preview [String] The name of the preview to be rendered.
19
+ # @return [Nokogiri::HTML]
20
+ def render_preview(name)
21
+ begin
22
+ preview_klass = self.class.name.gsub("Test", "Preview")
23
+ preview_klass = preview_klass.constantize
24
+ rescue NameError
25
+ raise NameError.new(
26
+ "`render_preview` expected to find #{preview_klass}, but it does not exist."
27
+ )
28
+ end
29
+
30
+ previews_controller = build_controller(ViewComponent::Base.preview_controller.constantize)
31
+ previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
32
+ previews_controller.response = ActionDispatch::Response.new
33
+ result = previews_controller.previews
34
+
35
+ @rendered_content = result
36
+
37
+ Nokogiri::HTML.fragment(@rendered_content)
38
+ end
39
+ end
40
+ end
@@ -155,7 +155,6 @@ module ViewComponent
155
155
  set_slot(slot_name, nil, **args, &block)
156
156
  end
157
157
  end
158
- ruby2_keywords(:"with_#{slot_name}") if respond_to?(:ruby2_keywords, true)
159
158
 
160
159
  # Instantiates and and adds multiple slots forwarding the first
161
160
  # argument to each slot constructor
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "view_component/render_preview_helper"
4
+
3
5
  module ViewComponent
4
6
  module TestHelpers
5
7
  begin
@@ -7,7 +9,7 @@ module ViewComponent
7
9
  include Capybara::Minitest::Assertions
8
10
 
9
11
  def page
10
- Capybara::Node::Simple.new(@rendered_component)
12
+ Capybara::Node::Simple.new(@rendered_content)
11
13
  end
12
14
 
13
15
  def refute_component_rendered
@@ -19,8 +21,8 @@ module ViewComponent
19
21
  # :nocov:
20
22
  if ENV["DEBUG"]
21
23
  warn(
22
- "WARNING in `ViewComponent::TestHelpers`: You must add `capybara` " \
23
- "to your Gemfile to use Capybara assertions."
24
+ "WARNING in `ViewComponent::TestHelpers`: Add `capybara` " \
25
+ "to Gemfile to use Capybara assertions."
24
26
  )
25
27
  end
26
28
 
@@ -41,14 +43,29 @@ module ViewComponent
41
43
  # @param component [ViewComponent::Base, ViewComponent::Collection] The instance of the component to be rendered.
42
44
  # @return [Nokogiri::HTML]
43
45
  def render_inline(component, **args, &block)
44
- @rendered_component =
46
+ @rendered_content =
45
47
  if Rails.version.to_f >= 6.1
46
48
  controller.view_context.render(component, args, &block)
47
49
  else
48
50
  controller.view_context.render_component(component, &block)
49
51
  end
50
52
 
51
- Nokogiri::HTML.fragment(@rendered_component)
53
+ Nokogiri::HTML.fragment(@rendered_content)
54
+ end
55
+
56
+ # Execute the given block in the view context. Internally sets `page` to be a
57
+ # `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
58
+ #
59
+ # ```ruby
60
+ # render_in_view_context do
61
+ # render(MyComponent.new)
62
+ # end
63
+ #
64
+ # assert_text("Hello, World!")
65
+ # ```
66
+ def render_in_view_context(&block)
67
+ @rendered_content = controller.view_context.instance_exec(&block)
68
+ Nokogiri::HTML.fragment(@rendered_content)
52
69
  end
53
70
 
54
71
  # @private
@@ -121,7 +138,7 @@ module ViewComponent
121
138
 
122
139
  request.path_info = path
123
140
  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]))
141
+ request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(path.split("?")[1]))
125
142
  request.set_header(Rack::QUERY_STRING, path.split("?")[1])
126
143
  yield
127
144
  ensure
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 54
6
+ MINOR = 56
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
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.54.0
4
+ version: 2.56.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-10 00:00:00.000000000 Z
11
+ date: 2022-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -345,6 +345,7 @@ files:
345
345
  - lib/view_component/render_component_helper.rb
346
346
  - lib/view_component/render_component_to_string_helper.rb
347
347
  - lib/view_component/render_monkey_patch.rb
348
+ - lib/view_component/render_preview_helper.rb
348
349
  - lib/view_component/render_to_string_monkey_patch.rb
349
350
  - lib/view_component/rendering_component_helper.rb
350
351
  - lib/view_component/rendering_monkey_patch.rb