actionview 4.2.11.1 → 6.1.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +232 -186
  3. data/MIT-LICENSE +1 -2
  4. data/README.rdoc +9 -8
  5. data/lib/action_view/base.rb +115 -39
  6. data/lib/action_view/buffers.rb +18 -1
  7. data/lib/action_view/cache_expiry.rb +52 -0
  8. data/lib/action_view/context.rb +8 -12
  9. data/lib/action_view/dependency_tracker.rb +61 -21
  10. data/lib/action_view/digestor.rb +89 -85
  11. data/lib/action_view/flows.rb +11 -12
  12. data/lib/action_view/gem_version.rb +6 -4
  13. data/lib/action_view/helpers/active_model_helper.rb +16 -11
  14. data/lib/action_view/helpers/asset_tag_helper.rb +282 -83
  15. data/lib/action_view/helpers/asset_url_helper.rb +175 -69
  16. data/lib/action_view/helpers/atom_feed_helper.rb +20 -17
  17. data/lib/action_view/helpers/cache_helper.rb +107 -43
  18. data/lib/action_view/helpers/capture_helper.rb +20 -13
  19. data/lib/action_view/helpers/controller_helper.rb +15 -4
  20. data/lib/action_view/helpers/csp_helper.rb +26 -0
  21. data/lib/action_view/helpers/csrf_helper.rb +8 -6
  22. data/lib/action_view/helpers/date_helper.rb +232 -130
  23. data/lib/action_view/helpers/debug_helper.rb +7 -6
  24. data/lib/action_view/helpers/form_helper.rb +808 -146
  25. data/lib/action_view/helpers/form_options_helper.rb +124 -78
  26. data/lib/action_view/helpers/form_tag_helper.rb +120 -74
  27. data/lib/action_view/helpers/javascript_helper.rb +33 -17
  28. data/lib/action_view/helpers/number_helper.rb +87 -62
  29. data/lib/action_view/helpers/output_safety_helper.rb +36 -4
  30. data/lib/action_view/helpers/rendering_helper.rb +21 -10
  31. data/lib/action_view/helpers/sanitize_helper.rb +30 -31
  32. data/lib/action_view/helpers/tag_helper.rb +269 -68
  33. data/lib/action_view/helpers/tags/base.rb +141 -97
  34. data/lib/action_view/helpers/tags/check_box.rb +20 -19
  35. data/lib/action_view/helpers/tags/checkable.rb +4 -2
  36. data/lib/action_view/helpers/tags/collection_check_boxes.rb +12 -34
  37. data/lib/action_view/helpers/tags/collection_helpers.rb +69 -36
  38. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +6 -12
  39. data/lib/action_view/helpers/tags/collection_select.rb +4 -2
  40. data/lib/action_view/helpers/tags/color_field.rb +4 -3
  41. data/lib/action_view/helpers/tags/date_field.rb +3 -2
  42. data/lib/action_view/helpers/tags/date_select.rb +38 -37
  43. data/lib/action_view/helpers/tags/datetime_field.rb +4 -3
  44. data/lib/action_view/helpers/tags/datetime_local_field.rb +3 -2
  45. data/lib/action_view/helpers/tags/datetime_select.rb +2 -0
  46. data/lib/action_view/helpers/tags/email_field.rb +2 -0
  47. data/lib/action_view/helpers/tags/file_field.rb +2 -0
  48. data/lib/action_view/helpers/tags/grouped_collection_select.rb +4 -2
  49. data/lib/action_view/helpers/tags/hidden_field.rb +6 -0
  50. data/lib/action_view/helpers/tags/label.rb +7 -2
  51. data/lib/action_view/helpers/tags/month_field.rb +3 -2
  52. data/lib/action_view/helpers/tags/number_field.rb +2 -0
  53. data/lib/action_view/helpers/tags/password_field.rb +3 -1
  54. data/lib/action_view/helpers/tags/placeholderable.rb +3 -1
  55. data/lib/action_view/helpers/tags/radio_button.rb +7 -6
  56. data/lib/action_view/helpers/tags/range_field.rb +2 -0
  57. data/lib/action_view/helpers/tags/search_field.rb +14 -9
  58. data/lib/action_view/helpers/tags/select.rb +11 -10
  59. data/lib/action_view/helpers/tags/tel_field.rb +2 -0
  60. data/lib/action_view/helpers/tags/text_area.rb +4 -2
  61. data/lib/action_view/helpers/tags/text_field.rb +8 -8
  62. data/lib/action_view/helpers/tags/time_field.rb +3 -2
  63. data/lib/action_view/helpers/tags/time_select.rb +2 -0
  64. data/lib/action_view/helpers/tags/time_zone_select.rb +3 -1
  65. data/lib/action_view/helpers/tags/translator.rb +15 -16
  66. data/lib/action_view/helpers/tags/url_field.rb +2 -0
  67. data/lib/action_view/helpers/tags/week_field.rb +3 -2
  68. data/lib/action_view/helpers/tags.rb +3 -1
  69. data/lib/action_view/helpers/text_helper.rb +56 -38
  70. data/lib/action_view/helpers/translation_helper.rb +150 -68
  71. data/lib/action_view/helpers/url_helper.rb +284 -117
  72. data/lib/action_view/helpers.rb +5 -3
  73. data/lib/action_view/layouts.rb +68 -63
  74. data/lib/action_view/log_subscriber.rb +77 -10
  75. data/lib/action_view/lookup_context.rb +134 -91
  76. data/lib/action_view/model_naming.rb +3 -1
  77. data/lib/action_view/path_set.rb +26 -24
  78. data/lib/action_view/railtie.rb +62 -13
  79. data/lib/action_view/record_identifier.rb +53 -26
  80. data/lib/action_view/renderer/abstract_renderer.rb +151 -14
  81. data/lib/action_view/renderer/collection_renderer.rb +196 -0
  82. data/lib/action_view/renderer/object_renderer.rb +34 -0
  83. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +102 -0
  84. data/lib/action_view/renderer/partial_renderer.rb +55 -303
  85. data/lib/action_view/renderer/renderer.rb +66 -9
  86. data/lib/action_view/renderer/streaming_template_renderer.rb +58 -54
  87. data/lib/action_view/renderer/template_renderer.rb +82 -73
  88. data/lib/action_view/rendering.rb +71 -45
  89. data/lib/action_view/routing_url_for.rb +34 -23
  90. data/lib/action_view/tasks/cache_digests.rake +25 -0
  91. data/lib/action_view/template/error.rb +44 -29
  92. data/lib/action_view/template/handlers/builder.rb +12 -13
  93. data/lib/action_view/template/handlers/erb/erubi.rb +89 -0
  94. data/lib/action_view/template/handlers/erb.rb +23 -89
  95. data/lib/action_view/template/handlers/html.rb +11 -0
  96. data/lib/action_view/template/handlers/raw.rb +4 -4
  97. data/lib/action_view/template/handlers.rb +12 -8
  98. data/lib/action_view/template/html.rb +10 -11
  99. data/lib/action_view/template/inline.rb +22 -0
  100. data/lib/action_view/template/raw_file.rb +25 -0
  101. data/lib/action_view/template/renderable.rb +24 -0
  102. data/lib/action_view/template/resolver.rb +263 -197
  103. data/lib/action_view/template/sources/file.rb +17 -0
  104. data/lib/action_view/template/sources.rb +13 -0
  105. data/lib/action_view/template/text.rb +8 -10
  106. data/lib/action_view/template/types.rb +18 -18
  107. data/lib/action_view/template.rb +108 -92
  108. data/lib/action_view/test_case.rb +66 -53
  109. data/lib/action_view/testing/resolvers.rb +24 -33
  110. data/lib/action_view/unbound_template.rb +31 -0
  111. data/lib/action_view/version.rb +3 -1
  112. data/lib/action_view/view_paths.rb +73 -58
  113. data/lib/action_view.rb +14 -8
  114. data/lib/assets/compiled/rails-ujs.js +746 -0
  115. metadata +42 -29
  116. data/lib/action_view/helpers/record_tag_helper.rb +0 -108
  117. data/lib/action_view/tasks/dependencies.rake +0 -23
