wikidatum 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+
5
+ # The Quantity type JSON looks like this:
6
+ #
7
+ # ```json
8
+ # {
9
+ # "property": {
10
+ # "id": "P937",
11
+ # "data-type": "quantity"
12
+ # },
13
+ # "value": {
14
+ # "type": "value",
15
+ # "content": {
16
+ # "amount": "+15",
17
+ # "unit": "1"
18
+ # }
19
+ # }
20
+ # }
21
+ # ```
22
+ class Wikidatum::DataType::Quantity
23
+ # @return [String] A string value like "+2", usually an integer but not always.
24
+ attr_reader :amount
25
+
26
+ # @return [String] a URL describing the unit for this quantity, e.g. "meter", "kilometer", "pound", "chapter", "section", etc.
27
+ attr_reader :unit
28
+
29
+ # @param amount [String]
30
+ # @param unit [String]
31
+ # @return [void]
32
+ def initialize(amount:, unit:)
33
+ @amount = amount
34
+ @unit = unit
35
+ end
36
+
37
+ # @return [Hash]
38
+ def to_h
39
+ {
40
+ amount: @amount,
41
+ unit: @unit
42
+ }
43
+ end
44
+
45
+ # The "type" value used by Wikibase, for use when creating/updating statements.
46
+ #
47
+ # @return [String]
48
+ def wikibase_type
49
+ 'quantity'
50
+ end
51
+
52
+ # @return [Symbol]
53
+ def self.symbolized_name
54
+ :quantity
55
+ end
56
+
57
+ # @!visibility private
58
+ def self.marshal_load(data_value_json)
59
+ Wikidatum::DataType::Base.new(
60
+ type: symbolized_name,
61
+ content: new(
62
+ amount: data_value_json['amount'],
63
+ unit: data_value_json['unit']
64
+ )
65
+ )
66
+ end
67
+
68
+ # @!visibility private
69
+ def marshal_dump
70
+ {
71
+ amount: @amount,
72
+ unit: @unit
73
+ }
74
+ end
75
+ end
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'wikidatum/data_value_type/base'
3
+ require 'wikidatum/data_type/base'
4
4
 
5
5
  # The SomeValue type actually has no datavalue key in the blob at all. We work
6
6
  # around this by just passing nil to the serializer.
7
7
 
8
8
  # Represents a value of "unknown value".
9
- class Wikidatum::DataValueType::SomeValue < Wikidatum::DataValueType::Base
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
12
  # @return [String]
@@ -14,16 +14,8 @@ class Wikidatum::DataValueType::SomeValue < Wikidatum::DataValueType::Base
14
14
  'string'
15
15
  end
16
16
 
17
- # The "datatype" value used by Wikibase, usually identical to wikibase_type
18
- # but not always.
19
- #
20
- # @return [String]
21
- def wikibase_datatype
22
- wikibase_type
23
- end
24
-
25
17
  # @!visibility private
26
18
  def self.marshal_load(_data_value_json)
27
- new(type: :some_value, value: nil)
19
+ new(type: :some_value, content: nil)
28
20
  end
29
21
  end
@@ -1,33 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'wikidatum/data_value_type/base'
3
+ require 'wikidatum/data_type/base'
4
4
 
5
- # The time type datavalue JSON looks like this:
5
+ # The time type JSON looks like this:
6
6
  #
7
7
  # ```json
8
8
  # {
9
- # "datavalue": {
10
- # "value": {
9
+ # "property": {
10
+ # "id": "P761",
11
+ # "data-type": "time"
12
+ # },
13
+ # "value": {
14
+ # "type": "value",
15
+ # "content": {
11
16
  # "time": "+2019-11-14T00:00:00Z",
12
- # "timezone": 0,
13
- # "before": 0,
14
- # "after": 0,
15
17
  # "precision": 11,
16
18
  # "calendarmodel": "http://www.wikidata.org/entity/Q1985727"
17
- # },
18
- # "type": "time"
19
+ # }
19
20
  # }
20
21
  # }
21
22
  # ```
22
23
  #
23
- # We do not include before and after because the documentation states that
24
- # they're unused and "may be removed in the future".
25
- #
26
- # NOTE: For consistency with Ruby snake_case attribute names, `timezone` from
27
- # the API is represented as `time_zone` and `calendarmodel` is
28
- # `calendar_model`. However, we expose aliases so `timezone` and
24
+ # NOTE: For consistency with Ruby snake_case attribute names, `calendarmodel`
25
+ # in the API is `calendar_model`. However, we expose an alias so
29
26
  # `calendarmodel` will still work.
