pumi 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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