mediawiki_api-wikidata 0.2.1 → 0.3.0
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 +5 -5
- data/.gitignore +18 -18
- data/.travis.yml +7 -8
- data/Gemfile +4 -4
- data/LICENCE +347 -347
- data/README.md +67 -63
- data/lib/mediawiki_api/wikidata.rb +1 -1
- data/lib/mediawiki_api/wikidata/exceptions.rb +10 -10
- data/lib/mediawiki_api/wikidata/version.rb +5 -5
- data/lib/mediawiki_api/wikidata/wikidata_client.rb +80 -64
- data/mediawiki_api-wikidata.gemspec +28 -28
- data/spec/spec_helper.rb +4 -4
- data/spec/support/request_helpers.rb +40 -40
- data/spec/wikidata_client_spec.rb +246 -174
- metadata +28 -29
data/README.md
CHANGED
@@ -1,63 +1,67 @@
|
|
1
|
-
# Wikidata API Gem
|
2
|
-
|
3
|
-
[](http://travis-ci.org/wmde/WikidataApiGem)
|
4
|
-
|
5
|
-
A library for interacting with the Wikidata API from Ruby.
|
6
|
-
Extends the [MediaWiki API Gem](https://github.com/wikimedia/mediawiki-ruby-api).
|
7
|
-
|
8
|
-
## Installation
|
9
|
-
|
10
|
-
Add this line to your application's Gemfile:
|
11
|
-
|
12
|
-
gem 'mediawiki_api-wikidata'
|
13
|
-
|
14
|
-
And then execute:
|
15
|
-
|
16
|
-
$ bundle
|
17
|
-
|
18
|
-
Or install it yourself as:
|
19
|
-
|
20
|
-
$ gem install mediawiki_api-wikidata
|
21
|
-
|
22
|
-
## Usage
|
23
|
-
|
24
|
-
```ruby
|
25
|
-
require "mediawiki_api/wikidata"
|
26
|
-
|
27
|
-
wikidata_client = MediawikiApi::Wikidata::WikidataClient.new "http://127.0.0.1/w/api.php" #instantiate new client
|
28
|
-
wikidata_client.log_in "username", "password" #log in via the API
|
29
|
-
wikidata_client.create_item "data" #create a new item specified by "data"
|
30
|
-
wikidata_client.create_property "data" #create a new property specified by "data"
|
31
|
-
wikidata_client.add_sitelink "Q1234", "enwiki", "Berlin" #add a new sitelink enwiki/Berlin to item Q1234
|
32
|
-
wikidata_client.remove_sitelink "Q1234", "enwiki" #remove enwiki sitelink from item Q1234
|
33
|
-
wikidata_client.sitelink_exists? "enwiki", "Berlin" #returns true if enwiki/Berlin sitelink exists, false otherwise
|
34
|
-
wikidata_client.create_claim "Q1234", "value", "P1234", '"test"' #adds claim with property P1234 and value "test" to item Q1234
|
35
|
-
wikidata_client.search_entities "test", "en", "item" #searches for items containing the string "test" in their english labels, descriptions and aliases
|
36
|
-
```
|
37
|
-
|
38
|
-
## Release notes
|
39
|
-
|
40
|
-
|
41
|
-
- Compatible with
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
- Support
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
-
|
58
|
-
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
-
|
63
|
-
|
1
|
+
# Wikidata API Gem
|
2
|
+
|
3
|
+
[](http://travis-ci.org/wmde/WikidataApiGem)
|
4
|
+
|
5
|
+
A library for interacting with the Wikidata API from Ruby.
|
6
|
+
Extends the [MediaWiki API Gem](https://github.com/wikimedia/mediawiki-ruby-api).
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
gem 'mediawiki_api-wikidata'
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install mediawiki_api-wikidata
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
require "mediawiki_api/wikidata"
|
26
|
+
|
27
|
+
wikidata_client = MediawikiApi::Wikidata::WikidataClient.new "http://127.0.0.1/w/api.php" #instantiate new client
|
28
|
+
wikidata_client.log_in "username", "password" #log in via the API
|
29
|
+
wikidata_client.create_item "data" #create a new item specified by "data"
|
30
|
+
wikidata_client.create_property "data" #create a new property specified by "data"
|
31
|
+
wikidata_client.add_sitelink "Q1234", "enwiki", "Berlin" #add a new sitelink enwiki/Berlin to item Q1234
|
32
|
+
wikidata_client.remove_sitelink "Q1234", "enwiki" #remove enwiki sitelink from item Q1234
|
33
|
+
wikidata_client.sitelink_exists? "enwiki", "Berlin" #returns true if enwiki/Berlin sitelink exists, false otherwise
|
34
|
+
wikidata_client.create_claim "Q1234", "value", "P1234", '"test"' #adds claim with property P1234 and value "test" to item Q1234
|
35
|
+
wikidata_client.search_entities "test", "en", "item" #searches for items containing the string "test" in their english labels, descriptions and aliases
|
36
|
+
```
|
37
|
+
|
38
|
+
## Release notes
|
39
|
+
### 0.3.0 (2021-06-08)
|
40
|
+
- Compatible with [mediawiki_api 7.0](https://rubygems.org/gems/mediawiki_api/versions/0.7.1)
|
41
|
+
- Compatible with Ruby 2.5
|
42
|
+
- Support for several API actions.
|
43
|
+
|
44
|
+
### 0.2.1 (2016-05-26)
|
45
|
+
- Compatible with [mediawiki_api 6.0](https://rubygems.org/gems/mediawiki_api/versions/0.6.0)
|
46
|
+
|
47
|
+
### 0.2.0 (2015-10-09)
|
48
|
+
- Compatible with [mediawiki_api 5.0](https://rubygems.org/gems/mediawiki_api/versions/0.5.0)
|
49
|
+
|
50
|
+
### 0.1.0 (2014-10-09)
|
51
|
+
- Feature complete for [Wikidata BrowserTests](https://github.com/wmde/WikidataBrowserTests)
|
52
|
+
- Support creating claims
|
53
|
+
- Support searching entities
|
54
|
+
|
55
|
+
### 0.0.2 (2014-10-09)
|
56
|
+
|
57
|
+
- Support adding sitelinks
|
58
|
+
- Support changing sitelinks
|
59
|
+
- Support removing sitelinks
|
60
|
+
- Support checking for existing sitelinks
|
61
|
+
- Provide separate methods for creating items and properties
|
62
|
+
- Removed custom edit summaries
|
63
|
+
|
64
|
+
### 0.0.1 (2014-09-29)
|
65
|
+
|
66
|
+
- Initial version
|
67
|
+
- Supports creation of entities via wbeditentity
|
@@ -1 +1 @@
|
|
1
|
-
require "mediawiki_api/wikidata/wikidata_client"
|
1
|
+
require "mediawiki_api/wikidata/wikidata_client"
|
@@ -1,10 +1,10 @@
|
|
1
|
-
module MediawikiApi
|
2
|
-
module Wikidata
|
3
|
-
class WikidataApiError < ApiError
|
4
|
-
|
5
|
-
end
|
6
|
-
|
7
|
-
class EntityIdentifierMismatchError < StandardError
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
1
|
+
module MediawikiApi
|
2
|
+
module Wikidata
|
3
|
+
class WikidataApiError < ApiError
|
4
|
+
|
5
|
+
end
|
6
|
+
|
7
|
+
class EntityIdentifierMismatchError < StandardError
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module MediawikiApi
|
2
|
-
module Wikidata
|
3
|
-
VERSION = "0.
|
4
|
-
end
|
5
|
-
end
|
1
|
+
module MediawikiApi
|
2
|
+
module Wikidata
|
3
|
+
VERSION = "0.3.0"
|
4
|
+
end
|
5
|
+
end
|
@@ -1,64 +1,80 @@
|
|
1
|
-
# Author:: Tobias Gritschacher (tobias.gritschacher@wikimedia.de)
|
2
|
-
# License:: GNU GPL v2+
|
3
|
-
|
4
|
-
require "mediawiki_api/wikidata/version"
|
5
|
-
require "mediawiki_api/wikidata/exceptions"
|
6
|
-
|
7
|
-
module MediawikiApi
|
8
|
-
module Wikidata
|
9
|
-
class WikidataClient < Client
|
10
|
-
|
11
|
-
def create_entity(entity_data, type)
|
12
|
-
action(:wbeditentity, token_type: "csrf", new: type, data: entity_data)
|
13
|
-
end
|
14
|
-
|
15
|
-
def create_item(item_data)
|
16
|
-
create_entity(item_data, "item")
|
17
|
-
end
|
18
|
-
|
19
|
-
def create_property(property_data)
|
20
|
-
create_entity(property_data, "property")
|
21
|
-
end
|
22
|
-
|
23
|
-
def set_sitelink(entity_identifier, sitelink_site_id, sitelink_title = nil, badges = nil)
|
24
|
-
params = { token_type: "csrf", linksite: sitelink_site_id, linktitle: sitelink_title, badges: badges}
|
25
|
-
action(:wbsetsitelink, params.merge(parse_entity_identifier(entity_identifier)))
|
26
|
-
end
|
27
|
-
|
28
|
-
def add_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges = nil)
|
29
|
-
set_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges)
|
30
|
-
end
|
31
|
-
|
32
|
-
def remove_sitelink(entity_identifier, sitelink_site_id)
|
33
|
-
set_sitelink(entity_identifier, sitelink_site_id)
|
34
|
-
end
|
35
|
-
|
36
|
-
def sitelink_exists?(site_id, title)
|
37
|
-
resp = action(:wbgetentities, token_type: false, sites: [site_id], titles: [title] )
|
38
|
-
!resp.data["entities"]["-1"]
|
39
|
-
end
|
40
|
-
|
41
|
-
def search_entities(search, language, entity_type, limit = 10, continue = nil)
|
42
|
-
action(:wbsearchentities, token_type: false, search: search, language: language, type: entity_type, limit: limit,
|
43
|
-
continue: continue)
|
44
|
-
end
|
45
|
-
|
46
|
-
def create_claim(entity_id, snaktype = "value", property_id, value_data)
|
47
|
-
action(:wbcreateclaim, token_type: "csrf", entity: entity_id, snaktype: snaktype, property: property_id, value: value_data)
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
1
|
+
# Author:: Tobias Gritschacher (tobias.gritschacher@wikimedia.de)
|
2
|
+
# License:: GNU GPL v2+
|
3
|
+
|
4
|
+
require "mediawiki_api/wikidata/version"
|
5
|
+
require "mediawiki_api/wikidata/exceptions"
|
6
|
+
|
7
|
+
module MediawikiApi
|
8
|
+
module Wikidata
|
9
|
+
class WikidataClient < Client
|
10
|
+
|
11
|
+
def create_entity(entity_data, type)
|
12
|
+
action(:wbeditentity, token_type: "csrf", new: type, data: entity_data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_item(item_data)
|
16
|
+
create_entity(item_data, "item")
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_property(property_data)
|
20
|
+
create_entity(property_data, "property")
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_sitelink(entity_identifier, sitelink_site_id, sitelink_title = nil, badges = nil)
|
24
|
+
params = { token_type: "csrf", linksite: sitelink_site_id, linktitle: sitelink_title, badges: badges}
|
25
|
+
action(:wbsetsitelink, params.merge(parse_entity_identifier(entity_identifier)))
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges = nil)
|
29
|
+
set_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_sitelink(entity_identifier, sitelink_site_id)
|
33
|
+
set_sitelink(entity_identifier, sitelink_site_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def sitelink_exists?(site_id, title)
|
37
|
+
resp = action(:wbgetentities, token_type: false, sites: [site_id], titles: [title] )
|
38
|
+
!resp.data["entities"]["-1"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def search_entities(search, language, entity_type, limit = 10, continue = nil)
|
42
|
+
action(:wbsearchentities, token_type: false, search: search, language: language, type: entity_type, limit: limit,
|
43
|
+
continue: continue)
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_claim(entity_id, snaktype = "value", property_id, value_data)
|
47
|
+
action(:wbcreateclaim, token_type: "csrf", entity: entity_id, snaktype: snaktype, property: property_id, value: value_data)
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_entities(ids)
|
51
|
+
action(:wbgetentities, token_type: false, ids: ids)
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_entities_by_titles(titles, sites)
|
55
|
+
action(:wbgetentities, token_type: false, titles: titles, sites: sites)
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_qualifier(claim_id, snaktype = "value", property_id, value_data)
|
59
|
+
action(:wbsetqualifier, token_type: "csrf", claim: claim_id, snaktype: snaktype, property: property_id, value: value_data)
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_reference(statement_id, snaks_data)
|
63
|
+
action(:wbsetreference, token_type: "csrf", statement: statement_id, snaks: snaks_data)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def parse_entity_identifier(identifier)
|
69
|
+
if identifier.is_a?(::Hash)
|
70
|
+
{ site: identifier[:site_id], title: identifier[:title] }
|
71
|
+
elsif identifier.is_a?(String)
|
72
|
+
{ id: identifier }
|
73
|
+
else
|
74
|
+
raise EntityIdentifierMismatchError, "Either entity id or site id and page title need to be set to identify the entity."
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'mediawiki_api/wikidata/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "mediawiki_api-wikidata"
|
8
|
-
spec.version = MediawikiApi::Wikidata::VERSION
|
9
|
-
spec.authors = ["Tobias Gritschacher"]
|
10
|
-
spec.email = ["tobias.gritschacher@wikimedia.de"]
|
11
|
-
spec.description = %q{A library for interacting with the Wikidata API from Ruby.}
|
12
|
-
spec.summary = %q{Extends the MediaWiki API Gem.}
|
13
|
-
spec.homepage = "https://github.com/wmde/WikidataApiGem"
|
14
|
-
spec.license = "GPL-2"
|
15
|
-
|
16
|
-
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = ["lib"]
|
19
|
-
|
20
|
-
spec.add_runtime_dependency "mediawiki_api", "~> 0.
|
21
|
-
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
-
spec.add_development_dependency "rake", "~> 0"
|
24
|
-
spec.add_development_dependency "rspec", "~> 3.0", ">= 3.0.0"
|
25
|
-
spec.add_development_dependency "webmock", "~> 1.17", ">= 1.17.2"
|
26
|
-
spec.add_development_dependency "redcarpet"
|
27
|
-
spec.add_development_dependency "yard"
|
28
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mediawiki_api/wikidata/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mediawiki_api-wikidata"
|
8
|
+
spec.version = MediawikiApi::Wikidata::VERSION
|
9
|
+
spec.authors = ["Tobias Gritschacher"]
|
10
|
+
spec.email = ["tobias.gritschacher@wikimedia.de"]
|
11
|
+
spec.description = %q{A library for interacting with the Wikidata API from Ruby.}
|
12
|
+
spec.summary = %q{Extends the MediaWiki API Gem.}
|
13
|
+
spec.homepage = "https://github.com/wmde/WikidataApiGem"
|
14
|
+
spec.license = "GPL-2"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_runtime_dependency "mediawiki_api", "~> 0.7.1"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
+
spec.add_development_dependency "rake", "~> 0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0", ">= 3.0.0"
|
25
|
+
spec.add_development_dependency "webmock", "~> 1.17", ">= 1.17.2"
|
26
|
+
spec.add_development_dependency "redcarpet"
|
27
|
+
spec.add_development_dependency "yard"
|
28
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'webmock/rspec'
|
2
|
-
require 'json'
|
3
|
-
require 'mediawiki_api'
|
4
|
-
require 'mediawiki_api/wikidata'
|
1
|
+
require 'webmock/rspec'
|
2
|
+
require 'json'
|
3
|
+
require 'mediawiki_api'
|
4
|
+
require 'mediawiki_api/wikidata'
|
@@ -1,40 +1,40 @@
|
|
1
|
-
module MediawikiApi::Wikidata::RequestHelpers
|
2
|
-
def api_url
|
3
|
-
"http://localhost/api.php"
|
4
|
-
end
|
5
|
-
|
6
|
-
def index_url
|
7
|
-
"http://localhost/w/index.php"
|
8
|
-
end
|
9
|
-
|
10
|
-
def mock_token
|
11
|
-
"token123"
|
12
|
-
end
|
13
|
-
|
14
|
-
def stub_api_request(method, params)
|
15
|
-
params = params.each.with_object({}) { |(k, v), p| p[k] = v.to_s }
|
16
|
-
|
17
|
-
stub_request(method, api_url).
|
18
|
-
with((method == :post ? :body : :query) => params.merge(format: "json"))
|
19
|
-
end
|
20
|
-
|
21
|
-
def stub_action_request(action, params = {})
|
22
|
-
method = params.delete(:http_method) || :post
|
23
|
-
|
24
|
-
stub_api_request(method, params.merge(action: action, token: mock_token))
|
25
|
-
end
|
26
|
-
|
27
|
-
def stub_action_request_without_token(action, params = {})
|
28
|
-
method = params.delete(:http_method) || :post
|
29
|
-
|
30
|
-
stub_api_request(method, params.merge(action: action))
|
31
|
-
end
|
32
|
-
|
33
|
-
def stub_token_request(type, warning = nil)
|
34
|
-
response = { query: { tokens: { "#{type}token" => mock_token } } }
|
35
|
-
response[:warnings] = { type => { '*' => [warning] } } unless warning.nil?
|
36
|
-
|
37
|
-
stub_api_request(:get, action: 'query', meta: 'tokens', type: type).
|
38
|
-
to_return(body: response.to_json)
|
39
|
-
end
|
40
|
-
end
|
1
|
+
module MediawikiApi::Wikidata::RequestHelpers
|
2
|
+
def api_url
|
3
|
+
"http://localhost/api.php"
|
4
|
+
end
|
5
|
+
|
6
|
+
def index_url
|
7
|
+
"http://localhost/w/index.php"
|
8
|
+
end
|
9
|
+
|
10
|
+
def mock_token
|
11
|
+
"token123"
|
12
|
+
end
|
13
|
+
|
14
|
+
def stub_api_request(method, params)
|
15
|
+
params = params.each.with_object({}) { |(k, v), p| p[k] = v.to_s }
|
16
|
+
|
17
|
+
stub_request(method, api_url).
|
18
|
+
with((method == :post ? :body : :query) => params.merge(format: "json"))
|
19
|
+
end
|
20
|
+
|
21
|
+
def stub_action_request(action, params = {})
|
22
|
+
method = params.delete(:http_method) || :post
|
23
|
+
|
24
|
+
stub_api_request(method, params.merge(action: action, token: mock_token))
|
25
|
+
end
|
26
|
+
|
27
|
+
def stub_action_request_without_token(action, params = {})
|
28
|
+
method = params.delete(:http_method) || :post
|
29
|
+
|
30
|
+
stub_api_request(method, params.merge(action: action))
|
31
|
+
end
|
32
|
+
|
33
|
+
def stub_token_request(type, warning = nil)
|
34
|
+
response = { query: { tokens: { "#{type}token" => mock_token } } }
|
35
|
+
response[:warnings] = { type => { '*' => [warning] } } unless warning.nil?
|
36
|
+
|
37
|
+
stub_api_request(:get, action: 'query', meta: 'tokens', type: type).
|
38
|
+
to_return(body: response.to_json)
|
39
|
+
end
|
40
|
+
end
|