Sha256: ae088f04cbc70cb2606789945eb63387824a258b3958491e2144aaf7914770c3

Contents?: true

Size: 1.74 KB

Versions: 3

Compression:

Stored size: 1.74 KB

Contents

module Iowa

	# This is a subclass of Ruby's Hash that implements a few convenient
	# methods used by IOWA.
	
	class Hash < Hash

		# A simple little routine to downcase any String used as a key
		# in a hash or any hash nested as value somewhere within the hash.
		# Thanks to Daniel Berger for this implementation.

		def downcase_keys!
			upper = /A-Z/
			self.each do |k,v|
				next unless k.kind_of? String
				self[k.dup.downcase] = v
				self.delete(k) if upper.match(k)
			end
		end

		# Convert any symbolic keys to strings.
		
		def stringify_keys!
			current_keys = self.keys
			current_keys.each do |k|
				v = self[k]
				self.delete k
				self[k.to_s] = v
			end
		end
		
		# Convert any string keys to symbols.
		
		def symbolify_keys!
			current_keys = self.keys
			current_keys.each do |k|
				v = self[k]
				self.delete k
				self[k.to_s.intern] = v
			end
		end

		def symbolify_all_keys!
			current_keys = self.keys
			current_keys.each do |k|
				v = self[k]
				v.symbolify_all_keys! if v.respond_to?(:has_key?)
				self.delete k
				self[k.to_s.intern] = v
			end
		end
		
		def step_merge!(h)
			h.each do |k,v|
				if v.kind_of?(::Hash)
					if self[k].kind_of?(::Hash)
						unless self[k].respond_to?(:step_merge!)
							if dp = self[k].default_proc
								self[k] = Iowa::Hash.new {|h,k| dp.call(h,k)}.step_merge!(self[k])
							else
								osk = self[k]
								self[k] = Iowa::Hash.new
								self[k].step_merge!(osk)
							end
						end
						self[k].step_merge!(v)
					else
						if self.default_proc
							self.delete k
							self[k]
						end
						unless self[k].kind_of?(::Hash)
							self.delete k
							self[k] = Iowa::Hash.new
						end
						self[k].step_merge!(v)
					end
				else
					self[k] = v
				end
			end
		end

	end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
IOWA-1.0.3 src/iowa/Hash.rb
IOWA-1.0.2 src/iowa/Hash.rb
IOWA-1.0.0 src/iowa/Hash.rb