lib/plugins/plugin.rb in rsence-pre-2.1.0.14 vs lib/plugins/plugin.rb in rsence-pre-2.1.0.15
- old
+ new
@@ -287,16 +287,143 @@
msg.reply(%{jsLoader.load("#{dependency}");})
end
end
end
+ # @private Returns a hash with valid symbol keys for +#value_call+.
+ def sanitize_value_call_hash( hash_dirty )
+ hash_clean = {}
+ hash_dirty.each do | key, value |
+ if key.to_sym == :method
+ hash_clean[:method] = value.to_sym
+ elsif key.to_sym == :plugin
+ hash_clean[:plugin] = value.to_sym
+ elsif key.to_sym == :args
+ if value.class == Array
+ hash_clean[:args] = value
+ else
+ warn "Invalid arguments (#{value.inspect}). Expected Array."
+ end
+ elsif key.to_sym == :uses_msg
+ value == false if value == nil
+ if value.class == TrueClass or value.class == FalseClass
+ hash_clean[:uses_msg] = value
+ else
+ warn "Invalid argument for :uses_msg (#{value.inspect}), expected boolean."
+ end
+ else
+ warn "Undefined value_call key: #{key.inspect}"
+ end
+ end
+ return hash_clean
+ end
+ # @private Returns a sanitized copy of a single responder specification.
+ def sanitize_value_responders( responders_dirty )
+ if responders_dirty.class != Array
+ warn "Unsupported responders type: #{responders_dirty.inspect} (expected Array or Hash). Trying work-around.." unless responders_dirty.class == Hash
+ responders_dirty = [ responders_dirty ]
+ end
+ responders_clean = []
+ responders_dirty.each do |responder_dirty|
+ if responder_dirty.class != Hash
+ if responder_dirty.class == Symbol
+ responder_dirty = { :method => responder_dirty }
+ elsif responder_dirty.class == String
+ if responder_dirty.include?('.')
+ last_dot_index = responder_dirty.rindex('.')
+ responder_plugin = responder_dirty[0..(last_dot_index-1)].to_sym
+ responder_method = responder_dirty[(last_dot_index+1)..-1].to_sym
+ responder_dirty = { :method => responder_method, :plugin => responder_plugin }
+ else
+ responder_dirty = { :method => responders_dirty.to_sym }
+ end
+ else
+ warn "Unsupported responder type: #{responder_dirty.inspect}. Skipping.."
+ next
+ end
+ end
+ responder_clean = {}
+ responder_dirty.each do |key, value|
+ if key.to_sym == :method
+ responder_clean[ :method ] = value.to_sym
+ elsif key.to_sym == :plugin
+ responder_clean[ :plugin ] = value.to_sym
+ else
+ warn "Unsupported responder key: #{key.inspect} => #{value.inspect}. Ignoring.."
+ end
+ end
+ if responder_clean.has_key?( :method )
+ responders_clean.push( responder_clean )
+ else
+ warn "Responder (#{responder_clean.inspect}) is missing a :method specification. Skipping.."
+ end
+ end
+ return responders_clean
+ end
+
+ # @private Returns a sanitized copy of a single value item.
+ def sanitize_value_item( value_item_dirty )
+ value_item_clean = {}
+ value_item_dirty.each do | key, value |
+ if key.to_sym == :value or key.to_sym == :data
+ if [Array, Hash, String, TrueClass, FalseClass, Fixnum, Bignum, Float, NilClass].include? value.class
+ value_item_clean[:value] = value
+ else
+ warn "Unsupported value class (#{value.class.inspect}) for value: #{value.inspect}. Using 0 instead."
+ value_item_clean[:value] = 0
+ end
+ elsif key.to_sym == :value_call or key.to_sym == :call
+ value_item_clean[:value_call] = sanitize_value_call_hash( value )
+ elsif key.to_sym == :restore_default or key.to_sym == :restore
+ if [TrueClass, FalseClass].include? value.class
+ value_item_clean[:restore_default] = value
+ else
+ warn "Unsupported type of restore (expected true or false): #{value.inspect}. Using true instead."
+ value_item_clean[:restore_default] = true
+ end
+ elsif key.to_sym == :responders or key.to_sym == :responder
+ sanitized_responders = sanitize_value_responders( value )
+ value_item_clean[:responders] = sanitized_responders unless sanitized_responders.empty?
+ else
+ warn "Unsupported value specification key: #{key.inspect}."
+ end
+ end
+ return value_item_clean
+ end
+
+ # @private Returns sanitized hash of the structure specified in values.yaml
+ def sanitize_values_yaml( values_path )
+ values_dirty = yaml_read( values_path )
+ return false if values_dirty == false
+ if values_dirty.class == Hash
+ values_clean = {}
+ values_dirty.each do |key, value|
+ values_clean[ key.to_sym ] = sanitize_value_item( value )
+ end
+ return values_clean unless values_clean.empty?
+ elsif values_dirty.class == Array
+ values_clean = []
+ values_dirty.each do |values_dirty_segment|
+ values_clean_segment = {}
+ values_dirty_segment.each do |key, value|
+ values_clean_segment[ key.to_sym ] = sanitize_value_item( value )
+ end
+ values_clean.push( values_clean_segment )
+ end
+ return values_clean unless values_clean.empty?
+ else
+ warn "Unsupported format of values.yaml, got: #{values_dirty.inspect}, expected Hash or Array."
+ end
+ return false
+ end
+
# @private This method looks looks for a file called "values.yaml" in the plugin's bundle directory.
# If this file is found, it loads it for initial value definitions.
# These definitions are accessible as the +@values+ attribute.
def init_values
values_path = bundle_path( 'values.yaml' )
- return yaml_read( values_path )
+ return sanitize_values_yaml( values_path )
end
# @private Creates a new instance of HValue, assigns it as +value_name+ into the
# session and uses the +value_properties+ Hash to define the default
# value and value responders.