mediawiki_api-wikidata 0.0.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.
data/README.md CHANGED
@@ -1,37 +1,67 @@
1
- # WikidataAPI
2
-
3
- [![Build Status](https://api.travis-ci.org/wmde/WikidataApiGem.png?branch=master)](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_entity "data" #create a new item specified by "data"
30
- ```
31
-
32
- ## Release notes
33
-
34
- ### 0.0.1 (2014-09-29)
35
-
36
- - Initial version
37
- - supports creation of entities via wbeditentity
1
+ # Wikidata API Gem
2
+
3
+ [![Build Status](https://api.travis-ci.org/wmde/WikidataApiGem.png?branch=master)](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
@@ -0,0 +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,5 +1,5 @@
1
1
  module MediawikiApi
2
2
  module Wikidata
3
- VERSION = "0.0.1"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -1,16 +1,80 @@
1
- # Author:: Tobias Gritschacher (tobias.gritschacher@wikimedia.de)
2
- # License:: GNU GPL v2+
3
-
4
- require "mediawiki_api/wikidata/version"
5
-
6
- module MediawikiApi
7
- module Wikidata
8
- class WikidataClient < Client
9
-
10
- def create_entity(data, type = "item")
11
- action(:wbeditentity, token_type: "edit", new: type, data: data, summary:"Created entity using mediawiki_api/wikidata gem")
12
- end
13
-
14
- end
15
- end
16
- 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
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_runtime_dependency "mediawiki_api", "~> 0.2.0"
20
+ spec.add_runtime_dependency "mediawiki_api", "~> 0.7.1"
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake", "~> 0"
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,34 +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_token_request(type, warning = nil)
28
- response = { tokens: { "#{type}token" => mock_token } }
29
- response[:warnings] = { type => { "*" => [warning] } } unless warning.nil?
30
-
31
- stub_api_request(:get, action: "tokens", type: type).
32
- to_return(body: response.to_json)
33
- end
34
- 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
@@ -1,32 +1,246 @@
1
- require 'spec_helper'
2
- require "webmock/rspec"
3
- require "support/request_helpers"
4
-
5
- describe MediawikiApi::Wikidata::WikidataClient do
6
- include MediawikiApi::Wikidata::RequestHelpers
7
-
8
- let(:client) { MediawikiApi::Wikidata::WikidataClient.new(api_url) }
9
-
10
- subject { client }
11
-
12
- describe "#create_entity" do
13
- subject { client.create_entity(data, type) }
14
-
15
- let(:data) { '{"labels":{"en":{"language":"en","value":"test_label"}},"descriptions":{"en":{"language":"en","value":"test_description"}}}' }
16
- let(:type) { "item" }
17
- let(:summary) { "Created entity using mediawiki_api/wikidata gem" }
18
- let(:response) { {} }
19
-
20
- before do
21
- stub_token_request(:edit)
22
- @edit_request = stub_action_request(:wbeditentity, data: data, new: type, summary: summary).
23
- to_return(body: response.to_json)
24
- end
25
-
26
- it "makes the right request" do
27
- subject
28
- expect(@edit_request).to have_been_requested
29
- end
30
- end
31
-
32
- end
1
+ require 'spec_helper'
2
+ require "webmock/rspec"
3
+ require "support/request_helpers"
4
+
5
+ describe MediawikiApi::Wikidata::WikidataClient do
6
+ include MediawikiApi::Wikidata::RequestHelpers
7
+
8
+ let(:client) { MediawikiApi::Wikidata::WikidataClient.new(api_url) }
9
+
10
+ subject { client }
11
+
12
+ describe "#create_entity" do
13
+ subject { client.create_entity(data, type) }
14
+
15
+ let(:data) { '{"labels":{"en":{"language":"en","value":"test_label"}},
16
+ "descriptions":{"en":{"language":"en","value":"test_description"}}}' }
17
+ let(:type) { "item" }
18
+ let(:response) { {} }
19
+
20
+ before do
21
+ stub_token_request(:csrf)
22
+ @edit_request = stub_action_request(:wbeditentity, data: data, new: type).
23
+ to_return(body: response.to_json)
24
+ end
25
+
26
+ it "makes the right request" do
27
+ subject
28
+ expect(@edit_request).to have_been_requested
29
+ end
30
+ end
31
+
32
+ describe "#create_item" do
33
+ subject { client.create_item(data) }
34
+
35
+ let(:data) { '{"labels":{"en":{"language":"en","value":"test_label"}},
36
+ "descriptions":{"en":{"language":"en","value":"test_description"}}}' }
37
+ let(:response) { {} }
38
+
39
+ before do
40
+ stub_token_request(:csrf)
41
+ @edit_request = stub_action_request(:wbeditentity, data: data, new: "item").
42
+ to_return(body: response.to_json)
43
+ end
44
+
45
+ it "makes the right request" do
46
+ subject
47
+ expect(@edit_request).to have_been_requested
48
+ end
49
+ end
50
+
51
+ describe "#create_property" do
52
+ subject { client.create_property(data) }
53
+
54
+ let(:data) { '{"labels":{"en":{"language":"en","value":"test_label"}},
55
+ "descriptions":{"en":{"language":"en","value":"test_description"}},"datatype":"string"}' }
56
+ let(:response) { {} }
57
+
58
+ before do
59
+ stub_token_request(:csrf)
60
+ @edit_request = stub_action_request(:wbeditentity, data: data, new: "property").
61
+ to_return(body: response.to_json)
62
+ end
63
+
64
+ it "makes the right request" do
65
+ subject
66
+ expect(@edit_request).to have_been_requested
67
+ end
68
+ end
69
+
70
+ describe "#create_property" do
71
+ subject { client.create_property(data) }
72
+
73
+ let(:data) { '{"labels":{"en":{"language":"en","value":"test_label"}},
74
+ "descriptions":{"en":{"language":"en","value":"test_description"}},"datatype":"string"}' }
75
+ let(:response) { {} }
76
+
77
+ before do
78
+ stub_token_request(:csrf)
79
+ @edit_request = stub_action_request(:wbeditentity, data: data, new: "property").
80
+ to_return(body: response.to_json)
81
+ end
82
+
83
+ it "makes the right request" do
84
+ subject
85
+ expect(@edit_request).to have_been_requested
86
+ end
87
+ end
88
+
89
+ describe "#set_sitelink (item identified by site/title)" do
90
+ subject { client.set_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges) }
91
+
92
+ let(:entity_identifier) { {site_id: "dewiki", title: "Berlin"} }
93
+ let(:sitelink_site_id) { "itwiki" }
94
+ let(:sitelink_title) { "Berlino" }
95
+ let(:badges) { true }
96
+ let(:response) { {} }
97
+
98
+ before do
99
+ stub_token_request(:csrf)
100
+ @edit_request = stub_action_request(:wbsetsitelink, site: "dewiki", title: "Berlin", linksite: sitelink_site_id,
101
+ linktitle: sitelink_title, badges: badges).
102
+ to_return(body: response.to_json)
103
+ end
104
+
105
+ it "makes the right request" do
106
+ subject
107
+ expect(@edit_request).to have_been_requested
108
+ end
109
+ end
110
+
111
+ describe "#set_sitelink (item identified by ID)" do
112
+ subject { client.set_sitelink(entity_identifier, sitelink_site_id, sitelink_title, badges) }
113
+
114
+ let(:entity_identifier) { "Q1234" }
115
+ let(:sitelink_site_id) { "itwiki" }
116
+ let(:sitelink_title) { "Berlino" }
117
+ let(:badges) { true }
118
+ let(:response) { {} }
119
+
120
+ before do
121
+ stub_token_request(:csrf)
122
+ @edit_request = stub_action_request(:wbsetsitelink, id: "Q1234", linksite: sitelink_site_id,
123
+ linktitle: sitelink_title, badges: badges).
124
+ to_return(body: response.to_json)
125
+ end
126
+
127
+ it "makes the right request" do
128
+ subject
129
+ expect(@edit_request).to have_been_requested
130
+ end
131
+ end
132
+
133
+ describe "#create_claim" do
134
+ subject { client.create_claim(entity_id, snaktype, property_id, value) }
135
+
136
+ let(:entity_id) { "Q1234" }
137
+ let(:snaktype) { "value" }
138
+ let(:property_id) { "P1234" }
139
+ let(:value) { '"stringtest"' }
140
+ let(:response) { {} }
141
+
142
+ before do
143
+ stub_token_request(:csrf)
144
+ @edit_request = stub_action_request(:wbcreateclaim, entity: entity_id, snaktype: snaktype, property: property_id, value: value).
145
+ to_return(body: response.to_json)
146
+ end
147
+
148
+ it "makes the right request" do
149
+ subject
150
+ expect(@edit_request).to have_been_requested
151
+ end
152
+ end
153
+ describe "#search_entities" do
154
+ subject { client.search_entities(search, language, entity_type, limit, continue) }
155
+
156
+ let(:search) { "test" }
157
+ let(:language) { "en" }
158
+ let(:entity_type) { "item" }
159
+ let(:limit) { 10 }
160
+ let(:continue) { "" }
161
+ let(:response) { {} }
162
+
163
+ before do
164
+ @edit_request = stub_action_request_without_token(:wbsearchentities, search: search, language: language, type: entity_type,
165
+ limit: limit, continue: continue).
166
+ to_return(body: response.to_json)
167
+ end
168
+
169
+ it "makes the right request" do
170
+ subject
171
+ expect(@edit_request).to have_been_requested
172
+ end
173
+ end
174
+ describe "#get_entities" do
175
+ subject { client.get_entities(entity_ids) }
176
+
177
+ let(:entity_ids) { ["Q1234","Q234"] }
178
+ let(:response) { {} }
179
+
180
+ before do
181
+ @edit_request = stub_action_request_without_token(:wbgetentities, ids: entity_ids.join("|")).
182
+ to_return(body: response.to_json)
183
+ end
184
+
185
+ it "makes the right request" do
186
+ subject
187
+ expect(@edit_request).to have_been_requested
188
+ end
189
+ end
190
+ describe "#get_entities_by_titles" do
191
+ subject { client.get_entities_by_titles(titles, site_ids) }
192
+
193
+ let(:titles) { "mediawiki" }
194
+ let(:site_ids) { ["jawiki"] }
195
+ let(:response) { {} }
196
+
197
+ before do
198
+ @edit_request = stub_action_request_without_token(:wbgetentities, titles: titles, sites: site_ids.join("|")).
199
+ to_return(body: response.to_json)
200
+ end
201
+
202
+ it "makes the right request" do
203
+ subject
204
+ expect(@edit_request).to have_been_requested
205
+ end
206
+ end
207
+ describe "#set_qualifier" do
208
+ subject { client.set_qualifier(claim_id, property_id, value) }
209
+
210
+ let(:claim_id) { "Q2$4554c0f4-47b2-1cd9-2db9-aa270064c9f3" }
211
+ let(:snaktype) { "value" }
212
+ let(:property_id) { "P1234" }
213
+ let(:value) { "stringtest".to_json }
214
+ let(:response) { {} }
215
+
216
+ before do
217
+ stub_token_request(:csrf)
218
+ @edit_request = stub_action_request(:wbsetqualifier, claim: claim_id, snaktype: snaktype, property: property_id, value: value).
219
+ to_return(body: response.to_json)
220
+ end
221
+
222
+ it "makes the right request" do
223
+ subject
224
+ expect(@edit_request).to have_been_requested
225
+ end
226
+ end
227
+ describe "#set_reference" do
228
+ subject { client.set_reference(statement_id, snaks) }
229
+
230
+ let(:statement_id) { "Q76$D4FDE516-F20C-4154-ADCE-7C5B609DFDFF" }
231
+ let(:property_id) { "P1234" }
232
+ let(:snaks) {{property_id=>[{"snaktype"=>"value", "property"=>property_id, "datavalue"=>"stringtest"}]}.to_json}
233
+ let(:response) { {} }
234
+
235
+ before do
236
+ stub_token_request(:csrf)
237
+ @edit_request = stub_action_request(:wbsetreference, statement: statement_id, snaks: snaks).
238
+ to_return(body: response.to_json)
239
+ end
240
+
241
+ it "makes the right request" do
242
+ subject
243
+ expect(@edit_request).to have_been_requested
244
+ end
245
+ end
246
+ end