All Files
(100.0%
covered at
198.98
hits/line)
8 files in total.
297 relevant lines.
297 lines covered and
0 lines missed
-
1
module Inquisitive
-
-
1
class << self
-
-
1
def coerce(object)
-
2095
coerce! object
-
rescue NameError
-
55
object
-
end
-
1
alias_method :[], :coerce
-
-
1
def coerce!(object)
-
2095
if Inquisitive.object? object
-
687
object
-
else
-
1408
Inquisitive.const_get(:"#{object.class}", false).new object
-
end
-
end
-
-
1
def present?(object)
-
1377
case object
-
when ::String, String
-
849
not object.empty?
-
when ::Array, Array
-
356
object.any? do |value|
-
333
Inquisitive.present? value
-
end
-
when ::Hash, Hash
-
91
object.values.any? do |value|
-
96
Inquisitive.present? value
-
end
-
when ::NilClass, NilClass
-
70
false
-
else
-
11
if object.respond_to?(:present?)
-
1
object.present?
-
else
-
10
!!object
-
end
-
end
-
end
-
-
1
def object?(object)
-
2095
object.class.name.start_with? 'Inquisitive::'
-
end
-
-
end
-
-
end
-
-
1
require "inquisitive/nil_class"
-
1
require "inquisitive/string"
-
1
require "inquisitive/array"
-
1
unless Object.const_defined? :HashWithIndifferentAccess
-
1
require "inquisitive/hash_with_indifferent_access"
-
end
-
1
require "inquisitive/hash"
-
1
require "inquisitive/environment"
-
1
require 'inquisitive/utils'
-
-
1
module Inquisitive
-
1
class Array < ::Array
-
1
include Inquisitive::Utils
-
-
1
attr_accessor :negated
-
1
def exclude
-
36
self.dup.tap{ |a| a.negated = !a.negated }
-
end
-
-
1
def === other
-
1
other.class == Class and other == ::Array or super
-
end
-
-
1
private
-
-
1
def respond_to_missing?(method_name, include_private = false)
-
3
predicate_method?(method_name)
-
end
-
1
def method_missing(method_name, *arguments)
-
21
if predicate_method? method_name
-
18
(include? predication(method_name)) ^ negated
-
else
-
3
super
-
end
-
end
-
-
end
-
end
-
1
require 'inquisitive/utils'
-
-
1
module Inquisitive
-
1
class Hash < HashWithIndifferentAccess
-
1
include Inquisitive::Utils
-
-
1
attr_accessor :negated
-
1
def no
-
24
dup.tap{ |s| s.negated = !s.negated }
-
end
-
-
1
def === other
-
1
other.class == Class and other == ::Hash or super
-
end
-
-
1
alias_method :regular_reader, :[] unless method_defined?(:regular_reader)
-
1
def [](key)
-
256
Inquisitive[regular_reader key]
-
end
-
-
1
def fetch(key, default=nil)
-
12
key = convert_key(key)
-
12
value = self[key]
-
12
if Inquisitive.present? value
-
2
value
-
else
-
10
if block_given?
-
4
yield(key)
-
6
elsif default
-
4
default
-
else
-
2
raise KeyError, "key not found: #{key}"
-
end
-
end
-
end
-
-
1
protected
-
-
1
def convert_value(value, options={})
-
1226
if options[:for] == :assignment
-
674
return if value.kind_of? NilClass
-
end
-
1226
super(Inquisitive[value], options)
-
end
-
-
1
private
-
-
1
def dup
-
24
super.tap{ |duplicate| duplicate.negated = self.negated }
-
end
-
-
1
def respond_to_missing?(method_name, include_private = false)
-
2
predicate_method?(method_name) or has_key?(method_name)
-
end
-
1
def method_missing(method_name, *arguments)
-
40
if predicate_method? method_name
-
if has_key? predication(method_name)
-
6
Inquisitive.present? self[predication(method_name)]
-
else
-
6
false
-
12
end ^ negated
-
else
-
28
Inquisitive[self[method_name]]
-
end
-
end
-
-
end
-
-
end
-
1
module Inquisitive
-
####
-
# A trimmed down version of ActiveSupport 4.0's HashWithIndifferentAccess
-
# modified slightly so we don't have to inject behaviour into Hash.
-
# It lacks all `deep_` transforms since that requires patching Object and Array.
-
##
-
1
class HashWithIndifferentAccess < ::Hash
-
-
1
def extractable_options?
-
1
true
-
end
-
1
def with_indifferent_access
-
1
dup
-
end
-
1
def nested_under_indifferent_access
-
1
self
-
end
-
-
1
def self.[](*args)
-
58
new.merge!(::Hash[*args])
-
end
-
-
1
def initialize(constructor = {}, &block)
-
if constructor.is_a?(::Hash)
-
1358
super()
-
1358
steal_default_from(constructor)
-
1358
update(constructor)
-
else
-
3
super(constructor)
-
1361
end.tap do |hash|
-
1361
self.default_proc = block if block_given?
-
end
-
end
-
-
1
def default(key = nil)
-
243
if key.is_a?(Symbol) && include?(key = key.to_s)
-
75
self[key]
-
else
-
168
super
-
end
-
end
-
-
1
alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
-
1
alias_method :regular_update, :update unless method_defined?(:regular_update)
-
-
1
def []=(key, value)
-
436
regular_writer(convert_key(key), convert_value(value, for: :assignment))
-
end
-
-
1
alias_method :store, :[]=
-
-
1
def update(other_hash)
-
1423
if other_hash.is_a? self.class
-
41
super(other_hash)
-
else
-
1382
other_hash.each_pair do |key, value|
-
1685
if block_given? && key?(key)
-
2
value = yield(convert_key(key), self[key], value)
-
end
-
1685
regular_writer(convert_key(key), convert_value(value))
-
end
-
1382
self
-
end
-
end
-
-
1
alias_method :merge!, :update
-
-
1
def key?(key)
-
126
super(convert_key(key))
-
end
-
-
1
alias_method :include?, :key?
-
1
alias_method :has_key?, :key?
-
1
alias_method :member?, :key?
-
-
1
def fetch(key, *extras)
-
9
super(convert_key(key), *extras)
-
end
-
-
# not sure why just this one Enumerable method fails tests without override
-
1
def reject(*args, &block)
-
1
self.class[super]
-
end
-
-
1
def values_at(*indices)
-
30
indices.collect {|key| self[convert_key(key)]}
-
end
-
-
1
def dup
-
40
self.class.new(self).tap do |new_hash|
-
40
new_hash.default = default
-
end
-
end
-
-
1
def merge(hash, &block)
-
3
self.dup.update(hash, &block)
-
end
-
-
1
def replace(other_hash)
-
1
super(self.class.new(other_hash))
-
end
-
-
1
def delete(key)
-
19
super(convert_key(key))
-
end
-
-
1
def transform_keys
-
10
result = {}
-
10
each_key do |key|
-
18
result[yield(key)] = self[key]
-
end
-
10
result
-
end
-
-
1
def transform_keys!
-
8
keys.each do |key|
-
15
self[yield(key)] = delete(key)
-
end
-
8
self
-
end
-
-
1
def symbolize_keys
-
16
transform_keys{ |key| key.to_sym rescue key }
-
end
-
-
1
def symbolize_keys!
-
11
transform_keys!{ |key| key.to_sym rescue key }
-
end
-
-
1
def assert_valid_keys(*valid_keys)
-
3
valid_string_keys = valid_keys.flatten.map(&:to_s).uniq
-
3
each_key do |k|
-
5
raise ArgumentError.new("Unknown key: #{k}") unless valid_string_keys.include?(k)
-
end
-
end
-
-
5
def stringify_keys!; self end
-
6
def stringify_keys; dup end
-
2
def to_options!; self end
-
-
1
def select(*args, &block)
-
4
dup.tap {|hash| hash.select!(*args, &block)}
-
end
-
-
1
def to_hash
-
10
_new_hash= {}
-
10
each do |key, value|
-
13
_new_hash[convert_key(key)] = convert_value(value, for: :to_hash)
-
end
-
10
::Hash.new(default).merge!(_new_hash)
-
end
-
-
1
protected
-
-
1
def steal_default_from(hash)
-
1358
if hash.default_proc
-
1
self.default_proc = hash.default_proc
-
else
-
1357
self.default = hash.default
-
end
-
end
-
-
1
def convert_key(key)
-
2321
key.kind_of?(Symbol) ? key.to_s : key
-
end
-
-
1
def convert_value(value, options = {})
-
2656
if value.is_a? ::Hash
-
682
if options[:for] == :to_hash
-
5
value.to_hash
-
else
-
677
if value.is_a? self.class
-
158
value
-
else
-
519
self.class.new value
-
end
-
end
-
1974
elsif value.is_a?(::Array)
-
212
unless options[:for] == :assignment
-
99
value = value.dup
-
end
-
734
value.map! { |e| convert_value(e, options) }
-
else
-
1762
value
-
end
-
end
-
-
end
-
-
end
-
1
require 'inquisitive/utils'
-
-
1
module Inquisitive
-
1
class NilClass
-
1
include Inquisitive::Utils
-
-
1
def initialize(object=nil); end
-
-
1
attr_accessor :negated
-
1
def not
-
48
self.dup.tap{ |s| s.negated = !s.negated }
-
end
-
1
alias_method :exclude, :not
-
1
alias_method :no, :not
-
-
1
undef_method :nil?, :inspect, :to_s
-
-
1
def present?
-
6
presence
-
end
-
-
# Since we can't subclass NilClass
-
# (it has no allocate method)
-
# we fake its identity.
-
1
def instance_of?(klass)
-
164
klass == ::NilClass or super
-
end
-
1
alias_method :kind_of?, :instance_of?
-
1
alias_method :is_a?, :instance_of?
-
-
1
def == other
-
3
other.nil?
-
end
-
1
def === other
-
1
other.class == Class and other == ::NilClass or super
-
end
-
-
1
def to_str
-
2
""
-
end
-
1
def to_ary
-
2
[]
-
end
-
1
def to_hash
-
2
{}
-
end
-
-
1
private
-
-
1
def respond_to_missing?(method_name, include_private = false)
-
2
true # nil.respond_to? method_name or predicate_method? method_name
-
end
-
1
def method_missing(method_name, *arguments, &block)
-
24
if nil.respond_to? method_name
-
2
nil.send method_name, *arguments, &block
-
22
elsif predicate_method? method_name
-
20
presence
-
else
-
2
self
-
end
-
end
-
-
1
def presence
-
26
false ^ negated
-
end
-
-
end
-
end
-
1
require 'inquisitive/utils'
-
-
1
module Inquisitive
-
1
class String < ::String
-
1
include Inquisitive::Utils
-
-
1
attr_accessor :negated
-
1
def not
-
36
self.dup.tap{ |s| s.negated = !s.negated }
-
end
-
-
1
def === other
-
1
other.class == Class and other == ::String or super
-
end
-
-
1
private
-
-
1
def respond_to_missing?(method_name, include_private = false)
-
3
predicate_method? method_name
-
end
-
1
def method_missing(method_name, *arguments)
-
21
if predicate_method? method_name
-
18
(self == predication(method_name)) ^ negated
-
else
-
3
super
-
end
-
end
-
-
end
-
end
-
1
module Inquisitive
-
-
1
module Utils
-
-
1
private
-
-
1
def predicate_method?(string)
-
112
string[-1] == '?'
-
end
-
-
1
def predication(string)
-
54
string[0..-2]
-
end
-
-
end
-
-
end