wikidatum 0.2.0 → 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.
@@ -4,28 +4,28 @@ class Wikidatum::Reference
4
4
  # @return [String] Hash of the reference (a cryptographic hash, not a Ruby hash).
5
5
  attr_reader :hash
6
6
 
7
- # @return [Array<Wikidatum::Snak>]
8
- attr_reader :snaks
7
+ # @return [Array<Wikidatum::ReferencePart>]
8
+ attr_reader :parts
9
9
 
10
10
  # @!visibility private
11
11
  # @param hash [String] Hash of the reference (a cryptographic hash, not a Ruby hash).
12
- # @param snaks [Array<Wikidatum::Snak>]
13
- def initialize(hash:, snaks:)
12
+ # @param parts [Array<Wikidatum::ReferencePart>]
13
+ def initialize(hash:, parts:)
14
14
  @hash = hash
15
- @snaks = snaks
15
+ @parts = parts
16
16
  end
17
17
 
18
18
  # @return [Hash]
19
19
  def to_h
20
20
  {
21
21
  hash: @hash,
22
- snaks: @snaks.map(&:to_h)
22
+ parts: @parts.map(&:to_h)
23
23
  }
24
24
  end
25
25
 
26
26
  # @return [String]
27
27
  def inspect
28
- "<Wikidatum::Reference hash=#{@hash.inspect} snaks=#{@snaks.inspect}>"
28
+ "<Wikidatum::Reference hash=#{@hash.inspect} parts=#{@parts.inspect}>"
29
29
  end
30
30
 
31
31
  # @!visibility private
@@ -37,11 +37,11 @@ class Wikidatum::Reference
37
37
  # @param ref_json [Hash]
38
38
  # @return [Wikidatum::Reference]
39
39
  def self.marshal_load(ref_json)
40
- snaks = ref_json['snaks'].values.flatten.map { |snak| Wikidatum::Snak.marshal_load(snak) }
40
+ parts = ref_json['parts'].map { |part| Wikidatum::ReferencePart.marshal_load(part) }
41
41
 
42
42
  Wikidatum::Reference.new(
43
43
  hash: ref_json['hash'],
44
- snaks: snaks
44
+ parts: parts
45
45
  )
46
46
  end
47
47
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Wikidatum::ReferencePart
4
+ # @return [String] ID of the property used, in the format "P123".
5
+ attr_reader :property_id
6
+
7
+ # @return [String]
8
+ attr_reader :data_type
9
+
10
+ # For more information on the possible types that can be returned by
11
+ # datavalues, see the official documentation:
12
+ # https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_json.html#json_datavalues
13
+ #
14
+ # @return [Wikidatum::DataType::Base] the value of the statement, can take various forms
15
+ attr_reader :value
16
+
17
+ # @!visibility private
18
+ # @param property_id [String] ID of the property used, in the format "P123".
19
+ # @param data_type [String]
20
+ # @param value [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, DataType::NoValue, DataType::SomeValue]
21
+ def initialize(property_id:, data_type:, value:)
22
+ @property_id = property_id
23
+ @data_type = data_type
24
+ @value = value
25
+ end
26
+
27
+ # @return [Hash]
28
+ def to_h
29
+ {
30
+ property_id: @property_id,
31
+ data_type: @data_type,
32
+ value: @value.to_h
33
+ }
34
+ end
35
+
36
+ # @return [String]
37
+ def inspect
38
+ "<Wikidatum::ReferencePart property_id=#{@property_id.inspect} data_type=#{@data_type.inspect} value=#{@value.inspect}>"
39
+ end
40
+
41
+ # @!visibility private
42
+ #
43
+ # This takes in the JSON blob (as a hash) that is output for a given
44
+ # reference part in the API and turns it into an actual instance of a
45
+ # ReferencePart.
46
+ #
47
+ # @param part_json [Hash]
48
+ # @return [Wikidatum::ReferencePart]
49
+ def self.marshal_load(part_json)
50
+ Wikidatum::ReferencePart.new(
51
+ property_id: part_json.dig('property', 'id'),
52
+ data_type: part_json.dig('property', 'data-type'),
53
+ value: Wikidatum::Utils.ingest_snak(part_json)
54
+ )
55
+ end
56
+ end
@@ -7,8 +7,11 @@ class Wikidatum::Statement
7
7
  # @return [String] property ID, in the format of 'P123'.
