gaun 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: 88b84d5cbf0cef43c15e08df26b16612e43b93179efc25feb17b2f1396dfc964
4
+ data.tar.gz: ef7fee6cb9d2ff07eafaef78c0be8385933038c1b8eec3388b1b42bb61b1744a
5
+ SHA512:
6
+ metadata.gz: dbadbd65d1bfc08c3f8038aa89135e26b85dd9cfacdbece309b8b37c55c1299d56071f2ae69a2cd868151cad4c9ac515226371d939dc9be367c19f558f843435
7
+ data.tar.gz: 163688126b4cd6b1ebe78767b168fdcd422691ad66fb5fbd199e51eece85f9ce97d0928acd54ddc706a9c74922269fabdd3cd5fa7944e80e03f665fa8721e0a5
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.2.0"
3
+ }
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 4.0.1
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## [0.2.0](https://github.com/open-ews/gaun/compare/v0.1.0...v0.2.0) (2026-03-03)
4
+
5
+
6
+ ### Features
7
+
8
+ * Update data ([c8e5790](https://github.com/open-ews/gaun/commit/c8e579075cd7289c9d691320c2a5839fad69e7dc))
9
+ * Update data ([60c5897](https://github.com/open-ews/gaun/commit/60c58974581441a5d2e724b13a9debe4f703bcc1))
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,130 @@
1
+ # gaun (गाउँ)
2
+
3
+ [![Build](https://github.com/open-ews/gaun/actions/workflows/build.yml/badge.svg)](https://github.com/open-ews/gaun/actions/workflows/build.yml)
4
+
5
+ **Gaun** is a Ruby library providing structured **geographical and administrative data for Nepal**, including provinces and districts.
6
+
7
+ > *गाउँ (Gaun)* means **village** in Nepali.
8
+
9
+ This gem is designed to be lightweight, easy to use, and suitable for applications that need reliable administrative region data—such as Early Warning Systems, humanitarian platforms, civic tech, and data validation pipelines.
10
+
11
+ ---
12
+
13
+ ## Features
14
+
15
+ * 📍 Administrative geodata for **Nepal**
16
+ * 🗺️ Hierarchical structure (Province → District)
17
+ * 🧩 Easy Ruby API
18
+ * 🚀 No external API dependencies
19
+ * 📦 Designed for offline and embedded use
20
+ * 🧑‍💻 Open source and extensible
21
+
22
+ ---
23
+
24
+ ## Installation
25
+
26
+ Add this line to your application's `Gemfile`:
27
+
28
+ ```ruby
29
+ gem "gaun"
30
+ ```
31
+
32
+ Then execute:
33
+
34
+ ```bash
35
+ bundle install
36
+ ```
37
+
38
+ Or install it directly:
39
+
40
+ ```bash
41
+ gem install gaun
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Usage
47
+
48
+ ### Provinces
49
+
50
+ ```ruby
51
+ Gaun::Province.all
52
+ ```
53
+
54
+ ```ruby
55
+ province = Gaun::Province.first
56
+ province.name_en
57
+ province.name_ne
58
+ ```
59
+
60
+ ### Districts
61
+
62
+ ```ruby
63
+ Gaun::District.all
64
+ ```
65
+
66
+ ```ruby
67
+ district = Gaun::District.find { |d| d.name_en == "Bhojpur" }
68
+ district.name_en
69
+ district.name_ne
70
+ ```
71
+
72
+ ## Use Cases
73
+
74
+ * Early warning and disaster response systems
75
+ * Address normalization and validation
76
+ * Beneficiary management systems
77
+ * Government and NGO platforms
78
+ * Offline-first applications
79
+
80
+ ---
81
+
82
+ ## Data Sources
83
+
84
+ The data in **gaun** is compiled from publicly available Government of Nepal administrative sources and verified datasets where possible.
85
+
86
+ If you find inaccuracies or updates (e.g. administrative changes), contributions are very welcome.
87
+
88
+ ---
89
+
90
+ ## Development
91
+
92
+ Clone the repository and install dependencies:
93
+
94
+ ```bash
95
+ git clone https://github.com/open-ews/gaun.git
96
+ cd gaun
97
+ bundle install
98
+ ```
99
+
100
+ Run tests:
101
+
102
+ ```bash
103
+ bundle exec rspec
104
+ ```
105
+
106
+ ---
107
+
108
+ ## Contributing
109
+
110
+ Contributions are welcome!
111
+
112
+ * Bug reports
113
+ * Data corrections
114
+ * New administrative layers
115
+ * Performance or API improvements
116
+
117
+ Please open an issue or submit a pull request.
118
+
119
+ ---
120
+
121
+ ## License
122
+
123
+ This gem is released under the **MIT License**.
124
+
125
+ ---
126
+
127
+ ## Related Projects
128
+
129
+ * **[baan](https://github.com/open-ews/baan)** – A library containing Geodata for administrative regions in Laos
130
+ * **[pumi](https://github.com/dwilkie/pumi)**– A library containing Geodata for administrative regions in Cambodia
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,260 @@
1
+ provinces:
2
+ - code: "NP-P1"
3
+ name_en: "Koshi"
4
+ name_ne: "कोशी"
5
+ districts:
6
+ - code: "0101"
7
+ name_en: "Bhojpur"
8
+ name_ne: "भोजपुर"
9
+ - code: "0102"
10
+ name_en: "Dhankuta"
11
+ name_ne: "धनकुटा"
12
+ - code: "0103"
13
+ name_en: "Ilam"
14
+ name_ne: "इलाम"
15
+ - code: "0104"
16
+ name_en: "Jhapa"
17
+ name_ne: "झापा"
18
+ - code: "0105"
19
+ name_en: "Khotang"
20
+ name_ne: "खोटाङ"
21
+ - code: "0106"
22
+ name_en: "Morang"
23
+ name_ne: "मोरङ"
24
+ - code: "0107"
25
+ name_en: "Okhaldhunga"
26
+ name_ne: "ओखलढुङ्गा"
27
+ - code: "0108"
28
+ name_en: "Panchthar"
29
+ name_ne: "पाँचथर"
30
+ - code: "0109"
31
+ name_en: "Sankhuwasabha"
32
+ name_ne: "सङ्खुवासभा"
33
+ - code: "0110"
34
+ name_en: "Solukhumbu"
35
+ name_ne: "सोलुखुम्बु"
36
+ - code: "0111"
37
+ name_en: "Sunsari"
38
+ name_ne: "सुनसरी"
39
+ - code: "0112"
40
+ name_en: "Taplejung"
41
+ name_ne: "ताप्लेजुङ"
42
+ - code: "0113"
43
+ name_en: "Terhathum"
44
+ name_ne: "तेह्रथुम"
45
+ - code: "0114"
46
+ name_en: "Udayapur"
47
+ name_ne: "उदयपुर"
48
+ - code: "NP-P2"
49
+ name_en: "Madhesh"
50
+ name_ne: "मधेश"
51
+ districts:
52
+ - code: "0201"
53
+ name_en: "Parsa"
54
+ name_ne: "पर्सा"
55
+ - code: "0202"
56
+ name_en: "Bara"
57
+ name_ne: "बारा"
58
+ - code: "0203"
59
+ name_en: "Rautahat"
60
+ name_ne: "रौतहट"
61
+ - code: "0204"
62
+ name_en: "Sarlahi"
63
+ name_ne: "सर्लाही"
64
+ - code: "0205"
65
+ name_en: "Dhanusha"
66
+ name_ne: "धनुषा"
67
+ - code: "0206"
68
+ name_en: "Siraha"
69
+ name_ne: "सिराहा"
70
+ - code: "0207"
71
+ name_en: "Mahottari"
72
+ name_ne: "महोत्तरी"
73
+ - code: "0208"
74
+ name_en: "Saptari"
75
+ name_ne: "सप्तरी"
76
+ - code: "NP-P3"
77
+ name_en: "Bagmati"
78
+ name_ne: "बागमती"
79
+ districts:
80
+ - code: "0301"
81
+ name_en: "Sindhuli"
82
+ name_ne: "सिन्धुली"
83
+ - code: "0302"
84
+ name_en: "Ramechhap"
85
+ name_ne: "रामेछाप"
86
+ - code: "0303"
87
+ name_en: "Dolakha"
88
+ name_ne: "दोलखा"
89
+ - code: "0304"
90
+ name_en: "Bhaktapur"
91
+ name_ne: "भक्तपुर"
92
+ - code: "0305"
93
+ name_en: "Dhading"
94
+ name_ne: "धादिङ"
95
+ - code: "0306"
96
+ name_en: "Kathmandu"
97
+ name_ne: "काठमाडौं"
98
+ - code: "0307"
99
+ name_en: "Kavrepalanchok"
100
+ name_ne: "काभ्रेपलाञ्चोक"
101
+ - code: "0308"
102
+ name_en: "Lalitpur"
103
+ name_ne: "ललितपुर"
104
+ - code: "0309"
105
+ name_en: "Nuwakot"
106
+ name_ne: "नुवाकोट"
107
+ - code: "0310"
108
+ name_en: "Rasuwa"
109
+ name_ne: "रसुवा"
110
+ - code: "0311"
111
+ name_en: "Sindhupalchok"
112
+ name_ne: "सिन्धुपाल्चोक"
113
+ - code: "0312"
114
+ name_en: "Chitwan"
115
+ name_ne: "चितवन"
116
+ - code: "0313"
117
+ name_en: "Makwanpur"
118
+ name_ne: "मकवानपुर"
119
+ - code: "NP-P4"
120
+ name_en: "Gandaki"
121
+ name_ne: "गण्डकी"
122
+ districts:
123
+ - code: "0401"
124
+ name_en: "Baglung"
125
+ name_ne: "बागलुङ"
126
+ - code: "0402"
127
+ name_en: "Gorkha"
128
+ name_ne: "गोरखा"
129
+ - code: "0403"
130
+ name_en: "Kaski"
131
+ name_ne: "कास्की"
132
+ - code: "0404"
133
+ name_en: "Lamjung"
134
+ name_ne: "लमजुङ"
135
+ - code: "0405"
136
+ name_en: "Manang"
137
+ name_ne: "मनाङ"
138
+ - code: "0406"
139
+ name_en: "Mustang"
140
+ name_ne: "मुस्ताङ"
141
+ - code: "0407"
142
+ name_en: "Myagdi"
143
+ name_ne: "म्याग्दी"
144
+ - code: "0408"
145
+ name_en: "Nawalpur"
146
+ name_ne: "नवलपुर"
147
+ - code: "0409"
148
+ name_en: "Parbat"
149
+ name_ne: "पर्वत"
150
+ - code: "0410"
151
+ name_en: "Syangja"
152
+ name_ne: "स्याङ्जा"
153
+ - code: "0411"
154
+ name_en: "Tanahun"
155
+ name_ne: "तनहुँ"
156
+ - code: "NP-P5"
157
+ name_en: "Lumbini"
158
+ name_ne: "लुम्बिनी"
159
+ districts:
160
+ - code: "0501"
161
+ name_en: "Kapilvastu"
162
+ name_ne: "कपिलवस्तु"
163
+ - code: "0502"
164
+ name_en: "Parasi"
165
+ name_ne: "परासी"
166
+ - code: "0503"
167
+ name_en: "Rupandehi"
168
+ name_ne: "रूपन्देही"
169
+ - code: "0504"
170
+ name_en: "Arghakhanchi"
171
+ name_ne: "अर्घाखाँची"
172
+ - code: "0505"
173
+ name_en: "Gulmi"
174
+ name_ne: "गुल्मी"
175
+ - code: "0506"
176
+ name_en: "Palpa"
177
+ name_ne: "पाल्पा"
178
+ - code: "0507"
179
+ name_en: "Dang"
180
+ name_ne: "दाङ"
181
+ - code: "0508"
182
+ name_en: "Pyuthan"
183
+ name_ne: "प्युठान"
184
+ - code: "0509"
185
+ name_en: "Rolpa"
186
+ name_ne: "रोल्पा"
187
+ - code: "0510"
188
+ name_en: "Eastern Rukum"
189
+ name_ne: "पूर्वी रुकुम"
190
+ - code: "0511"
191
+ name_en: "Banke"
192
+ name_ne: "बाँके"
193
+ - code: "0512"
194
+ name_en: "Bardiya"
195
+ name_ne: "बर्दिया"
196
+ - code: "NP-P6"
197
+ name_en: "Karnali"
198
+ name_ne: "कर्णाली"
199
+ districts:
200
+ - code: "0601"
201
+ name_en: "Western Rukum"
202
+ name_ne: "पश्चिमी रुकुम"
203
+ - code: "0602"
204
+ name_en: "Salyan"
205
+ name_ne: "सल्यान"
206
+ - code: "0603"
207
+ name_en: "Dolpa"
208
+ name_ne: "डोल्पा"
209
+ - code: "0604"
210
+ name_en: "Humla"
211
+ name_ne: "हुम्ला"
212
+ - code: "0605"
213
+ name_en: "Jumla"
214
+ name_ne: "जुम्ला"
215
+ - code: "0606"
216
+ name_en: "Kalikot"
217
+ name_ne: "कालिकोट"
218
+ - code: "0607"
219
+ name_en: "Mugu"
220
+ name_ne: "मुगु"
221
+ - code: "0608"
222
+ name_en: "Surkhet"
223
+ name_ne: "सुर्खेत"
224
+ - code: "0609"
225
+ name_en: "Dailekh"
226
+ name_ne: "दैलेख"
227
+ - code: "0610"
228
+ name_en: "Jajarkot"
229
+ name_ne: "जाजरकोट"
230
+ - code: "NP-P7"
231
+ name_en: "Sudurpashchim"
232
+ name_ne: "सुदूर-पश्चिम"
233
+ districts:
234
+ - code: "0701"
235
+ name_en: "Kailali"
236
+ name_ne: "कैलाली"
237
+ - code: "0702"
238
+ name_en: "Achham"
239
+ name_ne: "अछाम"
240
+ - code: "0703"
241
+ name_en: "Doti"
242
+ name_ne: "डोटी"
243
+ - code: "0704"
244
+ name_en: "Bajhang"
245
+ name_ne: "बझाङ"
246
+ - code: "0705"
247
+ name_en: "Bajura"
248
+ name_ne: "बाजुरा"
249
+ - code: "0706"
250
+ name_en: "Kanchanpur"
251
+ name_ne: "कञ्चनपुर"
252
+ - code: "0707"
253
+ name_en: "Dadeldhura"
254
+ name_ne: "डडेल्धुरा"
255
+ - code: "0708"
256
+ name_en: "Baitadi"
257
+ name_ne: "बैतडी"
258
+ - code: "0709"
259
+ name_en: "Darchula"
260
+ name_ne: "दार्चुला"
@@ -0,0 +1,31 @@
1
+ module Gaun
2
+ AdministrativeDivision = Data.define(:code, :name_en, :name_ne, :subdivisions, :parent_division) do
3
+ class << self
4
+ def all
5
+ data.values
6
+ end
7
+
8
+ def first
9
+ all.first
10
+ end
11
+
12
+ def find(...)
13
+ all.find(...)
14
+ end
15
+
16
+ def [](code)
17
+ data[code]
18
+ end
19
+
20
+ private
21
+
22
+ def data
23
+ @data ||= cache.data.fetch(self)
24
+ end
25
+
26
+ def cache
27
+ @cache ||= Cache.new
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/gaun/cache.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Gaun
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 Gaun
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 Gaun
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 Gaun
2
+ class Province < AdministrativeDivision
3
+ def districts
4
+ subdivisions
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Gaun
2
+ VERSION = "0.2.0"
3
+ end
data/lib/gaun.rb ADDED
@@ -0,0 +1,9 @@
1
+ require_relative "gaun/version"
2
+ require_relative "gaun/administrative_division"
3
+ require_relative "gaun/province"
4
+ require_relative "gaun/district"
5
+ require_relative "gaun/cache"
6
+ require_relative "gaun/parser"
7
+
8
+ module Gaun
9
+ end
@@ -0,0 +1,16 @@
1
+ {
2
+ "bootstrap-sha": "96e184a0cb4a3de5aa9ab838c8d0b90b59474f5d",
3
+ "include-component-in-tag": false,
4
+ "version-file": "lib/gaun/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
+ }
data/sig/gaun.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Gaun
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gaun
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: |
13
+ Gaun is a Ruby library providing structured geographical and administrative
14
+ data for Nepal, including provinces and districts.
15
+ It is designed for offline use in civic tech, humanitarian, and early warning systems.
16
+ email:
17
+ - dwilkie@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - ".release-please-manifest.json"
23
+ - ".tool-versions"
24
+ - CHANGELOG.md
25
+ - LICENSE
26
+ - README.md
27
+ - Rakefile
28
+ - lib/data/provinces.yml
29
+ - lib/gaun.rb
30
+ - lib/gaun/administrative_division.rb
31
+ - lib/gaun/cache.rb
32
+ - lib/gaun/district.rb
33
+ - lib/gaun/parser.rb
34
+ - lib/gaun/province.rb
35
+ - lib/gaun/version.rb
36
+ - release-please-config.json
37
+ - sig/gaun.rbs
38
+ homepage: https://github.com/open-ews/gaun
39
+ licenses:
40
+ - MIT
41
+ metadata:
42
+ homepage_uri: https://github.com/open-ews/gaun
43
+ source_code_uri: https://github.com/open-ews/gaun
44
+ changelog_uri: https://github.com/open-ews/gaun/blob/main/CHANGELOG.md
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.2.0
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubygems_version: 4.0.3
60
+ specification_version: 4
61
+ summary: Geographical and administrative data for Nepal
62
+ test_files: []