class Zen::Query::ApiBlock
Constants
- OPTION_KEYS
Attributes
block[R]
force[R]
options[R]
presence_fields[R]
value_fields[R]
Public Class Methods
new(presence_fields:, value_fields:, block:, force: false)
click to toggle source
# File lib/zen/query/api_block.rb, line 11 def initialize(presence_fields:, value_fields:, block:, force: false) @options = extract_options!(value_fields) @presence_fields = presence_fields @value_fields = value_fields @block = block @force = force end
Public Instance Methods
fits?(query)
click to toggle source
# File lib/zen/query/api_block.rb, line 20 def fits?(query) return false unless conditions_met_by?(query) return true if force (presence_fields.empty? && value_fields.empty?) || values_for(query.params).all? { |value| present?(value) } end
index()
click to toggle source
# File lib/zen/query/api_block.rb, line 36 def index case options[:index] when :first then -Float::INFINITY when :last then Float::INFINITY when Numeric then options[:index] else 0 end end
present?(value)
click to toggle source
# File lib/zen/query/api_block.rb, line 32 def present?(value) value.respond_to?(:empty?) ? !value.empty? : !!value end
values_for(params)
click to toggle source
# File lib/zen/query/api_block.rb, line 28 def values_for(params) params.values_at(*presence_fields) + valued_values_for(params) end
Private Instance Methods
condition_met?(query, key)
click to toggle source
# File lib/zen/query/api_block.rb, line 63 def condition_met?(query, key) return true unless options.key?(key) condition = options[key] value = case condition when String, Symbol then query.send(condition) when Proc then query.instance_exec(&condition) else condition end key == :if ? value : !value end
conditions_met_by?(query)
click to toggle source
# File lib/zen/query/api_block.rb, line 59 def conditions_met_by?(query) condition_met?(query, :if) && condition_met?(query, :unless) end
extract_options!(fields)
click to toggle source
# File lib/zen/query/api_block.rb, line 47 def extract_options!(fields) fields.keys.each_with_object({}) do |key, options| options[key] = fields.delete(key) if OPTION_KEYS.include?(key) end end
valued_values_for(params)
click to toggle source
# File lib/zen/query/api_block.rb, line 53 def valued_values_for(params) value_fields.map do |field, required_value| params[field] == required_value && required_value end end