Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
153 lines (127 sloc) 4.78 KB
# encoding: UTF-8
module Wice
module WgHash
class << self
# if there's a hash of hashes, the original structure and the
# returned structure should not contain any shared deep hashes
def deep_clone(hash) #:nodoc:
cloned = hash.clone
cloned.keys.each do |k|
if cloned[k].kind_of?(Hash)
cloned[k] = Wice::WgHash.deep_clone cloned[k]
end
end
cloned
end
# Used to modify options submitted to view helpers. If there is no :klass option,
# it will be added, if there is, the css class name will be appended to the existing
# class name(s)
def add_or_append_class_value!(hash, klass_value, prepend = false) #:nodoc:
if hash.has_key?('class')
hash[:class] = hash['class']
hash.delete('class')
end
hash[:class] = if hash.has_key?(:class)
if prepend
"#{klass_value} #{hash[:class]}"
else
"#{hash[:class]} #{klass_value}"
end
else
klass_value
end
hash
end
# Used mostly for submitting options to view helpers, that is, like this:
# content_tag(:th, col_link, Wice::WgHash.make_hash(:class, css_class))
# In some it is important that if the value is empty, no option
# is submitted at all. Thus, there's a check for an empty value
def make_hash(key, value) #:nodoc:
value.blank? ? {} : {key => value}
end
# A deep merge of two hashes.
# That is, if both hashes have the same key and the values are hashes, these two hashes should also be merged.
# Used for merging two sets of params.
def rec_merge(hash, other) #:nodoc:
res = hash.clone
other.each do |key, other_value|
value = res[key]
if value.is_a?(Hash) && other_value.is_a?(Hash)
res[key] = rec_merge value, other_value
else
res[key] = other_value
end
end
res
end
# Used to transform a traditional params hash
# into an array of two element arrays where element zero is a parameter name as it appears in HTTP requests,
# and the first element is the value:
# { :a => { :b => 3, :c => 4, :d => { :e => 5 }} }.parameter_names_and_values #=> [["a[d][e]", 5], ["a[b]", 3], ["a[c]", 4]]
# The parameter is an optional array of parameter names to prepend:
# { :a => { :b => 3, :c => 4, :d => { :e => 5 }} }.parameter_names_and_values(['foo', 'baz']) #=>
# [["foo[baz][a][d][e]", 5], ["foo[baz][a][b]", 3], ["foo[baz][a][c]", 4]]
def parameter_names_and_values(hash, initial = []) #:nodoc:
res = []
recursively_gather_finite_non_hash_values_with_key_path(hash, res, [])
res.collect do |parameter_struct|
parameter_struct[0] = initial + parameter_struct[0]
[Wice::WgArray.to_parameter_name(parameter_struct[0]), parameter_struct[1]]
end
end
protected
def recursively_gather_finite_non_hash_values_with_key_path(hash, res, stack = []) #:nodoc:
hash.each do |key, value|
if value.kind_of?(Hash)
recursively_gather_finite_non_hash_values_with_key_path(value, res, stack + [key])
else
res << [stack + [key], value]
end
end
end
end
end
module WgEnumerable #:nodoc:
# Used to check the validity of :custom_filter parameter of column
def self.all_items_are_of_class(enumerable, klass) #:nodoc:
return false if enumerable.empty?
enumerable.inject(true){|memo, o| (o.is_a? klass) && memo}
end
end
module WgArray
# Only used by Hash#parameter_names_and_values
# Transforms ['foo', 'bar', 'baz'] to 'foo[bar][baz]'
def self.to_parameter_name(array) #:nodoc:
array[0].to_s + (array[1..-1] || []).collect{|k| '[' + k.to_s + ']'}.join('')
end
end
end
# tag_options is a Rails views private method that takes a hash op options for
# an HTM hash and produces a string ready to be added to the tag.
# Here we are changing its visibility in order to be able to use it.
module ActionView #:nodoc:
module Helpers #:nodoc:
module TagHelper #:nodoc:
public :tag_options
end
end
end
module WGObjectExtensions #:nodoc:
# takes a list of messages, sends message 1 to self, then message 2 is sent to the result of the first message, ans so on
# returns nil as soon as the current receiver does not respond to such a message
def deep_send(*messages) #:nodoc:
obj = self
messages.each do |message|
if obj.respond_to? message
obj = obj.send(message)
else
return nil
end
# return obj if obj.nil?
end
return obj
end
end
class Object #:nodoc:
include WGObjectExtensions
end
Jump to Line
Something went wrong with that request. Please try again.