pumi 0.19.0 → 0.20.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.
data/data/provinces.yml CHANGED
@@ -10,6 +10,15 @@ provinces:
10
10
  en: Province
11
11
  links:
12
12
  wikipedia: https://en.wikipedia.org/wiki/Banteay_Meanchey_province
13
+ geodata:
14
+ lat: '13.7989147'
15
+ long: '102.8862666'
16
+ bounding_box:
17
+ - '13.3579351'
18
+ - '14.2502283'
19
+ - '102.3338282'
20
+ - '103.4427283'
21
+ iso3166_2: KH-1
13
22
  '02':
14
23
  name:
15
24
  km: បាត់ដំបង
@@ -20,6 +29,15 @@ provinces:
20
29
  en: Province
21
30
  links:
22
31
  wikipedia: https://en.wikipedia.org/wiki/Battambang_province
32
+ geodata:
33
+ lat: '12.9256791'
34
+ long: '103.23171364274523'
35
+ bounding_box:
36
+ - '12.3711193'
37
+ - '13.4793632'
38
+ - '102.3450807'
39
+ - '103.9011713'
40
+ iso3166_2: KH-2
23
41
  '03':
24
42
  name:
25
43
  km: កំពង់ចាម
@@ -30,6 +48,15 @@ provinces:
30
48
  en: Province
31
49
  links:
32
50
  wikipedia: https://en.wikipedia.org/wiki/Kampong_Cham_province
51
+ geodata:
52
+ lat: '12.1174857'
53
+ long: '105.20800220742942'
54
+ bounding_box:
55
+ - '11.7342165'
56
+ - '12.5014623'
57
+ - '104.8198072'
58
+ - '105.7759428'
59
+ iso3166_2: KH-3
33
60
  '04':
34
61
  name:
35
62
  km: កំពង់ឆ្នាំង
@@ -40,6 +67,15 @@ provinces:
40
67
  en: Province
41
68
  links:
42
69
  wikipedia: https://en.wikipedia.org/wiki/Kampong_Chhnang_province
70
+ geodata:
71
+ lat: '12.1382025'
72
+ long: '104.3354098'
73
+ bounding_box:
74
+ - '11.7344035'
75
+ - '12.6074435'
76
+ - '104.1710946'
77
+ - '104.9019904'
78
+ iso3166_2: KH-4
43
79
  '05':
44
80
  name:
45
81
  km: កំពង់ស្ពឺ
@@ -50,6 +86,15 @@ provinces:
50
86
  en: Province
51
87
  links:
52
88
  wikipedia: https://en.wikipedia.org/wiki/Kampong_Speu_province
89
+ geodata:
90
+ lat: '11.57753675'
91
+ long: '104.27140233242656'
92
+ bounding_box:
93
+ - '11.0779221'
94
+ - '12.0768453'
95
+ - '103.7729787'
96
+ - '104.7925761'
97
+ iso3166_2: KH-5
53
98
  '06':
54
99
  name:
55
100
  km: កំពង់ធំ
@@ -60,6 +105,15 @@ provinces:
60
105
  en: Province
61
106
  links:
62
107
  wikipedia: https://en.wikipedia.org/wiki/Kampong_Thom_province
108
+ geodata:
109
+ lat: '12.6687923'
110
+ long: '104.8879197'
111
+ bounding_box:
112
+ - '12.1886895'
113
+ - '13.4495556'
114
+ - '104.1734824'
115
+ - '105.7348383'
116
+ iso3166_2: KH-6
63
117
  '07':
64
118
  name:
65
119
  km: កំពត
@@ -70,6 +124,15 @@ provinces:
70
124
  en: Province
71
125
  links:
72
126
  wikipedia: https://en.wikipedia.org/wiki/Kampot_province
127
+ geodata:
128
+ lat: '10.6314754'
129
+ long: '104.132637'
130
+ bounding_box:
131
+ - '10.3536198'
132
+ - '11.1722266'
133
+ - '103.8390342'
134
+ - '104.727076'
135
+ iso3166_2: KH-7
73
136
  '08':
74
137
  name:
75
138
  km: កណ្តាល
@@ -80,6 +143,15 @@ provinces:
80
143
  en: Province
81
144
  links:
82
145
  wikipedia: https://en.wikipedia.org/wiki/Kandal_province