8
8
  attr_accessor :property_id
9
9
 
10
- # @return [Wikidatum::Snak]
11
- attr_accessor :mainsnak
10
+ # @return [String]
11
+ attr_accessor :data_type
12
+
13
+ # @return [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil]
14
+ attr_accessor :data_value
12
15
 
13
16
  # @return [Array<Wikidatum::Qualifier>]
14
17
  attr_accessor :qualifiers
@@ -22,15 +25,17 @@ class Wikidatum::Statement
22
25
 
23
26
  # @param id [String]
24
27
  # @param property_id [String] The 'P123' ID of the property that this statement represents.
25
- # @param mainsnak [Wikidatum::Snak]
28
+ # @param data_type [String]
29
+ # @param data_value [DataType::GlobeCoordinate, DataType::MonolingualText, DataType::Quantity, DataType::WikibaseString, DataType::Time, DataType::WikibaseItem, nil]
26
30
  # @param qualifiers [Array<Wikidatum::Qualifier>]
27
31
  # @param references [Array<Wikidatum::Reference>]
28
32
  # @param rank [String] The rank of the given statement.
29
33
  # Can have the values "preferred", "normal", or "deprecated". Defaults to "normal".
30
- def initialize(id:, property_id:, mainsnak:, qualifiers:, references:, rank: 'normal')
34
+ def initialize(id:, property_id:, data_type:, data_value:, qualifiers:, references:, rank: 'normal')
31
35
  @id = id
32
36
  @property_id = property_id
33
- @mainsnak = mainsnak
37
+ @data_type = data_type
38
+ @data_value = data_value
34
39
  @qualifiers = qualifiers
35
40
  @references = references
36
41
  @rank = rank
