wikidata 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f223b20d51a96728ef812814f1812f1628a86efc
4
- data.tar.gz: 0b20f8f264dca6b052f01c34d28feb98a48a4705
3
+ metadata.gz: c9c2ff62426ddfda2857a629064bd3e95d269867
4
+ data.tar.gz: ecd1e1e45425d0f25d6dc125745e688391ac58c6
5
5
  SHA512:
6
- metadata.gz: f29089ce4c8ab0262d00cb12cc865b9da8bba14b9259a323f75939725d8dffb581bfc473f079f88b5bb1379e728996d5fbf9d0502bdcfbcceb1c745d68f353c6
7
- data.tar.gz: 370fdf6fef4555678d60e29c9ebab43b8863804f9de89be7c42a63f14aaea483033b16c03af524f584782159dfa327ea91194d8662df7610ee7cff3a9e9640e1
6
+ metadata.gz: ae4db34040575940a822caeb1155a4e1d4dd857ff2cb66579b92045a37709f7ab8bdad98ab6f2d4c7e3598195ef990a64d721f95640b7037ee73631883cb35a0
7
+ data.tar.gz: 2001dc68293fdd54b86106a397bc07f65ba92a3bf0f4a8493cb9bc5bc95b51730ebb922c0380633413101febd3c75a65473688f4499a1e34a16daa32e2128392
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Wikidata for Ruby
1
+ # Wikidata for Ruby [![Gem Version](https://badge.fury.io/rb/wikidata.png)](http://badge.fury.io/rb/wikidata)
2
2
 