146
+ geodata:
147
+ lat: '11.396262499999999'
148
+ long: '105.02078685074581'
149
+ bounding_box:
150
+ - '10.8964776'
151
+ - '11.8943134'
152
+ - '104.6562154'
153
+ - '105.2971605'
154
+ iso3166_2: KH-8
83
155
  '09':
84
156
  name:
85
157
  km: កោះកុង
@@ -90,6 +162,15 @@ provinces:
90
162
  en: Province
91
163
  links:
92
164
  wikipedia: https://en.wikipedia.org/wiki/Koh_Kong_province
165
+ geodata:
166
+ lat: '11.6813417'
167
+ long: '103.0258043'
168
+ bounding_box:
169
+ - '10.6542293'
170
+ - '12.116263'
171
+ - '102.5849839'
172
+ - '104.0645553'
173
+ iso3166_2: KH-9
93
174
  '10':
94
175
  name:
95
176
  km: ក្រចេះ
@@ -100,6 +181,15 @@ provinces:
100
181
  en: Province
101
182
  links:
102
183
  wikipedia: https://en.wikipedia.org/wiki/Krati%C3%A9_province
184
+ geodata:
185
+ lat: '12.678301699999999'
186
+ long: '106.05817329824376'
187
+ bounding_box:
188
+ - '11.9494318'
189
+ - '13.4073182'
190
+ - '105.5871802'
191
+ - '106.8019914'
192
+ iso3166_2: KH-10
103
193
  '11':
104
194
  name:
105
195
  km: មណ្ឌលគិរី
@@ -110,6 +200,15 @@ provinces:
110
200
  en: Province
111
201
  links:
112
202
  wikipedia: https://en.wikipedia.org/wiki/Mondulkiri_province
203
+ geodata:
204
+ lat: '12.7396454'
205
+ long: '107.00882593208544'
206
+ bounding_box:
207
+ - '12.0614615'
208
+ - '13.4175148'
209
+ - '106.3385777'
210
+ - '107.6033126'
211
+ iso3166_2: KH-11
113
212
  '12':
114
213
  name:
115
214
  km: ភ្នំពេញ
@@ -120,6 +219,15 @@ provinces:
120
219
  en: Capital
121
220
  links:
122
221
  wikipedia: https://en.wikipedia.org/wiki/Phnom_Penh
222
+ geodata:
223
+ lat: '11.5730391'
224
+ long: '104.857807'
225
+ bounding_box:
226
+ - '11.4200852'
227
+ - '11.7349524'
228
+ - '104.7204046'
229
+ - '105.0440261'
230
+ iso3166_2: KH-12
123
231
  '13':
124
232
  name:
125
233
  km: ព្រះវិហារ
@@ -130,6 +238,15 @@ provinces:
130
238
  en: Province
131
239
  links:
132
240
  wikipedia: https://en.wikipedia.org/wiki/Preah_Vihear_province
241
+ geodata:
242
+ lat: '13.746298150000001'
243
+ long: '104.97403002709669'
244
+ bounding_box:
245
+ - '13.0553454'
246
+ - '14.4374188'
247
+ - '104.3579998'
248
+ - '105.8992487'
249
+ iso3166_2: KH-13
133
250
  '14':
134
251
  name:
135
252
  km: ព្រៃវែង
@@ -140,6 +257,15 @@ provinces:
140
257
  en: Province
141
258
  links:
142
259
  wikipedia: https://en.wikipedia.org/wiki/Prey_Veng_province
260
+ geodata:
261
+ lat: '11.365959700000001'
262
+ long: '105.45572772976189'
263
+ bounding_box:
264
+ - '10.8598854'
265
+ - '11.8712687'
266
+ - '105.1039948'
267
+ - '105.8091078'
268
+ iso3166_2: KH-14
143
269
  '15':
144
270
  name:
145
271
  km: ពោធិ៍សាត់
@@ -150,6 +276,15 @@ provinces:
150
276
  en: Province
151
277
  links:
152
278
  wikipedia: https://en.wikipedia.org/wiki/Pursat_province
279
+ geodata:
280
+ lat: '12.4662592'
281
+ long: '103.7426829518918'
282
+ bounding_box:
283
+ - '11.8432598'
284
+ - '13.0891438'
285
+ - '102.70351'
286
+ - '104.3951534'
287
+ iso3166_2: KH-15
153
288
  '16':
154
289
  name:
