wikidatum 0.3.1 → 0.3.3

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
  SHA256:
3
- metadata.gz: d2ee435a3831b816e6e64465040a5197de654450551812b835b28329be9c287d
4
- data.tar.gz: d23fb1902df5465b123fc0bcea0c7594fb64a6e918604a9f1bb1f4e4eadf6eff
3
+ metadata.gz: 524da97907bba148830e9191d3c0ba5c614ddbee6c50fd74c6e91595082e73bd
4
+ data.tar.gz: 2321efe8c69e953521dbe5f4da51725fd6183ac871e7c00a17c552c12dc15dc2
5
5
  SHA512:
6
- metadata.gz: ccd8210a5120fbbfb35ed03899938bf4ca4e5302bc93e3e53652180b86b221a3ec23afe57db78777ffcda5971150f7c0ed6af89cde7b294fe21d716491653c49
7
- data.tar.gz: cb4e092b80c6ab871c1dd7f5bd46f700029eab7438c7a4063a2aee42b389c0e86ec0e387fc15fa996037d2478f494ac46572879078930c41c18ae6b7e4073e00
6
+ metadata.gz: 634701e7e5204ea770eb114f62982140e3441358e71f1ca32bf38718f9e72f29fe582340546c28e0dad4e575903c6822057bb12f21572333c68cd6c28b2f1e46
7
+ data.tar.gz: 26cf62b267be9bb4a6cc752d1968740b3d153f972204f0b1d7900fa7e087cea6eef0e543972b3aafb22f98ffbea8cdc6e30f22cc30f34aa77d2f4d1605655d02
data/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.3.3 - 2023-01-24
10
+ ### Added
11
+
12
+ - Add a `labels` method on Wikidatum::Client for getting item label data from the new `items/{id}/labels` endpoint. (This isn't supported in the initial release of the REST API on Wikidata, so it will not work yet)
13
+
14
+ ### Changed
15
+
16
+ - Move error classes into their own `Wikidatum::Errors` namespace.
17
+
18
+ ## 0.3.2 - 2022-12-29
19
+ ### Added
20
+
21
+ - Add support for the `commonsMedia`, `url`, and `external-id` data types.
22
+ - Add `humanized_content` method to `Wikidatum::DataType::Base` class, for easier access to a Struct, string, or nil which represents the contents of the given data type.
23
+
9
24
  ## 0.3.1 - 2022-12-28
10
25
  ### Added
11
26
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2022 Connor Shea
3
+ Copyright (c) 2022-2023 Connor Shea
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  This gem supports making requests to the [new Wikidata/Wikibase REST API](https://doc.wikimedia.org/Wikibase/master/js/rest-api/).
4
4
 
5
- The [Wikimedia Docs on Wikibase's JSON format](https://doc.wikimedia.org/Wikibase/master/php/docs_topics_json.html) are also very useful for interacting with/contributing to this gem.
5
+ The [Wikimedia Docs on the Wikibase REST API data format differences](https://doc.wikimedia.org/Wikibase/master/php/rest_data_format_differences.html) are also very useful for interacting with/contributing to this gem.
6
6
 
7
- **The gem is currently in early development and is not ready for production usage**.
7
+ **The gem is currently in development. It's ready to be used, but you should be careful when making edits with it to ensure it's working correctly.** It's missing some key features, namely authentication support, but the core of the library works.
8
+
9
+ I reserve the right to make breaking changes while the library is still in the 0.x release series, although I'll avoid them unless I believe them to be significantly better for the library's usability/maintainability (or are necessary due to breaking changes in the REST API itself). If they do happen, I'll make them clear in the Changelog.
8
10
 
9
11
  ## Installation
10
12
 
@@ -24,7 +26,7 @@ Or install it yourself as:
24
26
 
25
27
  ## Usage
26
28
 
27
- You can view the YARD docs on GitHub Pages [here](https://connorshea.github.io/wikidatum/index.html).
29
+ You can view the YARD docs on GitHub Pages [here](https://connorshea.github.io/wikidatum/index.html). Generally, you'll want to look at the docs for {Wikidatum::Client} to get started.
28
30
 
29
31
  Currently, the gem is able to hit a few of the basic endpoints, and currently has no way to provide authentication. The additional features will be added later.
30
32
 
@@ -33,9 +35,10 @@ require 'wikidatum'
33
35
 
34
36
  wikidatum_client = Wikidatum::Client.new(
35
37
  user_agent: 'REPLACE ME WITH THE NAME OF YOUR BOT!',
36
- # Currently only the beta site has the API available, you'll
37
- # likely want to use wikidata.org once it's stable.
38
- wikibase_url: 'https://wikidata.beta.wmflabs.org',
38
+ wikibase_url: 'https://wikidata.org',
39
+ # NOTE: To edit as a bot, you need to authenticate as a user with the Bot
40
+ # flag. If you don't have that flag on your Wikibase User, you'll get a
41
+ # 403 error.
39
42
  bot: true
40
43
  )
41
44
 
@@ -60,6 +63,10 @@ item.label(lang: :en).value #=> "Earth"
60
63
  # Get the values for all English aliases on this item.
61
64
  item.aliases(langs: [:en]).map(&:value) #=> ["Planet Earth", "Pale Blue Dot"]
62
65
 
66
+ # Get all labels for a given item.
67
+ wikidatum_client.labels(id: 'Q2') #=> Array<Wikidatum::Term>
68
+
69
+ # Get a specific statement from its ID.
63
70
  statement_id = 'Q123$4543523c-1d1d-1111-1e1e-11b11111b1f1'
64
71
  statement = wikidatum_client.statement(id: statement_id) #=> Wikidatum::Statement
65
72
 
@@ -10,6 +10,8 @@ module Wikidatum
10
10
  STATEMENT_REGEX = /^Q?\d+\$[\w-]+$/.freeze
11
11
  VALID_RANKS = ['preferred', 'normal', 'deprecated'].freeze
12
12
  VALID_DATA_TYPES = [
13
+ 'Wikidatum::DataType::CommonsMedia',
14
+ 'Wikidatum::DataType::ExternalId',
13
15
  'Wikidatum::DataType::GlobeCoordinate',
14
16
  'Wikidatum::DataType::MonolingualText',
15
17
  'Wikidatum::DataType::NoValue',
@@ -17,7 +19,21 @@ module Wikidatum
17
19
  'Wikidatum::DataType::SomeValue',
18
20
  'Wikidatum::DataType::Time',
19
21
  'Wikidatum::DataType::WikibaseItem',
20
- 'Wikidatum::DataType::WikibaseString'
22
+ 'Wikidatum::DataType::WikibaseString',
23
+ 'Wikidatum::DataType::WikibaseUrl'
24
+ ].freeze
25
+
26
+ # @!private
27
+ CONTENT_DATA_TYPES = [
28
+ 'Wikidatum::DataType::CommonsMedia',
29
+ 'Wikidatum::DataType::ExternalId',
30
+ 'Wikidatum::DataType::GlobeCoordinate',
31
+ 'Wikidatum::DataType::MonolingualText',
32
+ 'Wikidatum::DataType::Quantity',
33
+ 'Wikidatum::DataType::Time',
34
+ 'Wikidatum::DataType::WikibaseItem',
35
+ 'Wikidatum::DataType::WikibaseString',
36
+ 'Wikidatum::DataType::WikibaseUrl'
21
37
  ].freeze
22
38
 
23
39
  # @return [String] the root URL of the Wikibase instance we want to interact
@@ -52,7 +68,10 @@ module Wikidatum
52
68
  # to interact with. If not provided, will default to
53
69
  # `https://www.wikidata.org`. Do not include a `/` at the end of the URL.
54
70
  # @param bot [Boolean] Whether requests sent by this client instance should
55
- # be registered as bot requests. Defaults to `true`.
71
+ # be registered as bot requests. Defaults to `true`. If the user is not
72
+ # authenticated, or if the user is not marked with the Bot flag in the
73
+ # Wikibase instance, you'll be unable to make edits with this set to
74
+ # `true`.
56
75
  # @param allow_ip_edits [Boolean] whether this client should allow non-GET
57
76
  # requests if authentication hasn't been provided. Defaults to false. If
58
77
  # this is set to true, the IP address of the device from which the
@@ -93,6 +112,28 @@ module Wikidatum
93
112
  Wikidatum::Item.marshal_load(response)
94
113
  end
95
114
 
115
+ # Get labels for an item from the Wikibase API based on the item's QID.
116
+ #
117
+ # @example
118
+ # wikidatum_client.labels(id: 'Q123') #=> [<Wikidatum::Term lang="en" value="Foo">, <Wikidatum::Term lang="es" value="Bar">]
119
+ # wikidatum_client.labels(id: 123)
120
+ # wikidatum_client.labels(id: '123')
121
+ #
122
+ # @param id [String, Integer] Either a string or integer representation of
123
+ # the relevant item's QID, e.g. `"Q123"`, `"123"`, or `123`.
124
+ # @return [Array<Wikidatum::Term>] This can, theoretically, be empty if the item has no labels.
125
+ def labels(id:)
126
+ raise ArgumentError, "#{id.inspect} is an invalid Wikibase QID. Must be an integer, a string representation of an integer, or in the format 'Q123'." unless id.is_a?(Integer) || id.match?(ITEM_REGEX)
127
+
128
+ id = coerce_item_id(id)
129
+
130
+ response = get_request("/entities/items/#{id}/labels")
131
+
132
+ puts JSON.pretty_generate(response) if ENV['DEBUG']
133
+
134
+ response.to_a.map { |lang, val| Wikidatum::Term.new(lang: lang, value: val) }
135
+ end
136
+
96
137
  # Get a statement from the Wikibase API based on its ID.
97
138
  #
98
139
  # @example
@@ -195,9 +236,36 @@ module Wikidatum
195
236
  # )
196
237
  # )
197
238
  #
239
+ # @example Add a URL statement.
240
+ # wikidatum_client.add_statement(
241
+ # id: 'Q123',
242
+ # property: 'P124',
243
+ # value: Wikidatum::DataType::WikibaseUrl.new(
244
+ # string: 'https://example.com'
245
+ # )
246
+ # )
247
+ #
248
+ # @example Add an External ID statement.
249
+ # wikidatum_client.add_statement(
250
+ # id: 'Q123',
251
+ # property: 'P124',
252
+ # value: Wikidatum::DataType::ExternalId.new(
253
+ # string: '123'
254
+ # )
255
+ # )
256
+ #
257
+ # @example Add a statement for an image, video, or audio file from Wikimedia Commons.
258
+ # wikidatum_client.add_statement(
259
+ # id: 'Q123',
260
+ # property: 'P124',
261
+ # value: Wikidatum::DataType::CommonsMedia.new(
262
+ # string: 'FooBar.jpg'
263
+ # )
264
+ # )
265
+ #
198
266
  # @param id [String, Integer] the ID of the item on which the statement will be added.
199
267
  # @param property [String, Integer] property ID in the format 'P123', or an integer.
200
- # @param value [Wikidatum::DataType::GlobeCoordinate, Wikidatum::DataType::MonolingualText, Wikidatum::DataType::Quantity, Wikidatum::DataType::WikibaseString, Wikidatum::DataType::Time, Wikidatum::DataType::WikibaseItem, Wikidatum::DataType::NoValue, Wikidatum::DataType::SomeValue] the value of the statement being created.
268
+ # @param value [Wikidatum::DataType::CommonsMedia, Wikidatum::DataType::ExternalId, Wikidatum::DataType::GlobeCoordinate, Wikidatum::DataType::MonolingualText, Wikidatum::DataType::Quantity, Wikidatum::DataType::WikibaseString, Wikidatum::DataType::Time, Wikidatum::DataType::WikibaseItem, Wikidatum::DataType::WikibaseUrl, Wikidatum::DataType::NoValue, Wikidatum::DataType::SomeValue] the value of the statement being created.
201
269
  # @param qualifiers [Array<Wikidatum::Qualifier>]
202
270
  # @param references [Array<Wikidatum::Reference>]
203
271
  # @param rank [String, Symbol] Valid ranks are 'preferred', 'normal', or
@@ -233,7 +301,7 @@ module Wikidatum
233
301
  type: 'somevalue'
234
302
  }
235
303
  }
236
- when 'Wikidatum::DataType::GlobeCoordinate', 'Wikidatum::DataType::MonolingualText', 'Wikidatum::DataType::Quantity', 'Wikidatum::DataType::WikibaseString', 'Wikidatum::DataType::Time', 'Wikidatum::DataType::WikibaseItem'
304
+ when *CONTENT_DATA_TYPES
237
305
  statement_hash = {
238
306
  property: {
239
307
  id: property
@@ -446,10 +514,10 @@ module Wikidatum
446
514
  # error message if so.
447
515
  #
448
516
  # @return [void]
449
- # @raise [DisallowedIpEditError, DisallowedBotEditError]
517
+ # @raise [Errors::DisallowedIpEditError, Errors::DisallowedBotEditError]
450
518
  def ensure_edit_permitted!
451
- raise DisallowedIpEditError if !authenticated? && !allow_ip_edits?
452
- raise DisallowedBotEditError if !authenticated? && bot?
519
+ raise Errors::DisallowedIpEditError if !authenticated? && !allow_ip_edits?
520
+ raise Errors::DisallowedBotEditError if !authenticated? && bot?
453
521
  end
454
522
  end
455
523
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # For more information on the possible types that can be returned by
4
4
  # datavalues, see the official documentation:
5
- # https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_json.html#json_datavalues
5
+ # https://doc.wikimedia.org/Wikibase/master/php/docs_topics_json.html#json_datavalues
6
6
  module Wikidatum::DataType
7
7
  class Base
8
8
  # Represents the type for this instance.
@@ -11,11 +11,14 @@ module Wikidatum::DataType
11
11
  #
12
12
  # - `:no_value`: No value
13
13
  # - `:some_value`: Unknown value
14
+ # - `:commons_media`: {DataType::CommonsMedia}
15
+ # - `:external_id`: {DataType::ExternalId}
14
16
  # - `:globe_coordinate`: {DataType::GlobeCoordinate}
15
17
  # - `:monolingual_text`: {DataType::MonolingualText}
16
18
  # - `:quantity`: {DataType::Quantity}
17
19
  # - `:string`: {DataType::WikibaseString}
18
20
  # - `:time`: {DataType::Time}
21
+ # - `:url`: {DataType::WikibaseUrl}
19
22
  # - `:wikibase_item`: {DataType::WikibaseItem}
20
23
  #
21
24
  # @return [Symbol]
@@ -23,13 +26,13 @@ module Wikidatum::DataType
23
26
 
24
27
  # The value of the "content" attribute in the response.
25
28
  #
26
- # If the `type` is `novalue` or `somevalue`, this returns `nil`.
29
+ # If the `type` is `:no_value` or `:some_value`, this returns `nil`.
27
30
  #
28
- # @return [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil]
31
+ # @return [DataType::CommonsMedia, DataType::ExternalId, DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::Time, DataType::WikibaseItem, DataType::WikibaseString, DataType::WikibaseUrl, nil]
29
32
  attr_reader :content
30
33
 
31
34
  # @param type [Symbol]
32
- # @param content [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil] nil if type is no_value or some_value
35
+ # @param content [DataType::CommonsMedia, DataType::ExternalId, DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::Time, DataType::WikibaseItem, DataType::WikibaseString, DataType::WikibaseUrl, nil] nil if type is no_value or some_value
33
36
  # @return [void]
34
37
  def initialize(type:, content:)
35
38
  @type = type
@@ -44,6 +47,14 @@ module Wikidatum::DataType
44
47
  }
45
48
  end
46
49
 
50
+ # Get the humanized version of the content. Depending on the given data
51
+ # type, it will return values in different formats.
52
+ #
53
+ # @return [String, DataType::GlobeCoordinate::HumanizedStruct, DataType::MonolingualText::HumanizedStruct, DataType::Quantity::HumanizedStruct, DataType::Time::HumanizedStruct, nil]
54
+ def humanized_content
55
+ @content.humanized
56
+ end
57
+
47
58
  # @!visibility private
48
59
  #
49
60
  # @param data_type [String] The value of `data-type` for the given Statement or Qualifier's property.
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+ require 'wikidatum/data_type/wikibase_string'
5
+
6
+ # Identical to the WikibaseString type, but we'll change some metadata to make
7
+ # it clear that they're technically distinct types.
8
+ class Wikidatum::DataType::CommonsMedia < Wikidatum::DataType::WikibaseString
9
+ # The "type" value used by Wikibase, for use when creating/updating statements.
10
+ #
11
+ # @return [String]
12
+ def wikibase_type
13
+ 'commonsMedia'
14
+ end
15
+
16
+ # @return [Symbol]
17
+ def self.symbolized_name
18
+ :commons_media
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+ require 'wikidatum/data_type/wikibase_string'
5
+
6
+ # Identical to the WikibaseString type, but we'll change some metadata to make
7
+ # it clear that they're technically distinct types.
8
+ class Wikidatum::DataType::ExternalId < Wikidatum::DataType::WikibaseString
9
+ # The "type" value used by Wikibase, for use when creating/updating statements.
10
+ #
11
+ # @return [String]
12
+ def wikibase_type
13
+ 'external-id'
14
+ end
15
+
16
+ # @return [Symbol]
17
+ def self.symbolized_name
18
+ :external_id
19
+ end
20
+ end
@@ -63,9 +63,19 @@ class Wikidatum::DataType::GlobeCoordinate
63
63
  'globe-coordinate'
64
64
  end
65
65
 
66
+ HumanizedStruct = Struct.new(:latitude, :longitude, :precision, :globe, keyword_init: true)
67
+
68
+ # The content of the data value object. Use this to get a more sensible
69
+ # representation of the statement's contents.
70
+ #
71
+ # @return [HumanizedStruct<latitude, longitude, precision, globe>]
72
+ def humanized
73
+ HumanizedStruct.new(to_h)
74
+ end
75
+
66
76
  # @return [Symbol]
67
77
  def self.symbolized_name
68
- :monolingual_text
78
+ :globe_coordinate
69
79
  end
70
80
 
71
81
  # @!visibility private
@@ -49,6 +49,16 @@ class Wikidatum::DataType::MonolingualText
49
49
  'monolingualtext'
50
50
  end
51
51
 
52
+ HumanizedStruct = Struct.new(:language, :text, keyword_init: true)
53
+
54
+ # The content of the data value object. Use this to get a more sensible
55
+ # representation of the statement's contents.
56
+ #
57
+ # @return [HumanizedStruct<language, text>]
58
+ def humanized
59
+ HumanizedStruct.new(to_h)
60
+ end
61
+
52
62
  # @return [Symbol]
53
63
  def self.symbolized_name
54
64
  :monolingual_text
@@ -9,11 +9,21 @@ require 'wikidatum/data_type/base'
9
9
  class Wikidatum::DataType::NoValue < Wikidatum::DataType::Base
10
10
  # The "type" value used by Wikibase, for use when creating/updating statements.
11
11
  #
12
+ # In this case, the type is a lie.
13
+ #
12
14
  # @return [String]
13
15
  def wikibase_type
14
16
  'string'
15
17
  end
16
18
 
19
+ # The content of the data value object. Use this to get a more sensible
20
+ # representation of the statement's contents.
21
+ #
22
+ # @return [nil]
23
+ def humanized
24
+ nil
25
+ end
26
+
17
27
  # @!visibility private
18
28
  def self.marshal_load(_data_value_json)
19
29
  new(type: :no_value, content: nil)
@@ -49,6 +49,16 @@ class Wikidatum::DataType::Quantity
49
49
  'quantity'
50
50
  end
51
51
 
52
+ HumanizedStruct = Struct.new(:amount, :unit, keyword_init: true)
53
+
54
+ # The content of the data value object. Use this to get a more sensible
55
+ # representation of the statement's contents.
56
+ #
57
+ # @return [HumanizedStruct<amount, unit>]
58
+ def humanized
59
+ HumanizedStruct.new(to_h)
60
+ end
61
+
52
62
  # @return [Symbol]
53
63
  def self.symbolized_name
54
64
  :quantity
@@ -9,11 +9,21 @@ require 'wikidatum/data_type/base'
9
9
  class Wikidatum::DataType::SomeValue < Wikidatum::DataType::Base
10
10
  # The "type" value used by Wikibase, for use when creating/updating statements.
11
11
  #
12
+ # In this case, the type is a lie.
13
+ #
12
14
  # @return [String]
13
15
  def wikibase_type
14
16
  'string'
15
17
  end
16
18
 
19
+ # The content of the data value object. Use this to get a more sensible
20
+ # representation of the statement's contents.
21
+ #
22
+ # @return [nil]
23
+ def humanized
24
+ nil
25
+ end
26
+
17
27
  # @!visibility private
18
28
  def self.marshal_load(_data_value_json)
19
29
  new(type: :some_value, content: nil)
@@ -109,6 +109,16 @@ class Wikidatum::DataType::Time
109
109
  'time'
110
110
  end
111
111
 
112
+ HumanizedStruct = Struct.new(:time, :precision, :calendar_model, keyword_init: true)
113
+
114
+ # The content of the data value object. Use this to get a more sensible
115
+ # representation of the statement's contents.
116
+ #
117
+ # @return [HumanizedStruct<time, precision, pretty_precision, calendar_model>]
118
+ def humanized
119
+ HumanizedStruct.new(to_h)
120
+ end
121
+
112
122
  # @return [Symbol]
113
123
  def self.symbolized_name
114
124
  :time
@@ -40,6 +40,14 @@ class Wikidatum::DataType::WikibaseItem
40
40
  'wikibase-item'
41
41
  end
42
42
 
43
+ # The content of the data value object. Use this to get a more sensible
44
+ # representation of the statement's contents.
45
+ #
46
+ # @return [String]
47
+ def humanized
48
+ @id
49
+ end
50
+
43
51
  # @return [Symbol]
44
52
  def self.symbolized_name
45
53
  :wikibase_item
@@ -40,6 +40,14 @@ class Wikidatum::DataType::WikibaseString
40
40
  'string'
41
41
  end
42
42
 
43
+ # The content of the data value object. Use this to get a more sensible
44
+ # representation of the statement's contents.
45
+ #
46
+ # @return [String]
47
+ def humanized
48
+ @string
49
+ end
50
+
43
51
  # @return [Symbol]
44
52
  def self.symbolized_name
45
53
  :string
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+ require 'wikidatum/data_type/wikibase_string'
5
+
6
+ # Identical to the WikibaseString type, but we'll change some metadata to make
7
+ # it clear that they're technically distinct types.
8
+ class Wikidatum::DataType::WikibaseUrl < Wikidatum::DataType::WikibaseString
9
+ # The "type" value used by Wikibase, for use when creating/updating statements.
10
+ #
11
+ # @return [String]
12
+ def wikibase_type
13
+ 'url'
14
+ end
15
+
16
+ # @return [Symbol]
17
+ def self.symbolized_name
18
+ :url
19
+ end
20
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'wikidatum/data_type/base'
4
+ require 'wikidatum/data_type/commons_media'
5
+ require 'wikidatum/data_type/external_id'
4
6
  require 'wikidatum/data_type/globe_coordinate'
5
7
  require 'wikidatum/data_type/monolingual_text'
6
8
  require 'wikidatum/data_type/no_value'
@@ -9,3 +11,4 @@ require 'wikidatum/data_type/some_value'
9
11
  require 'wikidatum/data_type/time'
10
12
  require 'wikidatum/data_type/wikibase_item'
11
13
  require 'wikidatum/data_type/wikibase_string'
14
+ require 'wikidatum/data_type/wikibase_url'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wikidatum
4
+ class Error < StandardError; end
5
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/error'
4
+
5
+ module Wikidatum::Errors
6
+ # If the Wikidatum::Client is set to disallow IP Edits (the default) and no
7
+ # authentication has been provided, this error will be raised when performing
8
+ # any non-GET requests.
9
+ class DisallowedIpEditError < Wikidatum::Error
10
+ def message
11
+ 'No authentication provided. If you want to perform unauthenticated edits and are comfortable exposing your IP address publicly, set `allow_ip_edits: true` when instantiating your client with `Wikidatum::Client.new`.'
12
+ end
13
+ end
14
+
15
+ # If the Wikidatum::Client is set to mark their edits as belonging to a bot,
16
+ # they must be authenticated as a bot user. We will disallow these edits
17
+ # as long as they're not authenticated as a specific user.
18
+ class DisallowedBotEditError < Wikidatum::Error
19
+ def message
20
+ 'No authentication provided, but attempted to edit as a bot. You cannot make edits as a bot unless you have authenticated as a user with the Bot flag.'
21
+ end
22
+ end
23
+ end
@@ -9,7 +9,7 @@ class Wikidatum::Qualifier
9
9
 
10
10
  # For more information on the possible types that can be returned by
11
11
  # datavalues, see the official documentation:
12
- # https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_json.html#json_datavalues
12
+ # https://doc.wikimedia.org/Wikibase/master/php/docs_topics_json.html#json_datavalues
13
13
  #
14
14
  # @return [Wikidatum::DataType::Base] the value of the statement, can take various forms
15
15
  attr_reader :value
@@ -9,7 +9,7 @@ class Wikidatum::ReferencePart
9
9
 
10
10
  # For more information on the possible types that can be returned by
11
11
  # datavalues, see the official documentation:
12
- # https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_json.html#json_datavalues
12
+ # https://doc.wikimedia.org/Wikibase/master/php/docs_topics_json.html#json_datavalues
13
13
  #
14
14
  # @return [Wikidatum::DataType::Base] the value of the statement, can take various forms
15
15
  attr_reader :value
@@ -17,7 +17,7 @@ class Wikidatum::ReferencePart
17
17
  # @!visibility private
18
18
  # @param property_id [String] ID of the property used, in the format "P123".
19
19
  # @param data_type [String]
20
- # @param value [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, DataType::NoValue, DataType::SomeValue]
20
+ # @param value [DataType::CommonsMedia, DataType::ExternalId, DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::Time, DataType::WikibaseItem, DataType::WikibaseString, DataType::WikibaseUrl, DataType::NoValue, DataType::SomeValue]
21
21
  def initialize(property_id:, data_type:, value:)
22
22
  @property_id = property_id
23
23
  @data_type = data_type
@@ -1,21 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Wikidatum::Sitelinks represent associated sitelinks on a Wikidata item.
3
+ # Wikidatum::Sitelinks represent associated sitelinks on a Wikidata item, for
4
+ # example the associated English Wikipedia article.
4
5
  class Wikidatum::Sitelink
5
- # @return [String]
6
+ # @return [String] The shortcode for the given site (e.g. 'enwiki', 'commons', etc.).
6
7
  attr_reader :site
7
8
 
8
- # @return [String]
9
+ # @return [String] The title of the page in the associated Wikimedia site.
9
10
  attr_reader :title
10
11
 
11
- # @return [Array<String>]
12
+ # @return [Array<String>] An array of badges, given as item IDs (e.g. `['Q123', 'Q124']`).
12
13
  attr_reader :badges
13
14
 
14
15
  # @!visibility private
15
16
  #
16
17
  # @param site [String, Symbol] The shortcode for the given site (e.g. 'enwiki', 'commons', etc.), can be either a string or a symbol.
17
18
  # @param title [String] The title of the page in the associated Wikimedia site.
18
- # @param badges [Array<String>] An array of badges, given as item IDs (e.g. `['Q123', 'Q124']`) optional.
19
+ # @param badges [Array<String>] An array of badges, given as item IDs (e.g. `['Q123', 'Q124']`). This parameter is optional.
19
20
  # @return [Wikidatum::Sitelink]
20
21
  def initialize(site:, title:, badges: [])
21
22
  @site = site.to_s
@@ -10,7 +10,7 @@ class Wikidatum::Statement
10
10
  # @return [String]
11
11
  attr_accessor :data_type
12
12
 
13
- # @return [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil]
13
+ # @return [DataType::CommonsMedia, DataType::ExternalId, DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::Time, DataType::WikibaseItem, DataType::WikibaseString, DataType::WikibaseUrl, nil]
14
14
  attr_accessor :data_value
15
15
 
16
16
  # @return [Array<Wikidatum::Qualifier>]
@@ -26,7 +26,7 @@ class Wikidatum::Statement
26
26
  # @param id [String]
27
27
  # @param property_id [String] The 'P123' ID of the property that this statement represents.
28
28
  # @param data_type [String]
29
- # @param data_value [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil]
29
+ # @param data_value [DataType::CommonsMedia, DataType::ExternalId, DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::Time, DataType::WikibaseItem, DataType::WikibaseString, DataType::WikibaseUrl, nil]
30
30
  # @param qualifiers [Array<Wikidatum::Qualifier>]
31
31
  # @param references [Array<Wikidatum::Reference>]
32
32
  # @param rank [String] The rank of the given statement.
@@ -3,16 +3,16 @@
3
3
  # Wikidatum::Term represents "Terms", which are pairs of language codes and
4
4
  # values. They're used for things like item labels, descriptions, and aliases.
5
5
  class Wikidatum::Term
6
- # @return [String]
6
+ # @return [String] A language code ('en', 'zh-mo', etc).
7
7
  attr_reader :lang
8
8
 
9
- # @return [String]
9
+ # @return [String] The value of the Term.
10
10
  attr_reader :value
11
11
 
12
12
  # @!visibility private
13
13
  #
14
14
  # @param lang [String, Symbol] A language code ('en', 'zh-mo', etc), can be a symbol or a string.
15
- # @param value [String] The value of the term.
15
+ # @param value [String] The value of the Term.
16
16
  # @return [Wikidatum::Term]
17
17
  def initialize(lang:, value:)
18
18
  @lang = lang.to_s
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wikidatum
4
- VERSION = '0.3.1'
4
+ VERSION = '0.3.3'
5
5
  end
data/lib/wikidatum.rb CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'wikidatum/client'
4
4
  require 'wikidatum/data_type'
5
+ require 'wikidatum/error'
6
+ require 'wikidatum/errors'
5
7
  require 'wikidatum/item'
6
8
  require 'wikidatum/qualifier'
7
9
  require 'wikidatum/reference'
@@ -13,26 +15,6 @@ require 'wikidatum/utils'
13
15
  require 'wikidatum/version'
14
16
 
15
17
  module Wikidatum
16
- class Error < StandardError; end
17
-
18
- # If the Wikidatum::Client is set to disallow IP Edits (the default) and no
19
- # authentication has been provided, this error will be raised when performing
20
- # any non-GET requests.
21
- class DisallowedIpEditError < Error
22
- def message
23
- 'No authentication provided. If you want to perform unauthenticated edits and are comfortable exposing your IP address publicly, set `allow_ip_edits: true` when instantiating your client with `Wikidatum::Client.new`.'
24
- end
25
- end
26
-
27
- # If the Wikidatum::Client is set to mark their edits as belonging to a bot,
28
- # they must be authenticated as a bot user. We will disallow these edits
29
- # as long as they're not authenticated as a specific user.
30
- class DisallowedBotEditError < Error
31
- def message
32
- 'No authentication provided, but attempted to edit as a bot. You cannot make edits as a bot unless you have authenticated as a user with the Bot flag.'
33
- end
34
- end
35
-
36
18
  # rubocop:disable Naming/ConstantName
37
19
 
38
20
  # These language codes are not enforced, you can pass whatever language code
@@ -65,9 +47,10 @@ module Wikidatum
65
47
  end
66
48
 
67
49
  module DataType
68
- # TODO: Add commonsMedia and url to the possible types.
69
50
  # rubocop:disable Lint/SymbolConversion
70
51
  DATA_TYPES = {
52
+ 'commonsMedia': 'Wikidatum::DataType::CommonsMedia',
53
+ 'external-id': 'Wikidatum::DataType::ExternalId',
71
54
  'globe-coordinate': 'Wikidatum::DataType::GlobeCoordinate',
72
55
  'monolingualtext': 'Wikidatum::DataType::MonolingualText',
73
56
  'novalue': 'Wikidatum::DataType::NoValue',
@@ -75,6 +58,7 @@ module Wikidatum
75
58
  'somevalue': 'Wikidatum::DataType::SomeValue',
76
59
  'string': 'Wikidatum::DataType::WikibaseString',
77
60
  'time': 'Wikidatum::DataType::Time',
61
+ 'url': 'Wikidatum::DataType::WikibaseUrl',
78
62
  'wikibase-item': 'Wikidatum::DataType::WikibaseItem'
79
63
  }.freeze
80
64
  # rubocop:enable Lint/SymbolConversion
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikidatum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Connor Shea
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-28 00:00:00.000000000 Z
11
+ date: 2023-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -40,6 +40,8 @@ files:
40
40
  - lib/wikidatum/client.rb
41
41
  - lib/wikidatum/data_type.rb
42
42
  - lib/wikidatum/data_type/base.rb
43
+ - lib/wikidatum/data_type/commons_media.rb
44
+ - lib/wikidatum/data_type/external_id.rb
43
45
  - lib/wikidatum/data_type/globe_coordinate.rb
44
46
  - lib/wikidatum/data_type/monolingual_text.rb
45
47
  - lib/wikidatum/data_type/no_value.rb
@@ -48,6 +50,9 @@ files:
48
50
  - lib/wikidatum/data_type/time.rb
49
51
  - lib/wikidatum/data_type/wikibase_item.rb
50
52
  - lib/wikidatum/data_type/wikibase_string.rb
53
+ - lib/wikidatum/data_type/wikibase_url.rb
54
+ - lib/wikidatum/error.rb
55
+ - lib/wikidatum/errors.rb
51
56
  - lib/wikidatum/item.rb
52
57
  - lib/wikidatum/qualifier.rb
53
58
  - lib/wikidatum/reference.rb