30
- class Wikidatum::DataValueType::Time
27
+ class Wikidatum::DataType::Time
31
28
  # A string representing the time in a format that is very similar to ISO 8601.
32
29
  #
33
30
  # For example, here are what dates look like for the most common precisions:
@@ -48,11 +45,6 @@ class Wikidatum::DataValueType::Time
48
45
  # @return [String] the time value, in a format like "+2022-01-01T00:00:00Z", though how this should be interpreted depends on the precision.
49
46
  attr_reader :time
50
47
 
51
- # @return [Integer] an integer for the offset (in minutes) from UTC. 0 means
52
- # UTC, will currently always be 0 but the Wikibase backend may change that
53
- # in the future.
54
- attr_reader :time_zone
55
-
56
48
  # An integer representing the precision of the date, where the integers correspond to the following:
57
49
  #
58
50
  # - 0: 1 Gigayear
@@ -91,13 +83,11 @@ class Wikidatum::DataValueType::Time
91
83
  attr_reader :calendar_model
92
84
 
93
85
  # @param time [String]
94
- # @param time_zone [Integer]
95
86
  # @param precision [Integer]
96
87
  # @param calendar_model [String]
97
88
  # @return [void]
98
- def initialize(time:, time_zone:, precision:, calendar_model:)
89
+ def initialize(time:, precision:, calendar_model:)
99
90
  @time = time
100
- @time_zone = time_zone
101
91
  @precision = precision
102
92
  @calendar_model = calendar_model
103
93
  end
@@ -106,7 +96,6 @@ class Wikidatum::DataValueType::Time
106
96
  def to_h