@@ -1,54 +1,45 @@
1
- require 'action_view/template/resolver'
1
+ # frozen_string_literal: true
2
+
3
+ require "action_view/template/resolver"
2
4
 
3
5
  module ActionView #:nodoc:
4
6
  # Use FixtureResolver in your tests to simulate the presence of files on the
5
7
  # file system. This is used internally by Rails' own test suite, and is
6
8
  # useful for testing extensions that have no way of knowing what the file
7
9
  # system will look like at runtime.
8
- class FixtureResolver < PathResolver
9
- attr_reader :hash
10
-
11
- def initialize(hash = {}, pattern=nil)
12
- super(pattern)
10
+ class FixtureResolver < OptimizedFileSystemResolver
11
+ def initialize(hash = {})
12
+ super("")
13
13
  @hash = hash
14
+ @path = ""
14
15
  end
15
16
 
16
- def to_s
17
- @hash.keys.join(', ')
17
+ def data
18
+ @hash
18
19
  end
19
20
 
20
- private
21
+ def to_s
22
+ @hash.keys.join(", ")
23
+ end
21
24
 
22
- def query(path, exts, formats, _)
23
- query = ""
24
- EXTENSIONS.each_key do |ext|
25
- query << '(' << exts[ext].map {|e| e && Regexp.escape(".#{e}") }.join('|') << '|)'
25
+ private
26
+ def find_candidate_template_paths(path)
27
+ @hash.keys.select do |fixture|
28
+ fixture.start_with?(path.virtual)
29
+ end.map do |fixture|
30
+ "/#{fixture}"
31
+ end
26
32
  end