@@ -41,7 +46,8 @@ class Wikidatum::Statement
41
46
  {
42
47
  id: @id,
43
48
  property_id: @property_id,
44
- mainsnak: @mainsnak.to_h,
49
+ data_type: @data_type,
50
+ data_value: @data_value.to_h,
45
51
  qualifiers: @qualifiers.map(&:to_h),
46
52
  references: @references.map(&:to_h),
47
53
  rank: @rank
@@ -56,10 +62,13 @@ class Wikidatum::Statement
56
62
  # @param statement_json [Hash]
57
63
  # @return [Wikidatum::Statement]
58
64
  def self.marshal_load(statement_json)
59
- mainsnak = Wikidatum::Snak.marshal_load(statement_json['mainsnak'])
65
+ data_type = Wikidatum::Utils.symbolized_name_for_data_type(statement_json['property']['data-type'])
66
+ data_value = Wikidatum::Utils.ingest_snak(statement_json)
67
+
68
+ property_id = statement_json['property']['id']
60
69
 
61
- qualifiers = statement_json['qualifiers'].to_a.flat_map do |_qualifier_prop_id, qualifier|
62
- qualifier.map { |q| Wikidatum::Qualifier.marshal_load(q) }
70
+ qualifiers = statement_json['qualifiers'].to_a.flat_map do |qualifier|
71
+ Wikidatum::Qualifier.marshal_load(qualifier)
63
72
  end
64
73
  references = statement_json['references'].flat_map do |reference|
65
74
  Wikidatum::Reference.marshal_load(reference)
@@ -67,8 +76,9 @@ class Wikidatum::Statement
67
76
 
68
77
  Wikidatum::Statement.new(
69
78
  id: statement_json['id'],
70
- property_id: mainsnak.property,
71
- mainsnak: mainsnak,
79
+ property_id: property_id,
80
+ data_type: data_type,
81
+ data_value: data_value,
72
82
  qualifiers: qualifiers,
73
83
  references: references,
74
84
  rank: statement_json['rank']
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wikidatum::Utils
4
+ # Yum!
5
+ def self.ingest_snak(json)
6
+ # the type can be 'novalue' (no value) or 'somevalue' (unknown), so we handle those as somewhat special cases
7
+ case json['value']['type']
8
+ when 'novalue'
9
+ Wikidatum::DataType::Base.marshal_load('novalue', nil)
10
+ when 'somevalue'
11
+ Wikidatum::DataType::Base.marshal_load('somevalue', nil)
12
+ when 'value'
13
+ Wikidatum::DataType::Base.marshal_load(json['property']['data-type'], json['value']['content'])
14
+ end
15
+ end
16
+
17
+ def self.symbolized_name_for_data_type(data_type)
18
+ unless Wikidatum::DataType::DATA_TYPES.keys.include?(data_type.to_sym)
19
+ puts "WARNING: Unsupported data type (#{data_type})"
20
+ return nil
21
+ end
22
+
23
+ Object.const_get(Wikidatum::DataType::DATA_TYPES[data_type.to_sym]).symbolized_name
24
+ end
25
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wikidatum
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/wikidatum.rb CHANGED
@@ -1,19 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'wikidatum/client'
4
- require_relative 'wikidatum/data_value_type'
5
- require_relative 'wikidatum/item'
6
- require_relative 'wikidatum/qualifier'
7
- require_relative 'wikidatum/reference'
8
- require_relative 'wikidatum/sitelink'
9
- require_relative 'wikidatum/snak'
10
- require_relative 'wikidatum/statement'
11
- require_relative 'wikidatum/term'
12
- require_relative 'wikidatum/version'
3
+ require 'wikidatum/client'
4
+ require 'wikidatum/data_type'
5
+ require 'wikidatum/item'
6
+ require 'wikidatum/qualifier'
7
+ require 'wikidatum/reference'
8
+ require 'wikidatum/reference_part'
9
+ require 'wikidatum/sitelink'
10
+ require 'wikidatum/statement'
11
+ require 'wikidatum/term'
12
+ require 'wikidatum/utils'
13
+ require 'wikidatum/version'
13
14
 
14
15
  module Wikidatum
15
16
  class Error < StandardError; end
16
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
+
17
27
  # rubocop:disable Naming/ConstantName
18
28
 
19
29
  # These language codes are not enforced, you can pass whatever language code
@@ -45,17 +55,18 @@ module Wikidatum
45
55
  # rubocop:enable Naming/ConstantName
46
56
  end
47
57
 
48
- module DataValueType
58
+ module DataType
59
+ # TODO: Add commonsMedia and url to the possible types.
49
60
  # rubocop:disable Lint/SymbolConversion
50
- DATA_VALUE_TYPES = {
51
- 'globecoordinate': 'Wikidatum::DataValueType::GlobeCoordinate',
52
- 'monolingualtext': 'Wikidatum::DataValueType::MonolingualText',
53
- 'novalue': 'Wikidatum::DataValueType::NoValue',
54
- 'quantity': 'Wikidatum::DataValueType::Quantity',
55
- 'somevalue': 'Wikidatum::DataValueType::SomeValue',
56
- 'string': 'Wikidatum::DataValueType::WikibaseString',
57
- 'time': 'Wikidatum::DataValueType::Time',
58
- 'wikibase-entityid': 'Wikidatum::DataValueType::WikibaseEntityId'
61
+ DATA_TYPES = {
62
+ 'globe-coordinate': 'Wikidatum::DataType::GlobeCoordinate',
63
+ 'monolingualtext': 'Wikidatum::DataType::MonolingualText',
64
+ 'novalue': 'Wikidatum::DataType::NoValue',
65
+ 'quantity': 'Wikidatum::DataType::Quantity',
66
+ 'somevalue': 'Wikidatum::DataType::SomeValue',
67
+ 'string': 'Wikidatum::DataType::WikibaseString',
68
+ 'time': 'Wikidatum::DataType::Time',
69
+ 'wikibase-item': 'Wikidatum::DataType::WikibaseItem'
59
70
  }.freeze
60
71
  # rubocop:enable Lint/SymbolConversion
61
72
  end
data/wikidatum.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
25
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
26
  `git ls-files -z`.split("\x0").reject do |f|
27
- (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|))})
27
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|))}) || f.match(/\A(?:Gemfile|Rakefile)/)
28
28
  end
