jp_local_gov 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +14 -0
  3. data/.github/workflows/auto-update.yml +27 -0
  4. data/.github/workflows/lint.yml +21 -0
  5. data/.github/workflows/main.yml +16 -0
  6. data/.github/workflows/steep.yml +30 -0
  7. data/.github/workflows/test.yml +20 -0
  8. data/.gitignore +14 -0
  9. data/.rspec +3 -0
  10. data/.rubocop.yml +17 -0
  11. data/.ruby-version +1 -0
  12. data/Appraisals +5 -0
  13. data/CHANGELOG.md +5 -0
  14. data/CODE_OF_CONDUCT.md +84 -0
  15. data/Gemfile +24 -0
  16. data/LICENSE.txt +21 -0
  17. data/README.md +151 -0
  18. data/Rakefile +44 -0
  19. data/Steepfile +6 -0
  20. data/bin/console +15 -0
  21. data/bin/generate_rbs +13 -0
  22. data/bin/lint +3 -0
  23. data/bin/setup +7 -0
  24. data/bin/steep +4 -0
  25. data/bin/test +4 -0
  26. data/data/base.rb +77 -0
  27. data/data/exporter.rb +65 -0
  28. data/data/importer.rb +65 -0
  29. data/data/json/01.json +1757 -0
  30. data/data/json/02.json +362 -0
  31. data/data/json/03.json +299 -0
  32. data/data/json/04.json +362 -0
  33. data/data/json/05.json +227 -0
  34. data/data/json/06.json +317 -0
  35. data/data/json/07.json +533 -0
  36. data/data/json/08.json +398 -0
  37. data/data/json/09.json +227 -0
  38. data/data/json/10.json +317 -0
  39. data/data/json/11.json +659 -0
  40. data/data/json/12.json +542 -0
  41. data/data/json/13.json +560 -0
  42. data/data/json/14.json +551 -0
  43. data/data/json/15.json +344 -0
  44. data/data/json/16.json +137 -0
  45. data/data/json/17.json +173 -0
  46. data/data/json/18.json +155 -0
  47. data/data/json/19.json +245 -0
  48. data/data/json/20.json +695 -0
  49. data/data/json/21.json +380 -0
  50. data/data/json/22.json +407 -0
  51. data/data/json/23.json +632 -0
  52. data/data/json/24.json +263 -0
  53. data/data/json/25.json +173 -0
  54. data/data/json/26.json +335 -0
  55. data/data/json/27.json +668 -0
  56. data/data/json/28.json +452 -0
  57. data/data/json/29.json +353 -0
  58. data/data/json/30.json +272 -0
  59. data/data/json/31.json +173 -0
  60. data/data/json/32.json +173 -0
  61. data/data/json/33.json +281 -0
  62. data/data/json/34.json +281 -0
  63. data/data/json/35.json +173 -0
  64. data/data/json/36.json +218 -0
  65. data/data/json/37.json +155 -0
  66. data/data/json/38.json +182 -0
  67. data/data/json/39.json +308 -0
  68. data/data/json/40.json +668 -0
  69. data/data/json/41.json +182 -0
  70. data/data/json/42.json +191 -0
  71. data/data/json/43.json +452 -0
  72. data/data/json/44.json +164 -0
  73. data/data/json/45.json +236 -0
  74. data/data/json/46.json +389 -0
  75. data/data/json/47.json +371 -0
  76. data/data/prefecture_capital.json +190 -0
  77. data/gemfiles/rails61.gemfile +25 -0
  78. data/gemfiles/rails61.gemfile.lock +127 -0
  79. data/jp_local_gov.gemspec +31 -0
  80. data/lib/jp_local_gov/base.rb +13 -0
  81. data/lib/jp_local_gov/local_gov.rb +17 -0
  82. data/lib/jp_local_gov/version.rb +5 -0
  83. data/lib/jp_local_gov.rb +68 -0
  84. data/sig/jp_local_gov/base.rbs +7 -0
  85. data/sig/jp_local_gov/local_gov.rbs +19 -0
  86. data/sig/jp_local_gov/version.rbs +3 -0
  87. data/sig/jp_local_gov.rbs +19 -0
  88. metadata +130 -0
