wikidata_position_history 2.2.0 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/wikidata_position_history.rb +12 -0
- data/lib/wikidata_position_history/report.rb +15 -99
- data/lib/wikidata_position_history/report/abstract.rb +20 -0
- data/lib/wikidata_position_history/report/constituency.rb +26 -0
- data/lib/wikidata_position_history/report/legislator.rb +12 -0
- data/lib/wikidata_position_history/report/mandate.rb +61 -0
- data/lib/wikidata_position_history/report/position.rb +16 -0
- data/lib/wikidata_position_history/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 43d866e3ec1ab0f61a2d8d66d46757dff7ecfd66f4c39bb7a1f90125befb3586
|
|
4
|
+
data.tar.gz: 9ac67f8d608c4ce7cc746b4e035664cfed07c5501f117d075fb3ab11444a4a69
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 24824e0ad6207a9a3c8b3e8a547a6eda2dc7e9ee5f6503995dd330c82ecb2bab11a4c4655c3fddd1d8c0235b13bc6d607010901147f305d736e46cdd959c1688
|
|
7
|
+
data.tar.gz: 257e34dc5e7855720b101d33d2bbf8404f1d4486270667653d1386e077ae4fbdc631b1edba4c7439f3c5f16b4cb80e6932c53d70c136577456d758fe55963b0d
|
data/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,18 @@ require 'date'
|
|
|
16
16
|
require 'mediawiki/client'
|
|
17
17
|
require 'mediawiki/page'
|
|
18
18
|
|
|
19
|
+
module MediaWiki
|
|
20
|
+
# mediawiki-page-replaceable_content does not provide a way to set a
|
|
21
|
+
# bot flag, so we need to monkey patch it. This should really be
|
|
22
|
+
# exposed somewhere in its interface.
|
|
23
|
+
class Client
|
|
24
|
+
def edit(hash)
|
|
25
|
+
hash['bot'] = ENV['PHH_BOT'] if ENV.key?('PHH_BOT')
|
|
26
|
+
wrapped_client.edit(hash)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
19
31
|
module WikidataPositionHistory
|
|
20
32
|
# Rewrites a Wiki page
|
|
21
33
|
class PageRewriter
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'report/abstract'
|
|
4
|
+
require_relative 'report/legislator'
|
|
5
|
+
require_relative 'report/mandate'
|
|
6
|
+
require_relative 'report/constituency'
|
|
7
|
+
require_relative 'report/position'
|
|
8
|
+
|
|
3
9
|
module WikidataPositionHistory
|
|
4
10
|
# A list made up of both direct and indirect claims, where we
|
|
5
11
|
# can tell which came from which, when required
|
|
@@ -102,122 +108,32 @@ module WikidataPositionHistory
|
|
|
102
108
|
end
|
|
103
109
|
end
|
|
104
110
|
|
|
105
|
-
# Construct the correct ReportConfig based on the position metadata
|
|
106
|
-
class ReportConfigFactory
|
|
107
|
-
def self.config(metadata)
|
|
108
|
-
return ReportConfig::Constituency.new if metadata.constituency?
|
|
109
|
-
|
|
110
|
-
ReportConfig::Position.new
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
private
|
|
114
|
-
|
|
115
|
-
attr_reader :metadata
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# Encapsulates the different configuration for each type of position
|
|
119
|
-
module ReportConfig
|
|
120
|
-
# Configuration for 'default' single-holder position
|
|
121
|
-
class Position
|
|
122
|
-
def mandates_query
|
|
123
|
-
SPARQL::MandatesQuery
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def biodata_query
|
|
127
|
-
SPARQL::BioQuery
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Configuration for representatives of a single-member constituency
|
|
132
|
-
class Constituency
|
|
133
|
-
def mandates_query
|
|
134
|
-
SPARQL::ConstituencyMandatesQuery
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def biodata_query
|
|
138
|
-
SPARQL::ConstituencyBioQuery
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def multimember_error_template
|
|
142
|
-
"\n{{PositionHolderHistory/error_multimember}}\n"
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
111
|
# The entire wikitext generated for this report
|
|
148
112
|
class Report
|
|
149
|
-
def initialize(position_id
|
|
113
|
+
def initialize(position_id)
|
|
150
114
|
@position_id = position_id
|
|
151
115
|
@template_class = template_class
|
|
152
116
|
end
|
|
153
117
|
|
|
154
118
|
attr_reader :position_id, :template_class
|
|
155
119
|
|
|
156
|
-
def wikitext
|
|
157
|
-
return legislator_template if metadata.legislator?
|
|
158
|
-
return config.multimember_error_template if metadata.constituency? && (metadata.representative_count != 1)
|
|
159
|
-
return no_items_output if mandates.empty?
|
|
160
|
-
|
|
161
|
-
template_class.new(template_params).output
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def template_params
|
|
165
|
-
{
|
|
166
|
-
metadata: metadata,
|
|
167
|
-
table_rows: table_rows,
|
|
168
|
-
sparql_url: sparql.wdqs_url,
|
|
169
|
-
}
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
private
|
|
173
|
-
|
|
174
120
|
def metadata
|
|
175
121
|
@metadata ||= Metadata.new(SPARQL::PositionQuery.new(position_id).results_as(PositionRow))
|
|
176
122
|
end
|
|
177
123
|
|
|
178
|
-
def
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def biodata_for(officeholder)
|
|
183
|
-
biodata.select { |bio| bio.person.id == officeholder.id }
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def padded_mandates
|
|
187
|
-
[nil, mandates, nil].flatten(1)
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def config
|
|
191
|
-
@config ||= ReportConfigFactory.config(metadata)
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def sparql
|
|
195
|
-
@sparql ||= config.mandates_query.new(position_id)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def biodata_sparql
|
|
199
|
-
config.biodata_query.new(position_id)
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def mandates
|
|
203
|
-
@mandates ||= sparql.results_as(MandateRow)
|
|
204
|
-
end
|
|
124
|
+
def report
|
|
125
|
+
return Report::Legislator.new(metadata) if metadata.legislator?
|
|
126
|
+
return Report::Constituency.new(metadata) if metadata.constituency?
|
|
205
127
|
|
|
206
|
-
|
|
207
|
-
"\n{{PositionHolderHistory/error_no_holders|id=#{position_id}}}\n"
|
|
128
|
+
Report::Position.new(metadata)
|
|
208
129
|
end
|
|
209
130
|
|
|
210
|
-
def
|
|
211
|
-
|
|
131
|
+
def template_params
|
|
132
|
+
report.template_params
|
|
212
133
|
end
|
|
213
134
|
|
|
214
|
-
def
|
|
215
|
-
|
|
216
|
-
{
|
|
217
|
-
mandate: OutputRow::Mandate.new(later, current, earlier),
|
|
218
|
-
bio: biodata_for(current.officeholder),
|
|
219
|
-
}
|
|
220
|
-
end
|
|
135
|
+
def wikitext
|
|
136
|
+
report.wikitext
|
|
221
137
|
end
|
|
222
138
|
end
|
|
223
139
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WikidataPositionHistory
|
|
4
|
+
class Report
|
|
5
|
+
# Abstract base class for Reports
|
|
6
|
+
class Abstract
|
|
7
|
+
def initialize(metadata)
|
|
8
|
+
@metadata = metadata
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
protected
|
|
12
|
+
|
|
13
|
+
attr_reader :metadata
|
|
14
|
+
|
|
15
|
+
def position_id
|
|
16
|
+
metadata.position.id
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WikidataPositionHistory
|
|
4
|
+
class Report
|
|
5
|
+
# Report of representatives for a single-member consttuency
|
|
6
|
+
class Constituency < Mandate
|
|
7
|
+
def wikitext
|
|
8
|
+
return multimember_error_template unless metadata.representative_count == 1
|
|
9
|
+
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def mandates_query
|
|
14
|
+
SPARQL::ConstituencyMandatesQuery
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def biodata_query
|
|
18
|
+
SPARQL::ConstituencyBioQuery
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def multimember_error_template
|
|
22
|
+
"\n{{PositionHolderHistory/error_multimember}}\n"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WikidataPositionHistory
|
|
4
|
+
class Report
|
|
5
|
+
# Report for a (presumed multi-member) legislative position
|
|
6
|
+
class Legislator < Abstract
|
|
7
|
+
def wikitext
|
|
8
|
+
"\n{{PositionHolderHistory/error_legislator|id=#{position_id}}}\n"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WikidataPositionHistory
|
|
4
|
+
class Report
|
|
5
|
+
# base report where each row is one person holding an office for a period
|
|
6
|
+
class Mandate < Abstract
|
|
7
|
+
def wikitext
|
|
8
|
+
return no_items_output if mandates.empty?
|
|
9
|
+
|
|
10
|
+
ReportTemplate.new(template_params).output
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def template_params
|
|
14
|
+
{
|
|
15
|
+
metadata: metadata,
|
|
16
|
+
table_rows: table_rows,
|
|
17
|
+
sparql_url: sparql.wdqs_url,
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def biodata
|
|
24
|
+
@biodata ||= biodata_sparql.results_as(BioRow)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def biodata_for(officeholder)
|
|
28
|
+
biodata.select { |bio| bio.person.id == officeholder.id }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def padded_mandates
|
|
32
|
+
[nil, mandates, nil].flatten(1)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def sparql
|
|
36
|
+
@sparql ||= mandates_query.new(position_id)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def biodata_sparql
|
|
40
|
+
biodata_query.new(position_id)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def mandates
|
|
44
|
+
@mandates ||= sparql.results_as(MandateRow)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def no_items_output
|
|
48
|
+
"\n{{PositionHolderHistory/error_no_holders|id=#{position_id}}}\n"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def table_rows
|
|
52
|
+
padded_mandates.each_cons(3).map do |later, current, earlier|
|
|
53
|
+
{
|
|
54
|
+
mandate: OutputRow::Mandate.new(later, current, earlier),
|
|
55
|
+
bio: biodata_for(current.officeholder),
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WikidataPositionHistory
|
|
4
|
+
class Report
|
|
5
|
+
# The default single-person-at-a-time position
|
|
6
|
+
class Position < Mandate
|
|
7
|
+
def mandates_query
|
|
8
|
+
SPARQL::MandatesQuery
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def biodata_query
|
|
12
|
+
SPARQL::BioQuery
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
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: 2.
|
|
4
|
+
version: 2.3.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-
|
|
12
|
+
date: 2020-10-01 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: mediawiki-replaceable-content
|
|
@@ -212,6 +212,11 @@ files:
|
|
|
212
212
|
- lib/wikidata_position_history/checks.rb
|
|
213
213
|
- lib/wikidata_position_history/output_row.rb
|
|
214
214
|
- lib/wikidata_position_history/report.rb
|
|
215
|
+
- lib/wikidata_position_history/report/abstract.rb
|
|
216
|
+
- lib/wikidata_position_history/report/constituency.rb
|
|
217
|
+
- lib/wikidata_position_history/report/legislator.rb
|
|
218
|
+
- lib/wikidata_position_history/report/mandate.rb
|
|
219
|
+
- lib/wikidata_position_history/report/position.rb
|
|
215
220
|
- lib/wikidata_position_history/template.rb
|
|
216
221
|
- lib/wikidata_position_history/version.rb
|
|
217
222
|
- wikidata_position_history.gemspec
|