Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/dm_ruby_extensions/extend_hash.rb

Overview


Instance Method Summary collapse

Instance Method Details

#convert_date(date_symbol_or_string) ⇒ Object

takes a Hash (like the params hash), and converts the Rails date attributes to a real Date object. => 2012, ‘start_date(2i)’ => 11, ‘start_date(3i)’ => 23.convert_date(:start_date)




8
9
10
11
12
# File 'lib/dm_ruby_extensions/extend_hash.rb', line 8

def convert_date(date_symbol_or_string)
  attribute = date_symbol_or_string.to_s
  return nil if self[attribute + '(1i)'].nil? || self[attribute + '(2i)'].nil? || self[attribute + '(3i)'].nil? 
  return Date.new(self[attribute + '(1i)'].to_i, self[attribute + '(2i)'].to_i, self[attribute + '(3i)'].to_i)   
end

#convert_datetime(date_symbol_or_string) ⇒ Object

takes a Hash (like the params hash), and converts the Rails datetime attributes to a real Date object.




17
18
19
20
21
# File 'lib/dm_ruby_extensions/extend_hash.rb', line 17

def convert_datetime(date_symbol_or_string)
  attribute = date_symbol_or_string.to_s
  return nil if self[attribute + '(1i)'].nil? || self[attribute + '(2i)'].nil? || self[attribute + '(3i)'].nil? || self[attribute + '(4i)'].nil? || self[attribute + '(5i)'].nil? 
  return Time.local(self[attribute + '(1i)'].to_i, self[attribute + '(2i)'].to_i, self[attribute + '(3i)'].to_i, self[attribute + '(4i)'].to_i, self[attribute + '(5i)'].to_i)   
end

#rekey(key_map = nil, &block) ⇒ Object

Borrowed from github.com/rubyworks/facets


Rekey a hash:

rekey()
rekey(from_key => to_key, ...)
rekey{|from_key| to_key}
rekey{|from_key, value| to_key}

If a key map is given, then the first key is changed to the second key.

foo = { :a=>1, :b=>2 }
foo.rekey(:a=>'a')       #=> { 'a'=>1, :b=>2 }
foo.rekey(:b=>:x)        #=> { :a =>1, :x=>2 }
foo.rekey('foo'=>'bar')  #=> { :a =>1, :b=>2 }

If a block is given, converts all keys in the Hash accroding to the given block procedure.

foo = { :name=>'Gavin', :wife=>:Lisa }
foo.rekey{ |k| k.to_s }  #=>  { "name"=>"Gavin", "wife"=>:Lisa }
foo                      #=>  { :name =>"Gavin", :wife=>:Lisa }

If no key map or block is given, then all keys are converted to Symbols.

Raises an ArgumentError if both a key_map and a block are given. If both are needed just call #rekey twice.

TODO: If ‘nil` is returned by block should the key be set to `nil` or the orignal key?

CREDIT: Trans, Gavin Kistner

Raises:

  • (ArgumentError)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/dm_ruby_extensions/extend_hash.rb', line 62

def rekey(key_map=nil, &block)
  raise ArgumentError, "argument or block" if key_map && block

  if !(key_map or block)
    block = lambda{|k| k.to_sym}
  end

  if block
    hash = dup.clear
    if block.arity.abs == 1
      each_pair do |k, v|
        hash[block[k]] = v     #hash[block[k] || k] = v
      end
    else
      each_pair do |k, v|
        hash[block[k,v]] = v   #hash[block[k,v] || k] = v
      end
    end
  else
    #hash = dup.clear  # to keep default_proc
    #(keys - key_map.keys).each do |key|
    #  hash[key] = self[key]
    #end
    #key_map.each do |from, to|
    #  hash[to] = self[from] if key?(from)
    #end
    hash = dup  # to keep default_proc
    key_map.each_pair do |from, to|
      hash[to] = hash.delete(from) if hash.key?(from)
    end
  end

  hash
end

#rekey!(key_map = nil, &block) ⇒ Object

Synonym for Hash#rekey, but modifies the receiver in place (and returns it).

foo = { :name=>'Gavin', :wife=>:Lisa }
foo.rekey!{ |k| k.to_s }  #=>  { "name"=>"Gavin", "wife"=>:Lisa }
foo                       #=>  { "name"=>"Gavin", "wife"=>:Lisa }

CREDIT: Trans, Gavin Kistner



105
106
107
# File 'lib/dm_ruby_extensions/extend_hash.rb', line 105

def rekey!(key_map=nil, &block)
  replace(rekey(key_map, &block))
end

#url_query_string(leading_slash = true) ⇒ Object

Convert hash of parameters to a query string




25
26
27
# File 'lib/dm_ruby_extensions/extend_hash.rb', line 25

def url_query_string(leading_slash = true)
  (leading_slash ? "/?" : "?") << URI.escape(self.collect{|k,v| "#{k}=#{v}"}.join('&'))
end