data/data/exporter.rb ADDED
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require_relative "base"
5
+
6
+ module JpLocalGov
7
+ module Data
8
+ class Exporter
9
+ SELECT_SQL = <<-SQL
10
+ SELECT
11
+ code,
12
+ prefecture_code,
13
+ prefecture,
14
+ prefecture_kana,
15
+ city,
16
+ city_kana,
17
+ prefecture_capital
18
+ FROM local_governments
19
+ ORDER BY code
20
+ SQL
21
+
22
+ def initialize
23
+ @db = JpLocalGov::Data::Base.new.db
24
+ end
25
+
26
+ def execute
27
+ local_governments.each do |prefix, value|
28
+ file_path = File.expand_path("../../data/json/#{prefix}.json", __FILE__)
29
+ File.open(file_path, "wb") do |file|
30
+ file.write JSON.pretty_generate(value)
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def local_governments
38
+ local_governments = {}
39
+
40
+ @db.execute(SELECT_SQL) do |row|
41
+ lg_hash = to_hash(row)
42
+ local_governments[lg_hash[:prefecture_code]] ||= {}
43
+ local_governments[lg_hash[:prefecture_code]] =
44
+ local_governments[lg_hash[:prefecture_code]].merge(lg_hash[:code] => lg_hash)
45
+ end
46
+
47
+ local_governments
48
+ end
49
+
50
+ def to_hash(row)
51
+ local_government = {}
52
+ local_government[:code],
53
+ local_government[:prefecture_code],
54
+ local_government[:prefecture],
55
+ local_government[:prefecture_kana],
56
+ local_government[:city],
57
+ local_government[:city_kana],
58
+ local_government[:prefecture_capital] = row
59
+
60
+ local_government[:prefecture_capital] = local_government[:prefecture_capital] == "1"
61
+ local_government
62
+ end
63
+ end
64
+ end
65
+ end
data/data/importer.rb ADDED
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+ require "open-uri"
5
+ require "pdf-reader"
6
+ require "json"
7
+ require "nokogiri"
8
+
9
+ module JpLocalGov
10
+ module Data
11
+ class Importer < Base
12
+ private
13
+
14
+ URL_DOMAIN = "https://www.soumu.go.jp"
15
+ SEARCH_URL = "https://www.soumu.go.jp/denshijiti/code.html"
16
+ VALID_COLUMN_COUNT = 5
17
+
18
+ def retrieve
19
+ local_governments = []
20
+ PDF::Reader.new(OpenURI.open_uri(pdf_url)).pages.each do |page|
21
+ page.text.split("\n").each do |row|
22
+ items = row.split("\s")
23
+ next if header?(items) || items.length != VALID_COLUMN_COUNT
24
+
25
+ local_governments << to_hash(items)
26
+ end
27
+ end
28
+ local_governments.uniq # to exclude special areas header(ex: Hokkaido Sapporo)
29
+ end
30
+
31
+ def to_hash(items)
32
+ {
33
+ code: items[0],
34
+ prefecture_code: items[0][0..1],
35
+ prefecture: items[1],
36
+ prefecture_kana: covert_half_char_to_full_char(items[3]),
37
+ city: items[2],
38
+ city_kana: covert_half_char_to_full_char(items[4]),
39
+ prefecture_capital: prefecture_capital?(items[1], items[2]) ? 1 : 0
40
+ }
41
+ end
42
+
43
+ def pdf_url
44
+ html = Nokogiri::HTML(OpenURI.open_uri(SEARCH_URL))
45
+ url = html.css('[href$=".pdf"]').first.attributes["href"]
46
+ "#{URL_DOMAIN}#{url}"
47
+ end
48
+
49
+ def header?(row)
50
+ (row[0] =~ /[0-9]/).nil?
51
+ end
52
+
53
+ def covert_half_char_to_full_char(text)
54
+ text.gsub(/[\uFF61-\uFF9F]+/) { |str| str.unicode_normalize(:nfkc) }
55
+ end
56
+
57
+ def prefecture_capital?(prefecture, city)
58
+ prefecture_capital_list = JSON.parse(File.open(File.expand_path("prefecture_capital.json", __dir__)).read)
59
+ prefecture_capital_list.find do |prefecture_capital|
60
+ prefecture_capital["prefecture"] == prefecture && prefecture_capital["city"] == city
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end