module Nytimes module Articles ## # This class represents a Facet used in the ArticleSearch API. Facets can be used to both search for matching articles (see Article#search) and # are also returned as article and search metadata. Facets are made up of 3 parts: # * facet_type - a string; see Article#search for a list of facet types # * term - a string as well # * count - Facets returned as search metadata (via the :facets parameter to Article#search) also include a non-nil count of matching articles for that facet class Facet ## # The term for the facet attr_reader :term ## # The number of times this facet has appeared in the search results (note: this only applies for facets returned in the facets header on an Article#search) attr_reader :count ## # The facet type attr_reader :facet_type # Facet name constants CLASSIFIERS = 'classifiers_facet' COLUMN = 'column_facet' DATE = 'date' DAY_OF_WEEK = 'day_of_week_facet' DESCRIPTION = 'des_facet' DESK = 'desk_facet' GEO = 'geo_facet' MATERIAL_TYPE = 'material_type_facet' ORGANIZATION = 'org_facet' PAGE = 'page_facet' PERSON = 'per_facet' PUB_DAY = 'publication_day' PUB_MONTH = 'publication_month' PUB_YEAR = 'publication_year' SECTION_PAGE = 'section_page_facet' SOURCE = 'source_facet' WORKS_MENTIONED = 'works_mentioned_facet' # Facets of content formatted for nytimes.com NYTD_BYLINE = 'nytd_byline' NYTD_DESCRIPTION = 'nytd_des_facet' NYTD_GEO = 'nytd_geo_facet' NYTD_ORGANIZATION = 'nytd_org_facet' NYTD_PERSON = 'nytd_per_facet' NYTD_SECTION = 'nytd_section_facet' NYTD_WORKS_MENTIONED = 'nytd_works_mentioned_facet' # The default 5 facets to return DEFAULT_RETURN_FACETS = [DESCRIPTION, GEO, ORGANIZATION, PERSON, DESK] ALL_FACETS = [CLASSIFIERS, COLUMN, DATE, DAY_OF_WEEK, DESCRIPTION, DESK, GEO, MATERIAL_TYPE, ORGANIZATION, PAGE, PERSON, PUB_DAY, PUB_MONTH, PUB_YEAR, SECTION_PAGE, SOURCE, WORKS_MENTIONED, NYTD_BYLINE, NYTD_DESCRIPTION, NYTD_GEO, NYTD_ORGANIZATION, NYTD_PERSON, NYTD_SECTION, NYTD_WORKS_MENTIONED] ## # Initializes the facet. There is seldom a reason for you to call this. def initialize(facet_type, term, count) @facet_type = facet_type @term = term @count = count end ## # Takes a symbol name and subs it to a string constant def self.symbol_name(facet) case facet when String return facet when Facet return facet.facet_type when Symbol # fall through else raise ArgumentError, "Unsupported type to Facet#symbol_to_api_name" end case facet when :geography GEO when :org, :orgs ORGANIZATION when :people PERSON when :nytd_geography NYTD_GEO when :nytd_org, :nytd_orgs NYTD_ORGANIZATION when :nytd_people NYTD_PERSON else name = facet.to_s.upcase if const_defined?(name) const_get(name) elsif name =~ /S$/ && const_defined?(name.gsub(/S$/, '')) const_get(name.gsub(/S$/, '')) else raise ArgumentError, "Unable to find a matching facet key for symbol :#{facet}" end end end ## # Initializes a selection of Facet objects returned from the API. Used for marshaling Facets in articles and metadata from search results # (Note: some facets are returned as scalar values) def self.init_from_api(api_hash) return nil if api_hash.nil? unless api_hash.is_a? Hash raise ArgumentError, "expecting a Hash only" else return nil if api_hash.empty? end out = {} api_hash.each_pair do |k,v| out[k] = v.map {|f| Facet.new(k, f['term'], f['count'])} end out end end end end