Class: Zoom::Params
- Inherits:
-
SimpleDelegator
- Object
- SimpleDelegator
- Zoom::Params
- Defined in:
- lib/zoom/params.rb
Constant Summary collapse
- EMPTY_ARRAY =
[].freeze
- EMPTY_HASH =
{}.freeze
Instance Method Summary collapse
- #except(*keys) ⇒ Object
- #except!(keys) ⇒ Object
- #filter_required(filters) ⇒ Object
- #find_matching_keys(keys) ⇒ Object
- #find_missing_entries(*entries) ⇒ Object
- #hash_filter(filter) ⇒ Object
-
#initialize(parameters = {}) ⇒ Params
constructor
A new instance of Params.
- #permit(*filters) ⇒ Object
- #permit_value(key, values) ⇒ Object
- #require(*entries) ⇒ Object
- #require_one_of(*keys) ⇒ Object
Constructor Details
#initialize(parameters = {}) ⇒ Params
Returns a new instance of Params.
6 7 8 9 |
# File 'lib/zoom/params.rb', line 6 def initialize(parameters = {}) @parameters = parameters super end |
Instance Method Details
#except(*keys) ⇒ Object
39 40 41 |
# File 'lib/zoom/params.rb', line 39 def except(*keys) dup.except!(keys.flatten) end |
#except!(keys) ⇒ Object
43 44 45 46 |
# File 'lib/zoom/params.rb', line 43 def except!(keys) keys.each { |key| delete(key) } self end |
#filter_required(filters) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/zoom/params.rb', line 64 def filter_required(filters) # Unless value is a hash, filter filters.each.with_object(self.class.new(except(filters.flatten))) do |filter, params| case filter when Symbol, String params.delete(filter) when Hash filter.each do |k, v| nested_filter = self.class.new(self[k]).filter_required(v) if nested_filter.empty? params.delete(k) else params[k] = nested_filter end end end end end |
#find_matching_keys(keys) ⇒ Object
97 98 99 100 101 |
# File 'lib/zoom/params.rb', line 97 def find_matching_keys(keys) keys.flatten.each_with_object([]) do |key, array| array << key if self[key] end end |
#find_missing_entries(*entries) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/zoom/params.rb', line 83 def find_missing_entries(*entries) entries.flatten.each.with_object([]) do |entry, array| if entry.is_a?(Hash) entry.keys.each do |k| array << k && next if self[k].nil? missing_entries = self.class.new(self[k]).find_missing_entries(*entry[k]) array << { k => missing_entries } unless missing_entries.empty? end elsif self[entry].nil? array << entry end end end |
#hash_filter(filter) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/zoom/params.rb', line 51 def hash_filter(filter) # Slicing filters out non-declared keys. slice(*filter.keys).each do |key, value| next unless value next unless key? key next if filter[key] == EMPTY_ARRAY next if filter[key] == EMPTY_HASH # Declaration { user: :name } or { user: [:name, :age, { address: ... }] }. self.class.new(value).permit(filter[key]) end filter.keys end |
#permit(*filters) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/zoom/params.rb', line 26 def permit(*filters) permitted_keys = filters.flatten.each.with_object([]) do |filter, array| case filter when Symbol, String array << filter when Hash array << hash_filter(filter) end end non_permitted_params = @parameters.keys - permitted_keys.flatten raise Zoom::ParameterNotPermitted, non_permitted_params.to_s unless non_permitted_params.empty? end |
#permit_value(key, values) ⇒ Object
103 104 105 106 107 108 |
# File 'lib/zoom/params.rb', line 103 def permit_value(key, values) value = @parameters[key] unless !value || values.include?(value) raise Zoom::ParameterValueNotPermitted, "#{key}: #{value}" end end |
#require(*entries) ⇒ Object
11 12 13 14 15 |
# File 'lib/zoom/params.rb', line 11 def require(*entries) missing_entries = find_missing_entries(entries) return filter_required(entries.flatten) if missing_entries.empty? raise Zoom::ParameterMissing, missing_entries.to_s end |
#require_one_of(*keys) ⇒ Object
17 18 19 20 21 22 23 24 |
# File 'lib/zoom/params.rb', line 17 def require_one_of(*keys) required_keys = keys keys = find_matching_keys(keys.flatten) unless keys.any? = required_keys.length > 1 ? "You are missing atleast one of #{required_keys}" : required_keys raise Zoom::ParameterMissing, end end |