baan 0.2.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 978e5b79344757b5f895d9a1adc4a53c9875e95d39e033b391dda8b355742994
4
+ data.tar.gz: 96537f628d8d9d74efd73f8e57472e01936433f4ad686abad0f4edf8842f47cc
5
+ SHA512:
6
+ metadata.gz: 7fb7321f1ca241cf7e38d0772bca6214c71d5876b61c5aa62fb6b34f7dca5f8ee4d216ff9a00b2d7e445f827152f23a4f2823b1f9475c9e746b341a725dd1897
7
+ data.tar.gz: 9d66c05533a44d0c559e72d9713954964ae36c815ae53fbb28ba80d9c654d22f070a54ad7da2251aae3bf1788f79f8e640d9674e0455ba28890cc70f4d845b26
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.2.0"
3
+ }
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,26 @@
1
+ plugins:
2
+ - rubocop-rspec
3
+ - rubocop-performance
4
+
5
+ # Omakase Ruby styling for Rails
6
+ inherit_gem:
7
+ rubocop-rails-omakase: rubocop.yml
8
+
9
+ AllCops:
10
+ NewCops: enable
11
+ TargetRubyVersion: 3.4
12
+
13
+ Lint:
14
+ Enabled: true
15
+
16
+ Style/FrozenStringLiteralComment:
17
+ Enabled: false
18
+
19
+ RSpec/DescribedClass:
20
+ Enabled: false
21
+
22
+ RSpec/ExampleLength:
23
+ Enabled: false
24
+
25
+ RSpec/MultipleExpectations:
26
+ Enabled: false
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.4.4
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## [0.2.0](https://github.com/open-ews/baan/compare/v0.1.0...v0.2.0) (2025-07-01)
4
+
5
+
6
+ ### Features
7
+
8
+ * test release ([aef2b7f](https://github.com/open-ews/baan/commit/aef2b7fff55b5f0db829c94902fe0e865026df75))
9
+ * test release ([513fe11](https://github.com/open-ews/baan/commit/513fe1159fda1397cb1201e4a745c613cb7d8cb3))
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2025 OpenEWS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # Baan (ບ້ານ)
2
+
3
+ [![Ruby](https://github.com/open-ews/baan/actions/workflows/build.yml/badge.svg)](https://github.com/open-ews/baan/actions/workflows/build.yml) [![codecov](https://codecov.io/github/open-ews/baan/graph/badge.svg?token=BnQJ13vZbX)](https://codecov.io/github/open-ews/baan)
4
+
5
+ **Baan** is a Ruby library that provides geodata for administrative regions in **Lao PDR**, including provinces and districts. The name *"Baan"* (ບ້ານ) means *"village"* in Lao, reflecting the project's aim to support geographic and community-based applications.
6
+
7
+ ---
8
+
9
+ ## 📦 Installation
10
+
11
+ Add this line to your Gemfile:
12
+
13
+ ```ruby
14
+ gem "baan"
15
+ ```
16
+
17
+ Then run:
18
+
19
+ ```bash
20
+ bundle install
21
+ ```
22
+
23
+ Or install it manually:
24
+
25
+ ```bash
26
+ gem install baan
27
+ ```
28
+
29
+ ---
30
+
31
+ ## 🗂️ Data Structure
32
+
33
+ The data is stored in YAML format under the `data/` directory:
34
+
35
+ ```
36
+ /baan
37
+ ├── lib/
38
+ │ └── baan.rb
39
+ └── data/
40
+ ├── provinces.yml
41
+ ```
42
+
43
+ Each record includes:
44
+
45
+ **Provinces**
46
+
47
+ * `code`: 3166-2:LA code
48
+ * `name_lo`: Lao name
49
+ * `name_en`: Romanized name
50
+ * `districts`: List of districts
51
+
52
+ **Districts**
53
+
54
+ * `code`: Administrative code
55
+ * `parent_division`: Parent province
56
+ * `name_lo`: Lao name
57
+ * `name_en`: Romanized name
58
+
59
+ ---
60
+
61
+ ## 🚀 Usage
62
+
63
+ ```ruby
64
+ # Get all provinces
65
+ Baan::Province.all
66
+ =>
67
+ {"LA-VT" =>
68
+ #<data Baan::Province
69
+ code="LA-VT",
70
+ name_en="Vientiane Prefecture",
71
+ name_lo="ວຽງຈັນ",
72
+ subdivisions=
73
+ [#<data Baan::District code="0101", name_en="Chanthabuly", name_lo="ຈັນທະບູລີ", subdivisions=[], parent_division=#<data Baan::Province:...>>,],
74
+ parent_division=nil>,
75
+ # ...other provinces
76
+ }
77
+
78
+ # Get a province by its code
79
+ Baan::Province["LA-VT"]
80
+ =>
81
+ #<data Baan::Province
82
+ code="LA-VT",
83
+ name_en="Vientiane Prefecture",
84
+ name_lo="ວຽງຈັນ",
85
+ subdivisions=
86
+ [#<data Baan::District code="0101", name_en="Chanthabuly", name_lo="ຈັນທະບູລີ", subdivisions=[], parent_division=#<data Baan::Province:...>>,],
87
+ parent_division=nil>
88
+
89
+ # Get all districts
90
+ Baan::District.all
91
+ =>
92
+ {"0101" =>
93
+ #<data Baan::District
94
+ code="0101",
95
+ name_en="Chanthabuly",
96
+ name_lo="ຈັນທະບູລີ",
97
+ subdivisions=[],
98
+ parent_division=#<data Baan::Province:...>>,
99
+ # ...other districts
100
+ }
101
+
102
+ # Get a district by its code
103
+ Baan::District["0101"]
104
+ =>
105
+ #<data Baan::District
106
+ code="0101",
107
+ name_en="Chanthabuly",
108
+ name_lo="ຈັນທະບູລີ",
109
+ subdivisions=[],
110
+ parent_division=#<data Baan::Province:...>>
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 📚 Use Cases
116
+
117
+ * Mapping and visualization of Lao administrative areas
118
+ * Disaster response and early warning systems
119
+ * Localized apps and services for Laos
120
+ * Statistical and demographic analysis
121
+
122
+ ---
123
+
124
+ ## 📄 License
125
+
126
+ This library is available as open source under the **MIT License**.
127
+
128
+ ---
129
+
130
+ ## 🤝 Contributing
131
+
132
+ We welcome contributions, especially:
133
+
134
+ * Updated or corrected geodata
135
+ * Additional administrative levels (e.g. villages)
136
+ * Support for other output formats (e.g. JSON, CSV)
137
+
138
+ To contribute:
139
+
140
+ 1. Fork the repository
141
+ 2. Make your changes
142
+ 3. Submit a pull request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require "rubocop/rake_task"
7
+
8
+ RuboCop::RakeTask.new
9
+
10
+ task default: %i[spec rubocop]
@@ -0,0 +1,534 @@
1
+ provinces:
2
+ - code: "LA-VT"
3
+ name_en: "Vientiane Prefecture"
4
+ name_lo: "ວຽງຈັນ"
5
+ districts:
6
+ - code: "0101"
7
+ name_en: "Chanthabuly"
8
+ name_lo: "ຈັນທະບູລີ"
9
+ - code: "0102"
10
+ name_en: "Sikhottabong"
11
+ name_lo: "ສີໂຄດຕະບອງ"
12
+ - code: "0103"
13
+ name_en: "Xaysetha"
14
+ name_lo: "ໄຊເສດຖາ"
15
+ - code: "0104"
16
+ name_en: "Sisattanak"
17
+ name_lo: "ສີສັດຕະນາກ"
18
+ - code: "0105"
19
+ name_en: "Naxaithong"
20
+ name_lo: "ນາຊາຍທອງ"
21
+ - code: "0106"
22
+ name_en: "Xaythany"
23
+ name_lo: "ໄຊທະນີ"
24
+ - code: "0107"
25
+ name_en: "Hadxayfong"
26
+ name_lo: "ຫາດຊາຍຟອງ"
27
+ - code: "0108"
28
+ name_en: "Sangthong"
29
+ name_lo: "ສັງທອງ"
30
+ - code: "0109"
31
+ name_en: "Mayparkngum"
32
+ name_lo: "ປາກງື່ມ"
33
+
34
+ - code: "LA-PH"
35
+ name_en: "Phongsaly"
36
+ name_lo: "ຜົ້ງສາລີ"
37
+ districts:
38
+ - code: "0201"
39
+ name_en: "Phongsaly"
40
+ name_lo: "ຜົ້ງສາລີ"
41
+ - code: "0202"
42
+ name_en: "May"
43
+ name_lo: "ໃໝ່"
44
+ - code: "0203"
45
+ name_en: "Khoua"
46
+ name_lo: "ຂວາ"
47
+ - code: "0204"
48
+ name_en: "Samphanh"
49
+ name_lo: "ສຳພັນ"
50
+ - code: "0205"
51
+ name_en: "Boun Neua"
52
+ name_lo: "ບຸນເໜືອ"
53
+ - code: "0206"
54
+ name_en: "Yot Ou"
55
+ name_lo: "ຍອດອູ"
56
+ - code: "0207"
57
+ name_en: "Boun Tay"
58
+ name_lo: "ບຸນໃຕ້"
59
+
60
+ - code: "LA-LM"
61
+ name_en: "Luang Namtha"
62
+ name_lo: "ຫລວງນໍ້າທາ"
63
+ districts:
64
+ - code: "0301"
65
+ name_en: "Namtha"
66
+ name_lo: "ນ້ຳທາ"
67
+ - code: "0302"
68
+ name_en: "Sing"
69
+ name_lo: "ສິງ"
70
+ - code: "0303"
71
+ name_en: "Long"
72
+ name_lo: "ລອງ"
73
+ - code: "0304"
74
+ name_en: "Viengphoukha"
75
+ name_lo: "ວຽງພູຄາ"
76
+ - code: "0305"
77
+ name_en: "Na Le"
78
+ name_lo: "ນາແລ"
79
+
80
+ - code: "LA-OU"
81
+ name_en: "Oudomxay"
82
+ name_lo: "ອຸດົມໄຊ"
83
+ districts:
84
+ - code: "0401"
85
+ name_en: "Xay"
86
+ name_lo: "ໄຊ"
87
+ - code: "0402"
88
+ name_en: "La"
89
+ name_lo: "ຫຼາ"
90
+ - code: "0403"
91
+ name_en: "Na Mo"
92
+ name_lo: "ນາໝໍ້"
93
+ - code: "0404"
94
+ name_en: "Nga"
95
+ name_lo: "ງາ"
96
+ - code: "0405"
97
+ name_en: "Beng"
98
+ name_lo: "ແບ່ງ"
99
+ - code: "0406"
100
+ name_en: "Houne"
101
+ name_lo: "ຮຸນ"
102
+ - code: "0407"
103
+ name_en: "Pak Beng"
104
+ name_lo: "ປາກແບ່ງ"
105
+
106
+ - code: "LA-BK"
107
+ name_en: "Bokeo"
108
+ name_lo: "ບໍ່ແກ້ວ"
109
+ districts:
110
+ - code: "0501"
111
+ name_en: "Houayxay"
112
+ name_lo: "ຫ້ວຍຊາຍ"
113
+ - code: "0502"
114
+ name_en: "Ton Pheung"
115
+ name_lo: "ຕົ້ນເຜິ້ງ"
116
+ - code: "0503"
117
+ name_en: "Meung"
118
+ name_lo: "ເມິງ"
119
+ - code: "0504"
120
+ name_en: "Pha Oudom"
121
+ name_lo: "ຜາອຸດົມ"
122
+ - code: "0505"
123
+ name_en: "Pak Tha"
124
+ name_lo: "ປາກທາ"
125
+
126
+ - code: "LA-LP"
127
+ name_en: "Luang Prabang"
128
+ name_lo: "ຫລວງພະບາງ"
129
+ districts:
130
+ - code: "0601"
131
+ name_en: "Luang Prabang"
132
+ name_lo: "ຫຼວງພະບາງ"
133
+ - code: "0602"
134
+ name_en: "Xiengngeun"
135
+ name_lo: "ຊຽງເງີນ"
136
+ - code: "0603"
137
+ name_en: "Nane"
138
+ name_lo: "ນານ"
139
+ - code: "0604"
140
+ name_en: "Pak Ou"
141
+ name_lo: "ປາກອູ"
142
+ - code: "0605"
143
+ name_en: "Nam Bak"
144
+ name_lo: "ນ້ຳບາກ"
145
+ - code: "0606"
146
+ name_en: "Ngoy"
147
+ name_lo: "ງອຍ"
148
+ - code: "0607"
149
+ name_en: "Pak Seng"
150
+ name_lo: "ປາກແຊງ"
151
+ - code: "0608"
152
+ name_en: "Phonxay"
153
+ name_lo: "ໂພນໄຊ"
154
+ - code: "0609"
155
+ name_en: "Chomphet"
156
+ name_lo: "ຈອມເພັດ"
157
+ - code: "0610"
158
+ name_en: "Viengkham"
159
+ name_lo: "ວຽງຄຳ"
160
+ - code: "0611"
161
+ name_en: "Phoukhoune"
162
+ name_lo: "ພູຄູນ"
163
+ - code: "0612"
164
+ name_en: "Phonthong"
165
+ name_lo: "ໂພນທອງ"
166
+
167
+ - code: "LA-HO"
168
+ name_en: "Houaphanh"
169
+ name_lo: "ຫົວພັນ"
170
+ districts:
171
+ - code: "0701"
172
+ name_en: "Xam Neua"
173
+ name_lo: "ຊຳເໜືອ"
174
+ - code: "0702"
175
+ name_en: "Xiengkho"
176
+ name_lo: "ຊຽງຄໍ້"
177
+ - code: "0703"
178
+ name_en: "Hiam"
179
+ name_lo: "ຮ້ຽມ"
180
+ - code: "0704"
181
+ name_en: "Viengxay"
182
+ name_lo: "ວຽງໄຊ"
183
+ - code: "0705"
184
+ name_en: "Houameuang"
185
+ name_lo: "ຫົວເມືອງ"
186
+ - code: "0706"
187
+ name_en: "Samtay"
188
+ name_lo: "ຊຳໃຕ້"
189
+ - code: "0707"
190
+ name_en: "Sop Bao"
191
+ name_lo: "ສົບເບົາ"
192
+ - code: "0708"
193
+ name_en: "Et"
194
+ name_lo: "ແອດ"
195
+ - code: "0709"
196
+ name_en: "Kone"
197
+ name_lo: "ກວັນ"
198
+ - code: "0710"
199
+ name_en: "Xon"
200
+ name_lo: "ຊ່ອນ"
201
+
202
+ - code: "LA-XA"
203
+ name_en: "Sainyabuli"
204
+ name_lo: "ໄຊຍະບູລີ"
205
+ districts:
206
+ - code: "0801"
207
+ name_en: "Sainyabuli"
208
+ name_lo: "ໄຊຍະບູລີ"
209
+ - code: "0802"
210
+ name_en: "Khop"
211
+ name_lo: "ຄອບ"
212
+ - code: "0803"
213
+ name_en: "Hongsa"
214
+ name_lo: "ຫົງສາ"
215
+ - code: "0804"
216
+ name_en: "Ngeun"
217
+ name_lo: "ເງີນ"
218
+ - code: "0805"
219
+ name_en: "Xienghone"
220
+ name_lo: "ຊຽງຮ່ອນ"
221
+ - code: "0806"
222
+ name_en: "Phiang"
223
+ name_lo: "ພຽງ"
224
+ - code: "0807"
225
+ name_en: "Parklai"
226
+ name_lo: "ປາກລາຍ"
227
+ - code: "0808"
228
+ name_en: "Kenethao"
229
+ name_lo: "ແກ່ນທ້າວ"
230
+ - code: "0809"
231
+ name_en: "Botene"
232
+ name_lo: "ບໍ່ແຕນ"
233
+ - code: "0810"
234
+ name_en: "Thongmyxay"
235
+ name_lo: "ທົ່ງມີໄຊ"
236
+ - code: "0811"
237
+ name_en: "Xaisathan"
238
+ name_lo: "ໄຊສະຖານ"
239
+
240
+ - code: "LA-XI"
241
+ name_en: "Xiangkhouang"
242
+ name_lo: "ຊຽງຂວາງ"
243
+ districts:
244
+ - code: "0901"
245
+ name_en: "Pek"
246
+ name_lo: "ແປກ"
247
+ - code: "0902"
248
+ name_en: "Kham"
249
+ name_lo: "ຄຳ"
250
+ - code: "0903"
251
+ name_en: "Nong Het"
252
+ name_lo: "ໜອງແຮດ"
253
+ - code: "0904"
254
+ name_en: "Khoune"
255
+ name_lo: "ຄູນ"
256
+ - code: "0905"
257
+ name_en: "Mok May"
258
+ name_lo: "ໝອກໄໝ່"
259
+ - code: "0906"
260
+ name_en: "Phou Kout"
261
+ name_lo: "ພູກູດ"
262
+ - code: "0907"
263
+ name_en: "Phaxay"
264
+ name_lo: "ຜາໄຊ"
265
+
266
+ - code: "LA-VI"
267
+ name_en: "Vientiane"
268
+ name_lo: "ວຽງຈັນ"
269
+ districts:
270
+ - code: "1001"
271
+ name_en: "Phonhong"
272
+ name_lo: "ໂພນໂຮງ"
273
+ - code: "1002"
274
+ name_en: "Thoulakhom"
275
+ name_lo: "ທຸລະຄົມ"
276
+ - code: "1003"
277
+ name_en: "Keo Oudom"
278
+ name_lo: "ແກ້ວອຸດົມ"
279
+ - code: "1004"
280
+ name_en: "Kasy"
281
+ name_lo: "ກາສີ"
282
+ - code: "1005"
283
+ name_en: "Vangvieng"
284
+ name_lo: "ວັງວຽງ"
285
+ - code: "1006"
286
+ name_en: "Feuang"
287
+ name_lo: "ເຟືອງ"
288
+ - code: "1007"
289
+ name_en: "Xanakharm"
290
+ name_lo: "ຊະນະຄາມ"
291
+ - code: "1008"
292
+ name_en: "Mad"
293
+ name_lo: "ແມດ"
294
+ - code: "1009"
295
+ name_en: "Viengkham"
296
+ name_lo: "ວຽງຄໍາ"
297
+ - code: "1010"
298
+ name_en: "Hinhurp"
299
+ name_lo: "ຫີນເຫີບ"
300
+ - code: "1011"
301
+ name_en: "Meun"
302
+ name_lo: "ໜື່ນ"
303
+
304
+ - code: "LA-BL"
305
+ name_en: "Bolikhamsai"
306
+ name_lo: "ບໍລິຄໍາໄຊ"
307
+ districts:
308
+ - code: "1101"
309
+ name_en: "Pakxan"
310
+ name_lo: "ປາກຊັນ"
311
+ - code: "1102"
312
+ name_en: "Thaphabat"
313
+ name_lo: "ທ່າພະບາດ"
314
+ - code: "1103"
315
+ name_en: "Pakkading"
316
+ name_lo: "ປາກກະດິງ"
317
+ - code: "1104"
318
+ name_en: "Borikhane"
319
+ name_lo: "ບໍລິຄັນ"
320
+ - code: "1105"
321
+ name_en: "Khamkeut"
322
+ name_lo: "ຄຳເກີດ"
323
+ - code: "1106"
324
+ name_en: "Viengthong"
325
+ name_lo: "ວຽງທອງ"
326
+ - code: "1107"
327
+ name_en: "Xaichamphon"
328
+ name_lo: "ໄຊຈຳພອນ"
329
+
330
+ - code: "LA-KH"
331
+ name_en: "Khammouane"
332
+ name_lo: "ຄໍາມ່ວນ"
333
+ districts:
334
+ - code: "1201"
335
+ name_en: "Thakhek"
336
+ name_lo: "ທ່າແຂກ"
337
+ - code: "1202"
338
+ name_en: "Mahaxay"
339
+ name_lo: "ມະຫາໄຊ"
340
+ - code: "1203"
341
+ name_en: "Nong Bok"
342
+ name_lo: "ໜອງບົກ"
343
+ - code: "1204"
344
+ name_en: "Hineboune"
345
+ name_lo: "ຫີນບູນ"
346
+ - code: "1205"
347
+ name_en: "Yommalath"
348
+ name_lo: "ຍົມມະລາດ"
349
+ - code: "1206"
350
+ name_en: "Boualapha"
351
+ name_lo: "ບົວລະພາ"
352
+ - code: "1207"
353
+ name_en: "Nakai"
354
+ name_lo: "ນາກາຍ"
355
+ - code: "1208"
356
+ name_en: "Sebangphay"
357
+ name_lo: "ເຊບັ້ງໄຟ"
358
+ - code: "1209"
359
+ name_en: "Xaibouathong"
360
+ name_lo: "ໄຊບົວທອງ"
361
+ - code: "1210"
362
+ name_en: "Kounkham"
363
+ name_lo: "ຄູນຄຳ"
364
+
365
+ - code: "LA-SV"
366
+ name_en: "Savannakhet"
367
+ name_lo: "ສະຫວັນນະເຂດ"
368
+ districts:
369
+ - code: "1301"
370
+ name_en: "Kaysone Phomvihane"
371
+ name_lo: "ໄກສອນ ພົມວິຫານ"
372
+ - code: "1302"
373
+ name_en: "Outhoumphone"
374
+ name_lo: "ອຸທຸມພອນ"
375
+ - code: "1303"
376
+ name_en: "Atsaphangthong"
377
+ name_lo: "ອາດສະພັງທອງ"
378
+ - code: "1304"
379
+ name_en: "Phine"
380
+ name_lo: "ພິນ"
381
+ - code: "1305"
382
+ name_en: "Seponh"
383
+ name_lo: "ເຊໂປນ"
384
+ - code: "1306"
385
+ name_en: "Nong"
386
+ name_lo: "ໜອງ"
387
+ - code: "1307"
388
+ name_en: "Thapangthong"
389
+ name_lo: "ທາພັງທອງ"
390
+ - code: "1308"
391
+ name_en: "Songkhone"
392
+ name_lo: "ສອງຄອນ"
393
+ - code: "1309"
394
+ name_en: "Champhone"
395
+ name_lo: "ຈຳພອນ"
396
+ - code: "1310"
397
+ name_en: "Xonaboury"
398
+ name_lo: "ຊົນນະບູລີ"
399
+ - code: "1311"
400
+ name_en: "Xayboury"
401
+ name_lo: "ໄຊບູລີ"
402
+ - code: "1312"
403
+ name_en: "Viraboury"
404
+ name_lo: "ວີລະບຸລີ"
405
+ - code: "1313"
406
+ name_en: "Assaphone"
407
+ name_lo: "ອາດສະພອນ"
408
+ - code: "1314"
409
+ name_en: "Xonboury"
410
+ name_lo: "ໄຊພູທອງ"
411
+ - code: "1315"
412
+ name_en: "Thaphalanxay"
413
+ name_lo: "ພະລານໄຊ"
414
+
415
+ - code: "LA-SL"
416
+ name_en: "Salavan"
417
+ name_lo: "ສາລະວັນ"
418
+ districts:
419
+ - code: "1401"
420
+ name_en: "Saravane"
421
+ name_lo: "ສາລະວັນ"
422
+ - code: "1402"
423
+ name_en: "Ta Oy"
424
+ name_lo: "ຕະໂອ້ຍ"
425
+ - code: "1403"
426
+ name_en: "Toumlane"
427
+ name_lo: "ຕຸ້ມລານ"
428
+ - code: "1404"
429
+ name_en: "Lakhonepheng"
430
+ name_lo: "ລະຄອນເພັງ"
431
+ - code: "1405"
432
+ name_en: "Vapy"
433
+ name_lo: "ວາປີ"
434
+ - code: "1406"
435
+ name_en: "Khongsedone"
436
+ name_lo: "ຄົງເຊໂດນ"
437
+ - code: "1407"
438
+ name_en: "Lao Ngam"
439
+ name_lo: "ເລົ່າງາມ"
440
+ - code: "1408"
441
+ name_en: "Sa Mouay"
442
+ name_lo: "ສະມ້ວຍ"
443
+
444
+ - code: "LA-XE"
445
+ name_en: "Sekong"
446
+ name_lo: "ເຊກອງ"
447
+ districts:
448
+ - code: "1501"
449
+ name_en: "La Mam"
450
+ name_lo: "ລະມາມ"
451
+ - code: "1502"
452
+ name_en: "Kaleum"
453
+ name_lo: "ກະເລິມ"
454
+ - code: "1503"
455
+ name_en: "Dak Cheung"
456
+ name_lo: "ດັກຈຶງ"
457
+ - code: "1504"
458
+ name_en: "Tha Teng"
459
+ name_lo: "ທ່າແຕງ"
460
+
461
+ - code: "LA-CH"
462
+ name_en: "Champasak"
463
+ name_lo: "ຈຳປາສັກ"
464
+ districts:
465
+ - code: "1601"
466
+ name_en: "Pakse"
467
+ name_lo: "ປາກເຊ"
468
+ - code: "1602"
469
+ name_en: "Sanasomboun"
470
+ name_lo: "ຊະນະສົມບູນ"
471
+ - code: "1603"
472
+ name_en: "Batiengchaleunsouk"
473
+ name_lo: "ບາຈຽງຈະເລີນສຸກ"
474
+ - code: "1604"
475
+ name_en: "Paksong"
476
+ name_lo: "ປາກຊ່ອງ"
477
+ - code: "1605"
478
+ name_en: "Pathouphone"
479
+ name_lo: "ປະທຸມພອນ"
480
+ - code: "1606"
481
+ name_en: "Phonthong"
482
+ name_lo: "ໂພນທອງ"
483
+ - code: "1607"
484
+ name_en: "Champassack"
485
+ name_lo: "ຈຳປາສັກ"
486
+ - code: "1608"
487
+ name_en: "Soukhoumma"
488
+ name_lo: "ສຸຂຸມາ"
489
+ - code: "1609"
490
+ name_en: "Mounlapamok"
491
+ name_lo: "ມູນລະປະໂມກ"
492
+ - code: "1610"
493
+ name_en: "Khong"
494
+ name_lo: "ໂຂງ"
495
+
496
+ - code: "LA-AT"
497
+ name_en: "Attapeu"
498
+ name_lo: "ອັດຕະປື"
499
+ districts:
500
+ - code: "1701"
501
+ name_en: "Saysetha"
502
+ name_lo: "ໄຊເສດຖາ"
503
+ - code: "1702"
504
+ name_en: "Samakkhixay"
505
+ name_lo: "ສາມັກຄີໄຊ"
506
+ - code: "1703"
507
+ name_en: "Sanamxay"
508
+ name_lo: "ສະໜາມໄຊ"
509
+ - code: "1704"
510
+ name_en: "Sanxay"
511
+ name_lo: "ສານໄຊ"
512
+ - code: "1705"
513
+ name_en: "Phouvong"
514
+ name_lo: "ພູວົງ"
515
+
516
+ - code: "LA-XS"
517
+ name_en: "Xaisomboun"
518
+ name_lo: "ໄຊສົມບູນ"
519
+ districts:
520
+ - code: "1801"
521
+ name_en: "Anouvong"
522
+ name_lo: "ອະນຸວົງ"
523
+ - code: "1802"
524
+ name_en: "Longchaeng"
525
+ name_lo: "ລ້ອງແຈ້ງ"
526
+ - code: "1803"
527
+ name_en: "Longxan"
528
+ name_lo: "ລ້ອງຊານ"
529
+ - code: "1804"
530
+ name_en: "Hom"
531
+ name_lo: "ຮົ່ມ"
532
+ - code: "1805"
533
+ name_en: "Thathom"
534
+ name_lo: "ທ່າໂທມ"
@@ -0,0 +1,23 @@
1
+ module Baan
2
+ AdministrativeDivision = Data.define(:code, :name_en, :name_lo, :subdivisions, :parent_division) do
3
+ class << self
4
+ def all
5
+ data
6
+ end
7
+
8
+ def [](code)
9
+ data[code]
10
+ end
11
+
12
+ private
13
+
14
+ def data
15
+ @data ||= cache.data.fetch(self)
16
+ end
17
+
18
+ def cache
19
+ @cache ||= Cache.new
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/baan/cache.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Baan
2
+ class Cache
3
+ attr_reader :parser
4
+
5
+ def initialize(parser: Parser.new)
6
+ @parser = parser
7
+ end
8
+
9
+ def data
10
+ @data ||= begin
11
+ dataset.each_with_object(Hash.new { |h, k| h[k] = {} }) do |(key, dataset), result|
12
+ dataset.each { result[key][it.code] = it }
13
+ end
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def dataset
20
+ @dataset ||= begin
21
+ data = parser.parse
22
+ { Province => data.provinces, District => data.districts }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ module Baan
2
+ class District < AdministrativeDivision
3
+ def province
4
+ parent_division
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ require "yaml"
2
+
3
+ module Baan
4
+ class Parser
5
+ DEFAULT_DATA_FILE = Pathname(File.join(__dir__, "..", "..", "data", "provinces.yml")).freeze
6
+ DEFAULT_ROOT_KEY = "provinces".freeze
7
+ Result = Data.define(:provinces, :districts)
8
+
9
+ attr_reader :data_file, :root_key
10
+
11
+ def initialize(**options)
12
+ @data_file = options.fetch(:data_file) { DEFAULT_DATA_FILE }
13
+ @root_key = options.fetch(:root_key) { DEFAULT_ROOT_KEY }
14
+ end
15
+
16
+ def parse
17
+ data = YAML.load_file(data_file).fetch(root_key)
18
+ districts = []
19
+ provinces = data.map do |province_data|
20
+ province = Province.new(parent_division: nil, subdivisions: [], **province_data.transform_keys(&:to_sym).except(:districts))
21
+
22
+ province_data.fetch("districts").map do |district_data|
23
+ district = District.new(parent_division: province, subdivisions: [], **district_data.transform_keys(&:to_sym))
24
+ province.subdivisions << district
25
+ districts << district
26
+ end
27
+
28
+ province
29
+ end
30
+
31
+ Result.new(provinces:, districts:)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ module Baan
2
+ class Province < AdministrativeDivision
3
+ def districts
4
+ subdivisions
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Baan
2
+ VERSION = "0.2.0"
3
+ end
data/lib/baan.rb ADDED
@@ -0,0 +1,9 @@
1
+ require_relative "baan/version"
2
+ require_relative "baan/administrative_division"
3
+ require_relative "baan/province"
4
+ require_relative "baan/district"
5
+ require_relative "baan/cache"
6
+ require_relative "baan/parser"
7
+
8
+ module Baan
9
+ end
@@ -0,0 +1,16 @@
1
+ {
2
+ "bootstrap-sha": "a5cb2c3881667534c63a973631295fbc7011c1fc",
3
+ "include-component-in-tag": false,
4
+ "version-file": "lib/baan/version.rb",
5
+ "packages": {
6
+ ".": {
7
+ "changelog-path": "CHANGELOG.md",
8
+ "release-type": "ruby",
9
+ "bump-minor-pre-major": true,
10
+ "bump-patch-for-minor-pre-major": false,
11
+ "draft": false,
12
+ "prerelease": false
13
+ }
14
+ },
15
+ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
16
+ }
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: baan
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - David Wilkie
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: A library containing Geodata for administrative regions in Laos
13
+ email:
14
+ - dwilkie@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - ".release-please-manifest.json"
20
+ - ".rspec"
21
+ - ".rubocop.yml"
22
+ - ".tool-versions"
23
+ - CHANGELOG.md
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - data/provinces.yml
28
+ - lib/baan.rb
29
+ - lib/baan/administrative_division.rb
30
+ - lib/baan/cache.rb
31
+ - lib/baan/district.rb
32
+ - lib/baan/parser.rb
33
+ - lib/baan/province.rb
34
+ - lib/baan/version.rb
35
+ - release-please-config.json
36
+ homepage: https://github.com/open-ews/baan
37
+ licenses:
38
+ - MIT
39
+ metadata:
40
+ homepage_uri: https://github.com/open-ews/baan
41
+ source_code_uri: https://github.com/open-ews/baan
42
+ changelog_uri: https://github.com/open-ews/baan/blob/main/CHANGELOG.md
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.4.0
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubygems_version: 3.6.7
58
+ specification_version: 4
59
+ summary: A library containing Geodata for administrative regions in Laos
60
+ test_files: []