kamome 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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +12 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +72 -0
- data/LICENSE +21 -0
- data/Makefile +12 -0
- data/README.md +139 -0
- data/Rakefile +6 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/kamome.gemspec +47 -0
- data/lib/kamome.rb +74 -0
- data/lib/kamome/configuration.rb +20 -0
- data/lib/kamome/csv_handler.rb +45 -0
- data/lib/kamome/downloader.rb +56 -0
- data/lib/kamome/loader.rb +36 -0
- data/lib/kamome/models/address.rb +83 -0
- data/lib/kamome/models/general.rb +107 -0
- data/lib/kamome/models/jigyosho.rb +106 -0
- data/lib/kamome/operation.rb +79 -0
- data/lib/kamome/transformations/cleaner.rb +19 -0
- data/lib/kamome/transformations/extractor.rb +18 -0
- data/lib/kamome/transformations/general_csv.rb +74 -0
- data/lib/kamome/transformations/jigyosho_csv.rb +81 -0
- data/lib/kamome/version.rb +5 -0
- metadata +188 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kamome
|
4
|
+
class Operation
|
5
|
+
TYPE_HASH = :hash
|
6
|
+
TYPE_DETAIL = :detail
|
7
|
+
TYPE_DEFAULT = :default
|
8
|
+
|
9
|
+
GENRE_GENERAL = :general
|
10
|
+
GENRE_JIGYOSHO = :jigyosho
|
11
|
+
|
12
|
+
URL_GENERAL_ALL = 'https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip'
|
13
|
+
URL_GENERAL_ADD = 'https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/add_%s.zip'
|
14
|
+
URL_GENERAL_DEL = 'https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/del_%s.zip'
|
15
|
+
URL_JIGYOSHO_ALL = 'https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip'
|
16
|
+
URL_JIGYOSHO_ADD = 'https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jadd%s.zip'
|
17
|
+
URL_JIGYOSHO_DEL = 'https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jdel%s.zip'
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def general_all(type: TYPE_DEFAULT)
|
21
|
+
new(type: type, genre: GENRE_GENERAL, urls: [URL_GENERAL_ALL])
|
22
|
+
end
|
23
|
+
|
24
|
+
def jigyosho_all(type: TYPE_DEFAULT)
|
25
|
+
new(type: type, genre: GENRE_JIGYOSHO, urls: [URL_JIGYOSHO_ALL])
|
26
|
+
end
|
27
|
+
|
28
|
+
def general_diff(date:, type: TYPE_DEFAULT)
|
29
|
+
yymm = format_yymm(date)
|
30
|
+
new(type: type, genre: GENRE_GENERAL, urls: [URL_GENERAL_ADD % yymm, URL_GENERAL_DEL % yymm])
|
31
|
+
end
|
32
|
+
|
33
|
+
def jigyosho_diff(date:, type: TYPE_DEFAULT)
|
34
|
+
yymm = format_yymm(date)
|
35
|
+
new(type: type, genre: GENRE_JIGYOSHO, urls: [URL_JIGYOSHO_ADD % yymm, URL_JIGYOSHO_DEL % yymm])
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
YYMM_FORMAT = /\d{2}(0[1-9]|1[0-2])/.freeze
|
41
|
+
def format_yymm(date)
|
42
|
+
yymm = date.respond_to?(:strftime) ? date.strftime('%y%m') : date.to_s
|
43
|
+
return yymm if yymm =~ YYMM_FORMAT
|
44
|
+
|
45
|
+
raise ::Kamome::ArgumentError, 'Wrong argument "date" (required "yymm" format)'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
attr_reader :type
|
50
|
+
attr_reader :genre
|
51
|
+
attr_reader :urls
|
52
|
+
|
53
|
+
def initialize(type:, genre:, urls:)
|
54
|
+
@type = type
|
55
|
+
@genre = genre
|
56
|
+
@urls = urls
|
57
|
+
end
|
58
|
+
|
59
|
+
def type_hash?
|
60
|
+
type == TYPE_HASH
|
61
|
+
end
|
62
|
+
|
63
|
+
def type_detail?
|
64
|
+
type == TYPE_DETAIL
|
65
|
+
end
|
66
|
+
|
67
|
+
def type_default?
|
68
|
+
type == TYPE_DEFAULT
|
69
|
+
end
|
70
|
+
|
71
|
+
def genre_general?
|
72
|
+
genre == GENRE_GENERAL
|
73
|
+
end
|
74
|
+
|
75
|
+
def genre_jigyosho?
|
76
|
+
genre == GENRE_JIGYOSHO
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kamome
|
4
|
+
module Transformations
|
5
|
+
module Cleaner
|
6
|
+
module_function
|
7
|
+
|
8
|
+
TOWN_KAN_SUB_RULE = /(\((?!.カイ\)).+|イカニケイサイガナイバアイ|.+ノツギニバンチガクルバアイ|.+イチエン)$/.freeze
|
9
|
+
def clean_town_kana(value)
|
10
|
+
value.sub(TOWN_KAN_SUB_RULE, '')
|
11
|
+
end
|
12
|
+
|
13
|
+
TOWN_SUB_RULE = /(((?!.+階)).+)|以下に掲載がない場合|.+の次に番地がくる場合|.+一円)$/.freeze
|
14
|
+
def clean_town(value)
|
15
|
+
value.sub(TOWN_SUB_RULE, '')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kamome
|
4
|
+
module Transformations
|
5
|
+
module Extractor
|
6
|
+
module_function
|
7
|
+
|
8
|
+
POST_OFFICE_REG = /((.+私書箱第.+号))$/.freeze
|
9
|
+
def extract_street(value)
|
10
|
+
value.sub(POST_OFFICE_REG, '')
|
11
|
+
end
|
12
|
+
|
13
|
+
def extract_post_office_box(value)
|
14
|
+
value[POST_OFFICE_REG, 1] || ''
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kamome/transformations/cleaner'
|
4
|
+
require 'kamome/models/general'
|
5
|
+
require 'kamome/models/address'
|
6
|
+
|
7
|
+
module Kamome
|
8
|
+
module Transformations
|
9
|
+
# Transform a GENERAL csv row to a Hash or others
|
10
|
+
class GeneralCsv
|
11
|
+
include Kamome::Transformations::Cleaner
|
12
|
+
|
13
|
+
# Generate hash from a general csv row
|
14
|
+
# @return [Hash]
|
15
|
+
def generate_hash(row)
|
16
|
+
validate_row!(row)
|
17
|
+
transform(row)
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_detail_model(row)
|
21
|
+
attributes = generate_hash(row)
|
22
|
+
::Kamome::Models::General.new(attributes)
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_model(row)
|
26
|
+
attributes = extract(generate_hash(row))
|
27
|
+
::Kamome::Models::Address.new(attributes)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
VALID_ROW_SIZE = 15
|
33
|
+
|
34
|
+
def validate_row!(row)
|
35
|
+
return if row&.size == VALID_ROW_SIZE
|
36
|
+
|
37
|
+
raise ArgumentError, "Wrong row size (expected #{VALID_ROW_SIZE}, got #{row&.size})"
|
38
|
+
end
|
39
|
+
|
40
|
+
def transform(row) # rubocop:disable Metrics/AbcSize
|
41
|
+
{
|
42
|
+
code: row[0].to_s,
|
43
|
+
zipcode: row[2].to_s,
|
44
|
+
prefecture_kana: row[3].to_s,
|
45
|
+
city_kana: row[4].to_s,
|
46
|
+
town_kana: clean_town_kana(row[5].to_s),
|
47
|
+
prefecture: row[6].to_s,
|
48
|
+
city: row[7].to_s,
|
49
|
+
town: clean_town(row[8].to_s),
|
50
|
+
ambiguous_town: row[9].to_i == 1,
|
51
|
+
ambiguous_street: row[10].to_i == 1,
|
52
|
+
required_chome: row[11].to_i == 1,
|
53
|
+
ambiguous_zipcode: row[12].to_i == 1,
|
54
|
+
state: row[13].to_i,
|
55
|
+
reason: row[14].to_i
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def extract(attributes)
|
60
|
+
{
|
61
|
+
code: attributes[:code],
|
62
|
+
zipcode: attributes[:zipcode],
|
63
|
+
prefecture: attributes[:prefecture],
|
64
|
+
city: attributes[:city],
|
65
|
+
town: attributes[:town],
|
66
|
+
street: '',
|
67
|
+
company_name: '',
|
68
|
+
post_office_box: '',
|
69
|
+
state: attributes[:state]
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kamome/transformations/extractor'
|
4
|
+
require 'kamome/models/jigyosho'
|
5
|
+
require 'kamome/models/address'
|
6
|
+
|
7
|
+
module Kamome
|
8
|
+
module Transformations
|
9
|
+
# Transform a JIGYOSHO csv row to a Hash or others
|
10
|
+
class JigyoshoCsv
|
11
|
+
include ::Kamome::Transformations::Extractor
|
12
|
+
|
13
|
+
# Generate a Hash from a JIGYOSHO csv row
|
14
|
+
# @return [Hash]
|
15
|
+
def generate_hash(row)
|
16
|
+
validate_row!(row)
|
17
|
+
transform(row)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Generate an instance of Kamome::Models::Jigyosho from a JIGYOSHO csv row
|
21
|
+
# @return [Kamome::Models::Jigyosho]
|
22
|
+
def generate_detail_model(row)
|
23
|
+
attributes = generate_hash(row)
|
24
|
+
::Kamome::Models::Jigyosho.new(attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Generate an instance of Kamome::Models::Address from a JIGYOSHO csv row
|
28
|
+
# @return [Kamome::Models::Address]
|
29
|
+
def generate_model(row)
|
30
|
+
attributes = extract(generate_hash(row))
|
31
|
+
::Kamome::Models::Address.new(attributes)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
VALID_ROW_SIZE = 13
|
37
|
+
|
38
|
+
def validate_row!(row)
|
39
|
+
return if row&.size == VALID_ROW_SIZE
|
40
|
+
|
41
|
+
raise ArgumentError, "Wrong row size (expected #{VALID_ROW_SIZE}, got #{row&.size})"
|
42
|
+
end
|
43
|
+
|
44
|
+
def transform(row) # rubocop:disable Metrics/AbcSize
|
45
|
+
{
|
46
|
+
code: row[0].to_s,
|
47
|
+
company_name_kana: row[1].to_s,
|
48
|
+
company_name: row[2].to_s,
|
49
|
+
prefecture: row[3].to_s,
|
50
|
+
city: row[4].to_s,
|
51
|
+
town: row[5].to_s,
|
52
|
+
street: extract_street(row[6].to_s),
|
53
|
+
post_office_box: extract_post_office_box(row[6].to_s),
|
54
|
+
zipcode: row[7].to_s,
|
55
|
+
japanpost_office_name: row[9].to_s,
|
56
|
+
has_post_office_box: row[10].to_i == 1,
|
57
|
+
multiple: row[11].to_i,
|
58
|
+
state: row[12].to_i
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def extract(attributes)
|
63
|
+
{
|
64
|
+
code: attributes[:code],
|
65
|
+
zipcode: attributes[:zipcode],
|
66
|
+
prefecture: attributes[:prefecture],
|
67
|
+
city: attributes[:city],
|
68
|
+
town: attributes[:town],
|
69
|
+
street: attributes[:street],
|
70
|
+
company_name: attributes[:company_name],
|
71
|
+
post_office_box: attributes[:post_office_box],
|
72
|
+
state: convert_state(attributes[:state])
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def convert_state(state)
|
77
|
+
state == 5 ? 2 : state
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
metadata
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kamome
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- kengos
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.17'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.17'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: vcr
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.4'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.60'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.60'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.30'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.30'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubyzip
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.2'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.2'
|
125
|
+
description: the Japanese postcode loading interface
|
126
|
+
email:
|
127
|
+
- kengo@kengos.jp
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- ".gitignore"
|
133
|
+
- ".rspec"
|
134
|
+
- ".rubocop.yml"
|
135
|
+
- ".travis.yml"
|
136
|
+
- ".yardopts"
|
137
|
+
- CHANGELOG.md
|
138
|
+
- Gemfile
|
139
|
+
- Gemfile.lock
|
140
|
+
- LICENSE
|
141
|
+
- Makefile
|
142
|
+
- README.md
|
143
|
+
- Rakefile
|
144
|
+
- bin/console
|
145
|
+
- bin/setup
|
146
|
+
- kamome.gemspec
|
147
|
+
- lib/kamome.rb
|
148
|
+
- lib/kamome/configuration.rb
|
149
|
+
- lib/kamome/csv_handler.rb
|
150
|
+
- lib/kamome/downloader.rb
|
151
|
+
- lib/kamome/loader.rb
|
152
|
+
- lib/kamome/models/address.rb
|
153
|
+
- lib/kamome/models/general.rb
|
154
|
+
- lib/kamome/models/jigyosho.rb
|
155
|
+
- lib/kamome/operation.rb
|
156
|
+
- lib/kamome/transformations/cleaner.rb
|
157
|
+
- lib/kamome/transformations/extractor.rb
|
158
|
+
- lib/kamome/transformations/general_csv.rb
|
159
|
+
- lib/kamome/transformations/jigyosho_csv.rb
|
160
|
+
- lib/kamome/version.rb
|
161
|
+
homepage: https://github.com/kengos/kamome
|
162
|
+
licenses:
|
163
|
+
- MIT
|
164
|
+
metadata:
|
165
|
+
homepage_uri: https://github.com/kengos/kamome
|
166
|
+
source_code_uri: https://github.com/kengos/kamome
|
167
|
+
changelog_uri: https://github.com/kengos/kamome/blob/master/CHANGELOG.md
|
168
|
+
post_install_message:
|
169
|
+
rdoc_options: []
|
170
|
+
require_paths:
|
171
|
+
- lib
|
172
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
requirements: []
|
183
|
+
rubyforge_project:
|
184
|
+
rubygems_version: 2.7.6
|
185
|
+
signing_key:
|
186
|
+
specification_version: 4
|
187
|
+
summary: kamome-0.1.0
|
188
|
+
test_files: []
|