29
29
  end
30
30
  spec.bindir = "exe"
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.2.0
4
+ version: 0.3.0
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-08-13 00:00:00.000000000 Z
11
+ date: 2022-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -32,32 +32,30 @@ extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
34
  - CHANGELOG.md
35
- - Gemfile
36
- - Gemfile.lock
37
35
  - LICENSE
38
36
  - README.md
39
- - Rakefile
40
37
  - bin/console
41
38
  - bin/setup
42
39
  - lib/wikidatum.rb
43
40
  - lib/wikidatum/client.rb
44
- - lib/wikidatum/data_value_type.rb
45
- - lib/wikidatum/data_value_type/base.rb
46
- - lib/wikidatum/data_value_type/globe_coordinate.rb
47
- - lib/wikidatum/data_value_type/monolingual_text.rb
48
- - lib/wikidatum/data_value_type/no_value.rb
49
- - lib/wikidatum/data_value_type/quantity.rb
50
- - lib/wikidatum/data_value_type/some_value.rb
51
- - lib/wikidatum/data_value_type/time.rb
52
- - lib/wikidatum/data_value_type/wikibase_entity_id.rb
53
- - lib/wikidatum/data_value_type/wikibase_string.rb
41
+ - lib/wikidatum/data_type.rb
42
+ - lib/wikidatum/data_type/base.rb
43
+ - lib/wikidatum/data_type/globe_coordinate.rb
44
+ - lib/wikidatum/data_type/monolingual_text.rb
45
+ - lib/wikidatum/data_type/no_value.rb
46
+ - lib/wikidatum/data_type/quantity.rb
47
+ - lib/wikidatum/data_type/some_value.rb
48
+ - lib/wikidatum/data_type/time.rb
49
+ - lib/wikidatum/data_type/wikibase_item.rb
50
+ - lib/wikidatum/data_type/wikibase_string.rb
54
51
  - lib/wikidatum/item.rb
55
52
  - lib/wikidatum/qualifier.rb
56
53
  - lib/wikidatum/reference.rb
54
+ - lib/wikidatum/reference_part.rb
57
55
  - lib/wikidatum/sitelink.rb
58
- - lib/wikidatum/snak.rb
59
56
  - lib/wikidatum/statement.rb
60
57
  - lib/wikidatum/term.rb
58
+ - lib/wikidatum/utils.rb
61
59
  - lib/wikidatum/version.rb
62
60
  - wikidatum.gemspec
63
61
  homepage:
@@ -84,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
82
  - !ruby/object:Gem::Version
85
83
  version: '0'
86
84
  requirements: []
87
- rubygems_version: 3.2.33
85
+ rubygems_version: 3.4.1
88
86
  signing_key:
89
87
  specification_version: 4
