module RailsConnector class ObjDataFromService < ObjData def initialize(data) @data = data end def value_and_type_of(attribute_name) return value_and_type_of_widget_pool if attribute_name == BasicObj::WIDGET_POOL_ATTRIBUTE_NAME value_and_type = @data[attribute_name] if value_and_type.blank? if INTERNAL_KEYS.include?(attribute_name) || SPECIAL_KEYS.include?(attribute_name) type = type_of_internal(attribute_name) [default_attribute_value(type), type] else raise RailsConnectorError.new("Illegal attribute name #{attribute_name}") end else raw_value = value_and_type.first type = if value_and_type.length == 1 type_of_internal(attribute_name) else value_and_type[1] end [convert_value(raw_value, type), type] end end def has_custom_attribute?(attribute_name) is_custom_attribute?(attribute_name) && !!@data[attribute_name] end def all_custom_attributes @data.select do |attribute_name, _| has_custom_attribute?(attribute_name) end.keys end private def convert_value(value, type) if type == "html" text_links_conversion.convert(value) else value end end def text_links_conversion @text_links_conversion = TextLinkConversion.new(text_links_map) end def text_links_map text_links = @data["_text_links"] return nil unless text_links text_links.first.each_with_object({}) do |link, map| map[link["link_id"]] = TextLink.new(link) end end def value_and_type_of_widget_pool [value_of_widget_pool, nil] end def value_of_widget_pool raw_value_of_widget_pool.dup.tap do |hash| hash.each_pair do |widget_id, raw_widget_data| hash[widget_id] = self.class.new(raw_widget_data) end end end def raw_value_of_widget_pool @data[BasicObj::WIDGET_POOL_ATTRIBUTE_NAME].first end def is_custom_attribute?(attribute_name) !attribute_name.starts_with?('_') && !SPECIAL_KEYS.include?(attribute_name) end internal_key_list = %w[ last_changed modification permalink sort_key1 sort_key2 sort_key3 sort_order sort_type1 sort_type2 sort_type3 suppress_export text_links valid_from valid_until ] INTERNAL_KEYS = Set.new(internal_key_list.map { |name| "_#{name}" } ) SPECIAL_KEYS = Set.new(%w[ body title blob ]) end end