155
290
  km: រតនគិរី
@@ -160,6 +295,15 @@ provinces:
160
295
  en: Province
161
296
  links:
162
297
  wikipedia: https://en.wikipedia.org/wiki/Ratanakiri_province
298
+ geodata:
299
+ lat: '13.9311155'
300
+ long: '107.03914990288844'
301
+ bounding_box:
302
+ - '13.1721622'
303
+ - '14.6904224'
304
+ - '106.5301893'
305
+ - '107.6276788'
306
+ iso3166_2: KH-16
163
307
  '17':
164
308
  name:
165
309
  km: សៀមរាប
@@ -170,6 +314,15 @@ provinces:
170
314
  en: Province
171
315
  links:
172
316
  wikipedia: https://en.wikipedia.org/wiki/Siem_Reap_province
317
+ geodata:
318
+ lat: '13.314962'
319
+ long: '103.805433'
320
+ bounding_box:
321
+ - '12.7720495'
322
+ - '13.9718578'
323
+ - '103.3892306'
324
+ - '104.6832474'
325
+ iso3166_2: KH-17
173
326
  '18':
174
327
  name:
175
328
  km: ព្រះសីហនុ
@@ -180,6 +333,15 @@ provinces:
180
333
  en: Province
181
334
  links:
182
335
  wikipedia: https://en.wikipedia.org/wiki/Sihanoukville_province
336
+ geodata:
337
+ lat: '10.50614075'
338
+ long: '103.26205644863938'
339
+ bounding_box:
340
+ - '9.4110961'
341
+ - '11.436044'
342
+ - '102.6295604'
343
+ - '104.0772547'
344
+ iso3166_2: KH-18
183
345
  '19':
184
346
  name:
185
347
  km: ស្ទឹងត្រែង
@@ -190,6 +352,15 @@ provinces:
190
352
  en: Province
191
353
  links:
192
354
  wikipedia: https://en.wikipedia.org/wiki/Stung_Treng_province
355
+ geodata:
356
+ lat: '13.852468'
357
+ long: '106.0889848986395'
358
+ bounding_box:
359
+ - '13.1137001'
360
+ - '14.5919671'
361
+ - '105.5194671'
362
+ - '106.7891813'
363
+ iso3166_2: KH-19
193
364
  '20':
194
365
  name:
195
366
  km: ស្វាយរៀង
@@ -200,6 +371,15 @@ provinces:
200
371
  en: Province
201
372
  links:
202
373
  wikipedia: https://en.wikipedia.org/wiki/Svay_Rieng_province
374
+ geodata:
375
+ lat: '11.1942275'
376
+ long: '105.7973275083619'
377
+ bounding_box:
378
+ - '10.7889074'
379
+ - '11.5996145'
380
+ - '105.5796471'
381
+ - '106.206119'
382
+ iso3166_2: KH-20
203
383
  '21':
204
384
  name:
205
385
  km: តាកែវ
@@ -210,6 +390,15 @@ provinces:
210
390
  en: Province
211
391
  links:
212
392
  wikipedia: https://en.wikipedia.org/wiki/Tak%C3%A9o_province
393
+ geodata:
394
+ lat: '10.93539205'
395
+ long: '104.78988300047047'
396
+ bounding_box:
397
+ - '10.5187794'
398
+ - '11.3530403'
399
+ - '104.4101661'
400
+ - '105.0983022'
401
+ iso3166_2: KH-21
213
402
  '22':
214
403
  name:
215
404
  km: ឧត្តរមានជ័យ
@@ -220,6 +409,15 @@ provinces:
220
409
  en: Province
221
410
  links:
222
411
  wikipedia: https://en.wikipedia.org/wiki/Oddar_Meanchey_province
412
+ geodata:
413
+ lat: '14.1585631'
414
+ long: '103.78279595655918'
415
+ bounding_box:
416
+ - '13.8769057'
417
+ - '14.4403696'
418
+ - '103.0318699'
419
+ - '104.5085773'
420
+ iso3166_2: KH-22
223
421
  '23':
224
422
  name:
225
423
  km: កែប
@@ -230,6 +428,15 @@ provinces:
230
428
  en: Province
231
429
  links:
232
430
  wikipedia: https://en.wikipedia.org/wiki/Kep_province
