pumi 0.1.1

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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.github/actions/fetch_data/Dockerfile +8 -0
  3. data/.github/actions/fetch_data/action.yml +17 -0
  4. data/.github/actions/fetch_data/entrypoint.sh +16 -0
  5. data/.github/workflows/build.yml +25 -0
  6. data/.github/workflows/bump_version.yml +37 -0
  7. data/.github/workflows/update_data.yml +38 -0
  8. data/.gitignore +14 -0
  9. data/.rspec +2 -0
  10. data/.rubocop.yml +22 -0
  11. data/.tool-versions +2 -0
  12. data/CODE_OF_CONDUCT.md +74 -0
  13. data/Gemfile +4 -0
  14. data/LICENSE.txt +21 -0
  15. data/README.md +177 -0
  16. data/Rakefile +6 -0
  17. data/app/assets/javascripts/pumi.js.coffee +97 -0
  18. data/app/controllers/pumi/communes_controller.rb +7 -0
  19. data/app/controllers/pumi/districts_controller.rb +7 -0
  20. data/app/controllers/pumi/provinces_controller.rb +7 -0
  21. data/app/controllers/pumi/villages_controller.rb +7 -0
  22. data/app/serializers/pumi/response_serializer.rb +15 -0
  23. data/bin/console +14 -0
  24. data/bin/parse_data +66 -0
  25. data/bin/setup +8 -0
  26. data/config/routes.rb +3 -0
  27. data/data/communes.yml +13170 -0
  28. data/data/districts.yml +1626 -0
  29. data/data/provinces.yml +202 -0
  30. data/data/villages.yml +114978 -0
  31. data/lib/pumi/administrative_unit.rb +3 -0
  32. data/lib/pumi/commune.rb +3 -0
  33. data/lib/pumi/data_store.rb +7 -0
  34. data/lib/pumi/district.rb +3 -0
  35. data/lib/pumi/location.rb +42 -0
  36. data/lib/pumi/parser.rb +135 -0
  37. data/lib/pumi/province.rb +3 -0
  38. data/lib/pumi/rails/engine.rb +6 -0
  39. data/lib/pumi/rails.rb +2 -0
  40. data/lib/pumi/store_cache.rb +17 -0
  41. data/lib/pumi/version.rb +3 -0
  42. data/lib/pumi/village.rb +3 -0
  43. data/lib/pumi.rb +25 -0
  44. data/pumi.gemspec +40 -0
  45. data/pumi.jpg +0 -0
  46. data/pumi_ui_en.png +0 -0
  47. data/pumi_ui_km.png +0 -0
  48. data/tmp/.keep +0 -0
  49. metadata +302 -0
data/bin/parse_data ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Usage:
4
+
5
+ # $ parse_data
6
+
7
+ require "pathname"
8
+ require "csv"
9
+ require "yaml"
10
+
11
+ DEFAULT_DATA_LOCATION = "tmp/*.csv".freeze
12
+ HEADERS = %w[type code name_km name_latin reference note1 note2].freeze
13
+ CODE_LENGTHS = {
14
+ 4 => "districts",
15
+ 6 => "communes",
16
+ 8 => "villages"
17
+ }.freeze
18
+
19
+ # https://en.wikipedia.org/wiki/Administrative_divisions_of_Cambodia
20
+ # https://en.wikipedia.org/wiki/Romanization_of_Khmer
21
+ # https://en.wikipedia.org/wiki/United_Nations_Group_of_Experts_on_Geographical_Names
22
+
23
+ AdministrativeUnit = Struct.new(:en, :km, :latin, keyword_init: true)
24
+ ADMINISTRATIVE_UNITS = {
25
+ "ស្រុក" => AdministrativeUnit.new(en: "District", km: "ស្រុក", latin: "Srok"),
26
+ "ខណ្ឌ" => AdministrativeUnit.new(en: "Section", km: "ខណ្ឌ", latin: "Khan"),
27
+ "ឃុំ" => AdministrativeUnit.new(en: "Commune", km: "ឃុំ", latin: "Khum"),
28
+ "សង្កាត់" => AdministrativeUnit.new(en: "Quarter", km: "សង្កាត់", latin: "Sangkat"),
29
+ "ភូមិ" => AdministrativeUnit.new(en: "Village", km: "ភូមិ", latin: "Phum"),
30
+ "ក្រុង" => AdministrativeUnit.new(en: "Municipality", km: "ក្រុង", latin: "Krong")
31
+ }.freeze
32
+
33
+ data = {}
34
+
35
+ Pathname.glob(DEFAULT_DATA_LOCATION).select(&:file?).each do |file|
36
+ CSV.read(file, headers: HEADERS).each do |row|
37
+ code = row.fetch("code")
38
+ next if code.to_s.gsub(/\D/, "").empty?
39
+
40
+ code = code.rjust(code.length + 1, "0") if code.length.odd?
41
+ location_type = CODE_LENGTHS.fetch(code.length)
42
+ administrative_unit = ADMINISTRATIVE_UNITS.fetch(row.fetch("type"))
43
+
44
+ data[location_type] ||= {}
45
+ data[location_type][code] = {
46
+ "name" => {
47
+ "km" => row.fetch("name_km"),
48
+ "latin" => row.fetch("name_latin")
49
+ },
50
+ "administrative_unit" => {
51
+ "km" => administrative_unit.km,
52
+ "latin" => administrative_unit.latin,
53
+ "en" => administrative_unit.en
54
+ }
55
+ }
56
+ end
57
+ end
58
+
59
+ if data.any?
60
+ CODE_LENGTHS.each do |_, type|
61
+ File.write(
62
+ "data/#{type}.yml",
63
+ { type => data.fetch(type).sort.to_h }.to_yaml
64
+ )
65
+ end
66
+ end
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Pumi::Engine.routes.draw do
2
+ resources :provinces, :districts, :communes, :villages, :only => :index, :defaults => { :format => :json }
3
+ end