wikidata-client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +69 -0
  6. data/LICENCE +21 -0
  7. data/README.md +180 -0
  8. data/Rakefile +5 -0
  9. data/config/mapping.yml +19 -0
  10. data/config/settings.yml +4 -0
  11. data/lib/wikidata.rb +39 -0
  12. data/lib/wikidata/client.rb +36 -0
  13. data/lib/wikidata/config.rb +23 -0
  14. data/lib/wikidata/entity.rb +83 -0
  15. data/lib/wikidata/item.rb +41 -0
  16. data/lib/wikidata/property.rb +29 -0
  17. data/lib/wikidata/property/base.rb +16 -0
  18. data/lib/wikidata/property/globe_coordinate.rb +13 -0
  19. data/lib/wikidata/property/string.rb +6 -0
  20. data/lib/wikidata/property/time.rb +66 -0
  21. data/lib/wikidata/property/url.rb +6 -0
  22. data/lib/wikidata/resource.rb +69 -0
  23. data/lib/wikidata/response.rb +31 -0
  24. data/lib/wikidata/search_response.rb +35 -0
  25. data/lib/wikidata/version.rb +3 -0
  26. data/spec/fixtures/vcr/Wikidata_Entity/properties/entities/should_allow_to_return_only_entities_ids_from_a_key.yml +160 -0
  27. data/spec/fixtures/vcr/Wikidata_Entity/properties/entities/should_allow_to_return_only_entities_ids_from_an_id.yml +160 -0
  28. data/spec/fixtures/vcr/Wikidata_Entity/properties/entities/should_return_entities_property_from_a_key_children_here_.yml +518 -0
  29. data/spec/fixtures/vcr/Wikidata_Entity/properties/entities/should_return_entities_property_from_an_id_P40_for_children_here_.yml +516 -0
  30. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_date/should_return_Time_from_a_a_key_date_of_birth_here_.yml +162 -0
  31. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_date/should_return_Time_from_a_property_id_P569_for_date_of_birth_here_.yml +162 -0
  32. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_globe_coordinate/should_return_GlobeCoordinate_from_a_key_coordinate_location_here_.yml +58 -0
  33. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_globe_coordinate/should_return_GlobeCoordinate_from_a_property_id_P625_for_coordinate_location_here_.yml +58 -0
  34. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_string/should_return_String_from_a_key_freebase_identifier_here_.yml +160 -0
  35. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_string/should_return_String_from_a_property_id_P646_for_freebase_identifier_here_.yml +160 -0
  36. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_url/should_return_Url_from_a_key_official_website_here_.yml +78 -0
  37. data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/of_type_url/should_return_Url_from_a_property_id_P856_for_official_website_here_.yml +78 -0
  38. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_aliases.yml +176 -0
  39. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_descriptions.yml +178 -0
  40. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_id.yml +176 -0
  41. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_labels.yml +176 -0
  42. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_sitelinks.yml +176 -0
  43. data/spec/fixtures/vcr/Wikidata_Entity/properties/should_return_url.yml +178 -0
  44. data/spec/fixtures/vcr/Wikidata_Item/_find_/should_find_by_id.yml +319 -0
  45. data/spec/fixtures/vcr/Wikidata_Item/_find_/should_find_by_ids.yml +441 -0
  46. data/spec/fixtures/vcr/Wikidata_Item/_find_/should_find_by_title.yml +319 -0
  47. data/spec/fixtures/vcr/Wikidata_Item/_find_/should_find_by_titles.yml +441 -0
  48. data/spec/fixtures/vcr/Wikidata_Item/_find_/should_return_nil_if_item_not_found.yml +58 -0
  49. data/spec/fixtures/vcr/Wikidata_Item/_search/should_fetch_all_all_items_of_the_collection.yml +656 -0
  50. data/spec/fixtures/vcr/Wikidata_Item/_search/should_return_a_response_with_an_empty_array_of_results_if_search_missing.yml +57 -0
  51. data/spec/fixtures/vcr/Wikidata_Item/_search/should_return_an_array_of_Wikidata_Item.yml +654 -0
  52. data/spec/fixtures/vcr/Wikidata_Item/_search/should_return_the_next_page_offset.yml +123 -0
  53. data/spec/fixtures/vcr/Wikidata_Item/_search/should_return_the_total_number_of_hits.yml +123 -0
  54. data/spec/spec_helper.rb +28 -0
  55. data/spec/wikidata/client_spec.rb +4 -0
  56. data/spec/wikidata/entity_spec.rb +139 -0
  57. data/spec/wikidata/item_spec.rb +64 -0
  58. data/spec/wikidata/property/time_spec.rb +61 -0
  59. data/spec/wikidata_spec.rb +20 -0
  60. data/wikidata-client.gemspec +27 -0
  61. metadata +262 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 176a5af4ed352f7b9647a8ee712c5dcc98314abe