107
97
  {
108
98
  time: @time,
109
- time_zone: @time_zone,
110
99
  precision: @precision,
111
100
  pretty_precision: pretty_precision,
112
101
  calendar_model: @calendar_model
@@ -120,21 +109,17 @@ class Wikidatum::DataValueType::Time
120
109
  'time'
121
110
  end
122
111
 
123
- # The "datatype" value used by Wikibase, usually identical to wikibase_type
124
- # but not always.
125
- #
126
- # @return [String]
127
- def wikibase_datatype
128
- wikibase_type
112
+ # @return [Symbol]
113
+ def self.symbolized_name
114
+ :time
129
115
  end
130
116
 
131
117
  # @!visibility private
132
118
  def self.marshal_load(data_value_json)
133
- Wikidatum::DataValueType::Base.new(
134
- type: :time,
135
- value: new(
119
+ Wikidatum::DataType::Base.new(
120
+ type: symbolized_name,
121
+ content: new(
136
122
  time: data_value_json['time'],
137
- time_zone: data_value_json['timezone'],
138
123
  precision: data_value_json['precision'],
139
124
  calendar_model: data_value_json['calendarmodel']
140
125
  )
@@ -145,7 +130,6 @@ class Wikidatum::DataValueType::Time
145
130
  def marshal_dump
146
131
  {
147
132
  time: @time,
148
- timezone: @time_zone,
149
133
  precision: @precision,
150
134
  calendarmodel: @calendar_model
151
135
  }
@@ -182,6 +166,5 @@ class Wikidatum::DataValueType::Time
182
166
 
183
167
  # Aliases to match the name returned by the REST API.
184
168
 
185
- alias timezone time_zone
186
169
  alias calendarmodel calendar_model
187
170
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+
5
+ # The Wikibase Item type JSON looks like this:
6
+ #
7
+ # ```json
8
+ # {
9
+ # "property": {
10
+ # "id": "P963",
11
+ # "data-type": "wikibase-item"
12
+ # },
13
+ # "value": {
14
+ # "type": "value",
15
+ # "content": "Q524026"
16
+ # }
17
+ # }
18
+ # ```
19
+ class Wikidatum::DataType::WikibaseItem
20
+ # @return [String] in the format "Q123".
21
+ attr_reader :id
22
+
23
+ # @param id [String]
24
+ # @return [void]
25
+ def initialize(id:)
26
+ @id = id
27
+ end
28
+
29
+ # @return [Hash]
30
+ def to_h
31
+ {
32
+ id: @id
33
+ }
34
+ end
35
+
36
+ # The "type" value used by Wikibase, for use when creating/updating statements.
37
+ #
38
+ # @return [String]
39
+ def wikibase_type
40
+ 'wikibase-item'
41
+ end
42
+
43
+ # @return [Symbol]
44
+ def self.symbolized_name
45
+ :wikibase_item
46
+ end
47
+
48
+ # @!visibility private
49
+ def self.marshal_load(id)
50
+ Wikidatum::DataType::Base.new(
51
+ type: symbolized_name,
52
+ content: new(
53
+ id: id
54
+ )
55
+ )
56
+ end
57
+
58
+ # @!visibility private
59
+ def marshal_dump
60
+ @id
61
+ end
62
+ end
@@ -1,18 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'wikidatum/data_value_type/base'
3
+ require 'wikidatum/data_type/base'
4
4
 
5
- # The String type datavalue JSON looks like this:
5
+ # The String type JSON looks like this:
6
6
  #
7
7
  # ```json
8
8
  # {
9
- # "datavalue": {
10
- # "value": "Foobar",
11
- # "type": "string"
9
+ # "property": {
10
+ # "id": "P143",
11
+ # "data-type": "string"
12
+ # },
13
+ # "value": {
14
+ # "type": "value",
15
+ # "content": "foo"
12
16
  # }
13
17
  # }
14
18
  # ```
15
- class Wikidatum::DataValueType::WikibaseString
19
+ class Wikidatum::DataType::WikibaseString
16
20
  # @return [String] the value for the string.
17
21
  attr_reader :string
18
22
 
@@ -36,19 +40,16 @@ class Wikidatum::DataValueType::WikibaseString
36
40
  'string'
37
41
  end
38
42
 
39
- # The "datatype" value used by Wikibase, usually identical to wikibase_type
40
- # but not always.
41
- #
42
- # @return [String]
43
- def wikibase_datatype
44
- wikibase_type
43
+ # @return [Symbol]
44
+ def self.symbolized_name
45
+ :string
45
46
  end
46
47
 
47
48
  # @!visibility private
48
49
  def self.marshal_load(string)
49
- Wikidatum::DataValueType::Base.new(
50
- type: :string,
51
- value: new(
50
+ Wikidatum::DataType::Base.new(
51
+ type: symbolized_name,
52
+ content: new(
52
53
  string: string
53
54
  )
54
55
  )
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'wikidatum/data_type/base'
4
+ require 'wikidatum/data_type/globe_coordinate'
5
+ require 'wikidatum/data_type/monolingual_text'
6
+ require 'wikidatum/data_type/no_value'
7
+ require 'wikidatum/data_type/quantity'
8
+ require 'wikidatum/data_type/some_value'
9
+ require 'wikidatum/data_type/time'
10
+ require 'wikidatum/data_type/wikibase_item'
11
+ require 'wikidatum/data_type/wikibase_string'
@@ -186,8 +186,8 @@ class Wikidatum::Item
186
186
  statements = item_json['statements'].to_a.flat_map do |_property_id, st_arr|
187
187
  st_arr.map { |statement| Wikidatum::Statement.marshal_load(statement) }
188
188
  end
189
- sitelinks = item_json['sitelinks'].to_a.map do |_name, sitelink|
190
- Wikidatum::Sitelink.new(site: sitelink['site'], title: sitelink['title'], badges: sitelink['badges'])
189
+ sitelinks = item_json['sitelinks'].to_a.map do |site, sitelink|
190
+ Wikidatum::Sitelink.new(site: site, title: sitelink['title'], badges: sitelink['badges'])
191
191
  end
192
192
 
193
193
  Wikidatum::Item.new(
@@ -1,7 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'wikidatum/snak'
3
+ class Wikidatum::Qualifier
4
+ # @return [String] ID of the property for this Qualifier, in the format 'P123'.
5
+ attr_reader :property_id
4
6
 
5
- # Wikidatum::Qualifier is actually just an alias for snak, because qualifiers
6
- # are effectively just snaks.
7
- Wikidatum::Qualifier = Wikidatum::Snak
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 for this Qualifier, 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::Qualifier 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
+ # qualifier the API and turns it into an actual instance of a Qualifier.
45
+ #
46
+ # @param qualifier_json [Hash]
47
+ # @return [Wikidatum::Qualifier]
48
+ def self.marshal_load(qualifier_json)
49
+ Wikidatum::Qualifier.new(
50
+ property_id: qualifier_json.dig('property', 'id'),
51
+ data_type: qualifier_json.dig('property', 'data-type'),
52
+ value: Wikidatum::Utils.ingest_snak(qualifier_json)
53
+ )
54
+ end
55
+ end
@@ -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.1'
4
+ VERSION = '0.3.1'
5
5
  end