jp_local_gov 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/dependabot.yml +14 -0
- data/.github/workflows/auto-update.yml +27 -0
- data/.github/workflows/lint.yml +21 -0
- data/.github/workflows/main.yml +16 -0
- data/.github/workflows/steep.yml +30 -0
- data/.github/workflows/test.yml +20 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +17 -0
- data/.ruby-version +1 -0
- data/Appraisals +5 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +24 -0
- data/LICENSE.txt +21 -0
- data/README.md +151 -0
- data/Rakefile +44 -0
- data/Steepfile +6 -0
- data/bin/console +15 -0
- data/bin/generate_rbs +13 -0
- data/bin/lint +3 -0
- data/bin/setup +7 -0
- data/bin/steep +4 -0
- data/bin/test +4 -0
- data/data/base.rb +77 -0
- data/data/exporter.rb +65 -0
- data/data/importer.rb +65 -0
- data/data/json/01.json +1757 -0
- data/data/json/02.json +362 -0
- data/data/json/03.json +299 -0
- data/data/json/04.json +362 -0
- data/data/json/05.json +227 -0
- data/data/json/06.json +317 -0
- data/data/json/07.json +533 -0
- data/data/json/08.json +398 -0
- data/data/json/09.json +227 -0
- data/data/json/10.json +317 -0
- data/data/json/11.json +659 -0
- data/data/json/12.json +542 -0
- data/data/json/13.json +560 -0
- data/data/json/14.json +551 -0
- data/data/json/15.json +344 -0
- data/data/json/16.json +137 -0
- data/data/json/17.json +173 -0
- data/data/json/18.json +155 -0
- data/data/json/19.json +245 -0
- data/data/json/20.json +695 -0
- data/data/json/21.json +380 -0
- data/data/json/22.json +407 -0
- data/data/json/23.json +632 -0
- data/data/json/24.json +263 -0
- data/data/json/25.json +173 -0
- data/data/json/26.json +335 -0
- data/data/json/27.json +668 -0
- data/data/json/28.json +452 -0
- data/data/json/29.json +353 -0
- data/data/json/30.json +272 -0
- data/data/json/31.json +173 -0
- data/data/json/32.json +173 -0
- data/data/json/33.json +281 -0
- data/data/json/34.json +281 -0
- data/data/json/35.json +173 -0
- data/data/json/36.json +218 -0
- data/data/json/37.json +155 -0
- data/data/json/38.json +182 -0
- data/data/json/39.json +308 -0
- data/data/json/40.json +668 -0
- data/data/json/41.json +182 -0
- data/data/json/42.json +191 -0
- data/data/json/43.json +452 -0
- data/data/json/44.json +164 -0
- data/data/json/45.json +236 -0
- data/data/json/46.json +389 -0
- data/data/json/47.json +371 -0
- data/data/prefecture_capital.json +190 -0
- data/gemfiles/rails61.gemfile +25 -0
- data/gemfiles/rails61.gemfile.lock +127 -0
- data/jp_local_gov.gemspec +31 -0
- data/lib/jp_local_gov/base.rb +13 -0
- data/lib/jp_local_gov/local_gov.rb +17 -0
- data/lib/jp_local_gov/version.rb +5 -0
- data/lib/jp_local_gov.rb +68 -0
- data/sig/jp_local_gov/base.rbs +7 -0
- data/sig/jp_local_gov/local_gov.rbs +19 -0
- data/sig/jp_local_gov/version.rbs +3 -0
- data/sig/jp_local_gov.rbs +19 -0
- 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
|