3
3
  Access all of the wonderful structured data on [Wikidata](http://www.wikidata.org), with Ruby! Also includes a convenient CLI.
4
4
 
@@ -17,6 +17,23 @@ module Wikidata
17
17
  display_item Wikidata::Item.find_by_id(article_id)
18
18
  end
19
19
 
20
+ desc "traverse ARTICLE_NAME relation_name", "find all related items until there are no more"
21
+ def traverse(article_name, relation_name)
22
+ item = Wikidata::Item.find_by_title(article_name)
23
+ if item
24
+ puts "#{item.label.green} (#{item.id})"
25
+ while true
26
+ if collection = item.entities_for_property_id(relation_name)
27
+ if item = collection.first
28
+ puts "#{item.label.green} (#{item.id})"
29
+ else
30
+ break
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
20
37
  protected
21
38
 
22
39
  def display_item(item)
@@ -27,6 +44,7 @@ module Wikidata
27
44
  puts " Claims: #{item.claims.length}" if item.claims
28
45
  if item.claims.length > 0
29
46
  if options[:resolve_properties]
47
+ item.resolve_claims!
30
48
  table_data = item.claims.map do |claim|
31
49
  { :id => claim.mainsnak.property_id,
32
50
  'Property Label' => claim.mainsnak.property.label,
@@ -1,19 +1,68 @@
1
+ require "active_support/core_ext/array"
2
+
1
3
  module Wikidata
2
4
  class Entity < Wikidata::HashedObject
3
5
 
4
6
  def self.find_all query
5
- Wikidata::IdentityMap.cache "#{query.hash}" do
6
- query = {
7
- action: 'wbgetentities',
8
- sites: 'enwiki',
9
- format: 'json'
10
- }.merge(Wikidata.default_languages_hash).merge(query)
11
- response = HTTParty.get('http://www.wikidata.org/w/api.php', {query: query})
12
- # puts "Getting: #{query}"
13
- response['entities'].map do |entity_id, entity_hash|
14
- new(entity_hash)
7
+
8
+ found_objects = []
9
+
10
+ query = {
11
+ action: 'wbgetentities',
12
+ sites: 'enwiki',
13
+ format: 'json'
14
+ }.merge(Wikidata.default_languages_hash).merge(query)
15
+
16
+ ids = query[:ids] || []
17
+ titles = query[:titles] || []
18
+
19
+ # Split IDs and titles
20
+ ids = ids.split("|") if ids && ids.class == String
21
+ titles = titles.split("|") if titles && titles.class == String
22
+
23
+ # Reject already cached values
24
+ fetchable_ids = ids.reject do |id|
25
+ if val = IdentityMap.cached_value(id)
26
+ found_objects << val
27
+ true
28
+ else
29
+ false
30
+ end
31
+ end
32
+ fetchable_titles = titles.reject do |title|
33
+ if val = IdentityMap.cached_value(title)
34
+ found_objects << val
35
+ true
36
+ else
37
+ false
38
+ end
39
+ end
40
+
41
+ # Fetch by IDs
42
+ if fetchable_ids.length > 0
43
+ fetchable_ids.in_groups_of(50, false) do |group|
44
+ found_objects.concat query_and_build_objects(query.merge(ids: group.join("|")))
45
+ end
46
+ end
47
+
48
+ # Fetch by titles
49
+ if fetchable_titles.length > 0
50
+ fetchable_titles.in_groups_of(50, false) do |group|
51
+ found_objects.concat query_and_build_objects(query.merge(titles: group.join("|")))
15
52
  end
16
53
  end
54
+
55
+ found_objects
56
+ end
57
+
58
+ def self.query_and_build_objects(query)
59
+ response = HTTParty.get('http://www.wikidata.org/w/api.php', {query: query})
60
+ # puts "Getting: #{query}"
61
+ response['entities'].map do |entity_id, entity_hash|
62
+ item = new(entity_hash)
63
+ IdentityMap.cache!(entity_id, item)
64
+ item
65
+ end
17
66
  end
18
67
 
19
68
  def self.find_all_by_id id, query = {}
@@ -1,17 +1,19 @@
1
1
  module Wikidata
2
2
  class IdentityMap < Wikidata::HashedObject
3
3
 
4
- def self.cache(key, &block)
5
- @@identity_map ||= {}
6
- if cached_value = @@identity_map[key]
7
- return cached_value
4
+ def self.if_uncached(key, &block)
5
+ if cached = cached_value(key)
6
+ return cached
8
7
  else
9
- content = block.call
10
- cache! key, content
11
- return content
8
+ block.call
12
9
  end
13
10
  end
14
11
 
12
+ def self.cached_value(key)
13
+ @@identity_map ||= {}
14
+ @@identity_map[key]
15
+ end
16
+
15
17
  def self.cache!(key, value)
16
18
  @@identity_map ||= {}
17
19
  @@identity_map[key] = value
data/lib/wikidata/item.rb CHANGED
@@ -15,9 +15,31 @@ module Wikidata
15
15
  end
16
16
  end
17
17
 
18
+ def resolve_claims!
19
+ ids = []
20
+ claims.each do |claim|
21
+ ids << claim.mainsnak.property_id
22
+ ids << claim.mainsnak.value.item_id if claim.mainsnak.value.class == Wikidata::DataValues::Entity
23
+ end
24
+ self.class.find_all_by_id ids
25
+ end
26
+
18
27
  def claims_for_property_id(property_id)
19
28
  claims.select{|c| c.mainsnak.property_id == property_id }
20
29
  end
21
30
 
31
+ def entities_for_property_id(property_id)
32
+ presets = {
33
+ mother: "P25",
34
+ father: "P22",
35
+ children: "P40",
36
+ doctoral_advisor: "P184"
37
+ }
38
+ property_id = presets[property_id.to_sym] if presets.include?(property_id.to_sym)
39
+ claims_for_property_id(property_id).map{|c| c.mainsnak.value.entity }
40
+ rescue
41
+ []
42
+ end
43
+
22
44
  end
23
45
  end
@@ -1,3 +1,3 @@
1
1
  module Wikidata
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/wikidata.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency "httparty"
21
21
  spec.add_dependency "colorize"
22
22
  spec.add_dependency "formatador"
23
+ spec.add_dependency "activesupport"
23
24
  spec.add_dependency "thor"
24
25
  spec.add_dependency "i18n"
25
26
  spec.add_dependency "hashie", ">= 2.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikidata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wil Gieseler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-18 00:00:00.000000000 Z
11
+ date: 2014-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: thor
57
71
  requirement: !ruby/object:Gem::Requirement