Sha256: b2e4ac8eec21e255e37701645b48f1642d66545943d0387c0a24e0ab68703c20

Contents?: true

Size: 1.96 KB

Versions: 2

Compression:

Stored size: 1.96 KB

Contents

module Wikidata
  class Entity < Hashie::Mash
    extend Forwardable

    disable_warnings

    def initialize(hash, opts = {})
      super(hash, opts)
      @_properties = {}
    end

    def id
      self['id'] || self['title']
    end

    def title
      return labels['en'].value if labels && labels['en']
      return sitelinks['en'].value if sitelinks && sitelinks['en']

      title
    end

    def url
      Wikidata.settings.item.url.gsub(':id', id)
    end

    Wikidata.mapping.each do |type, mappings|
      resource = (type.to_sym == :resources)
      mappings.each do |k, code|
        define_method k do
          resource ? property(code) : properties(code)
        end
        define_method(resource ? "#{k}_id" : "#{k}_ids") do
          resource ? property_id(code) : property_ids(code)
        end
      end
    end

    def property_keys
      claims.keys
    end

    def property_name(code)
      Wikidata::Item.find(code).title
    end

    def properties(code)
      @_properties[code] ||= Array(raw_property(code)).map { |a| Wikidata::Property.build a }
    end

    def property_ids(code)
      Array(raw_property(code)).map do |attribute|
        self.class.entity_id attribute
      end.compact
    end

    def property(code)
      properties(code).first
    end

    def property_id(code)
      property_ids(code).first
    end

    def inspect
      "<#{self.class} id: #{id}, title: \"#{title}\">"
    end

    class << self
      # TODO: Handle other types
      # http://www.wikidata.org/wiki/Wikidata:Glossary#Entities.2C_items.2C_properties_and_queries
      def entity_id(attribute)
        return unless attribute.mainsnak.datavalue

        attribute.mainsnak.datavalue.value.tap do |h|
          case h['entity-type']
          when 'item'
            return "Q#{h['numeric-id']}"
          else
            return nil
          end
        end
      end
    end

    private

    def raw_property(code)
      return unless claims

      claims[code]
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
wikidata-client-0.1.0 lib/wikidata/entity.rb
wikidata-client-0.1.0.pre.rc1 lib/wikidata/entity.rb