mediawiki_api-wikidata 0.0.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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