wikidata 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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