4
+ data.tar.gz: 4a1bbc872493aaeb43f0c374de9aac2244e445fe
5
+ SHA512:
6
+ metadata.gz: 4e88633911b243de244e13a694cef8ad33dcd3fc3442f78e4e3c9bd1b61b2a6e10b1edbfb656c5d87f09abfc1e4468640d9e0b070c1fccabbb64fb1363e612c1
7
+ data.tar.gz: 318598d5c79876629b2bf334a1c60a3d5a16ff544e669335908ad61d7e26cee1594899dfe2cce27d8aff1d2014dee5f24fc46f6d636ff5ae762c4631adfcbea1
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.0
5
+ addons:
6
+ code_climate:
7
+ repo_token: 743f972ae03be14575c4cda0bf254af861a9a788527267015c5a8d487f43c371
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "codeclimate-test-reporter", require: nil
7
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ wikidata-client (0.0.1)
5
+ faraday (~> 0.9)
6
+ faraday_middleware (~> 0.9)
7
+ hashie (~> 3.3)
8
+ patron (~> 0.4)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.3.6)
14
+ codeclimate-test-reporter (0.4.0)
15
+ simplecov (>= 0.7.1, < 1.0.0)
16
+ coderay (1.1.0)
17
+ crack (0.4.2)
18
+ safe_yaml (~> 1.0.0)
19
+ diff-lcs (1.2.5)
20
+ docile (1.1.5)
21
+ faraday (0.9.0)
22
+ multipart-post (>= 1.2, < 3)
23
+ faraday_middleware (0.9.1)
24
+ faraday (>= 0.7.4, < 0.10)
25
+ hashie (3.3.1)
26
+ method_source (0.8.2)
27
+ multi_json (1.10.1)
28
+ multipart-post (2.0.0)
29
+ patron (0.4.18)
30
+ pry (0.10.1)
31
+ coderay (~> 1.1.0)
32
+ method_source (~> 0.8.1)
33
+ slop (~> 3.4)
34
+ rake (10.3.2)
35
+ rspec (3.1.0)
36
+ rspec-core (~> 3.1.0)
37
+ rspec-expectations (~> 3.1.0)
38
+ rspec-mocks (~> 3.1.0)
39
+ rspec-core (3.1.4)
40
+ rspec-support (~> 3.1.0)
41
+ rspec-expectations (3.1.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.1.0)
44
+ rspec-mocks (3.1.1)
45
+ rspec-support (~> 3.1.0)
46
+ rspec-support (3.1.0)
47
+ safe_yaml (1.0.3)
48
+ simplecov (0.9.1)
49
+ docile (~> 1.1.0)
50
+ multi_json (~> 1.0)
51
+ simplecov-html (~> 0.8.0)
52
+ simplecov-html (0.8.0)
53
+ slop (3.6.0)
54
+ vcr (2.9.3)
55
+ webmock (1.18.0)
56
+ addressable (>= 2.3.6)
57
+ crack (>= 0.3.2)
58
+
59
+ PLATFORMS
60
+ ruby
61
+
62
+ DEPENDENCIES
63
+ codeclimate-test-reporter
64
+ pry (~> 0.10)
65
+ rake (~> 10.3)
66
+ rspec (~> 3.1)
67
+ vcr (~> 2.9)
68
+ webmock (~> 1.18)
69
+ wikidata-client!
data/LICENCE ADDED
@@ -0,0 +1,21 @@
1
+ MIT LICENSE
2
+
3
+ Copyright (c) klacointe <kevinlacointe@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # Wikidata API Client
2
+
3
+ [![Build Status](https://travis-ci.org/klacointe/wikidata-client.svg?branch=master)](https://travis-ci.org/klacointe/wikidata-client)
4
+ [![Code Climate](https://codeclimate.com/github/klacointe/wikidata-client/badges/gpa.svg)](https://codeclimate.com/github/klacointe/wikidata-client)
5
+ [![Test Coverage](https://codeclimate.com/github/klacointe/wikidata-client/badges/coverage.svg)](https://codeclimate.com/github/klacointe/wikidata-client)
6
+ [![Dependency Status](https://gemnasium.com/klacointe/wikidata-client.svg)](https://gemnasium.com/klacointe/wikidata-client)
7
+
8
+
9
+ [Wikidata](http://www.wikidata.org/) client library for Ruby.
10
+
11
+ It provide an easy way to search for wikidata pages and read their contents.
12
+
13
+
14
+ ## Installation
15
+
16
+ In bunler: `gem 'wikidata-client', '~> 0.0.1', require: 'wikidata'`
17
+
18
+ Otherwise: `gem install wikidata-client`
19
+
20
+
21
+ ## Configuration
22
+
23
+ Only one thing is configurable for now, the HTTP client [patron](https://github.com/toland/patron)
24
+
25
+ ```ruby
26
+ Wikidata.configure do |c|
27
+ c.client_options = {
28
+ request: {
29
+ open_timeout: 2,
30
+ timeout: 9
31
+ }
32
+ }
33
+ end
34
+ ```
35
+
36
+ ## Usage
37
+
38
+
39
+ ### Search
40
+
41
+ ```irb
42
+ > search = Wikidata::Item.search 'Homer Simpson'
43
+ => <Wikidata::SearchResponse results: [
44
+ <Wikidata::Item id: Q7810, title: "Homer Simpson">,
45
+ <Wikidata::Item id: Q3577370, title: "Homer Simpson, This Is Your Wife">,
46
+ <Wikidata::Item id: Q2082128, title: "Homer Simpson in: "Kidney Trouble">,
47
+ <Wikidata::Item id: Q2715733, title: "Politically Inept, with Homer Simpson">,
48
+ <Wikidata::Item id: Q1626047, title: "The City of New York vs. Homer Simpson">,
49
+ <Wikidata::Item id: Q5966549, title: "Q5966549">,
50
+ <Wikidata::Item id: Q15162647, title: "Being Homer Simpson">,
51
+ <Wikidata::Item id: Q17653635, title: "'Homer Simpson' contributes to U.S. presidential candidate Buddy Roemer">,
52
+ <Wikidata::Item id: Q17713638, title: "Q17713638">,
53
+ <Wikidata::Item id: Q2751406, title: "Q2751406">
54
+ ]>
55
+
56
+ > search.empty?
57
+ => false
58
+
59
+ > search.results.first.labels['en'].value
60
+ => "Homer Simpson"
61
+
62
+ > search.total_hits
63
+ => 119
64
+
65
+ > search.next_page_offset
66
+ => 10
67
+ ```
68
+
69
+ ### Find by ids or titles
70
+
71
+ ```irb
72
+ > homer = Wikidata::Item.find_by_title 'Homer Simpson' # Same as homer = Wikidata::Item.find 'Q7810'
73
+ => <Wikidata::Item id: Q7810, title: "Homer Simpson">
74
+
75
+ > homer.children
76
+ => [<Wikidata::Item id: Q5480, title: "Bart Simpson">, <Wikidata::Item id: Q5846, title: "Lisa Simpson">, <Wikidata::Item id: Q7834, title: "Maggie Simpson">]
77
+
78
+ > homer.date_of_birth.date
79
+ => #<DateTime: 1956-06-18T00:00:00+00:00 ((2435643j,0s,0n),+0s,2299161j)>
80
+ ```
81
+
82
+
83
+ If you want several pages at the same time, just give an array to `find` or `find_by_title` methods:
84
+
85
+ ```irb
86
+ > Wikidata::Item.find_by_title ['Sid Vicious', 'John Lydon']
87
+ => <Wikidata::Response results: [
88
+ <Wikidata::Item id: Q47878, title: "Sid Vicious">,
89
+ <Wikidata::Item id: Q106662, title: "John Lydon">
90
+ ]>
91
+
92
+ > Wikidata::Item.find ['Q47878', 'Q106662']
93
+ => <Wikidata::Response results: [
94
+ <Wikidata::Item id: Q47878, title: "Sid Vicious">,
95
+ <Wikidata::Item id: Q106662, title: "John Lydon">
96
+ ]>
97
+ ```
98
+
99
+ ## Properties
100
+
101
+ To access an item property, use the Wikidata property code and one of these
102
+ methods:
103
+
104
+ - `properties`: to get all properties
105
+ - `property`: to get the first property
106
+
107
+ ```irb
108
+ > homer = Wikidata::Item.find_by_title 'Homer Simpson'
109
+
110
+ => <Wikidata::Item id: Q7810, title: "Homer Simpson">
111
+
112
+ > homer.properties('P40')
113
+ => [
114
+ <Wikidata::Item id: Q5480, title: "Bart Simpson">,
115
+ <Wikidata::Item id: Q5846, title: "Lisa Simpson">,
116
+ <Wikidata::Item id: Q7834, title: "Maggie Simpson">
117
+ ]
118
+
119
+ > homer.property('P22')
120
+ => <Wikidata::Item id: Q842104, title: "Grampa Simpson">
121
+ ```
122
+
123
+ Alternatively, you can map wikidata property codes to method names, see
124
+ https://github.com/klacointe/wikidata-client/blob/master/config/mapping.yml to
125
+ get the list of mapped properties.
126
+
127
+ If you define the mapping under the `resources` section, accessor will be on the
128
+ first property only. If under the `collections` sections, all properties will be
129
+ returned:
130
+
131
+ ```irb
132
+ > homer = Wikidata::Item.find_by_title 'Homer Simpson'
133
+
134
+ => <Wikidata::Item id: Q7810, title: "Homer Simpson">
135
+
136
+ > homer.children
137
+ => [
138
+ <Wikidata::Item id: Q5480, title: "Bart Simpson">,
139
+ <Wikidata::Item id: Q5846, title: "Lisa Simpson">,
140
+ <Wikidata::Item id: Q7834, title: "Maggie Simpson">
141
+ ]
142
+
143
+ > homer.father
144
+ => <Wikidata::Item id: Q842104, title: "Grampa Simpson">
145
+ ```
146
+
147
+
148
+ Feel free to add yours in a topic branch and seed me a pull request.
149
+
150
+
151
+ Finally of you want to get only ids of properties to avoid making several
152
+ unecessary requests, you can use these methods: `property_id` and `property_ids`:
153
+
154
+ ```irb
155
+ > homer = Wikidata::Item.find_by_title 'Homer Simpson'
156
+
157
+ => <Wikidata::Item id: Q7810, title: "Homer Simpson">
158
+
159
+ > homer.property_ids('P40')
160
+ => ["Q5480", "Q5846", "Q7834"]
161
+
162
+ > homer.property_id('P22')
163
+ => "Q842104"
164
+ ```
165
+
166
+ ## Note on Patches/Pull Requests
167
+
168
+ * Fork the project.
169
+ * Make your feature addition or bug fix.
170
+ * Add tests for it. This is important so I don't break it in a future version
171
+ unintentionally.
172
+ * Commit, do not mess with rakefile, version, or history. (if you want to have
173
+ your own version, that is fine but bump version in a commit by itself in another
174
+ branch so I can ignore when I pull)
175
+ * Send me a pull request. Bonus points for topic branches.
176
+
177
+
178
+ ## Copyright
179
+
180
+ MIT. See LICENSE for further details.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task default: :spec
@@ -0,0 +1,19 @@
1
+ resources:
2
+ creator: P170
3
+ place_of_birth: P19
4
+ place_of_death: P20
5
+ country_of_citizenship: P27
6
+ date_of_birth: P569
7
+ date_of_death: P570
8
+ date_of_foundation_or_creation: P571
9
+ official_website: P856
10
+ gender: P21
11
+ is_in_the_administrative_territorial_entity: P131
12
+ coordinate_location: P625
13
+ freebase_identifier: P646
14
+ father: P22
15
+ collections:
16
+ official_websites: P856
17
+ instance_of: P31
18
+ subclass_of: P279
19
+ children: P40
@@ -0,0 +1,4 @@
1
+ :api:
2
+ :url: http://www.wikidata.org/w/api.php
3
+ :item:
4
+ :url: http://www.wikidata.org/wiki/:id
data/lib/wikidata.rb ADDED
@@ -0,0 +1,39 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'patron'
4
+ require 'hashie'
5
+ require 'yaml'
6
+
7
+ require 'wikidata/config'
8
+
9
+ module Wikidata
10
+ class << self
11
+ def configure &block
12
+ Config.configure &block
13
+ end
14
+
15
+ def client_options
16
+ Config.client_options
17
+ end
18
+
19
+ def settings
20
+ Config.settings
21
+ end
22
+
23
+ def mapping
24
+ Config.mapping
25
+ end
26
+ end
27
+ end
28
+
29
+ require 'wikidata/client'
30
+ require 'wikidata/property'
31
+ require 'wikidata/property/base'
32
+ require 'wikidata/property/string'
33
+ require 'wikidata/property/time'
34
+ require 'wikidata/property/url'
35
+ require 'wikidata/property/globe_coordinate'
36
+ require 'wikidata/entity'
37
+ require 'wikidata/item'
38
+ require 'wikidata/response'
39
+ require 'wikidata/search_response'
@@ -0,0 +1,36 @@
1
+ module Wikidata
2
+ class Client
3
+ DEFAULT_QUERY = {
4
+ format: 'json'
5
+ }
6
+
7
+ attr_accessor :query, :total_pages
8
+
9
+ def initialize query = {}
10
+ @query = DEFAULT_QUERY.merge(query)
11
+ end
12
+
13
+ def response
14
+ response_class.new api.get('', query)
15
+ end
16
+
17
+ private
18
+
19
+ def response_class
20
+ case @query[:action]
21
+ when 'query'
22
+ Wikidata::SearchResponse
23
+ else
24
+ Wikidata::Response
25
+ end
26
+ end
27
+
28
+ def api
29
+ Faraday.new({url: Wikidata.settings.api.url}.merge(Wikidata.client_options)) do |faraday|
30
+ faraday.request :url_encoded
31
+ faraday.response :json, content_type: /\bjson$/
32
+ faraday.adapter :patron
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module Wikidata
2
+ class Config
3
+ class << self
4
+ attr_accessor :client_options, :settings, :mapping
5
+
6
+ def configure &block
7
+ yield self
8
+ end
9
+ end
10
+
11
+ @client_options = {}
12
+ @settings = Hashie::Mash.new(
13
+ YAML.load_file(
14
+ File.expand_path('../../../config/settings.yml', __FILE__)
15
+ )
16
+ )
17
+ @mapping = Hashie::Mash.new(
18
+ YAML.load_file(
19
+ File.expand_path('../../../config/mapping.yml', __FILE__)
20
+ )
21
+ )
22
+ end
23
+ end
@@ -0,0 +1,83 @@
1
+ module Wikidata
2
+ class Entity
3
+ extend Forwardable
4
+
5
+ attr_accessor :hash
6
+ def_delegators :@hash, :id, :labels, :aliases, :descriptions, :sitelinks
7
+
8
+ def initialize hash
9
+ @hash = Hashie::Mash.new hash
10
+ @_properties = {}
11
+ end
12
+
13
+ def id
14
+ return hash['id'] if hash['id']
15
+ return hash['title'] if hash['title']
16
+ end
17
+
18
+ def title
19
+ return labels['en'].value if labels && labels['en']
20
+ return sitelinks['en'].value if sitelinks && sitelinks['en']
21
+ hash['title'] if hash['title']
22
+ end
23
+
24
+ def url
25
+ Wikidata.settings.item.url.gsub(':id', id)
26
+ end
27
+
28
+ Wikidata.mapping.resources.each do |k, code|
29
+ define_method k do
30
+ property code
31
+ end
32
+ define_method "#{k}_id" do
33
+ property_id code
34
+ end
35
+ end
36
+
37
+ Wikidata.mapping.collections.each do |k, code|
38
+ define_method k do
39
+ properties code
40
+ end
41
+ define_method "#{k}_ids" do
42
+ property_ids code
43
+ end
44
+ end
45
+
46
+ def properties code
47
+ @_properties[code] ||= Array(raw_property(code)).map {|a| Wikidata::Property.build a }
48
+ end
49
+
50
+ def property_ids code
51
+ Array(raw_property(code)).map do |attribute|
52
+ # TODO Handle other types
53
+ # http://www.wikidata.org/wiki/Wikidata:Glossary#Entities.2C_items.2C_properties_and_queries
54
+ case attribute.mainsnak.datavalue.value['entity-type']
55
+ when 'item'
56
+ prefix = 'Q'
57
+ else
58
+ raise "Unkown wikibase-item entity-type #{attribute.mainsnak.datatype.value['entity-type']}"
59
+ end
60
+ "#{prefix}#{attribute.mainsnak.datavalue.value['numeric-id']}"
61
+ end
62
+ end
63
+
64
+ def property code
65
+ properties(code).first
66
+ end
67
+
68
+ def property_id code
69
+ property_ids(code).first
70
+ end
71
+
72
+ def inspect
73
+ "<#{self.class} id: #{id}, title: \"#{title}\">"
74
+ end
75
+
76
+ private
77
+
78
+ def raw_property code
79
+ return unless hash.claims
80
+ hash.claims[code]
81
+ end
82
+ end
83
+ end