Class: Hashery::QueryHash

Inherits:
CRUDHash show all
Defined in:
lib/hashery/query_hash.rb

Overview

QueryHash is essentially a Hash class, but with some OpenStruct-like features.

q = QueryHash.new

Entries can be added to the Hash via a setter method.

q.a = 1

Then looked up via a query method.

q.a?  #=> 1

The can also be looked up via a bang method.

q.a!  #=> 1

The difference between query methods and bang methods is that the bang method will auto-instantiate the entry if not present, where as a query method will not.

A QueryHash might not be quite as elegant as an OpenHash in that reader methods must end in ‘?` or `!`, but it remains fully compatible with Hash regardless of it’s settings.

Constant Summary

Constants inherited from CRUDHash

CRUDHash::NA

Instance Method Summary collapse

Methods inherited from CRUDHash

#<<, [], #[], #[]=, auto, #cast, #cast_key, #default_proc, #delete, #each, #fetch, #key?, #key_proc, #key_proc=, #merge, #read, #replace, #retrieve, #store, #to_hash, #update, #values_at

Methods inherited from Hash

create, #rekey, #rekey!, #retrieve, #to_hash, #to_stash

Constructor Details

#initialize(*default, &default_proc) ⇒ QueryHash

By default the ‘key_proc` is set to convert all keys to strings via `#to_s`.

Parameters:

  • default

    Default object, or

  • default_proc

    Default procedure.



36
37
38
39
# File 'lib/hashery/query_hash.rb', line 36

def initialize(*default, &default_proc)
  @key_proc = Proc.new{ |k| k.to_s }
  super(*default, &default_proc)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(s, *a, &b) ⇒ Object

Route get and set calls.

Examples:

o = QueryHash.new
o.a = 1
o.a?  #=> 1
o.b?  #=> nil

Parameters:

  • s (Symbol)

    Name of method.

  • a (Array)

    Method arguments.

  • b (Proc)

    Block argument.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/hashery/query_hash.rb', line 55

def method_missing(s,*a, &b)
  type = s.to_s[-1,1]
  name = s.to_s.sub(/[!?=]$/, '')     
  key  = name  #key  = cast_key(name)

  case type
  when '='
    store(key, a.first)
  when '!'
    default = (default_proc ? default_proc.call(self, key) : default)
    key?(key) ?  fetch(key) : store(key, default)
  when '?'
    key?(key) ? fetch(key) : nil
  else
    # return self[key] if key?(key)
    super(s,*a,&b)
  end
end

Instance Method Details

#respond_to?(name) ⇒ Boolean

Custom #respond_to to account for #method_missing.

Parameters:

  • name

    The method name to check.

Returns:

  • (Boolean)

    ‘true` or `false`.



81
82
83
84
85
86
87
# File 'lib/hashery/query_hash.rb', line 81

def respond_to?(name)
  return true if name.to_s.end_with?('=')
  return true if name.to_s.end_with?('?')
  return true if name.to_s.end_with?('!')
  #key?(name.to_sym) || super(name)
  super(name)
end