jp_local_gov 0.1.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.
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