27
- query = /^(#{Regexp.escape(path)})#{query}$/
28
33
 
29
- templates = []
30
- @hash.each do |_path, array|
31
- source, updated_at = array
32
- next unless _path =~ query
33
- handler, format, variant = extract_handler_and_format_and_variant(_path, formats)
34
- templates << Template.new(source, _path, handler,
35
- :virtual_path => path.virtual,
36
- :format => format,
37
- :variant => variant,
38
- :updated_at => updated_at
39
- )
34
+ def source_for_template(template)
35
+ @hash[template[1..template.size]]
40
36
  end
41
-
42
- templates.sort_by {|t| -t.identifier.match(/^#{query}$/).captures.reject(&:blank?).size }
43
- end
44
37
  end
45
38
 
46
39
  class NullResolver < PathResolver
47
- def query(path, exts, formats, _)
48
- handler, format, variant = extract_handler_and_format_and_variant(path, formats)
49
- [ActionView::Template.new("Template generated by Null Resolver", path, handler, :virtual_path => path, :format => format, :variant => variant)]
40
+ def query(path, exts, _, locals, cache:)
41
+ handler, format, variant = extract_handler_and_format_and_variant(path)
42
+ [ActionView::Template.new("Template generated by Null Resolver", path.virtual, handler, virtual_path: path.virtual, format: format, variant: variant, locals: locals)]
50
43
  end
51
44
  end
52
-
53
45
  end
54
-
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
4
+
5
+ module ActionView
6
+ class UnboundTemplate
7
+ def initialize(source, identifier, handler, options)
8
+ @source = source
9
+ @identifier = identifier
10
+ @handler = handler
11
+ @options = options
12
+
13
+ @templates = Concurrent::Map.new(initial_capacity: 2)
14
+ end
15
+
16
+ def bind_locals(locals)
17
+ @templates[locals] ||= build_template(locals)
18
+ end
19
+
20
+ private
21
+ def build_template(locals)
22
+ options = @options.merge(locals: locals)
23
+ Template.new(
24
+ @source,
25
+ @identifier,
26
+ @handler,
27
+ **options
28
+ )
29
+ end
30
+ end
31
+ end
@@ -1,4 +1,6 @@
1
- require_relative 'gem_version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "gem_version"
2
4
 
3
5
  module ActionView
4
6
  # Returns the version of the currently loaded ActionView as a <tt>Gem::Version</tt>
@@ -1,78 +1,33 @@
1
- require 'action_view/base'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActionView
4
4
  module ViewPaths
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- class_attribute :_view_paths
9
- self._view_paths = ActionView::PathSet.new
10
- self._view_paths.freeze
8
+ ViewPaths.set_view_paths(self, ActionView::PathSet.new.freeze)
11
9
  end
12
10
 
13
- delegate :template_exists?, :view_paths, :formats, :formats=,
14
- :locale, :locale=, :to => :lookup_context
11
+ delegate :template_exists?, :any_templates?, :view_paths, :formats, :formats=,
12
+ :locale, :locale=, to: :lookup_context
15
13
 
16
14
  module ClassMethods
17
- def _prefixes # :nodoc:
18
- @_prefixes ||= begin
19
- deprecated_prefixes = handle_deprecated_parent_prefixes
20
- if deprecated_prefixes
21
- deprecated_prefixes
22
- else
23
- return local_prefixes if superclass.abstract?
24
-
25
- local_prefixes + superclass._prefixes
26
- end
27
- end
15
+ def _view_paths
16
+ ViewPaths.get_view_paths(self)
28
17
  end
29
18
 
30
- private
31
-
32
- # Override this method in your controller if you want to change paths prefixes for finding views.
33
- # Prefixes defined here will still be added to parents' <tt>._prefixes</tt>.
34
- def local_prefixes
35
- [controller_path]
19
+ def _view_paths=(paths)
20
+ ViewPaths.set_view_paths(self, paths)
36
21
  end
37
22
 
38
- def handle_deprecated_parent_prefixes # TODO: remove in 4.3/5.0.
39
- return unless respond_to?(:parent_prefixes)
40
-
41
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
42
- Overriding `ActionController::Base::parent_prefixes` is deprecated,
43
- override `.local_prefixes` instead.
44
- MSG
23
+ def _prefixes # :nodoc:
24
+ @_prefixes ||= begin
25
+ return local_prefixes if superclass.abstract?
45
26
 
46
- local_prefixes + parent_prefixes
27
+ local_prefixes + superclass._prefixes
28
+ end
47
29
  end
48
- end
49
-
50
- # The prefixes used in render "foo" shortcuts.
51
- def _prefixes # :nodoc:
52
- self.class._prefixes
53
- end
54
-
55
- # LookupContext is the object responsible to hold all information required to lookup
56
- # templates, i.e. view paths and details. Check ActionView::LookupContext for more
57
- # information.
58
- def lookup_context
59
- @_lookup_context ||=
60
- ActionView::LookupContext.new(self.class._view_paths, details_for_lookup, _prefixes)
61
- end
62
-
63
- def details_for_lookup
64
- { }
65
- end
66
-
67
- def append_view_path(path)
68
- lookup_context.view_paths.push(*path)
69
- end
70
-
71
- def prepend_view_path(path)
72
- lookup_context.view_paths.unshift(*path)
73
- end
74
30
 
75
- module ClassMethods
76
31
  # Append a path to the list of view paths for this controller.
77
32
  #
78
33
  # ==== Parameters
@@ -106,6 +61,66 @@ module ActionView
106
61
  def view_paths=(paths)
107
62
  self._view_paths = ActionView::PathSet.new(Array(paths))
108
63
  end
64
+
65
+ private
66
+ # Override this method in your controller if you want to change paths prefixes for finding views.
67
+ # Prefixes defined here will still be added to parents' <tt>._prefixes</tt>.
68
+ def local_prefixes
69
+ [controller_path]
70
+ end
71
+ end
72
+
73
+ # :stopdoc:
74
+ @all_view_paths = {}
75
+
76
+ def self.get_view_paths(klass)
77
+ @all_view_paths[klass] || get_view_paths(klass.superclass)
78
+ end
79
+
80
+ def self.set_view_paths(klass, paths)
81
+ @all_view_paths[klass] = paths
82
+ end
83
+
84
+ def self.all_view_paths
85
+ @all_view_paths.values.uniq
86
+ end
87
+ # :startdoc:
88
+
89
+ # The prefixes used in render "foo" shortcuts.
90
+ def _prefixes # :nodoc:
91
+ self.class._prefixes
92
+ end
93
+
94
+ # <tt>LookupContext</tt> is the object responsible for holding all
95
+ # information required for looking up templates, i.e. view paths and
96
+ # details. Check <tt>ActionView::LookupContext</tt> for more information.
97
+ def lookup_context
98
+ @_lookup_context ||=
99
+ ActionView::LookupContext.new(self.class._view_paths, details_for_lookup, _prefixes)
100
+ end
101
+
102
+ def details_for_lookup
103
+ {}
104
+ end
105
+
106
+ # Append a path to the list of view paths for the current <tt>LookupContext</tt>.
107
+ #
108
+ # ==== Parameters
109
+ # * <tt>path</tt> - If a String is provided, it gets converted into
110
+ # the default view path. You may also provide a custom view path
111
+ # (see ActionView::PathSet for more information)
112
+ def append_view_path(path)
113
+ lookup_context.view_paths.push(*path)
114
+ end
115
+
116
+ # Prepend a path to the list of view paths for the current <tt>LookupContext</tt>.
117
+ #
118
+ # ==== Parameters
119
+ # * <tt>path</tt> - If a String is provided, it gets converted into
120
+ # the default view path. You may also provide a custom view path
121
+ # (see ActionView::PathSet for more information)
122
+ def prepend_view_path(path)
123
+ lookup_context.view_paths.unshift(*path)
109
124
  end
110
125
  end
111
126
  end
data/lib/action_view.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
- # Copyright (c) 2004-2014 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2022 David Heinemeier Hansson
3
5
  #
4
6
  # Permission is hereby granted, free of charge, to any person obtaining
5
7
  # a copy of this software and associated documentation files (the
@@ -21,9 +23,9 @@
21
23
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
24
  #++
23
25
 
24
- require 'active_support'
25
- require 'active_support/rails'
26
- require 'action_view/version'
26
+ require "active_support"
27
+ require "active_support/rails"
28
+ require "action_view/version"
27
29
 
28
30
  module ActionView
29
31
  extend ActiveSupport::Autoload
@@ -33,7 +35,6 @@ module ActionView
33
35
  eager_autoload do
34
36
  autoload :Base
35
37
  autoload :Context
36
- autoload :CompiledTemplates, "action_view/context"
37
38
  autoload :Digestor
38
39
  autoload :Helpers
39
40
  autoload :LookupContext
@@ -43,12 +44,15 @@ module ActionView
43
44
  autoload :Rendering
44
45
  autoload :RoutingUrlFor
45
46
  autoload :Template
47
+ autoload :UnboundTemplate
46
48
  autoload :ViewPaths
47
49
 
48
50
  autoload_under "renderer" do
49
51
  autoload :Renderer
50
52
  autoload :AbstractRenderer
51
53
  autoload :PartialRenderer
54
+ autoload :CollectionRenderer
55
+ autoload :ObjectRenderer
52
56
  autoload :TemplateRenderer
53
57
  autoload :StreamingTemplateRenderer
54
58
  end
@@ -56,6 +60,7 @@ module ActionView
56
60
  autoload_at "action_view/template/resolver" do
57
61
  autoload :Resolver
58
62
  autoload :PathResolver
63
+ autoload :FileSystemResolver
59
64
  autoload :OptimizedFileSystemResolver
60
65
  autoload :FallbackFileSystemResolver
61
66
  end
@@ -74,12 +79,13 @@ module ActionView
74
79
  autoload :MissingTemplate
75
80
  autoload :ActionViewError
76
81
  autoload :EncodingError
77
- autoload :MissingRequestError
78
82
  autoload :TemplateError
83
+ autoload :SyntaxErrorInTemplate
79
84
  autoload :WrongEncodingError
80
85
  end
81
86
  end
82
87
 
88
+ autoload :CacheExpiry
83
89
  autoload :TestCase
84
90
 
85
91
  def self.eager_load!
@@ -89,8 +95,8 @@ module ActionView
89
95
  end
90
96
  end
91
97
 
92
- require 'active_support/core_ext/string/output_safety'
98
+ require "active_support/core_ext/string/output_safety"
93
99
 
94
100
  ActiveSupport.on_load(:i18n) do
95
- I18n.load_path << "#{File.dirname(__FILE__)}/action_view/locale/en.yml"
101
+ I18n.load_path << File.expand_path("action_view/locale/en.yml", __dir__)
96
102
  end