lib/rcap/cap_1_0/info.rb in rcap-1.3.1 vs lib/rcap/cap_1_0/info.rb in rcap-2.0.0

- old
+ new

@@ -1,494 +1,42 @@ module RCAP module CAP_1_0 + # In Info object is valid if # * it has an event # * it has an urgency with a valid value # * it has a severity with a valid value # * it has a certainty with a valid value # * all categories are valid and categories has at minimum 1 entry # * all Resource objects in the resources collection are valid # * all Area objects in the areas collection are valid - class Info - include Validation + class Info < RCAP::Base::Info - CATEGORY_GEO = "Geo" - CATEGORY_MET = "Met" - CATEGORY_SAFETY = "Safety" - CATEGORY_SECURITY = "Security" - CATEGORY_RESCUE = "Rescue" - CATEGORY_FIRE = "Fire" - CATEGORY_HEALTH = "Health" - CATEGORY_ENV = "Env" - CATEGORY_TRANSPORT = "Transport" - CATEGORY_INFRA = "Infra" - CATEGORY_CBRNE = "CBRNE" - CATEGORY_OTHER = "Other" - # Valid values for categories - VALID_CATEGORIES = [ CATEGORY_GEO, CATEGORY_MET, CATEGORY_SAFETY, - CATEGORY_SECURITY, CATEGORY_RESCUE, CATEGORY_FIRE, CATEGORY_HEALTH, - CATEGORY_ENV, CATEGORY_TRANSPORT, CATEGORY_INFRA, CATEGORY_CBRNE, - CATEGORY_OTHER ] - - URGENCY_IMMEDIATE = "Immediate" - URGENCY_EXPECTED = "Expected" - URGENCY_FUTURE = "Future" - URGENCY_PAST = "Past" - URGENCY_UNKNOWN = "Unknown" - # Valid values for urgency - VALID_URGENCIES = [ URGENCY_IMMEDIATE, URGENCY_EXPECTED, URGENCY_FUTURE, - URGENCY_PAST, URGENCY_UNKNOWN ] - - SEVERITY_EXTREME = "Extreme" - SEVERITY_SEVERE = "Severe" - SEVERITY_MODERATE = "Moderate" - SEVERITY_MINOR = "Minor" - SEVERITY_UNKNOWN = "Unknown" - # Valid values for severity - VALID_SEVERITIES = [ SEVERITY_EXTREME, SEVERITY_SEVERE, SEVERITY_MODERATE, - SEVERITY_MINOR, SEVERITY_UNKNOWN ] - - CERTAINTY_VERY_LIKELY = "Very Likely" - CERTAINTY_LIKELY = "Likely" - CERTAINTY_POSSIBLE = "Possible" - CERTAINTY_UNLIKELY = "Unlikely" - CERTAINTY_UNKNOWN = "Unknown" - # Valid valies for certainty - VALID_CERTAINTIES = [ CERTAINTY_VERY_LIKELY, CERTAINTY_LIKELY, - CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN ] - - XML_ELEMENT_NAME = 'info' - LANGUAGE_ELEMENT_NAME = 'language' - CATEGORY_ELEMENT_NAME = 'category' - EVENT_ELEMENT_NAME = 'event' - URGENCY_ELEMENT_NAME = 'urgency' - SEVERITY_ELEMENT_NAME = 'severity' - CERTAINTY_ELEMENT_NAME = 'certainty' - AUDIENCE_ELEMENT_NAME = 'audience' - EVENT_CODE_ELEMENT_NAME = 'eventCode' - EFFECTIVE_ELEMENT_NAME = 'effective' - ONSET_ELEMENT_NAME = 'onset' - EXPIRES_ELEMENT_NAME = 'expires' - SENDER_NAME_ELEMENT_NAME = 'senderName' - HEADLINE_ELEMENT_NAME = 'headline' - DESCRIPTION_ELEMENT_NAME = 'description' - INSTRUCTION_ELEMENT_NAME = 'instruction' - WEB_ELEMENT_NAME = 'web' - CONTACT_ELEMENT_NAME = 'contact' - - XPATH = "cap:#{ XML_ELEMENT_NAME }" - LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }" - EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }" - URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }" - CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }" - SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }" - CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }" - AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }" - EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }" - EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }" - ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }" - EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }" - SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }" - HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }" - DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }" - INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }" - WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }" - CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }" - - DEFAULT_LANGUAGE = 'en-US' - - validates_presence_of( :event, :urgency, :severity, :certainty ) validates_inclusion_of( :certainty, :allow_nil => true, :in => VALID_CERTAINTIES, :message => "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }") - validates_inclusion_of( :severity, :allow_nil => true, :in => VALID_SEVERITIES, :message => "can only be assigned the following values: #{ VALID_SEVERITIES.join(', ') }" ) - validates_inclusion_of( :urgency, :allow_nil => true, :in => VALID_URGENCIES, :message => "can only be assigned the following values: #{ VALID_URGENCIES.join(', ') }" ) - validates_inclusion_of_members_of( :categories, :in => VALID_CATEGORIES, :allow_blank => true ) - validates_collection_of( :resources, :areas, :event_codes, :parameters ) # @return [String] - attr_accessor( :event ) - # @return [String] Value can only be one of {VALID_URGENCIES} - attr_accessor( :urgency ) - # @return [String] Value can only be one of {VALID_SEVERITIES} - attr_accessor( :severity ) - # @return [String] Value can only be one of {VALID_CERTAINTIES} - attr_accessor( :certainty ) - # @return [String] - attr_accessor( :language ) - # @return [String] - attr_accessor( :audience ) - # @return [DateTime] Effective start time of information - attr_accessor( :effective ) - # @return [DateTime] Expected start of event - attr_accessor( :onset ) - # @return [DateTime] Effective expiry time of information - attr_accessor( :expires ) - # @return [String] - attr_accessor( :sender_name ) - # @return [String] - attr_accessor( :headline ) - # @return [String] - attr_accessor( :description ) - # @return [String] - attr_accessor( :instruction ) - # @return [String] - attr_accessor( :web ) - # @return [String] - attr_accessor( :contact ) - - # @return [Array<String>] Collection of textual categories; elements can be one of {VALID_CATEGORIES} - attr_reader( :categories ) - # @return [Array<EventCode>] Collection of {EventCode} objects - attr_reader( :event_codes ) - # @return [Array<Parameter>] Collection of {Parameter} objects - attr_reader( :parameters ) - # @return [Array<Resource> Collection of {Resource} objects - attr_reader( :resources ) - # @return [Array<Area>] Collection of {Area} objects - attr_reader( :areas ) - - # @param [Hash] attributes - # @option attributes [String] :language Defaults to {DEFAULT_LANGUAGE} - # @option attributes [Array<String>] :categories Collection of categories in {VALID_CATEGORIES} - # @option attributes [String] :audience - # @option attributes [String] :event - # @option attributes [String] :urgency A member of {VALID_URGENCIES} - # @option attributes [String] :severity A member of {VALID_SEVERITIES} - # @option attributes [String] :certainty A member of {VALID_CERTAINTIES} - # @option attributes [DateTime] :effective - # @option attributes [DateTime] :onset - # @option attributes [DateTime] :expires - # @option attributes [Array<EventCode>] :event_codes Collection of {EventCode} objects - # @option attributes [String] :sender_name - # @option attributes [String] :headline - # @option attributes [String] :description - # @option attributes [String] :instruction - # @option attributes [String] :web URL - # @option attributes [String] :contact - # @option attributes [Array<Parameter>] :parameters Collection of {Parameter} objects - # @option attributes [Array<Resource>] :resources Collection of {Resource} objects - # @option attributes [Array<Area>] :areas Collection of {Area} objects - def initialize( attributes = {} ) - @language = attributes[ :language ] || DEFAULT_LANGUAGE - @categories = Array( attributes[ :categories ]) - @audience = attributes [ :audience ] - @event = attributes [ :event ] - @urgency = attributes[ :urgency ] - @severity = attributes[ :severity ] - @certainty = attributes[ :certainty ] - @effective = attributes[ :effective ] - @onset = attributes[ :onset ] - @expires = attributes[ :expires ] - @event_codes = Array( attributes[ :event_codes ]) - @sender_name = attributes[ :sender_name ] - @headline = attributes[ :headline ] - @description = attributes[ :description ] - @instruction = attributes[ :instruction ] - @web = attributes[ :web ] - @contact = attributes[ :contact ] - @parameters = Array( attributes[ :parameters ]) - @resources = Array( attributes[ :resources ]) - @areas = Array( attributes[ :areas ]) + def xmlns + Alert::XMLNS end - # Creates a new EventCode object and adds it to the event_codes array. The - # event_code_attributes are passed as a parameter to EventCode.new. - # - # @see EventCode#initialize - # - # @param [Hash] event_code_attributes (see EventCode#initialize) - # @return [EventCode] - def add_event_code( event_code_attributes = {}) - event_code = EventCode.new( event_code_attributes ) - @event_codes << event_code - event_code + # @return [Class] + def event_code_class + EventCode end - # Creates a new Parameter object and adds it to the parameters array. The - # parameter_attributes are passed as a parameter to Parameter.new. - # - # @see Parameter#initialize - # - # @param [Hash] parameter_attributes (see Parameter#initialize) - # @return [Parameter] - def add_parameter( parameter_attributes = {}) - parameter = Parameter.new( parameter_attributes ) - @parameters << parameter - parameter + # @return [Class] + def parameter_class + Parameter end - # Creates a new Resource object and adds it to the resources array. The - # resource_attributes are passed as a parameter to Resource.new. - # - # @see Resource#initialize - # - # @param [Hash] resource_attributes (See Resource#initialize) - # @return [Resource] - def add_resource( resource_attributes = {}) - resource = Resource.new( resource_attributes ) - @resources << resource - resource + # @return [Class] + def resource_class + Resource end - # Creates a new Area object and adds it to the areas array. The - # area_attributes are passed as a parameter to Area.new. - # - # @see Area#initialize - # - # @param [Hash] area_attributes (see Area#initialize) - # @return [Area] - def add_area( area_attributes = {}) - area = Area.new( area_attributes ) - @areas << area - area - end - - # @return [REXML::Element] - def to_xml_element - xml_element = REXML::Element.new( XML_ELEMENT_NAME ) - xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text( @language ) if @language - @categories.each do |category| - xml_element.add_element( CATEGORY_ELEMENT_NAME ).add_text( category ) - end - xml_element.add_element( EVENT_ELEMENT_NAME ).add_text( @event ) - xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( @urgency ) - xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( @severity ) - xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( @certainty ) - xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( @audience ) if @audience - @event_codes.each do |event_code| - xml_element.add_element( event_code.to_xml_element ) - end - xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text( @effective.to_s_for_cap ) if @effective - xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( @onset.to_s_for_cap ) if @onset - xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( @expires.to_s_for_cap ) if @expires - xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( @sender_name ) if @sender_name - xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( @headline ) if @headline - xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( @description ) if @description - xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( @instruction ) if @instruction - xml_element.add_element( WEB_ELEMENT_NAME ).add_text( @web ) if @web - xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( @contact ) if @contact - @parameters.each do |parameter| - xml_element.add_element( parameter.to_xml_element ) - end - @resources.each do |resource| - xml_element.add_element( resource.to_xml_element ) - end - @areas.each do |area| - xml_element.add_element( area.to_xml_element ) - end - xml_element - end - - # @return [String] - def to_xml - self.to_xml_element.to_s - end - - # @return [String] - def inspect - info_inspect = "Language: #{ @language }\n"+ - "Categories: #{ @categories.to_s_for_cap }\n"+ - "Event: #{ @event }\n"+ - "Urgency: #{ @urgency }\n"+ - "Severity: #{ @severity }\n"+ - "Certainty: #{ @certainty }\n"+ - "Audience: #{ @audience }\n"+ - "Event Codes: #{ @event_codes.inspect }\n"+ - "Effective: #{ @effective }\n"+ - "Onset: #{ @onset }\n"+ - "Expires: #{ @expires }\n"+ - "Sender Name: #{ @sender_name }\n"+ - "Headline: #{ @headline }\n"+ - "Description:\n"+ - @description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+ - "Instruction: #{ @instruction }\n"+ - "Web: #{ @web }\n"+ - "Contact: #{ @contact }\n"+ - "Parameters:\n"+ - @parameters.map{ |parameter| parameter.inspect }.join( "\n" )+"\n"+ - "Resources:\n"+ - @resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+ - "Area:\n"+ - @areas.map{ |area| " #{ area }" }.join( "\n" )+"\n" - RCAP.format_lines_for_inspect( 'INFO', info_inspect ) - end - - # Returns a string representation of the event of the form - # event(urgency/severity/certainty) - # - # @return [String] - def to_s - "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })" - end - - # @param [REXML::Element] info_xml_element - # @return [Info] - def self.from_xml_element( info_xml_element ) - self.new( - :language => RCAP.xpath_text( info_xml_element, LANGUAGE_XPATH, Alert::XMLNS ) || DEFAULT_LANGUAGE, - :categories => RCAP.xpath_match( info_xml_element, CATEGORY_XPATH, Alert::XMLNS ).map{ |element| element.text }, - :event => RCAP.xpath_text( info_xml_element, EVENT_XPATH, Alert::XMLNS ), - :urgency => RCAP.xpath_text( info_xml_element, URGENCY_XPATH, Alert::XMLNS ), - :severity => RCAP.xpath_text( info_xml_element, SEVERITY_XPATH, Alert::XMLNS ), - :certainty => RCAP.xpath_text( info_xml_element, CERTAINTY_XPATH, Alert::XMLNS ), - :audience => RCAP.xpath_text( info_xml_element, AUDIENCE_XPATH, Alert::XMLNS ), - :effective => (( effective = RCAP.xpath_first( info_xml_element, EFFECTIVE_XPATH, Alert::XMLNS )) ? DateTime.parse( effective.text ) : nil ), - :onset => (( onset = RCAP.xpath_first( info_xml_element, ONSET_XPATH, Alert::XMLNS )) ? DateTime.parse( onset.text ) : nil ), - :expires => (( expires = RCAP.xpath_first( info_xml_element, EXPIRES_XPATH, Alert::XMLNS )) ? DateTime.parse( expires.text ) : nil ), - :sender_name => RCAP.xpath_text( info_xml_element, SENDER_NAME_XPATH, Alert::XMLNS ), - :headline => RCAP.xpath_text( info_xml_element, HEADLINE_XPATH, Alert::XMLNS ), - :description => RCAP.xpath_text( info_xml_element, DESCRIPTION_XPATH, Alert::XMLNS ), - :instruction => RCAP.xpath_text( info_xml_element, INSTRUCTION_XPATH, Alert::XMLNS ), - :web => RCAP.xpath_text( info_xml_element, WEB_XPATH, Alert::XMLNS ), - :contact => RCAP.xpath_text( info_xml_element, CONTACT_XPATH, Alert::XMLNS ), - :event_codes => RCAP.xpath_match( info_xml_element, EventCode::XPATH, Alert::XMLNS ).map{ |element| EventCode.from_xml_element( element )}, - :parameters => RCAP.xpath_match( info_xml_element, Parameter::XPATH, Alert::XMLNS ).map{ |element| Parameter.from_xml_element( element )}, - :resources => RCAP.xpath_match( info_xml_element, Resource::XPATH, Alert::XMLNS ).map{ |element| Resource.from_xml_element( element )}, - :areas => RCAP.xpath_match( info_xml_element, Area::XPATH, Alert::XMLNS ).map{ |element| Area.from_xml_element( element )} - ) - end - - LANGUAGE_YAML = 'Language' - CATEGORIES_YAML = 'Categories' - EVENT_YAML = 'Event' - URGENCY_YAML = 'Urgency' - SEVERITY_YAML = 'Severity' - CERTAINTY_YAML = 'Certainty' - AUDIENCE_YAML = 'Audience' - EFFECTIVE_YAML = 'Effective' - ONSET_YAML = 'Onset' - EXPIRES_YAML = 'Expires' - SENDER_NAME_YAML = 'Sender Name' - HEADLINE_YAML = 'Headline' - DESCRIPTION_YAML = 'Description' - INSTRUCTION_YAML = 'Instruction' - WEB_YAML = 'Web' - CONTACT_YAML = 'Contact' - EVENT_CODES_YAML = 'Event Codes' - PARAMETERS_YAML = 'Parameters' - RESOURCES_YAML = 'Resources' - AREAS_YAML = 'Areas' - - # @return [String] - def to_yaml( options = {} ) - parameter_to_hash = lambda{ |hash, parameter| hash.merge( parameter.name => parameter.value )} - - RCAP.attribute_values_to_hash( [ LANGUAGE_YAML, @language ], - [ CATEGORIES_YAML, @categories ], - [ EVENT_YAML, @event ], - [ URGENCY_YAML, @urgency ], - [ SEVERITY_YAML, @severity ], - [ CERTAINTY_YAML, @certainty ], - [ AUDIENCE_YAML, @audience ], - [ EFFECTIVE_YAML, @effective ], - [ ONSET_YAML, @onset ], - [ EXPIRES_YAML, @expires ], - [ SENDER_NAME_YAML, @sender_name ], - [ HEADLINE_YAML, @headline ], - [ DESCRIPTION_YAML, @description ], - [ INSTRUCTION_YAML, @instruction ], - [ WEB_YAML, @web ], - [ CONTACT_YAML, @contact ], - [ EVENT_CODES_YAML, @event_codes.inject({}, &parameter_to_hash )], - [ PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash )], - [ RESOURCES_YAML, @resources ], - [ AREAS_YAML, @areas ]).to_yaml( options ) - end - - # @param [Hash] info_yaml_data - # @return [Info] - def self.from_yaml_data( info_yaml_data ) - self.new( - :language => info_yaml_data [ LANGUAGE_YAML ], - :categories => info_yaml_data [ CATEGORIES_YAML ], - :event => info_yaml_data [ EVENT_YAML ], - :urgency => info_yaml_data [ URGENCY_YAML ], - :severity => info_yaml_data [ SEVERITY_YAML ], - :certainty => info_yaml_data [ CERTAINTY_YAML ], - :audience => info_yaml_data [ AUDIENCE_YAML ], - :effective => ( effective = info_yaml_data[ EFFECTIVE_YAML ]).blank? ? nil : DateTime.parse( effective.to_s ), - :onset => ( onset = info_yaml_data[ ONSET_YAML ]).blank? ? nil : DateTime.parse( onset.to_s ), - :expires => ( expires = info_yaml_data[ EXPIRES_YAML ]).blank? ? nil : DateTime.parse( expires.to_s ), - :sender_name => info_yaml_data [ SENDER_NAME_YAML ], - :headline => info_yaml_data [ HEADLINE_YAML ], - :description => info_yaml_data [ DESCRIPTION_YAML ], - :instruction => info_yaml_data [ INSTRUCTION_YAML ], - :web => info_yaml_data [ WEB_YAML ], - :contact => info_yaml_data [ CONTACT_YAML ], - :event_codes => Array( info_yaml_data [ EVENT_CODES_YAML ]).map{ |name,value| EventCode.new( :name => name, :value => value )}, - :parameters => Array( info_yaml_data [ PARAMETERS_YAML ]).map{ |parameter_yaml_data| Parameter.new( :name => name, :value => value )}, - :resources => Array( info_yaml_data [ RESOURCES_YAML ]).map{ |resource_yaml_data| Resource.from_yaml_data( resource_yaml_data )}, - :areas => Array( info_yaml_data [ AREAS_YAML ]).map{ |area_yaml_data| Area.from_yaml_data( area_yaml_data )} - ) - end - - LANGUAGE_KEY = 'language' - CATEGORIES_KEY = 'categories' - EVENT_KEY = 'event' - URGENCY_KEY = 'urgency' - SEVERITY_KEY = 'severity' - CERTAINTY_KEY = 'certainty' - AUDIENCE_KEY = 'audience' - EFFECTIVE_KEY = 'effective' - ONSET_KEY = 'onset' - EXPIRES_KEY = 'expires' - SENDER_NAME_KEY = 'sender_name' - HEADLINE_KEY = 'headline' - DESCRIPTION_KEY = 'description' - INSTRUCTION_KEY = 'instruction' - WEB_KEY = 'web' - CONTACT_KEY = 'contact' - RESOURCES_KEY = 'resources' - EVENT_CODES_KEY = 'event_codes' - PARAMETERS_KEY = 'parameters' - AREAS_KEY = 'areas' - - # @return [Hash] - def to_h - RCAP.attribute_values_to_hash( [ LANGUAGE_KEY, @language ], - [ CATEGORIES_KEY, @categories ], - [ EVENT_KEY, @event ], - [ URGENCY_KEY, @urgency ], - [ SEVERITY_KEY, @severity ], - [ CERTAINTY_KEY, @certainty ], - [ AUDIENCE_KEY, @audience ], - [ EFFECTIVE_KEY, RCAP.to_s_for_cap( @effective )], - [ ONSET_KEY, RCAP.to_s_for_cap( @onset )], - [ EXPIRES_KEY, RCAP.to_s_for_cap( @expires )], - [ SENDER_NAME_KEY, @sender_name ], - [ HEADLINE_KEY, @headline ], - [ DESCRIPTION_KEY, @description ], - [ INSTRUCTION_KEY, @instruction ], - [ WEB_KEY, @web ], - [ CONTACT_KEY, @contact ], - [ RESOURCES_KEY, @resources.map{ |resource| resource.to_h } ], - [ EVENT_CODES_KEY, @event_codes.map{ |event_code| event_code.to_h } ], - [ PARAMETERS_KEY, @parameters.map{ |parameter| parameter.to_h } ], - [ AREAS_KEY, @areas.map{ |area| area.to_h }]) - end - - # @param [Hash] info_hash - # @return [Info] - def self.from_h( info_hash ) - self.new( :language => info_hash[ LANGUAGE_KEY ], - :categories => info_hash[ CATEGORIES_KEY ], - :event => info_hash[ EVENT_KEY ], - :urgency => info_hash[ URGENCY_KEY ], - :severity => info_hash[ SEVERITY_KEY ], - :certainty => info_hash[ CERTAINTY_KEY ], - :audience => info_hash[ AUDIENCE_KEY ], - :effective => RCAP.parse_datetime( info_hash[ EFFECTIVE_KEY ]), - :onset => RCAP.parse_datetime( info_hash[ ONSET_KEY ]), - :expires => RCAP.parse_datetime( info_hash[ EXPIRES_KEY ]), - :sender_name => info_hash[ SENDER_NAME_KEY ], - :headline => info_hash[ HEADLINE_KEY ], - :description => info_hash[ DESCRIPTION_KEY ], - :instruction => info_hash[ INSTRUCTION_KEY ], - :web => info_hash[ WEB_KEY ], - :contact => info_hash[ CONTACT_KEY ], - :resources => Array( info_hash[ RESOURCES_KEY ]).map{ |resource_hash| Resource.from_h( resource_hash ) }, - :event_codes => Array( info_hash[ EVENT_CODES_KEY ]).map{ |event_code_hash| EventCode.from_h( event_code_hash )}, - :parameters => Array( info_hash[ PARAMETERS_KEY ]).map{ |parameter_hash| Parameter.from_h( parameter_hash )}, - :areas => Array( info_hash[ AREAS_KEY ]).map{ |area_hash| Area.from_h( area_hash )}) + # @return [Class] + def area_class + Area end end end end