wikidata_position_history 1.6.0 → 1.7.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/lib/sparql/{bio_data.rb → bio_query.rb} +2 -2
- data/lib/sparql/item_query.rb +5 -1
- data/lib/sparql/{mandates.rb → mandates_query.rb} +2 -2
- data/lib/sparql/{position_data.rb → position_query.rb} +18 -6
- data/lib/wikidata_position_history.rb +3 -3
- data/lib/wikidata_position_history/report.rb +66 -6
- data/lib/wikidata_position_history/template.rb +8 -2
- data/lib/wikidata_position_history/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dc98f35825bd450d052eaf0bbb84934db297933bce312b88fd8b545474b742bf
|
|
4
|
+
data.tar.gz: 663abb5df3df62744eebbdeaea9ce2e63bf90aeff5335bf2406ae66306dd7608
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d06f8f44b1b84107e9bed22f158479f2be66569511ee1f9dea33ceaa788a9cff118b15e3e0960723cc943a290f832c6442f5c8c8659fb275002449e57c90d285
|
|
7
|
+
data.tar.gz: edae0f0fc3223778d655546c873792f81da0f514c50be44e27a192717df11c2672eedc251e2cf210ab4e623cdd0c5a232b6e65671c7cc9b2a356a1498ed3426f
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
# [1.7.0] 2020-09-08
|
|
4
|
+
|
|
5
|
+
# Enchancements
|
|
6
|
+
|
|
7
|
+
* Yesterday’s future, when we said we'd do something a little better
|
|
8
|
+
with positions that have multiple inception or abolition dates, has
|
|
9
|
+
arrived. Now we display all of them (with a warning), rather than just
|
|
10
|
+
picking one semi-randomly.
|
|
11
|
+
|
|
12
|
+
# Improvements
|
|
13
|
+
|
|
14
|
+
* A query like https://w.wiki/bVz is taking about 6 seconds to run.
|
|
15
|
+
Changing that to https://w.wiki/bW3 drops that to about half a second.
|
|
16
|
+
If you were to guess that the first has now been replaced by the
|
|
17
|
+
second, you'd be entirely correct.
|
|
18
|
+
|
|
3
19
|
# [1.6.0] 2020-09-07
|
|
4
20
|
|
|
5
21
|
## Enhancements
|
|
@@ -7,7 +7,7 @@ module WikidataPositionHistory
|
|
|
7
7
|
# This is distinct from the mandate query itself to avoid complex
|
|
8
8
|
# GROUP BY scenarios where people have multiple values for
|
|
9
9
|
# biographical properties.
|
|
10
|
-
class
|
|
10
|
+
class BioQuery < ItemQuery
|
|
11
11
|
def raw_sparql
|
|
12
12
|
<<~SPARQL
|
|
13
13
|
# holder-biodata
|
|
@@ -24,7 +24,7 @@ module WikidataPositionHistory
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
# Represents a single row returned from the Position query
|
|
27
|
-
class
|
|
27
|
+
class BioRow
|
|
28
28
|
def initialize(row)
|
|
29
29
|
@row = row
|
|
30
30
|
end
|
data/lib/sparql/item_query.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module WikidataPositionHistory
|
|
4
4
|
module SPARQL
|
|
5
5
|
# SPARQL for fetching all officeholdings of a position
|
|
6
|
-
class
|
|
6
|
+
class MandatesQuery < ItemQuery
|
|
7
7
|
def raw_sparql
|
|
8
8
|
<<~SPARQL
|
|
9
9
|
# position-mandates
|
|
@@ -28,7 +28,7 @@ module WikidataPositionHistory
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# Represents a single row returned from the Mandates query
|
|
31
|
-
class
|
|
31
|
+
class MandateRow
|
|
32
32
|
def initialize(row)
|
|
33
33
|
@row = row
|
|
34
34
|
end
|
|
@@ -3,30 +3,42 @@
|
|
|
3
3
|
module WikidataPositionHistory
|
|
4
4
|
module SPARQL
|
|
5
5
|
# SPARQL for fetching metadata about a position
|
|
6
|
-
class
|
|
6
|
+
class PositionQuery < ItemQuery
|
|
7
7
|
def raw_sparql
|
|
8
8
|
<<~SPARQL
|
|
9
9
|
# position-metadata
|
|
10
10
|
|
|
11
|
-
SELECT DISTINCT ?inception ?inception_precision ?abolition ?abolition_precision ?isPosition
|
|
11
|
+
SELECT DISTINCT ?item ?inception ?inception_precision ?abolition ?abolition_precision ?isPosition
|
|
12
12
|
WHERE {
|
|
13
13
|
VALUES ?item { wd:%s }
|
|
14
|
-
BIND(EXISTS {
|
|
15
|
-
OPTIONAL { ?item p:P571
|
|
16
|
-
|
|
14
|
+
BIND(EXISTS { wd:%s wdt:P279+ wd:Q4164871 } as ?isPosition)
|
|
15
|
+
OPTIONAL { ?item p:P571 [ a wikibase:BestRank ;
|
|
16
|
+
psv:P571 [ wikibase:timeValue ?inception; wikibase:timePrecision ?inception_precision ]
|
|
17
|
+
] }
|
|
18
|
+
OPTIONAL { ?item p:P576 [ a wikibase:BestRank ;
|
|
19
|
+
psv:P576 [ wikibase:timeValue ?abolition; wikibase:timePrecision ?abolition_precision ]
|
|
20
|
+
] }
|
|
17
21
|
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
|
|
18
22
|
}
|
|
19
23
|
SPARQL
|
|
20
24
|
end
|
|
25
|
+
|
|
26
|
+
def sparql_args
|
|
27
|
+
[itemid, itemid]
|
|
28
|
+
end
|
|
21
29
|
end
|
|
22
30
|
end
|
|
23
31
|
|
|
24
32
|
# Represents a single row returned from the Position query
|
|
25
|
-
class
|
|
33
|
+
class PositionRow
|
|
26
34
|
def initialize(row)
|
|
27
35
|
@row = row
|
|
28
36
|
end
|
|
29
37
|
|
|
38
|
+
def item
|
|
39
|
+
QueryService::WikidataItem.new(row.dig(:item, :value))
|
|
40
|
+
end
|
|
41
|
+
|
|
30
42
|
def inception_date
|
|
31
43
|
return if inception_date_raw.empty?
|
|
32
44
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
require 'query_service'
|
|
4
4
|
require 'sparql/item_query'
|
|
5
|
-
require 'sparql/
|
|
6
|
-
require 'sparql/
|
|
7
|
-
require 'sparql/
|
|
5
|
+
require 'sparql/position_query'
|
|
6
|
+
require 'sparql/bio_query'
|
|
7
|
+
require 'sparql/mandates_query'
|
|
8
8
|
require 'wikidata_position_history/checks'
|
|
9
9
|
require 'wikidata_position_history/template'
|
|
10
10
|
require 'wikidata_position_history/report'
|
|
@@ -40,6 +40,68 @@ module WikidataPositionHistory
|
|
|
40
40
|
attr_reader :later, :current, :earlier
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
# Data about the position itself, to be passed to the report template
|
|
44
|
+
class Metadata
|
|
45
|
+
# simplified version of a WikidataPositionHistory::Check
|
|
46
|
+
Warning = Struct.new(:headline, :explanation)
|
|
47
|
+
|
|
48
|
+
def initialize(rows)
|
|
49
|
+
@rows = rows
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def item
|
|
53
|
+
rows.map(&:item).first
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def inception_date
|
|
57
|
+
return if inception_dates.empty?
|
|
58
|
+
|
|
59
|
+
inception_dates.join(' / ')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def inception_warning
|
|
63
|
+
count = inception_dates.count
|
|
64
|
+
|
|
65
|
+
return if count == 1
|
|
66
|
+
return Warning.new('Missing field', "#{item_qlink} is missing {{P|571}}") if count.zero?
|
|
67
|
+
|
|
68
|
+
Warning.new('Multiple values', "#{item_qlink} has more than one {{P|571}}")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def abolition_date
|
|
72
|
+
return if abolition_dates.empty?
|
|
73
|
+
|
|
74
|
+
abolition_dates.join(' / ')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def abolition_warning
|
|
78
|
+
return unless abolition_dates.count > 1
|
|
79
|
+
|
|
80
|
+
Warning.new('Multiple values', "#{item_qlink} has more than one {{P|576}}")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def position?
|
|
84
|
+
# this should be the same everywhere
|
|
85
|
+
rows.map(&:position?).first
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
attr_reader :rows
|
|
91
|
+
|
|
92
|
+
def inception_dates
|
|
93
|
+
rows.map(&:inception_date).compact.uniq(&:to_s).sort
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def abolition_dates
|
|
97
|
+
rows.map(&:abolition_date).compact.uniq(&:to_s).sort
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def item_qlink
|
|
101
|
+
item.qlink
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
43
105
|
# The entire wikitext generated for this report
|
|
44
106
|
class Report
|
|
45
107
|
def initialize(position_id, template_class = ReportTemplate)
|
|
@@ -81,13 +143,11 @@ module WikidataPositionHistory
|
|
|
81
143
|
private
|
|
82
144
|
|
|
83
145
|
def metadata
|
|
84
|
-
|
|
85
|
-
# multiple dates
|
|
86
|
-
@metadata ||= SPARQL::PositionData.new(position_id).results_as(PositionData).first
|
|
146
|
+
@metadata ||= Metadata.new(SPARQL::PositionQuery.new(position_id).results_as(PositionRow))
|
|
87
147
|
end
|
|
88
148
|
|
|
89
149
|
def biodata
|
|
90
|
-
@biodata ||= SPARQL::
|
|
150
|
+
@biodata ||= SPARQL::BioQuery.new(position_id).results_as(BioRow)
|
|
91
151
|
end
|
|
92
152
|
|
|
93
153
|
def biodata_for(officeholder)
|
|
@@ -99,11 +159,11 @@ module WikidataPositionHistory
|
|
|
99
159
|
end
|
|
100
160
|
|
|
101
161
|
def sparql
|
|
102
|
-
@sparql ||= SPARQL::
|
|
162
|
+
@sparql ||= SPARQL::MandatesQuery.new(position_id)
|
|
103
163
|
end
|
|
104
164
|
|
|
105
165
|
def mandates
|
|
106
|
-
@mandates ||= sparql.results_as(
|
|
166
|
+
@mandates ||= sparql.results_as(MandateRow)
|
|
107
167
|
end
|
|
108
168
|
|
|
109
169
|
def no_items_output
|
|
@@ -25,7 +25,10 @@ module WikidataPositionHistory
|
|
|
25
25
|
<% if metadata.abolition_date -%>
|
|
26
26
|
|-
|
|
27
27
|
| colspan="3" style="padding:0.5em 2em; border: none; background: #fff; font-size: 1.25em; text-align: right;" | '''Position abolished''': <%= metadata.abolition_date %>
|
|
28
|
-
| style="padding:0.5em 2em 0.5em 1em; border: none; background: #fff; text-align: left;" |
|
|
28
|
+
| style="padding:0.5em 2em 0.5em 1em; border: none; background: #fff; text-align: left;" | \
|
|
29
|
+
<% [metadata.abolition_warning].compact.each do |warning| -%>
|
|
30
|
+
<span style="display: block">[[File:Pictogram voting comment.svg|15px|link=]] <span style="color: #d33; font-weight: bold; vertical-align: middle;"><%= warning.headline %></span> <ref><%= warning.explanation %></ref></span>\
|
|
31
|
+
<% end %>
|
|
29
32
|
<% end -%>
|
|
30
33
|
<% table_rows.map(&:values).each do |mandate, bio| -%>
|
|
31
34
|
|-
|
|
@@ -40,7 +43,10 @@ module WikidataPositionHistory
|
|
|
40
43
|
<% if metadata.inception_date -%>
|
|
41
44
|
|-
|
|
42
45
|
| colspan="3" style="padding:0.5em 2em; border: none; background: #fff; font-size: 1.25em; text-align: right;" | '''Position created''': <%= metadata.inception_date %>
|
|
43
|
-
| style="padding:0.5em 2em 0.5em 1em; border: none; background: #fff; text-align: left;" |
|
|
46
|
+
| style="padding:0.5em 2em 0.5em 1em; border: none; background: #fff; text-align: left;" | \
|
|
47
|
+
<% [metadata.inception_warning].compact.each do |warning| -%>
|
|
48
|
+
<span style="display: block">[[File:Pictogram voting comment.svg|15px|link=]] <span style="color: #d33; font-weight: bold; vertical-align: middle;"><%= warning.headline %></span> <ref><%= warning.explanation %></ref></span>\
|
|
49
|
+
<% end %>
|
|
44
50
|
<% end -%>
|
|
45
51
|
|}
|
|
46
52
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wikidata_position_history
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tony Bowden
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2020-09-
|
|
12
|
+
date: 2020-09-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: mediawiki-replaceable-content
|
|
@@ -204,10 +204,10 @@ files:
|
|
|
204
204
|
- exe/position-history-for-item
|
|
205
205
|
- exe/update_wikidata_page
|
|
206
206
|
- lib/query_service.rb
|
|
207
|
-
- lib/sparql/
|
|
207
|
+
- lib/sparql/bio_query.rb
|
|
208
208
|
- lib/sparql/item_query.rb
|
|
209
|
-
- lib/sparql/
|
|
210
|
-
- lib/sparql/
|
|
209
|
+
- lib/sparql/mandates_query.rb
|
|
210
|
+
- lib/sparql/position_query.rb
|
|
211
211
|
- lib/wikidata_position_history.rb
|
|
212
212
|
- lib/wikidata_position_history/checks.rb
|
|
213
213
|
- lib/wikidata_position_history/report.rb
|