90
88
  summary: Ruby gem for the new Wikidata REST API.
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Specify your gem's dependencies in wikidatum.gemspec
6
- gemspec
7
-
8
- gem 'rake', '~> 13.0'
9
- gem 'minitest', '~> 5.16'
10
- gem 'simplecov', '~> 0.21', require: false
11
- gem 'rubocop', '~> 1.30'
12
- gem 'yard', '~> 0.9'
13
- gem 'webmock', '~> 3.17', require: false
data/Gemfile.lock DELETED
@@ -1,73 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- wikidatum (0.2.0)
5
- faraday (~> 2.4)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- addressable (2.8.0)
11
- public_suffix (>= 2.0.2, < 5.0)
12
- ast (2.4.2)
13
- crack (0.4.5)
14
- rexml
15
- docile (1.4.0)
16
- faraday (2.4.0)
17
- faraday-net_http (~> 2.0)
18
- ruby2_keywords (>= 0.0.4)
19
- faraday-net_http (2.1.0)
20
- hashdiff (1.0.1)
21
- minitest (5.16.0)
22
- parallel (1.22.1)
23
- parser (3.1.2.0)
24
- ast (~> 2.4.1)
25
- public_suffix (4.0.7)
26
- rainbow (3.1.1)
27
- rake (13.0.6)
28
- regexp_parser (2.5.0)
29
- rexml (3.2.5)
30
- rubocop (1.30.1)
31
- parallel (~> 1.10)
32
- parser (>= 3.1.0.0)
33
- rainbow (>= 2.2.2, < 4.0)
34
- regexp_parser (>= 1.8, < 3.0)
35
- rexml (>= 3.2.5, < 4.0)
36
- rubocop-ast (>= 1.18.0, < 2.0)
37
- ruby-progressbar (~> 1.7)
38
- unicode-display_width (>= 1.4.0, < 3.0)
39
- rubocop-ast (1.18.0)
40
- parser (>= 3.1.1.0)
41
- ruby-progressbar (1.11.0)
42
- ruby2_keywords (0.0.5)
43
- simplecov (0.21.2)
44
- docile (~> 1.1)
45
- simplecov-html (~> 0.11)
46
- simplecov_json_formatter (~> 0.1)
47
- simplecov-html (0.12.3)
48
- simplecov_json_formatter (0.1.4)
49
- unicode-display_width (2.1.0)
50
- webmock (3.17.1)
51
- addressable (>= 2.8.0)
52
- crack (>= 0.3.2)
53
- hashdiff (>= 0.4.0, < 2.0.0)
54
- webrick (1.7.0)
55
- yard (0.9.28)
56
- webrick (~> 1.7.0)
57
-
58
- PLATFORMS
59
- arm64-darwin-21
60
- x86_64-darwin-21
61
- x86_64-linux
62
-
63
- DEPENDENCIES
64
- minitest (~> 5.16)
65
- rake (~> 13.0)
66
- rubocop (~> 1.30)
67
- simplecov (~> 0.21)
68
- webmock (~> 3.17)
69
- wikidatum!
70
- yard (~> 0.9)
71
-
72
- BUNDLED WITH
73
- 2.3.3
data/Rakefile DELETED
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rake/testtask"
5
-
6
- Rake::TestTask.new(:test) do |t|
7
- t.libs << "test"
8
- t.libs << "lib"
9
- t.test_files = FileList["test/**/*_spec.rb"]
10
- end
11
-
12
- require "rubocop/rake_task"
13
-
14
- RuboCop::RakeTask.new
15
-
16
- task default: %i[test rubocop]
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # For more information on the possible types that can be returned by
4
- # datavalues, see the official documentation:
5
- # https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_json.html#json_datavalues
6
- module Wikidatum::DataValueType
7
- class Base
8
- # Represents the type for this datavalue instance.
9
- #
10
- # Possible values for the `type` attribute are:
11
- #
12
- # - `:no_value`: No value
13
- # - `:some_value`: Unknown value
14
- # - `:globe_coordinate`: {DataValueType::GlobeCoordinate}
15
- # - `:monolingual_text`: {DataValueType::MonolingualText}
16
- # - `:quantity`: {DataValueType::Quantity}
17
- # - `:string`: {DataValueType::WikibaseString}
18
- # - `:time`: {DataValueType::Time}
19
- # - `:wikibase_entity_id`: {DataValueType::WikibaseEntityId}
20
- #
21
- # @return [Symbol]
22
- attr_reader :type
23
-
24
- # The value of the datavalue object in the response.
25
- #
26
- # If the `type` is `novalue` or `somevalue`, this returns `nil`.
27
- #
28
- # @return [DataValueType::GlobeCoordinate, DataValueType::MonolingualText, DataValueType::Quantity, DataValueType::WikibaseString, DataValueType::Time, DataValueType::WikibaseEntityId, nil]
29
- attr_reader :value
30
-
31
- # @param type [Symbol]
32
- # @param value [DataValueType::GlobeCoordinate, DataValueType::MonolingualText, DataValueType::Quantity, DataValueType::WikibaseString, DataValueType::Time, DataValueType::WikibaseEntityId, nil] nil if type is no_value or some_value
33
- # @return [void]
34
- def initialize(type:, value:)
35
- @type = type
36
- @value = value
37
- end
38
-
39
- # @return [Hash]
40
- def to_h
41
- {
42
- type: @type,
43
- value: @value&.to_h
44
- }
45
- end
46
-
47
- # @!visibility private
48
- #
49
- # @param data_value_type [String] The value of `type` for the given Snak's datavalue.
50
- # @param data_value_json [Hash] The `value` part of datavalue.
51
- # @return [Wikidatum::DataValueType::Base] An instance of Base.
52
- def self.marshal_load(data_value_type, data_value_json)
53
- unless Wikidatum::DataValueType::DATA_VALUE_TYPES.keys.include?(data_value_type.to_sym)
54
- puts 'WARNING: Unsupported datavalue type.'
55
- return nil
56
- end
57
-
58
- Object.const_get(Wikidatum::DataValueType::DATA_VALUE_TYPES[data_value_type.to_sym]).marshal_load(data_value_json)
59
- end
60
- end
61
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'wikidatum/data_value_type/base'
4
-
5
- # The Quantity type datavalue JSON looks like this:
6
- #
7
- # ```json
8
- # {
9
- # "datavalue": {
10
- # "value": {
11
- # "amount": "+10.38",
12
- # "upperBound": "+10.375",
13
- # "lowerBound": "+10.385",
14
- # "unit": "http://www.wikidata.org/entity/Q712226"
15
- # },
16
- # "type": "quantity"
17
- # }
18
- # }
19
- # ```
20
- class Wikidatum::DataValueType::Quantity
21
- # @return [String] A string value like "+2", usually an integer but not always.
22
- attr_reader :amount
23
-
24
- # @return [String, nil] upper bound, if one is defined.
25
- attr_reader :upper_bound
26
-
27
- # @return [String, nil] lower bound, if one is defined.
28
- attr_reader :lower_bound
29
-
30
- # @return [String] a URL describing the unit for this quantity, e.g. "meter", "kilometer", "pound", "chapter", "section", etc.
31
- attr_reader :unit
32
-
33
- # @param amount [String]
34
- # @param upper_bound [String]
35
- # @param lower_bound [String]
36
- # @param unit [String]
37
- # @return [void]
38
- def initialize(amount:, upper_bound:, lower_bound:, unit:)
39
- @amount = amount
40
- @upper_bound = upper_bound
41
- @lower_bound = lower_bound
42
- @unit = unit
43
- end
44
-
45
- # @return [Hash]
46
- def to_h
47
- {
48
- amount: @amount,
49
- upper_bound: @upper_bound,
50
- lower_bound: @lower_bound,
51
- unit: @unit
52
- }
53
- end
54
-
55
- # The "type" value used by Wikibase, for use when creating/updating statements.
56
- #
57
- # @return [String]
58
- def wikibase_type
59
- 'quantity'
60
- end
61
-
62
- # The "datatype" value used by Wikibase, usually identical to wikibase_type
63
- # but not always.
64
- #
65
- # @return [String]
66
- def wikibase_datatype
67
- wikibase_type
68
- end
69
-
70
- # @!visibility private
71
- def self.marshal_load(data_value_json)
72
- Wikidatum::DataValueType::Base.new(
73
- type: :quantity,
74
- value: new(
75
- amount: data_value_json['amount'],
76
- upper_bound: data_value_json['upperBound'],
77
- lower_bound: data_value_json['lowerBound'],
78
- unit: data_value_json['unit']
79
- )
80
- )
81
- end
82
-
83
- # @!visibility private
84
- def marshal_dump
85
- {
86
- amount: @amount,
87
- upperBound: @upper_bound,
88
- lowerBound: @lower_bound,
89
- unit: @unit
90
- }
91
- end
92
- end