431
+ geodata:
432
+ lat: '10.402153949999999'
433
+ long: '104.26506181616313'
434
+ bounding_box:
435
+ - '10.1548084'
436
+ - '10.5908859'
437
+ - '104.0710119'
438
+ - '104.4259394'
439
+ iso3166_2: KH-23
233
440
  '24':
234
441
  name:
235
442
  km: ប៉ៃលិន
@@ -240,6 +447,15 @@ provinces:
240
447
  en: Province
241
448
  links:
242
449
  wikipedia: https://en.wikipedia.org/wiki/Pailin_province
450
+ geodata:
451
+ lat: '12.89053285'
452
+ long: '102.62946042446026'
453
+ bounding_box:
454
+ - '12.663855'
455
+ - '13.1166697'
456
+ - '102.485444'
457
+ - '102.7533088'
458
+ iso3166_2: KH-24
243
459
  '25':
244
460
  name:
245
461
  km: ត្បូងឃ្មុំ
@@ -250,3 +466,12 @@ provinces:
250
466
  en: Province
251
467
  links:
252
468
  wikipedia: https://en.wikipedia.org/wiki/Tboung_Khmum_province
469
+ geodata:
470
+ lat: '11.950072599999999'
471
+ long: '105.824571891073'
472
+ bounding_box:
473
+ - '11.5995257'
474
+ - '12.3005412'
475
+ - '105.408445'
476
+ - '106.4674381'
477
+ iso3166_2: KH-25
@@ -0,0 +1,13 @@
1
+ module Pumi
2
+ module Bot
3
+ module Wikipedia
4
+ class Article
5
+ attr_reader :client
6
+
7
+ def initialize(client: Pumi::Wikipedia::Client.new)
8
+ @client = client
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,157 @@
1
+ require "ostruct"
2
+
3
+ module Pumi
4
+ module Bot
5
+ module Wikipedia
6
+ class CommunesInCambodiaArticle < Article
7
+ class Location < SimpleDelegator
8
+ def communes_summary
9
+ summary = communes_by_type.map do |administrative_unit, communes|
10
+ next if Array(communes).empty?
11
+
12
+ text = "#{communes.size} #{administrative_unit.name_en}"
13
+ text << "s" if communes.size > 1
14
+ text << " (#{administrative_unit.name_km} #{administrative_unit.name_latin})"
15
+ end
16
+
17
+ summary << "#{format_number(villages_count)} Villages (ភូមិ Phum)"
18
+
19
+ if summary.size <= 2
20
+ summary.join(" and ")
21
+ else
22
+ [summary[0..-2].join(", "), summary[-1]].join(" and ")
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def communes_by_type
29
+ communes.each_with_object({}) do |commune, result|
30
+ administrative_unit = commune.administrative_unit
31
+ result[administrative_unit] ||= []
32
+ result[administrative_unit] << commune
33
+ end
34
+ end
35
+
36
+ def format_number(number)
37
+ number.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
38
+ end
39
+ end
40
+
41
+ class Province < Location
42
+ def districts
43
+ Pumi::District.where(province_id: id).map { |district| District.new(district) }
44
+ end
45
+
46
+ def communes
47
+ Pumi::Commune.where(province_id: id)
48
+ end
49
+
50
+ def villages_count
51
+ Pumi::Village.where(province_id: id).count
52
+ end
53
+ end
54
+
55
+ class District < Location
56
+ def communes
57
+ Pumi::Commune.where(district_id: id)
58
+ end
59
+
60
+ def villages_count
61
+ Pumi::Village.where(district_id: id).count
62
+ end
63
+ end
64
+
65
+ PAGE_TITLE = "List_of_communes_in_Cambodia".freeze
66
+ INTRO_TEXT = "<div id=\"intro\">The '''communes of Cambodia''' ({{lang|km|ឃុំ}} ''[[khum]]''/{{lang|km|សង្កាត់}} ''[[sangkat]]'') are the third-level administrative divisions in Cambodia. They are the subdivisions of the [[List of districts in Cambodia|districts and municipalities of Cambodia]]. Communes can consist of as few as %<min_villages>s<ref>{{cite web|url=http://db.ncdd.gov.kh/gazetteer/view/commune.castle?cm=%<smallest_commune_id>s |title=%<smallest_commune_name>s |publisher=National Committee for Sub-National Democratic Development }}</ref> or as many as %<max_villages>s<ref>{{cite web|url=http://db.ncdd.gov.kh/gazetteer/view/commune.castle?cm=%<largest_commune_id>s |title=%<largest_commune_name>s |publisher=National Committee for Sub-National Democratic Development }}</ref> villages (''[[phum]]''), depending on the population.\nThere are a total of %<communes_count>s communes and %<villages_count>s villages in Cambodia.</div>".freeze
67
+
68
+ TEMPLATE = File.read("#{__dir__}/templates/commune_list.wikitext.erb")
69
+
70
+ def publish
71
+ replace_intro
72
+ replace_number_of_communes
73
+ replace_communes_list
74
+ client.update_page(title: PAGE_TITLE, source:, comment: "Update page")
75
+ end
76
+
77
+ private
78
+
79
+ def source_html
80
+ @source_html ||= Nokogiri::HTML(source)
81
+ end
82
+
83
+ def source
84
+ @source ||= page.fetch(:source).dup
85
+ end
86
+
87
+ def page
88
+ @page ||= client.get_page(title: PAGE_TITLE)
89
+ end
90
+
91
+ def intro_section
92
+ result = source_html.at_css('[id="intro"]')
93
+ raise "Could not find section with <div id=\"intro\">" if result.nil?
94
+
95
+ result
96
+ end
97
+
98
+ def communes_list_section
99
+ result = source_html.at_css('[id="communes-list"]')
100
+ raise "Could not find section with <div id=\"communes-list\">" if result.nil?
101
+
102
+ result
103
+ end
104
+
105
+ def replace_communes_list
106
+ provinces = Pumi::Province.all.map { |province| Province.new(province) }
107
+ data = OpenStruct.new(provinces:)
108
+ communes_list = ERB.new(TEMPLATE).result(data.instance_eval { binding })
109
+ source.sub!(communes_list_section.to_html, communes_list)
110
+ end
111
+
112
+ def replace_number_of_communes
113
+ source.sub!(
114
+ /current_number\s*=\s*(?:^|\s)(\d*\.?\d+|\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)/,
115
+ "current_number = #{format_number(Pumi::Commune.all.size)}"
116
+ )
117
+ end
118
+
119
+ def replace_intro
120
+ villages = Pumi::Village.all.each_with_object({}) do |village, result|
121
+ result[village.commune] ||= []
122
+
123
+ result[village.commune] << village
124
+ end
125
+
126
+ village_sizes = villages.each_with_object({}) do |(commune, villages), result|
127
+ result[villages.size] = commune
128
+ end
129
+
130
+ min_villages = village_sizes.keys.min
131
+ max_villages = village_sizes.keys.max
132
+
133
+ smallest_commune = village_sizes[min_villages]
134
+ largest_commune = village_sizes[max_villages]
135
+
136
+ intro = format(
137
+ INTRO_TEXT,
138
+ min_villages:,
139
+ max_villages:,
140
+ smallest_commune_id: smallest_commune.id,
141
+ smallest_commune_name: smallest_commune.name_en,
142
+ largest_commune_id: largest_commune.id,
143
+ largest_commune_name: largest_commune.name_en,
144
+ communes_count: format_number(Pumi::Commune.all.count),
145
+ villages_count: format_number(Pumi::Village.all.count)
146
+ )
147
+
148
+ source.sub!(intro_section.to_html, intro)
149
+ end
150
+
151
+ def format_number(number)
152
+ number.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,122 @@
1
+ require "ostruct"
2
+
3
+ module Pumi
4
+ module Bot
5
+ module Wikipedia
6
+ class DistrictsInCambodiaArticle < Article
7
+ PAGE_TITLE = "List_of_districts,_municipalities_and_sections_in_Cambodia".freeze
8
+
9
+ INTRO_TEXT = "This is a list of [[Cambodia]]'s %<districts_count>s districts ({{lang|km|ស្រុក}} ''srok''), %<municipalities_count>s district-level municipalities ({{lang|km|ក្រុង}} ''krong'') and %<sections_count>s sections ({{lang|km|ខណ្ឌ}} ''khan'') organized by each [[Provinces of Cambodia|province]] and an [[Provinces of Cambodia|autonomous municipality]] ([[Phnom Penh]]).".freeze
10
+ DISTRICTS_TEMPLATE = File.read("#{__dir__}/templates/district_list.wikitext.erb")
11
+
12
+ Misspelling = Struct.new(:incorrect_text, :correct_text, keyword_init: true)
13
+
14
+ MISSPELLINGS = [
15
+ Misspelling.new(incorrect_text: "Kratié", correct_text: "Kratie"),
16
+ Misspelling.new(incorrect_text: "Mondulkiri", correct_text: "Mondul Kiri"),
17
+ Misspelling.new(
18
+ incorrect_text: "Phnom Penh (autonomous municipality)",
19
+ correct_text: "Phnom Penh"
20
+ ),
21
+ Misspelling.new(incorrect_text: "Ratanakiri", correct_text: "Ratanak Kiri"),
22
+ Misspelling.new(incorrect_text: "Siem Reap", correct_text: "Siemreap"),
23
+ Misspelling.new(incorrect_text: "Takéo", correct_text: "Takeo")
24
+ ].freeze
25
+
26
+ def publish
27
+ page = client.get_page(title: PAGE_TITLE)
28
+ source = page.fetch(:source).dup
29
+
30
+ replace_intro(source:, replacement: generate_intro)
31
+ replace_number_of_districts(source:, replacement: District.all.size)
32
+
33
+ Pumi::Province.all.each do |province|
34
+ section = find_section_by_title(source:, title: province.name_en)
35
+ new_section = generate_districts_section(province:)
36
+ source.sub!(section[1], new_section)
37
+ end
38
+
39
+ client.update_page(title: PAGE_TITLE, source:, comment: "Update page")
40
+ end
41
+
42
+ private
43
+
44
+ def generate_districts_section(province:)
45
+ districts = Pumi::District.where(province_id: province.id)
46
+
47
+ data = OpenStruct.new(
48
+ province:,
49
+ districts:,
50
+ districts_summary: generate_districts_summary(districts:)
51
+ )
52
+ result = ERB.new(DISTRICTS_TEMPLATE).result(data.instance_eval { binding })
53
+ "\n\n#{result}\n"
54
+ end
55
+
56
+ def generate_districts_summary(districts:)
57
+ summary = districts_by_type(collection: districts).map do |au, d|
58
+ next if Array(d).empty?
59
+
60
+ text = "#{d.size} #{au.name_en}"
61
+ if d.size > 1
62
+ au.name_en.end_with?("y") ? text.chomp!("y") << "ies" : text << "s"
63
+ end
64
+ text << " (#{au.name_km} #{au.name_latin})"
65
+ end
66
+
67
+ if summary.size <= 2
68
+ summary.join(" and ")
69
+ else
70
+ [summary[0..-2].join(", "), summary[-1]].join(" and ")
71
+ end
72
+ end
73
+
74
+ def find_section_by_title(source:, title:)
75
+ misspelling = MISSPELLINGS.find { |m| m.correct_text == title }
76
+ search_term = misspelling&.incorrect_text || title
77
+
78
+ section = source.match(/==\s*\[\[[[:word:]\s]+\|#{Regexp.escape(search_term)}\]\].+?==(.+?(?===))/m)
79
+
80
+ raise "Missing section for #{search_term}" if section.nil?
81
+
82
+ section
83
+ end
84
+
85
+ def generate_intro
86
+ all_districts = districts_by_type
87
+
88
+ format(
89
+ INTRO_TEXT,
90
+ districts_count: fetch_districts_by_type("District", collection: all_districts).size,
91
+ municipalities_count: fetch_districts_by_type(
92
+ "Municipality",
93
+ collection: all_districts
94
+ ).size,
95
+ sections_count: fetch_districts_by_type("Section", collection: all_districts).size
96
+ )
97
+ end
98
+
99
+ def replace_number_of_districts(source:, replacement:)
100
+ source.sub!(/current_number\s*=\s*\d+/, "current_number = #{replacement}")
101
+ end
102
+
103
+ def replace_intro(source:, replacement:)
104
+ source.sub!(/This is a list of.+/, replacement)
105
+ end
106
+
107
+ def districts_by_type(collection: Pumi::District.all)
108
+ collection.each_with_object({}) do |district, result|
109
+ administrative_unit = district.administrative_unit
110
+ result[administrative_unit] ||= []
111
+ result[administrative_unit] << district
112
+ end
113
+ end
114
+
115
+ def fetch_districts_by_type(type, collection:)
116
+ administrative_unit = collection.keys.find { |au| au.name_en == type }
117
+ Array(collection[administrative_unit])
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end