omg-actionview 8.0.0.alpha1

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 (130) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +25 -0
  3. data/MIT-LICENSE +21 -0
  4. data/README.rdoc +40 -0
  5. data/app/assets/javascripts/rails-ujs.esm.js +686 -0
  6. data/app/assets/javascripts/rails-ujs.js +630 -0
  7. data/lib/action_view/base.rb +316 -0
  8. data/lib/action_view/buffers.rb +165 -0
  9. data/lib/action_view/cache_expiry.rb +69 -0
  10. data/lib/action_view/context.rb +32 -0
  11. data/lib/action_view/dependency_tracker/erb_tracker.rb +159 -0
  12. data/lib/action_view/dependency_tracker/ruby_tracker.rb +43 -0
  13. data/lib/action_view/dependency_tracker/wildcard_resolver.rb +32 -0
  14. data/lib/action_view/dependency_tracker.rb +41 -0
  15. data/lib/action_view/deprecator.rb +7 -0
  16. data/lib/action_view/digestor.rb +130 -0
  17. data/lib/action_view/flows.rb +75 -0
  18. data/lib/action_view/gem_version.rb +17 -0
  19. data/lib/action_view/helpers/active_model_helper.rb +54 -0
  20. data/lib/action_view/helpers/asset_tag_helper.rb +680 -0
  21. data/lib/action_view/helpers/asset_url_helper.rb +473 -0
  22. data/lib/action_view/helpers/atom_feed_helper.rb +205 -0
  23. data/lib/action_view/helpers/cache_helper.rb +315 -0
  24. data/lib/action_view/helpers/capture_helper.rb +236 -0
  25. data/lib/action_view/helpers/content_exfiltration_prevention_helper.rb +70 -0
  26. data/lib/action_view/helpers/controller_helper.rb +42 -0
  27. data/lib/action_view/helpers/csp_helper.rb +26 -0
  28. data/lib/action_view/helpers/csrf_helper.rb +35 -0
  29. data/lib/action_view/helpers/date_helper.rb +1266 -0
  30. data/lib/action_view/helpers/debug_helper.rb +38 -0
  31. data/lib/action_view/helpers/form_helper.rb +2765 -0
  32. data/lib/action_view/helpers/form_options_helper.rb +927 -0
  33. data/lib/action_view/helpers/form_tag_helper.rb +1088 -0
  34. data/lib/action_view/helpers/javascript_helper.rb +96 -0
  35. data/lib/action_view/helpers/number_helper.rb +165 -0
  36. data/lib/action_view/helpers/output_safety_helper.rb +70 -0
  37. data/lib/action_view/helpers/rendering_helper.rb +218 -0
  38. data/lib/action_view/helpers/sanitize_helper.rb +201 -0
  39. data/lib/action_view/helpers/tag_helper.rb +621 -0
  40. data/lib/action_view/helpers/tags/base.rb +138 -0
  41. data/lib/action_view/helpers/tags/check_box.rb +65 -0
  42. data/lib/action_view/helpers/tags/checkable.rb +18 -0
  43. data/lib/action_view/helpers/tags/collection_check_boxes.rb +37 -0
  44. data/lib/action_view/helpers/tags/collection_helpers.rb +118 -0
  45. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +31 -0
  46. data/lib/action_view/helpers/tags/collection_select.rb +33 -0
  47. data/lib/action_view/helpers/tags/color_field.rb +26 -0
  48. data/lib/action_view/helpers/tags/date_field.rb +14 -0
  49. data/lib/action_view/helpers/tags/date_select.rb +75 -0
  50. data/lib/action_view/helpers/tags/datetime_field.rb +39 -0
  51. data/lib/action_view/helpers/tags/datetime_local_field.rb +29 -0
  52. data/lib/action_view/helpers/tags/datetime_select.rb +10 -0
  53. data/lib/action_view/helpers/tags/email_field.rb +10 -0
  54. data/lib/action_view/helpers/tags/file_field.rb +26 -0
  55. data/lib/action_view/helpers/tags/grouped_collection_select.rb +34 -0
  56. data/lib/action_view/helpers/tags/hidden_field.rb +14 -0
  57. data/lib/action_view/helpers/tags/label.rb +84 -0
  58. data/lib/action_view/helpers/tags/month_field.rb +14 -0
  59. data/lib/action_view/helpers/tags/number_field.rb +20 -0
  60. data/lib/action_view/helpers/tags/password_field.rb +14 -0
  61. data/lib/action_view/helpers/tags/placeholderable.rb +24 -0
  62. data/lib/action_view/helpers/tags/radio_button.rb +32 -0
  63. data/lib/action_view/helpers/tags/range_field.rb +10 -0
  64. data/lib/action_view/helpers/tags/search_field.rb +27 -0
  65. data/lib/action_view/helpers/tags/select.rb +45 -0
  66. data/lib/action_view/helpers/tags/select_renderer.rb +56 -0
  67. data/lib/action_view/helpers/tags/tel_field.rb +10 -0
  68. data/lib/action_view/helpers/tags/text_area.rb +24 -0
  69. data/lib/action_view/helpers/tags/text_field.rb +33 -0
  70. data/lib/action_view/helpers/tags/time_field.rb +23 -0
  71. data/lib/action_view/helpers/tags/time_select.rb +10 -0
  72. data/lib/action_view/helpers/tags/time_zone_select.rb +25 -0
  73. data/lib/action_view/helpers/tags/translator.rb +39 -0
  74. data/lib/action_view/helpers/tags/url_field.rb +10 -0
  75. data/lib/action_view/helpers/tags/week_field.rb +14 -0
  76. data/lib/action_view/helpers/tags/weekday_select.rb +31 -0
  77. data/lib/action_view/helpers/tags.rb +47 -0
  78. data/lib/action_view/helpers/text_helper.rb +568 -0
  79. data/lib/action_view/helpers/translation_helper.rb +161 -0
  80. data/lib/action_view/helpers/url_helper.rb +812 -0
  81. data/lib/action_view/helpers.rb +68 -0
  82. data/lib/action_view/layouts.rb +434 -0
  83. data/lib/action_view/locale/en.yml +56 -0
  84. data/lib/action_view/log_subscriber.rb +132 -0
  85. data/lib/action_view/lookup_context.rb +299 -0
  86. data/lib/action_view/model_naming.rb +14 -0
  87. data/lib/action_view/path_registry.rb +57 -0
  88. data/lib/action_view/path_set.rb +84 -0
  89. data/lib/action_view/railtie.rb +132 -0
  90. data/lib/action_view/record_identifier.rb +118 -0
  91. data/lib/action_view/render_parser/prism_render_parser.rb +139 -0
  92. data/lib/action_view/render_parser/ripper_render_parser.rb +350 -0
  93. data/lib/action_view/render_parser.rb +40 -0
  94. data/lib/action_view/renderer/abstract_renderer.rb +186 -0
  95. data/lib/action_view/renderer/collection_renderer.rb +204 -0
  96. data/lib/action_view/renderer/object_renderer.rb +34 -0
  97. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +120 -0
  98. data/lib/action_view/renderer/partial_renderer.rb +267 -0
  99. data/lib/action_view/renderer/renderer.rb +107 -0
  100. data/lib/action_view/renderer/streaming_template_renderer.rb +107 -0
  101. data/lib/action_view/renderer/template_renderer.rb +115 -0
  102. data/lib/action_view/rendering.rb +190 -0
  103. data/lib/action_view/routing_url_for.rb +149 -0
  104. data/lib/action_view/tasks/cache_digests.rake +25 -0
  105. data/lib/action_view/template/error.rb +264 -0
  106. data/lib/action_view/template/handlers/builder.rb +25 -0
  107. data/lib/action_view/template/handlers/erb/erubi.rb +85 -0
  108. data/lib/action_view/template/handlers/erb.rb +157 -0
  109. data/lib/action_view/template/handlers/html.rb +11 -0
  110. data/lib/action_view/template/handlers/raw.rb +11 -0
  111. data/lib/action_view/template/handlers.rb +66 -0
  112. data/lib/action_view/template/html.rb +33 -0
  113. data/lib/action_view/template/inline.rb +22 -0
  114. data/lib/action_view/template/raw_file.rb +25 -0
  115. data/lib/action_view/template/renderable.rb +30 -0
  116. data/lib/action_view/template/resolver.rb +212 -0
  117. data/lib/action_view/template/sources/file.rb +17 -0
  118. data/lib/action_view/template/sources.rb +13 -0
  119. data/lib/action_view/template/text.rb +32 -0
  120. data/lib/action_view/template/types.rb +50 -0
  121. data/lib/action_view/template.rb +580 -0
  122. data/lib/action_view/template_details.rb +66 -0
  123. data/lib/action_view/template_path.rb +66 -0
  124. data/lib/action_view/test_case.rb +449 -0
  125. data/lib/action_view/testing/resolvers.rb +44 -0
  126. data/lib/action_view/unbound_template.rb +67 -0
  127. data/lib/action_view/version.rb +10 -0
  128. data/lib/action_view/view_paths.rb +117 -0
  129. data/lib/action_view.rb +104 -0
  130. metadata +275 -0
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_view/helpers/tag_helper"
4
+ require "active_support/html_safe_translation"
5
+
6
+ module ActionView
7
+ module Helpers # :nodoc:
8
+ # = Action View Translation \Helpers
9
+ module TranslationHelper
10
+ extend ActiveSupport::Concern
11
+
12
+ include TagHelper
13
+
14
+ # Specify whether an error should be raised for missing translations.
15
+ singleton_class.attr_accessor :raise_on_missing_translations
16
+
17
+ included do
18
+ mattr_accessor :debug_missing_translation, default: true
19
+ end
20
+
21
+ # Delegates to <tt>I18n#translate</tt> but also performs three additional
22
+ # functions.
23
+ #
24
+ # First, it will ensure that any thrown +MissingTranslation+ messages will
25
+ # be rendered as inline spans that:
26
+ #
27
+ # * Have a <tt>translation-missing</tt> class applied
28
+ # * Contain the missing key as the value of the +title+ attribute
29
+ # * Have a titleized version of the last key segment as text
30
+ #
31
+ # For example, the value returned for the missing translation key
32
+ # <tt>"blog.post.title"</tt> will be:
33
+ #
34
+ # <span
35
+ # class="translation_missing"
36
+ # title="translation missing: en.blog.post.title">Title</span>
37
+ #
38
+ # This allows for views to display rather reasonable strings while still
39
+ # giving developers a way to find missing translations.
40
+ #
41
+ # If you would prefer missing translations to raise an error, you can
42
+ # opt out of span-wrapping behavior globally by setting
43
+ # <tt>config.i18n.raise_on_missing_translations = true</tt> or
44
+ # individually by passing <tt>raise: true</tt> as an option to
45
+ # <tt>translate</tt>.
46
+ #
47
+ # Second, if the key starts with a period <tt>translate</tt> will scope
48
+ # the key by the current partial. Calling <tt>translate(".foo")</tt> from
49
+ # the <tt>people/index.html.erb</tt> template is equivalent to calling
50
+ # <tt>translate("people.index.foo")</tt>. This makes it less
51
+ # repetitive to translate many keys within the same partial and provides
52
+ # a convention to scope keys consistently.
53
+ #
54
+ # Third, the translation will be marked as <tt>html_safe</tt> if the key
55
+ # has the suffix "_html" or the last element of the key is "html". Calling
56
+ # <tt>translate("footer_html")</tt> or <tt>translate("footer.html")</tt>
57
+ # will return an HTML safe string that won't be escaped by other HTML
58
+ # helper methods. This naming convention helps to identify translations
59
+ # that include HTML tags so that you know what kind of output to expect
60
+ # when you call translate in a template and translators know which keys
61
+ # they can provide HTML values for.
62
+ #
63
+ # To access the translated text along with the fully resolved
64
+ # translation key, <tt>translate</tt> accepts a block:
65
+ #
66
+ # <%= translate(".relative_key") do |translation, resolved_key| %>
67
+ # <span title="<%= resolved_key %>"><%= translation %></span>
68
+ # <% end %>
69
+ #
70
+ # This enables annotate translated text to be aware of the scope it was
71
+ # resolved against.
72
+ #
73
+ def translate(key, **options)
74
+ return key.map { |k| translate(k, **options) } if key.is_a?(Array)
75
+ key = key&.to_s unless key.is_a?(Symbol)
76
+
77
+ alternatives = if options.key?(:default)
78
+ options[:default].is_a?(Array) ? options.delete(:default).compact : [options.delete(:default)]
79
+ end
80
+
81
+ options[:raise] = true if options[:raise].nil? && TranslationHelper.raise_on_missing_translations
82
+ default = MISSING_TRANSLATION
83
+
84
+ translation = while key || alternatives.present?
85
+ if alternatives.blank? && !options[:raise].nil?
86
+ default = NO_DEFAULT # let I18n handle missing translation
87
+ end
88
+
89
+ key = scope_key_by_partial(key)
90
+
91
+ translated = ActiveSupport::HtmlSafeTranslation.translate(key, **options, default: default)
92
+
93
+ break translated unless translated == MISSING_TRANSLATION
94
+
95
+ if alternatives.present? && !alternatives.first.is_a?(Symbol)
96
+ break alternatives.first && I18n.translate(nil, **options, default: alternatives)
97
+ end
98
+
99
+ first_key ||= key
100
+ key = alternatives&.shift
101
+ end
102
+
103
+ if key.nil? && !first_key.nil?
104
+ translation = missing_translation(first_key, options)
105
+ key = first_key
106
+ end
107
+
108
+ block_given? ? yield(translation, key) : translation
109
+ end
110
+ alias :t :translate
111
+
112
+ # Delegates to <tt>I18n.localize</tt> with no additional functionality.
113
+ #
114
+ # See https://www.rubydoc.info/gems/i18n/I18n/Backend/Base:localize
115
+ # for more information.
116
+ def localize(object, **options)
117
+ I18n.localize(object, **options)
118
+ end
119
+ alias :l :localize
120
+
121
+ private
122
+ MISSING_TRANSLATION = -(2**60)
123
+ private_constant :MISSING_TRANSLATION
124
+
125
+ NO_DEFAULT = [].freeze
126
+ private_constant :NO_DEFAULT
127
+
128
+ def scope_key_by_partial(key)
129
+ if key&.start_with?(".")
130
+ if @virtual_path
131
+ @_scope_key_by_partial_cache ||= {}
132
+ @_scope_key_by_partial_cache[@virtual_path] ||= @virtual_path.gsub(%r{/_?}, ".")
133
+ "#{@_scope_key_by_partial_cache[@virtual_path]}#{key}"
134
+ else
135
+ raise "Cannot use t(#{key.inspect}) shortcut because path is not available"
136
+ end
137
+ else
138
+ key
139
+ end
140
+ end
141
+
142
+ def missing_translation(key, options)
143
+ keys = I18n.normalize_keys(options[:locale] || I18n.locale, key, options[:scope])
144
+
145
+ title = +"translation missing: #{keys.join(".")}"
146
+
147
+ options.each do |name, value|
148
+ unless name == :scope
149
+ title << ", " << name.to_s << ": " << ERB::Util.html_escape(value)
150
+ end
151
+ end
152
+
153
+ if ActionView::Base.debug_missing_translation
154
+ content_tag("span", keys.last.to_s.titleize, class: "translation_missing", title: title)
155
+ else
156
+ title
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end