phlex-rails 2.0.0.rc2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (217) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -6
  3. data/lib/generators/phlex/component/component_generator.rb +7 -3
  4. data/lib/generators/phlex/install/install_generator.rb +5 -36
  5. data/lib/generators/phlex/view/view_generator.rb +6 -2
  6. data/lib/phlex/rails/buffered.rb +9 -12
  7. data/lib/phlex/rails/buffered_checkbox_builder.rb +0 -4
  8. data/lib/phlex/rails/buffered_form_builder.rb +0 -64
  9. data/lib/phlex/rails/buffered_label_builder.rb +0 -3
  10. data/lib/phlex/rails/buffered_radio_button_builder.rb +0 -4
  11. data/lib/phlex/rails/csv.rb +4 -6
  12. data/lib/phlex/rails/helper_macros.rb +7 -8
  13. data/lib/phlex/rails/helpers/asset_url.rb +0 -1
  14. data/lib/phlex/rails/helpers/audio_path.rb +3 -0
  15. data/lib/phlex/rails/helpers/audio_tag.rb +1 -0
  16. data/lib/phlex/rails/helpers/audio_url.rb +1 -0
  17. data/lib/phlex/rails/helpers/auto_discovery_link_tag.rb +1 -0
  18. data/lib/phlex/rails/helpers/build_tag_values.rb +1 -0
  19. data/lib/phlex/rails/helpers/button_tag.rb +1 -0
  20. data/lib/phlex/rails/helpers/button_to.rb +1 -0
  21. data/lib/phlex/rails/helpers/check_box.rb +1 -0
  22. data/lib/phlex/rails/helpers/check_box_tag.rb +1 -0
  23. data/lib/phlex/rails/helpers/class_names.rb +1 -0
  24. data/lib/phlex/rails/helpers/collection_check_boxes.rb +1 -0
  25. data/lib/phlex/rails/helpers/collection_radio_buttons.rb +1 -0
  26. data/lib/phlex/rails/helpers/collection_select.rb +1 -0
  27. data/lib/phlex/rails/helpers/color_field.rb +1 -0
  28. data/lib/phlex/rails/helpers/color_field_tag.rb +1 -0
  29. data/lib/phlex/rails/helpers/compute_asset_extname.rb +1 -0
  30. data/lib/phlex/rails/helpers/compute_asset_host.rb +1 -0
  31. data/lib/phlex/rails/helpers/compute_asset_path.rb +1 -0
  32. data/lib/phlex/rails/helpers/content_for.rb +4 -2
  33. data/lib/phlex/rails/helpers/content_tag.rb +1 -0
  34. data/lib/phlex/rails/helpers/controller_name.rb +1 -0
  35. data/lib/phlex/rails/helpers/controller_path.rb +1 -0
  36. data/lib/phlex/rails/helpers/csp_meta_tag.rb +1 -0
  37. data/lib/phlex/rails/helpers/csrf_meta_tags.rb +1 -0
  38. data/lib/phlex/rails/helpers/current_cycle.rb +1 -0
  39. data/lib/phlex/rails/helpers/current_page.rb +1 -0
  40. data/lib/phlex/rails/helpers/cycle.rb +1 -0
  41. data/lib/phlex/rails/helpers/date_field.rb +1 -0
  42. data/lib/phlex/rails/helpers/date_field_tag.rb +1 -0
  43. data/lib/phlex/rails/helpers/date_select.rb +1 -0
  44. data/lib/phlex/rails/helpers/datetime_field.rb +1 -0
  45. data/lib/phlex/rails/helpers/datetime_field_tag.rb +1 -0
  46. data/lib/phlex/rails/helpers/datetime_local_field.rb +1 -0
  47. data/lib/phlex/rails/helpers/datetime_local_field_tag.rb +1 -0
  48. data/lib/phlex/rails/helpers/datetime_select.rb +1 -0
  49. data/lib/phlex/rails/helpers/debug.rb +1 -0
  50. data/lib/phlex/rails/helpers/default_url_options.rb +1 -0
  51. data/lib/phlex/rails/helpers/distance_of_time_in_words.rb +1 -0
  52. data/lib/phlex/rails/helpers/distance_of_time_in_words_to_now.rb +1 -0
  53. data/lib/phlex/rails/helpers/dom_class.rb +1 -0
  54. data/lib/phlex/rails/helpers/dom_id.rb +1 -0
  55. data/lib/phlex/rails/helpers/email_field.rb +1 -0
  56. data/lib/phlex/rails/helpers/email_field_tag.rb +1 -0
  57. data/lib/phlex/rails/helpers/error_message.rb +1 -0
  58. data/lib/phlex/rails/helpers/error_wrapping.rb +1 -0
  59. data/lib/phlex/rails/helpers/escape_once.rb +1 -0
  60. data/lib/phlex/rails/helpers/excerpt.rb +1 -0
  61. data/lib/phlex/rails/helpers/favicon_link_tag.rb +1 -0
  62. data/lib/phlex/rails/helpers/field_id.rb +1 -0
  63. data/lib/phlex/rails/helpers/field_name.rb +1 -0
  64. data/lib/phlex/rails/helpers/field_set_tag.rb +1 -0
  65. data/lib/phlex/rails/helpers/fields.rb +1 -0
  66. data/lib/phlex/rails/helpers/fields_for.rb +1 -0
  67. data/lib/phlex/rails/helpers/file_field.rb +1 -0
  68. data/lib/phlex/rails/helpers/file_field_tag.rb +1 -0
  69. data/lib/phlex/rails/helpers/flash.rb +1 -0
  70. data/lib/phlex/rails/helpers/font_path.rb +1 -0
  71. data/lib/phlex/rails/helpers/font_url.rb +1 -0
  72. data/lib/phlex/rails/helpers/form_authenticity_token.rb +8 -0
  73. data/lib/phlex/rails/helpers/form_for.rb +1 -0
  74. data/lib/phlex/rails/helpers/form_tag.rb +1 -0
  75. data/lib/phlex/rails/helpers/form_with.rb +1 -0
  76. data/lib/phlex/rails/helpers/grouped_collection_select.rb +1 -0
  77. data/lib/phlex/rails/helpers/grouped_options_for_select.rb +1 -0
  78. data/lib/phlex/rails/helpers/hidden_field.rb +1 -0
  79. data/lib/phlex/rails/helpers/hidden_field_tag.rb +1 -0
  80. data/lib/phlex/rails/helpers/highlight.rb +1 -0
  81. data/lib/phlex/rails/helpers/image_path.rb +1 -0
  82. data/lib/phlex/rails/helpers/image_submit_tag.rb +1 -0
  83. data/lib/phlex/rails/helpers/image_tag.rb +1 -0
  84. data/lib/phlex/rails/helpers/image_url.rb +1 -0
  85. data/lib/phlex/rails/helpers/javascript_import_module_tag.rb +1 -0
  86. data/lib/phlex/rails/helpers/javascript_importmap_tags.rb +1 -0
  87. data/lib/phlex/rails/helpers/javascript_include_tag.rb +1 -0
  88. data/lib/phlex/rails/helpers/javascript_path.rb +1 -0
  89. data/lib/phlex/rails/helpers/javascript_tag.rb +1 -0
  90. data/lib/phlex/rails/helpers/javascript_url.rb +1 -0
  91. data/lib/phlex/rails/helpers/l.rb +1 -0
  92. data/lib/phlex/rails/helpers/label.rb +1 -0
  93. data/lib/phlex/rails/helpers/label_tag.rb +3 -0
  94. data/lib/phlex/rails/helpers/link_to.rb +1 -0
  95. data/lib/phlex/rails/helpers/link_to_if.rb +1 -0
  96. data/lib/phlex/rails/helpers/link_to_unless.rb +1 -0
  97. data/lib/phlex/rails/helpers/link_to_unless_current.rb +1 -0
  98. data/lib/phlex/rails/helpers/localize.rb +1 -0
  99. data/lib/phlex/rails/helpers/mail_to.rb +1 -0
  100. data/lib/phlex/rails/helpers/month_field.rb +1 -0
  101. data/lib/phlex/rails/helpers/month_field_tag.rb +1 -0
  102. data/lib/phlex/rails/helpers/notice.rb +1 -0
  103. data/lib/phlex/rails/helpers/number_field.rb +1 -0
  104. data/lib/phlex/rails/helpers/number_field_tag.rb +1 -0
  105. data/lib/phlex/rails/helpers/number_to_currency.rb +1 -0
  106. data/lib/phlex/rails/helpers/number_to_human.rb +1 -0
  107. data/lib/phlex/rails/helpers/number_to_human_size.rb +1 -0
  108. data/lib/phlex/rails/helpers/number_to_percentage.rb +1 -0
  109. data/lib/phlex/rails/helpers/number_to_phone.rb +1 -0
  110. data/lib/phlex/rails/helpers/number_with_delimiter.rb +1 -0
  111. data/lib/phlex/rails/helpers/number_with_precision.rb +1 -0
  112. data/lib/phlex/rails/helpers/object.rb +1 -0
  113. data/lib/phlex/rails/helpers/option_groups_from_collection_for_select.rb +1 -0
  114. data/lib/phlex/rails/helpers/options_for_select.rb +1 -0
  115. data/lib/phlex/rails/helpers/options_from_collection_for_select.rb +1 -0
  116. data/lib/phlex/rails/helpers/password_field.rb +1 -0
  117. data/lib/phlex/rails/helpers/password_field_tag.rb +1 -0
  118. data/lib/phlex/rails/helpers/path_to_asset.rb +1 -0
  119. data/lib/phlex/rails/helpers/path_to_audio.rb +1 -0
  120. data/lib/phlex/rails/helpers/path_to_font.rb +1 -0
  121. data/lib/phlex/rails/helpers/path_to_image.rb +1 -0
  122. data/lib/phlex/rails/helpers/path_to_javascript.rb +1 -0
  123. data/lib/phlex/rails/helpers/path_to_stylesheet.rb +1 -0
  124. data/lib/phlex/rails/helpers/path_to_video.rb +1 -0
  125. data/lib/phlex/rails/helpers/phone_field.rb +1 -0
  126. data/lib/phlex/rails/helpers/phone_field_tag.rb +1 -0
  127. data/lib/phlex/rails/helpers/phone_to.rb +1 -0
  128. data/lib/phlex/rails/helpers/pluralize.rb +1 -0
  129. data/lib/phlex/rails/helpers/preload_link_tag.rb +1 -0
  130. data/lib/phlex/rails/helpers/provide.rb +1 -0
  131. data/lib/phlex/rails/helpers/public_compute_asset_path.rb +1 -0
  132. data/lib/phlex/rails/helpers/radio_button.rb +1 -0
  133. data/lib/phlex/rails/helpers/radio_button_tag.rb +1 -0
  134. data/lib/phlex/rails/helpers/range_field.rb +1 -0
  135. data/lib/phlex/rails/helpers/range_field_tag.rb +1 -0
  136. data/lib/phlex/rails/helpers/request.rb +1 -0
  137. data/lib/phlex/rails/helpers/reset_cycle.rb +1 -0
  138. data/lib/phlex/rails/helpers/rich_text_area.rb +1 -0
  139. data/lib/phlex/rails/helpers/sanitize.rb +1 -0
  140. data/lib/phlex/rails/helpers/sanitize_css.rb +1 -0
  141. data/lib/phlex/rails/helpers/search_field.rb +1 -0
  142. data/lib/phlex/rails/helpers/search_field_tag.rb +1 -0
  143. data/lib/phlex/rails/helpers/select.rb +1 -0
  144. data/lib/phlex/rails/helpers/select_date.rb +1 -0
  145. data/lib/phlex/rails/helpers/select_datetime.rb +1 -0
  146. data/lib/phlex/rails/helpers/select_day.rb +1 -0
  147. data/lib/phlex/rails/helpers/select_hour.rb +1 -0
  148. data/lib/phlex/rails/helpers/select_minute.rb +1 -0
  149. data/lib/phlex/rails/helpers/select_month.rb +1 -0
  150. data/lib/phlex/rails/helpers/select_second.rb +1 -0
  151. data/lib/phlex/rails/helpers/select_tag.rb +1 -0
  152. data/lib/phlex/rails/helpers/select_time.rb +1 -0
  153. data/lib/phlex/rails/helpers/select_year.rb +1 -0
  154. data/lib/phlex/rails/helpers/simple_format.rb +1 -0
  155. data/lib/phlex/rails/helpers/sms_to.rb +1 -0
  156. data/lib/phlex/rails/helpers/strip_links.rb +1 -0
  157. data/lib/phlex/rails/helpers/strip_tags.rb +1 -0
  158. data/lib/phlex/rails/helpers/stylesheet_link_tag.rb +1 -0
  159. data/lib/phlex/rails/helpers/stylesheet_path.rb +1 -0
  160. data/lib/phlex/rails/helpers/stylesheet_url.rb +1 -0
  161. data/lib/phlex/rails/helpers/submit_tag.rb +1 -0
  162. data/lib/phlex/rails/helpers/tag.rb +3 -3
  163. data/lib/phlex/rails/helpers/telephone_field.rb +1 -0
  164. data/lib/phlex/rails/helpers/telephone_field_tag.rb +1 -0
  165. data/lib/phlex/rails/helpers/text_area.rb +1 -0
  166. data/lib/phlex/rails/helpers/text_area_tag.rb +1 -0
  167. data/lib/phlex/rails/helpers/text_field.rb +1 -0
  168. data/lib/phlex/rails/helpers/text_field_tag.rb +1 -0
  169. data/lib/phlex/rails/helpers/time_ago_in_words.rb +1 -0
  170. data/lib/phlex/rails/helpers/time_field.rb +1 -0
  171. data/lib/phlex/rails/helpers/time_field_tag.rb +1 -0
  172. data/lib/phlex/rails/helpers/time_select.rb +1 -0
  173. data/lib/phlex/rails/helpers/time_tag.rb +1 -0
  174. data/lib/phlex/rails/helpers/time_zone_options_for_select.rb +1 -0
  175. data/lib/phlex/rails/helpers/time_zone_select.rb +1 -0
  176. data/lib/phlex/rails/helpers/token_list.rb +1 -0
  177. data/lib/phlex/rails/helpers/translate.rb +3 -1
  178. data/lib/phlex/rails/helpers/truncate.rb +2 -7
  179. data/lib/phlex/rails/helpers/turbo_frame_tag.rb +1 -0
  180. data/lib/phlex/rails/helpers/turbo_include_tags.rb +1 -0
  181. data/lib/phlex/rails/helpers/turbo_refresh_method_tag.rb +1 -0
  182. data/lib/phlex/rails/helpers/turbo_refresh_scroll_tag.rb +1 -0
  183. data/lib/phlex/rails/helpers/turbo_refreshes_with.rb +1 -0
  184. data/lib/phlex/rails/helpers/turbo_stream.rb +3 -2
  185. data/lib/phlex/rails/helpers/turbo_stream_from.rb +1 -0
  186. data/lib/phlex/rails/helpers/url_field.rb +1 -0
  187. data/lib/phlex/rails/helpers/url_field_tag.rb +1 -0
  188. data/lib/phlex/rails/helpers/url_for.rb +1 -0
  189. data/lib/phlex/rails/helpers/url_options.rb +1 -0
  190. data/lib/phlex/rails/helpers/url_to_asset.rb +1 -0
  191. data/lib/phlex/rails/helpers/url_to_audio.rb +1 -0
  192. data/lib/phlex/rails/helpers/url_to_font.rb +1 -0
  193. data/lib/phlex/rails/helpers/url_to_image.rb +1 -0
  194. data/lib/phlex/rails/helpers/url_to_javascript.rb +1 -0
  195. data/lib/phlex/rails/helpers/url_to_stylesheet.rb +1 -0
  196. data/lib/phlex/rails/helpers/url_to_video.rb +1 -0
  197. data/lib/phlex/rails/helpers/utf8_enforcer_tag.rb +1 -0
  198. data/lib/phlex/rails/helpers/video_path.rb +1 -0
  199. data/lib/phlex/rails/helpers/video_tag.rb +1 -0
  200. data/lib/phlex/rails/helpers/video_url.rb +1 -0
  201. data/lib/phlex/rails/helpers/week_field.rb +1 -0
  202. data/lib/phlex/rails/helpers/week_field_tag.rb +1 -0
  203. data/lib/phlex/rails/helpers/weekday_options_for_select.rb +1 -0
  204. data/lib/phlex/rails/helpers/weekday_select.rb +1 -0
  205. data/lib/phlex/rails/helpers/word_wrap.rb +1 -0
  206. data/lib/phlex/rails/helpers.rb +1 -0
  207. data/lib/phlex/rails/html.rb +7 -4
  208. data/lib/phlex/rails/layout.rb +5 -5
  209. data/lib/phlex/rails/sgml.rb +113 -72
  210. data/lib/phlex/rails/streaming.rb +2 -3
  211. data/lib/phlex/rails/svg.rb +12 -0
  212. data/lib/phlex/rails/unbuffered.rb +1 -2
  213. data/lib/phlex/rails/version.rb +1 -1
  214. data/lib/phlex/rails.rb +16 -14
  215. metadata +12 -11
  216. data/lib/phlex/rails/helper_finder.rb +0 -13
  217. data/lib/phlex/rails/testing.rb +0 -18
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::URLToImage
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-url_to_image)
6
7
  register_value_helper def url_to_image(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::URLToJavascript
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-url_to_javascript)
6
7
  register_value_helper def url_to_javascript(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::URLToStylesheet
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-url_to_stylesheet)
6
7
  register_value_helper def url_to_stylesheet(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::URLToVideo
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-url_to_video)
6
7
  register_value_helper def url_to_video(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::UTF8EnforcerTag
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-utf8_enforcer_tag)
6
7
  register_output_helper def utf8_enforcer_tag(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::VideoPath
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-video_path)
6
7
  register_value_helper def video_path(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::VideoTag
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-video_tag)
6
7
  register_output_helper def video_tag(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::VideoURL
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html#method-i-video_url)
6
7
  register_value_helper def video_url(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::WeekField
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-week_field)
6
7
  register_output_helper def week_field(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::WeekFieldTag
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-week_field_tag)
6
7
  register_output_helper def week_field_tag(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::WeekdayOptionsForSelect
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-weekday_options_for_select)
6
7
  register_output_helper def weekday_options_for_select(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::WeekdaySelect
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-weekday_select)
6
7
  register_output_helper def weekday_select(...) = nil
7
8
  end
@@ -3,5 +3,6 @@
3
3
  module Phlex::Rails::Helpers::WordWrap
4
4
  extend Phlex::Rails::HelperMacros
5
5
 
6
+ # [Rails Docs](https://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-word_wrap)
6
7
  register_value_helper def word_wrap(...) = nil
7
8
  end
@@ -63,6 +63,7 @@ module Phlex::Rails::Helpers
63
63
  autoload :Flash, "phlex/rails/helpers/flash"
64
64
  autoload :FontPath, "phlex/rails/helpers/font_path"
65
65
  autoload :FontURL, "phlex/rails/helpers/font_url"
66
+ autoload :FormAuthenticityToken, "phlex/rails/helpers/form_authenticity_token"
66
67
  autoload :FormFor, "phlex/rails/helpers/form_for"
67
68
  autoload :FormTag, "phlex/rails/helpers/form_tag"
68
69
  autoload :FormWith, "phlex/rails/helpers/form_with"
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Phlex::Rails::HTML
4
- module Format
5
- def format
6
- :html
7
- end
4
+ def self.included(base)
5
+ base.include Phlex::Rails::SGML
6
+ super
7
+ end
8
+
9
+ def format
10
+ :html
8
11
  end
9
12
  end
@@ -16,7 +16,6 @@ module Phlex::Rails
16
16
  include Helpers::TurboRefreshScrollTag
17
17
  include Helpers::TurboRefreshesWith
18
18
 
19
- # @api private
20
19
  module Interface
21
20
  def render(view_context, _locals, &)
22
21
  new.render(view_context, &)
@@ -37,19 +36,20 @@ module Phlex::Rails
37
36
  end
38
37
  end
39
38
 
40
- def self.included(klass)
41
- unless klass < Phlex::HTML
39
+ def self.included(base)
40
+ unless base < Phlex::HTML
42
41
  raise Phlex::ArgumentError.new("👋 #{name} should only be included into Phlex::HTML classes.")
43
42
  end
44
43
 
45
- klass.extend(Interface)
44
+ base.extend(Interface)
45
+ super
46
46
  end
47
47
 
48
48
  def render(view_context = nil, *args, **kwargs, &block)
49
49
  if @_state
50
50
  super
51
51
  else
52
- call(view_context:) do |yielded|
52
+ call(context: { rails_view_context: view_context }) do |yielded|
53
53
  case yielded
54
54
  when Symbol
55
55
  output = view_context.view_flow.get(yielded)
@@ -1,92 +1,133 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Phlex
4
- module Rails
5
- module SGML
6
- module ClassMethods
7
- def render_in(...)
8
- new.render_in(...)
9
- end
10
- end
3
+ module Phlex::Rails::SGML
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ base.extend Phlex::Rails::HelperMacros
7
+ super
8
+ end
11
9
 
12
- module Overrides
13
- class HelpersCalledBeforeRenderError < StandardError; end
10
+ module ClassMethods
11
+ def render_in(...)
12
+ new.render_in(...)
13
+ end
14
+ end
14
15
 
15
- def partial(*, **, &block)
16
- if block
17
- Phlex::Rails::Partial.new(*, **) { capture(&block) }
18
- else
19
- Phlex::Rails::Partial.new(*, **)
20
- end
21
- end
16
+ def method_missing(name, *args, **kwargs, &block)
17
+ return super unless view_context.respond_to?(name)
22
18
 
23
- def helpers
24
- unless @_state && (view_context = @_state.view_context)
25
- raise HelpersCalledBeforeRenderError.new("Do not use rails helpers until after the view has been rendered.") unless view_context
26
- end
19
+ const_name = name.to_s.gsub("?", "")
20
+ module_name = Phlex::Rails::Helpers.constants.find { |mod| mod.to_s.underscore.gsub("domid", "dom_id") == const_name }
21
+ return super unless module_name
27
22
 
28
- if defined?(ViewComponent::Base) && ViewComponent::Base === view_context
29
- view_context.helpers
30
- else
31
- view_context
32
- end
33
- end
23
+ raise NoMethodError.new("Try including `Phlex::Rails::Helpers::#{module_name}` in #{self.class.name}.")
24
+ end
34
25
 
35
- def render(*args, **kwargs, &block)
36
- renderable = args[0]
37
-
38
- case renderable
39
- when Phlex::SGML, Proc, Method, String
40
- return super
41
- when Class
42
- return super if renderable < Phlex::SGML
43
- when Enumerable
44
- return super unless ActiveRecord::Relation === renderable
45
- when nil
46
- return super if kwargs.length == 0
47
- end
26
+ def partial(*, **, &block)
27
+ if block
28
+ Phlex::Rails::Partial.new(*, **) { capture(&block) }
29
+ else
30
+ Phlex::Rails::Partial.new(*, **)
31
+ end
32
+ end
48
33
 
49
- return super if args.length == 0 && kwargs.length == 0
34
+ def helpers
35
+ warn <<~MESSAGE
36
+ The `helpers` method is deprecated and will be removed in the next
37
+ minor version of phlex-rails.
50
38
 
51
- output = if block
52
- @_state.view_context.render(*args, **kwargs) do |*yielded_args|
53
- if yielded_args.length == 1 && defined?(ViewComponent::Base) && ViewComponent::Base === yielded_args[0]
54
- capture(Phlex::Rails::Buffered.new(yielded_args[0], view: self), &block)
55
- else
56
- capture(*yielded_args, &block)
57
- end
58
- end
59
- else
60
- @_state.view_context.render(*args, **kwargs)
61
- end
39
+ If you absolutely need to access the underlying Rails view context,
40
+ you can do that via the `view_context` method, though this is
41
+ not recommended.
62
42
 
63
- raw(output)
64
- end
43
+ It is much safer to use one of the built-in helper adapters or to
44
+ register your own adapter via `register_output_helper` or
45
+ `register_value_helper`.
65
46
 
66
- def render_in(view_context, &erb)
67
- if erb
68
- call(view_context:) { |*args|
69
- if args.length == 1 && Phlex::SGML === args[0] && !erb.source_location&.[](0)&.end_with?(".rb")
70
- unbuffered = Phlex::Rails::Unbuffered.new(args[0])
71
- raw(helpers.capture(unbuffered, &erb))
72
- else
73
- raw(helpers.capture(*args, &erb))
74
- end
75
- }.html_safe
47
+ See https://beta.phlex.fun/rails/helpers.html
48
+ MESSAGE
49
+
50
+ view_context
51
+ end
52
+
53
+ def view_context
54
+ context[:rails_view_context] || (
55
+ raise Phlex::Rails::HelpersCalledBeforeRenderError.new(
56
+ "Do not use rails helpers until after the view has been rendered."
57
+ )
58
+ )
59
+ end
60
+
61
+ # If we’re rendered from view_component, we need to capture on the view_component context.
62
+ def capture_context
63
+ context[:view_component_context] || view_context
64
+ end
65
+
66
+ def render(renderable = nil, &block)
67
+ case renderable
68
+ when Phlex::SGML, Proc, Method, String
69
+ return super
70
+ when Class
71
+ return super if renderable < Phlex::SGML
72
+ when Enumerable
73
+ return super unless ActiveRecord::Relation === renderable
74
+ when nil
75
+ return super
76
+ end
77
+
78
+ if renderable.respond_to?(:render_in) || renderable.respond_to?(:to_partial_path)
79
+ output = if block
80
+ view_context.render(renderable) do |*yielded_args|
81
+ if yielded_args.length == 1 && defined?(ViewComponent::Base) && ViewComponent::Base === yielded_args[0]
82
+ capture(Phlex::Rails::Buffered.new(yielded_args[0], component: self), &block)
76
83
  else
77
- call(view_context:).html_safe
84
+ capture(*yielded_args, &block)
78
85
  end
79
86
  end
87
+ else
88
+ view_context.render(renderable)
89
+ end
80
90
 
81
- def capture(...)
82
- super&.html_safe
83
- end
91
+ raw(output)
92
+ else
93
+ super
94
+ end
95
+ end
96
+
97
+ def render_in(view_context, &erb)
98
+ case view_context
99
+ when defined?(ViewComponent::Base) && ViewComponent::Base
100
+ context = {
101
+ rails_view_context: view_context.helpers,
102
+ view_component_context: view_context,
103
+ }
104
+ else
105
+ context = { rails_view_context: view_context }
106
+ end
84
107
 
85
- # Trick ViewComponent into thinking we're a ViewComponent to fix rendering output
86
- # @api private
87
- def set_original_view_context(view_context)
108
+ if erb
109
+ call(context:) { |*args|
110
+ if args.length == 1 && Phlex::SGML === args[0] && !erb.source_location&.[](0)&.end_with?(".rb")
111
+ unbuffered = Phlex::Rails::Unbuffered.new(args[0])
112
+ raw(view_context.capture(unbuffered, &erb))
113
+ else
114
+ raw(view_context.capture(*args, &erb))
88
115
  end
89
- end
116
+ }.html_safe
117
+ else
118
+ call(context:).html_safe
90
119
  end
91
120
  end
121
+
122
+ def set_original_view_context(view_context)
123
+ # no-op (see https://github.com/ViewComponent/view_component/issues/2207)
124
+ end
125
+
126
+ def capture(...)
127
+ super&.html_safe
128
+ end
129
+
130
+ def enable_cache_reloading?
131
+ Rails.env.development?
132
+ end
92
133
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # @api private
4
3
  module Phlex::Rails::Streaming
5
4
  include ActionController::Live
6
5
 
@@ -32,7 +31,7 @@ module Phlex::Rails::Streaming
32
31
  headers["Content-Disposition"] = "attachment; filename=\"#{filename || view.filename}\""
33
32
 
34
33
  self.response_body = Enumerator.new do |buffer|
35
- view.call(buffer, view_context:)
34
+ view.call(buffer, context: { rails_view_context: view_context })
36
35
  end
37
36
  end
38
37
 
@@ -47,7 +46,7 @@ module Phlex::Rails::Streaming
47
46
  end
48
47
 
49
48
  self.response_body = Enumerator.new do |buffer|
50
- view.call(buffer, view_context:)
49
+ view.call(buffer, context: { rails_view_context: view_context })
51
50
  rescue => e
52
51
  raise(e) if Rails.env.test?
53
52
 
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Phlex::Rails::SVG
4
+ def self.included(base)
5
+ base.include Phlex::Rails::SGML
6
+ super
7
+ end
8
+
9
+ def format
10
+ :svg
11
+ end
12
+ end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # @api private
4
3
  class Phlex::Rails::Unbuffered
5
4
  def initialize(component)
6
5
  @component = component
@@ -26,7 +25,7 @@ class Phlex::Rails::Unbuffered
26
25
  if erb
27
26
  component.public_send(method_name, *, **) do |*a, **kw|
28
27
  component.raw(
29
- component.helpers.capture(
28
+ component.capture_context.capture(
30
29
  *a,
31
30
  **kw,
32
31
  &erb
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Phlex
4
4
  module Rails
5
- VERSION = "2.0.0.rc2"
5
+ VERSION = "2.0.0"
6
6
  end
7
7
  end
data/lib/phlex/rails.rb CHANGED
@@ -4,33 +4,35 @@ require "phlex"
4
4
 
5
5
  module Phlex
6
6
  module Rails
7
+ class HelpersCalledBeforeRenderError < StandardError; end
8
+
7
9
  autoload :Buffered, "phlex/rails/buffered"
10
+ autoload :Unbuffered, "phlex/rails/unbuffered"
11
+
8
12
  autoload :BufferedCheckboxBuilder, "phlex/rails/buffered_checkbox_builder"
9
13
  autoload :BufferedFormBuilder, "phlex/rails/buffered_form_builder"
10
14
  autoload :BufferedLabelBuilder, "phlex/rails/buffered_label_builder"
11
15
  autoload :BufferedRadioButtonBuilder, "phlex/rails/buffered_radio_button_builder"
12
- autoload :CSV, "phlex/rails/csv"
16
+
17
+ autoload :SGML, "phlex/rails/sgml"
13
18
  autoload :HTML, "phlex/rails/html"
14
- autoload :HelperFinder, "phlex/rails/helper_finder"
15
- autoload :HelperMacros, "phlex/rails/helper_macros"
19
+ autoload :SVG, "phlex/rails/svg"
20
+
21
+ autoload :CSV, "phlex/rails/csv"
22
+
16
23
  autoload :Helpers, "phlex/rails/helpers"
24
+ autoload :HelperMacros, "phlex/rails/helper_macros"
25
+
17
26
  autoload :Layout, "phlex/rails/layout"
18
27
  autoload :Partial, "phlex/rails/partial"
19
- autoload :SGML, "phlex/rails/sgml"
20
28
  autoload :Streaming, "phlex/rails/streaming"
21
- autoload :Unbuffered, "phlex/rails/unbuffered"
22
29
  end
23
30
 
24
- CSV.extend Phlex::Rails::HelperMacros
25
- CSV.prepend Phlex::Rails::CSV::Overrides
26
-
27
- SGML.extend Phlex::Rails::SGML::ClassMethods
28
- SGML.extend Phlex::Rails::HelperMacros
29
- SGML.prepend Phlex::Rails::SGML::Overrides
30
- SGML.include Phlex::Rails::HelperFinder
31
+ CSV.include(Phlex::Rails::CSV)
32
+ CSV.extend(Phlex::Rails::HelperMacros)
31
33
 
32
- HTML.extend Phlex::Rails::HTML::Format
33
- HTML.include Phlex::Rails::HTML::Format
34
+ HTML.include(Phlex::Rails::HTML)
35
+ SVG.include(Phlex::Rails::SVG)
34
36
 
35
37
  ActiveSupport::SafeBuffer.include(Phlex::SGML::SafeObject)
36
38
  end
metadata CHANGED
@@ -1,29 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phlex-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Drapper
8
+ - Will Cosgrove
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2025-02-10 00:00:00.000000000 Z
12
+ date: 2025-02-14 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: phlex
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - '='
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: 2.0.0.rc2
20
+ version: 2.0.0
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - '='
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: 2.0.0.rc2
27
+ version: 2.0.0
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: railties
29
30
  requirement: !ruby/object:Gem::Requirement
@@ -44,7 +45,7 @@ dependencies:
44
45
  - - "<"
45
46
  - !ruby/object:Gem::Version
46
47
  version: '9'
47
- description: A high-performance view framework optimised for fun.
48
+ description: Object-oriented views in pure Ruby.
48
49
  email:
49
50
  - joel@drapper.me
50
51
  executables: []
@@ -72,7 +73,6 @@ files:
72
73
  - lib/phlex/rails/buffered_label_builder.rb
73
74
  - lib/phlex/rails/buffered_radio_button_builder.rb
74
75
  - lib/phlex/rails/csv.rb
75
- - lib/phlex/rails/helper_finder.rb
76
76
  - lib/phlex/rails/helper_macros.rb
77
77
  - lib/phlex/rails/helpers.rb
78
78
  - lib/phlex/rails/helpers/action_cable_meta_tag.rb
@@ -137,6 +137,7 @@ files:
137
137
  - lib/phlex/rails/helpers/flash.rb
138
138
  - lib/phlex/rails/helpers/font_path.rb
139
139
  - lib/phlex/rails/helpers/font_url.rb
140
+ - lib/phlex/rails/helpers/form_authenticity_token.rb
140
141
  - lib/phlex/rails/helpers/form_for.rb
141
142
  - lib/phlex/rails/helpers/form_tag.rb
142
143
  - lib/phlex/rails/helpers/form_with.rb
@@ -278,7 +279,7 @@ files:
278
279
  - lib/phlex/rails/partial.rb
279
280
  - lib/phlex/rails/sgml.rb
280
281
  - lib/phlex/rails/streaming.rb
281
- - lib/phlex/rails/testing.rb
282
+ - lib/phlex/rails/svg.rb
282
283
  - lib/phlex/rails/unbuffered.rb
283
284
  - lib/phlex/rails/version.rb
284
285
  homepage: https://www.phlex.fun
@@ -287,7 +288,7 @@ licenses:
287
288
  metadata:
288
289
  homepage_uri: https://www.phlex.fun
289
290
  source_code_uri: https://github.com/phlex-ruby/phlex-rails
290
- changelog_uri: https://github.com/phlex-ruby/phlex-rails/blob/main/CHANGELOG.md
291
+ changelog_uri: https://github.com/phlex-ruby/phlex-rails/releases
291
292
  funding_uri: https://github.com/sponsors/joeldrapper
292
293
  rubygems_mfa_required: 'true'
293
294
  post_install_message:
@@ -298,7 +299,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
298
299
  requirements:
299
300
  - - ">="
300
301
  - !ruby/object:Gem::Version
301
- version: 3.3.1
302
+ version: '3.2'
302
303
  required_rubygems_version: !ruby/object:Gem::Requirement
303
304
  requirements:
304
305
  - - ">="
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlex::Rails::HelperFinder
4
- def method_missing(name, *args, **kwargs, &block)
5
- return super unless helpers.respond_to?(name)
6
-
7
- const_name = name.to_s.gsub("?", "")
8
- module_name = Phlex::Rails::Helpers.constants.find { |mod| mod.to_s.underscore.gsub("domid", "dom_id") == const_name }
9
- return super unless module_name
10
-
11
- raise NoMethodError.new("Try including `Phlex::Rails::Helpers::#{module_name}` in #{self.class.name}.")
12
- end
13
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "phlex/rails"
4
- require "phlex/testing"
5
-
6
- module Phlex::Testing::RailsContext
7
- def view_context
8
- controller.view_context
9
- end
10
-
11
- def controller
12
- @controller ||= ActionView::TestCase::TestController.new
13
- end
14
- end
15
-
16
- Phlex::Testing::SGML.prepend(
17
- Phlex::Testing::RailsContext,
18
- )