wikidata-client 0.0.10 → 0.1.0.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +4 -0
- data/README.md +2 -6
- data/lib/wikidata/client.rb +2 -2
- data/lib/wikidata/config.rb +5 -5
- data/lib/wikidata/entity.rb +32 -24
- data/lib/wikidata/property/base.rb +4 -3
- data/lib/wikidata/property/hash.rb +7 -0
- data/lib/wikidata/property/quantity.rb +18 -0
- data/lib/wikidata/property/time.rb +32 -25
- data/lib/wikidata/property.rb +5 -2
- data/lib/wikidata/version.rb +1 -1
- data/lib/wikidata.rb +6 -5
- data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/Quantity_data_type/should_return_hard_coded_number_of_children.yml +311 -0
- data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/keys_of_all_properties/can_get_a_list_of_all_property_keys.yml +114 -0
- data/spec/fixtures/vcr/Wikidata_Entity/properties/properties/name_of_a_property/can_get_the_name_of_a_property.yml +495 -0
- data/spec/spec_helper.rb +0 -3
- data/spec/wikidata/entity_spec.rb +18 -0
- data/spec/wikidata_spec.rb +4 -7
- metadata +40 -40
- data/.gitignore +0 -3
- data/.irbrc +0 -1
- data/.rspec +0 -2
- data/.travis.yml +0 -11
- data/Gemfile +0 -7
- data/Rakefile +0 -5
- data/wikidata-client.gemspec +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3a8b1ca5db1a94adb4890a6dfa8c6dfa7eaa2e8e802b097d16e48f2932049888
|
4
|
+
data.tar.gz: 59e71242e4542335fbb4e13ff3bada7db08ba48272be638ab26cf529edae23bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fd41ca92856865b23e73ff5b04c96af1cec255c7852b7b33b5e226db42ec4cc8a7fd5d31e4e66c00c675e956bda34fe7b6b5859ec9b18221f0ca609b373105c
|
7
|
+
data.tar.gz: 1ccf018cd1255ad71ecaa0cc125c2d51d3d1efd45c04a2e541581cbf772630f90537ff203257e0b727b44415aba5ddb720649c4e52f6b86f9aaabb0720130064
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
# Wikidata API Client
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/wikidata-client.svg)](http://badge.fury.io/rb/wikidata-client)
|
4
|
-
[![Build Status](https://travis-ci.org/klacointe/wikidata-client.svg?branch=master)](https://travis-ci.org/klacointe/wikidata-client)
|
5
|
-
[![Code Climate](https://codeclimate.com/github/klacointe/wikidata-client/badges/gpa.svg)](https://codeclimate.com/github/klacointe/wikidata-client)
|
6
|
-
[![Test Coverage](https://codeclimate.com/github/klacointe/wikidata-client/badges/coverage.svg)](https://codeclimate.com/github/klacointe/wikidata-client)
|
7
|
-
[![Dependency Status](https://gemnasium.com/klacointe/wikidata-client.svg)](https://gemnasium.com/klacointe/wikidata-client)
|
8
4
|
|
9
5
|
|
10
6
|
[Wikidata](http://www.wikidata.org/) client library for Ruby.
|
@@ -15,7 +11,7 @@ their contents.
|
|
15
11
|
|
16
12
|
## Installation
|
17
13
|
|
18
|
-
In bundler: `gem 'wikidata-client', '~> 0.0.
|
14
|
+
In bundler: `gem 'wikidata-client', '~> 0.0.10', require: 'wikidata'`
|
19
15
|
|
20
16
|
Otherwise: `gem install wikidata-client`
|
21
17
|
|
@@ -33,7 +29,7 @@ Wikidata.configure do |config|
|
|
33
29
|
open_timeout: 2
|
34
30
|
}
|
35
31
|
}
|
36
|
-
config.
|
32
|
+
config.adapter = :excon
|
37
33
|
end
|
38
34
|
```
|
39
35
|
|
data/lib/wikidata/client.rb
CHANGED
@@ -6,7 +6,7 @@ module Wikidata
|
|
6
6
|
|
7
7
|
attr_accessor :query, :total_pages
|
8
8
|
|
9
|
-
def initialize
|
9
|
+
def initialize(query = {})
|
10
10
|
@query = DEFAULT_QUERY.merge(query)
|
11
11
|
end
|
12
12
|
|
@@ -28,9 +28,9 @@ module Wikidata
|
|
28
28
|
def api
|
29
29
|
opts = Wikidata.options.merge url: Wikidata.settings.api.url
|
30
30
|
Faraday.new(opts) do |faraday|
|
31
|
+
faraday.adapter Wikidata.adapter
|
31
32
|
faraday.request :url_encoded
|
32
33
|
faraday.response :json, content_type: /\bjson$/
|
33
|
-
Wikidata.faraday.call faraday
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
data/lib/wikidata/config.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
module Wikidata
|
2
2
|
class Config
|
3
3
|
class << self
|
4
|
-
attr_accessor :options, :
|
4
|
+
attr_accessor :options, :adapter, :settings, :mapping
|
5
5
|
|
6
|
-
def configure
|
6
|
+
def configure
|
7
7
|
yield self
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
@options = {}
|
12
|
-
@
|
12
|
+
@adapter = :excon
|
13
13
|
@settings = Hashie::Mash.new(
|
14
14
|
YAML.load_file(
|
15
|
-
File.expand_path('
|
15
|
+
File.expand_path('../../config/settings.yml', __dir__)
|
16
16
|
)
|
17
17
|
)
|
18
18
|
@mapping = Hashie::Mash.new(
|
19
19
|
YAML.load_file(
|
20
|
-
File.expand_path('
|
20
|
+
File.expand_path('../../config/mapping.yml', __dir__)
|
21
21
|
)
|
22
22
|
)
|
23
23
|
end
|
data/lib/wikidata/entity.rb
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
module Wikidata
|
2
|
-
class Entity
|
2
|
+
class Entity < Hashie::Mash
|
3
3
|
extend Forwardable
|
4
4
|
|
5
|
-
|
6
|
-
def_delegators :@hash, :id, :labels, :aliases, :descriptions, :sitelinks
|
5
|
+
disable_warnings
|
7
6
|
|
8
|
-
def initialize
|
9
|
-
|
7
|
+
def initialize(hash, opts = {})
|
8
|
+
super(hash, opts)
|
10
9
|
@_properties = {}
|
11
10
|
end
|
12
11
|
|
13
12
|
def id
|
14
|
-
|
15
|
-
return hash['title'] if hash['title']
|
13
|
+
self['id'] || self['title']
|
16
14
|
end
|
17
15
|
|
18
16
|
def title
|
19
17
|
return labels['en'].value if labels && labels['en']
|
20
18
|
return sitelinks['en'].value if sitelinks && sitelinks['en']
|
21
|
-
|
19
|
+
|
20
|
+
title
|
22
21
|
end
|
23
22
|
|
24
23
|
def url
|
@@ -31,27 +30,35 @@ module Wikidata
|
|
31
30
|
define_method k do
|
32
31
|
resource ? property(code) : properties(code)
|
33
32
|
end
|
34
|
-
define_method
|
33
|
+
define_method(resource ? "#{k}_id" : "#{k}_ids") do
|
35
34
|
resource ? property_id(code) : property_ids(code)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
40
|
-
def
|
41
|
-
|
39
|
+
def property_keys
|
40
|
+
claims.keys
|
41
|
+
end
|
42
|
+
|
43
|
+
def property_name(code)
|
44
|
+
Wikidata::Item.find(code).title
|
45
|
+
end
|
46
|
+
|
47
|
+
def properties(code)
|
48
|
+
@_properties[code] ||= Array(raw_property(code)).map { |a| Wikidata::Property.build a }
|
42
49
|
end
|
43
50
|
|
44
|
-
def property_ids
|
51
|
+
def property_ids(code)
|
45
52
|
Array(raw_property(code)).map do |attribute|
|
46
53
|
self.class.entity_id attribute
|
47
54
|
end.compact
|
48
55
|
end
|
49
56
|
|
50
|
-
def property
|
57
|
+
def property(code)
|
51
58
|
properties(code).first
|
52
59
|
end
|
53
60
|
|
54
|
-
def property_id
|
61
|
+
def property_id(code)
|
55
62
|
property_ids(code).first
|
56
63
|
end
|
57
64
|
|
@@ -60,17 +67,17 @@ module Wikidata
|
|
60
67
|
end
|
61
68
|
|
62
69
|
class << self
|
63
|
-
|
64
|
-
# TODO Handle other types
|
70
|
+
# TODO: Handle other types
|
65
71
|
# http://www.wikidata.org/wiki/Wikidata:Glossary#Entities.2C_items.2C_properties_and_queries
|
66
|
-
def entity_id
|
72
|
+
def entity_id(attribute)
|
67
73
|
return unless attribute.mainsnak.datavalue
|
74
|
+
|
68
75
|
attribute.mainsnak.datavalue.value.tap do |h|
|
69
76
|
case h['entity-type']
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
77
|
+
when 'item'
|
78
|
+
return "Q#{h['numeric-id']}"
|
79
|
+
else
|
80
|
+
return nil
|
74
81
|
end
|
75
82
|
end
|
76
83
|
end
|
@@ -78,9 +85,10 @@ module Wikidata
|
|
78
85
|
|
79
86
|
private
|
80
87
|
|
81
|
-
def raw_property
|
82
|
-
return unless
|
83
|
-
|
88
|
+
def raw_property(code)
|
89
|
+
return unless claims
|
90
|
+
|
91
|
+
claims[code]
|
84
92
|
end
|
85
93
|
end
|
86
94
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'wikidata/property/hash'
|
2
|
+
|
1
3
|
module Wikidata
|
2
4
|
module Property
|
3
|
-
|
4
5
|
class Base
|
5
6
|
attr_reader :property
|
6
7
|
|
7
|
-
def initialize
|
8
|
-
@property =
|
8
|
+
def initialize(property)
|
9
|
+
@property = Wikidata::Property::Hash.new(property)
|
9
10
|
end
|
10
11
|
|
11
12
|
def value
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Wikidata
|
2
|
+
module Property
|
3
|
+
class Quantity < Wikidata::Property::Base
|
4
|
+
def amount
|
5
|
+
value.amount.to_f
|
6
|
+
end
|
7
|
+
def upperBound
|
8
|
+
value.upperBound.to_f
|
9
|
+
end
|
10
|
+
def lowerBound
|
11
|
+
value.lowerBound.to_f
|
12
|
+
end
|
13
|
+
def unit
|
14
|
+
value.unit
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,16 +2,16 @@ module Wikidata
|
|
2
2
|
module Property
|
3
3
|
class Time < Wikidata::Property::Base
|
4
4
|
DATE_PRECISION = {
|
5
|
-
0
|
6
|
-
1
|
7
|
-
2
|
8
|
-
3
|
9
|
-
4
|
10
|
-
5
|
11
|
-
6
|
12
|
-
7
|
13
|
-
8
|
14
|
-
9
|
5
|
+
0 => { key: nil, value: 1_000_000_000 * 365 * 24 * 3600 },
|
6
|
+
1 => { key: nil, value: 100_000_000 * 365 * 24 * 3600 },
|
7
|
+
2 => { key: nil, value: 10_000_000 * 365 * 24 * 3600 },
|
8
|
+
3 => { key: nil, value: 1_000_000 * 365 * 24 * 3600 },
|
9
|
+
4 => { key: nil, value: 100_000 * 365 * 24 * 3600 },
|
10
|
+
5 => { key: nil, value: 10_000 * 365 * 24 * 3600 },
|
11
|
+
6 => { key: nil, value: 1000 * 365 * 24 * 3600 },
|
12
|
+
7 => { key: :century, value: 100 * 365 * 24 * 3600 },
|
13
|
+
8 => { key: :decade, value: 10 * 365 * 24 * 3600 },
|
14
|
+
9 => { key: :year, value: 365 * 24 * 3600 },
|
15
15
|
10 => { key: :month, value: 30 * 24 * 3600 },
|
16
16
|
11 => { key: :day, value: 24 * 3600 },
|
17
17
|
12 => { key: nil, value: 3600 },
|
@@ -36,13 +36,14 @@ module Wikidata
|
|
36
36
|
|
37
37
|
def date
|
38
38
|
return @_date if @_date
|
39
|
-
|
39
|
+
|
40
|
+
d = ::Hash[%i[year month day hour min sec].zip(
|
40
41
|
value.time.scan(/(-?\d+)-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/).first.map(&:to_i)
|
41
42
|
)]
|
42
|
-
[
|
43
|
+
%i[month day].each do |k|
|
43
44
|
d[k] = (d[k] == 0 ? 1 : d[k])
|
44
45
|
end
|
45
|
-
@_date ||= DateTime.new
|
46
|
+
@_date ||= DateTime.new(*d.values)
|
46
47
|
end
|
47
48
|
|
48
49
|
def timestamp
|
@@ -78,12 +79,18 @@ module Wikidata
|
|
78
79
|
protected
|
79
80
|
|
80
81
|
def generic_range
|
81
|
-
from = before > 0
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
from = if before > 0
|
83
|
+
timestamp - (before.to_i * precision)
|
84
|
+
else
|
85
|
+
timestamp
|
86
|
+
end
|
87
|
+
to = if after > 0
|
88
|
+
timestamp + (after.to_i * precision)
|
89
|
+
else
|
90
|
+
timestamp
|
91
|
+
end
|
92
|
+
|
93
|
+
@_range ||= (to_datetime ::Time.at(from).utc)..(to_datetime ::Time.at(to).utc)
|
87
94
|
end
|
88
95
|
|
89
96
|
def century_range
|
@@ -117,11 +124,11 @@ module Wikidata
|
|
117
124
|
end
|
118
125
|
|
119
126
|
def month_range
|
120
|
-
if date.month == 2 && self.class.leap_year?(date.year)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
127
|
+
last_day = if date.month == 2 && self.class.leap_year?(date.year)
|
128
|
+
29
|
129
|
+
else
|
130
|
+
DAYS_IN_MONTH[date.month]
|
131
|
+
end
|
125
132
|
from = DateTime.new(date.year, date.month, 1, 0, 0, 0)
|
126
133
|
to = DateTime.new(date.year, date.month, last_day, 23, 59, 59)
|
127
134
|
@_range ||= (from..to)
|
@@ -137,7 +144,7 @@ module Wikidata
|
|
137
144
|
DateTime.new t.year, t.month, t.day, t.hour, t.min, t.sec
|
138
145
|
end
|
139
146
|
|
140
|
-
def self.leap_year?
|
147
|
+
def self.leap_year?(year)
|
141
148
|
(year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0)
|
142
149
|
end
|
143
150
|
end
|
data/lib/wikidata/property.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Wikidata
|
2
2
|
module Property
|
3
|
-
def self.build
|
4
|
-
return if %w
|
3
|
+
def self.build(attribute)
|
4
|
+
return if %w[somevalue novalue].include? attribute.mainsnak.snaktype
|
5
|
+
|
5
6
|
case attribute.mainsnak.datatype
|
6
7
|
when 'string', 'external-id'
|
7
8
|
Wikidata::Property::String.new attribute
|
@@ -17,6 +18,8 @@ module Wikidata
|
|
17
18
|
Wikidata::Property::CommonsMedia.new attribute
|
18
19
|
when 'monolingualtext'
|
19
20
|
Wikidata::Property::MonolingualText.new attribute
|
21
|
+
when 'quantity'
|
22
|
+
Wikidata::Property::Quantity.new attribute
|
20
23
|
else
|
21
24
|
puts "Unkown property type #{attribute.mainsnak.datatype}"
|
22
25
|
end
|
data/lib/wikidata/version.rb
CHANGED
data/lib/wikidata.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'faraday'
|
2
|
-
require '
|
2
|
+
require 'faraday/excon'
|
3
3
|
require 'hashie'
|
4
4
|
require 'yaml'
|
5
5
|
|
@@ -7,12 +7,12 @@ require 'wikidata/config'
|
|
7
7
|
|
8
8
|
module Wikidata
|
9
9
|
class << self
|
10
|
-
def configure
|
11
|
-
Config.configure
|
10
|
+
def configure(&block)
|
11
|
+
Config.configure(&block)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
Config.
|
14
|
+
def adapter
|
15
|
+
Config.adapter
|
16
16
|
end
|
17
17
|
|
18
18
|
def options
|
@@ -38,6 +38,7 @@ require 'wikidata/property/url'
|
|
38
38
|
require 'wikidata/property/globe_coordinate'
|
39
39
|
require 'wikidata/property/commons_media'
|
40
40
|
require 'wikidata/property/monolingual_text'
|
41
|
+
require 'wikidata/property/quantity'
|
41
42
|
require 'wikidata/entity'
|
42
43
|
require 'wikidata/item'
|
43
44
|
require 'wikidata/response'
|