Class: ActiveSupport::ParameterFilter::CompiledFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/active_support/parameter_filter.rb

Overview

:nodoc:

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(regexps, deep_regexps, blocks, mask:) ⇒ CompiledFilter

Returns a new instance of CompiledFilter.



86
87
88
89
90
91
# File 'lib/active_support/parameter_filter.rb', line 86

def initialize(regexps, deep_regexps, blocks, mask:)
  @regexps = regexps
  @deep_regexps = deep_regexps.any? ? deep_regexps : nil
  @blocks = blocks
  @mask = mask
end

Instance Attribute Details

#blocksObject (readonly)

Returns the value of attribute blocks.



84
85
86
# File 'lib/active_support/parameter_filter.rb', line 84

def blocks
  @blocks
end

#deep_regexpsObject (readonly)

Returns the value of attribute deep_regexps.



84
85
86
# File 'lib/active_support/parameter_filter.rb', line 84

def deep_regexps
  @deep_regexps
end

#regexpsObject (readonly)

Returns the value of attribute regexps.



84
85
86
# File 'lib/active_support/parameter_filter.rb', line 84

def regexps
  @regexps
end

Class Method Details

.compile(filters, mask:) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/active_support/parameter_filter.rb', line 59

def self.compile(filters, mask:)
  return lambda { |params| params.dup } if filters.empty?

  strings, regexps, blocks = [], [], []

  filters.each do |item|
    case item
    when Proc
      blocks << item
    when Regexp
      regexps << item
    else
      strings << Regexp.escape(item.to_s)
    end
  end

  deep_regexps = regexps.extract! { |r| r.to_s.include?("\\.") }
  deep_strings = strings.extract! { |s| s.include?("\\.") }

  regexps << Regexp.new(strings.join("|"), true) unless strings.empty?
  deep_regexps << Regexp.new(deep_strings.join("|"), true) unless deep_strings.empty?

  new regexps, deep_regexps, blocks, mask: mask
end

Instance Method Details

#call(params, parents = [], original_params = params) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'lib/active_support/parameter_filter.rb', line 93

def call(params, parents = [], original_params = params)
  filtered_params = params.class.new

  params.each do |key, value|
    filtered_params[key] = value_for_key(key, value, parents, original_params)
  end

  filtered_params
end

#value_for_key(key, value, parents = [], original_params = nil) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/active_support/parameter_filter.rb', line 103

def value_for_key(key, value, parents = [], original_params = nil)
  parents.push(key) if deep_regexps
  if regexps.any? { |r| r.match?(key.to_s) }
    value = @mask
  elsif deep_regexps && (joined = parents.join(".")) && deep_regexps.any? { |r| r.match?(joined) }
    value = @mask
  elsif value.is_a?(Hash)
    value = call(value, parents, original_params)
  elsif value.is_a?(Array)
    # If we don't pop the current parent it will be duplicated as we
    # process each array value.
    parents.pop if deep_regexps
    value = value.map { |v| value_for_key(key, v, parents, original_params) }
    # Restore the parent stack after processing the array.
    parents.push(key) if deep_regexps
  elsif blocks.any?
    key = key.dup if key.duplicable?
    value = value.dup if value.duplicable?
    blocks.each { |b| b.arity == 2 ? b.call(key, value) : b.call(key, value, original_params) }
  end
  parents.pop if deep_regexps
  value
end