lib/vobject/component.rb
require "vobject"
require "vobject/property"
require "vobject/vcalendar/grammar"
require "json"
class Vobject::Component
attr_accessor :comp_name, :children, :multiple_components, :errors, :norm
def <=>(another)
me = self.to_norm
o = another.to_norm
me <=> o
end
def blank(version)
ingest VOBJECT: { VERSION: { value: version } }
end
def initialize(key, cs, err)
self.comp_name = key
raise_invalid_initialization if key != name
self.children = []
if cs.nil?
else
cs.each_key do |k|
val = cs[k]
# iteration of array || hash values is making the value a key!
next if k.class == Array
next if k.class == Hash
cc = child_class(k, val)
if val.is_a?(Hash) && val.has_key?(:component)
val[:component].each do |x|
children << cc.new(k, x, [])
end
else
children << cc.new(k, val)
end
end
end
self.errors = err.select { |e| !e.nil? }
self.norm = nil
end
def get_errors
errors
end
def child_class(key, val)
base_class = if val.is_a?(Hash) && val.has_key?(:component)
component_base_class
elsif !(val.is_a?(Hash) && !val.has_key?(:value))
property_base_class
else
component_base_class
end
return base_class if [:CLASS, :OBJECT, :METHOD].include? key
camelized_key = key.to_s.downcase.split("_").map(&:capitalize).join("")
base_class.const_get(camelized_key) rescue base_class
end
def to_s
s = "BEGIN:#{name}\n"
children.each do |c|
s << c.to_s
end
s << "END:#{name}\n"
s
end
def to_norm
if norm.nil?
s = "BEGIN:#{name.upcase}\n"
properties = children.select { |c| c.is_a? Vobject::Property }
components = children.select { |c| not c.is_a? Vobject::Property }
# create to_norm in advance
properties.each { |p| p.to_norm }
properties.sort.each do |p|
s << p.to_norm
end
components.sort.each { |p| s << p.to_norm }
s << "END:#{name.upcase}\n"
norm = s
end
norm
end
def to_hash
a = {}
children.each do |c|
if c.is_a?(Vobject::Component)
a = a.merge(c.to_hash) { |_, old, new| [old, new].flatten }
elsif c.is_a?(Vobject::Property)
a = a.merge(c.to_hash) { |_, old, new| [old, new].flatten }
else
a[c.name] = c.to_hash
end
end
{ comp_name => a }
end
def to_json
to_hash.to_json
end
def name
comp_name
end
private
def property_base_class
Vobject::Property
end
def component_base_class
Vobject::Component
end
def parameter_base_class
Vobject::Parameter
end
def raise_invalid_initialization
raise "vObject component initialization failed"
end
end