jp_prefecture 0.11.0 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/jp_prefecture.rb CHANGED
@@ -1,8 +1,9 @@
1
- # coding: utf-8
2
- require "jp_prefecture/base"
3
- require "jp_prefecture/config"
4
- require "jp_prefecture/prefecture"
5
- require "jp_prefecture/version"
1
+ # frozen_string_literal: true
2
+
3
+ require 'jp_prefecture/base'
4
+ require 'jp_prefecture/config'
5
+ require 'jp_prefecture/prefecture'
6
+ require 'jp_prefecture/version'
6
7
 
7
8
  module JpPrefecture
8
9
  @config = Config.new
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  module JpPrefecture
3
4
  module Base
4
5
  # モデル内で使用するための設定を行う
@@ -34,7 +35,7 @@ module JpPrefecture
34
35
  method_name = options[:method_name] || :prefecture
35
36
 
36
37
  define_method method_name do
37
- JpPrefecture::Prefecture.find(self.send(column_name))
38
+ JpPrefecture::Prefecture.find(send(column_name))
38
39
  end
39
40
  end
40
41
  end
@@ -1,9 +1,7 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
3
  module JpPrefecture
4
4
  class Config
5
- attr_accessor :mapping_data
6
- attr_accessor :zip_mapping_data
5
+ attr_accessor :mapping_data, :zip_mapping_data
7
6
  end
8
7
  end
9
-
@@ -1,10 +1,10 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'yaml'
3
4
 
4
5
  module JpPrefecture
5
6
  # コードと都道府県のマッピング
6
7
  module Mapping
7
-
8
8
  filepath = File.join(File.dirname(__FILE__), '../../data/prefecture.yml')
9
9
  @data = YAML.load_file(filepath)
10
10
 
@@ -1,98 +1,46 @@
1
- # coding: utf-8
2
- require "jp_prefecture/mapping"
3
- require "jp_prefecture/zip_mapping"
1
+ # frozen_string_literal: true
2
+
3
+ require 'jp_prefecture/prefecture/finder'
4
+ require 'jp_prefecture/mapping'
5
+ require 'jp_prefecture/zip_mapping'
4
6
 
5
7
  module JpPrefecture
6
8
  # 都道府県のコードと名前を扱うクラス
7
9
  class Prefecture
8
-
9
10
  attr_accessor :code, :name, :name_e, :name_h, :name_k, :zips, :area, :type
10
11
 
11
- # 配列から都道府県クラスを生成
12
+ # 都道府県コードから都道府県インスタンスを作成
12
13
  #
13
14
  # @example
14
- # # コード/名前から都道府県クラスを生成
15
- # JpPrefecture::Prefecture.build(1, '北海道', 'Hokkaido')
15
+ # # 都道府県コードから都道府県インスタンスを生成
16
+ # JpPrefecture::Prefecture.build_by_code(1)
16
17
  #
17
- # @param pref [Integer] 都道府県コード
18
- # @param name [String] 都道府県名
19
- # @param name_e [String] 都道府県名(英語表記)
20
- # @param optional name_h [String] 都道府県名(ひらがな表記)
21
- # @param optional name_k [String] 都道府県名(カタカナ表記)
22
- # @param optional area [String] 地方名
23
- # @param zips [Array] 郵便番号の配列 (array of ranges, can be used in ARel, e.g. User.where(zip: prefecture.zips))
24
- def self.build(code, name, name_e, name_h = nil, name_k = nil, area = nil)
25
- pref = self.new
26
-
27
- pref.code = code
28
- pref.name = name
29
- pref.name_e = name_e.capitalize
30
- pref.name_h = name_h
31
- pref.name_k = name_k
32
- pref.zips = ZipMapping.data[code]
33
- pref.area = area
34
- pref.type =
18
+ # @param code [Integer] 都道府県コード
19
+ # @return [JpPrefecture::Prefecture] 都道府県インスタンス
20
+ # @return [nil] 都道府県が見つからない場合は nil
21
+ def self.build_by_code(code) # rubocop:disable Metrics/AbcSize
22
+ result = Mapping.data[code]
23
+ return unless result
24
+
25
+ pref = new
26
+
27
+ pref.code = code
28
+ pref.name = result[:name]
29
+ pref.name_e = result[:name_e].capitalize
30
+ pref.name_h = result[:name_h]
31
+ pref.name_k = result[:name_k]
32
+ pref.zips = ZipMapping.data[code]
33
+ pref.area = result[:area]
34
+ pref.type =
35
35
  case pref.name[-1]
36
- when "", "", "", ""
36
+ when '', '', '', ''
37
37
  pref.name[-1]
38
- else
39
- nil
40
38
  end
41
39
 
42
40
  pref
43
41
  end
44
42
 
45
- # 都道府県を検索
46
- #
47
- # @example
48
- # # 都道府県コードから検索
49
- # JpPrefecture::Prefecture.find(1)
50
- # JpPrefecture::Prefecture.find(code: 1)
51
- #
52
- # # 都道府県名から検索
53
- # JpPrefecture::Prefecture.find(name: '北海道')
54
- #
55
- # # 都道府県名から検索(前方一致)
56
- # JpPrefecture::Prefecture.find(name: '東京')
57
- #
58
- # # 英語表記の都道府県名から検索
59
- # JpPrefecture::Prefecture.find(name: 'Hokkaido')
60
- # JpPrefecture::Prefecture.find(name: 'hokkaido')
61
- #
62
- # @param args [Integer] 都道府県コード
63
- # @param [Hash] args 検索条件
64
- # @option args [Integer] :code 都道府県コード
65
- # @option args [String] :name 都道府県名/英語/ひらがな/カタカナ表記の都道府県名
66
- # @option args [Integer] :zip 郵便番号
67
- # @return [JpPrefecture::Prefecture] 都道府県が見つかった場合は都道府県クラス
68
- # @return [nil] 都道府県が見つからない場合は nil
69
- def self.find(args)
70
- return if args.nil?
71
-
72
- if args.is_a?(Integer) || args.is_a?(String)
73
- code = args.to_i
74
- else
75
- code =
76
- case args.keys[0]
77
- when :name
78
- self.find_code_by_name(args[:name])
79
- when :code
80
- args[:code].to_i
81
- when :zip
82
- ZipMapping.code_for_zip(args[:zip].to_i)
83
- end
84
- end
85
-
86
- names = Mapping.data[code]
87
-
88
- return unless names
89
-
90
- self.build(code,
91
- names[:name], names[:name_e],
92
- names[:name_h], names[:name_k], names[:area])
93
- end
94
-
95
- # すべての都道府県クラスを返す
43
+ # すべての都道府県を取得
96
44
  #
97
45
  # @example
98
46
  # # 都道府県の一覧を取得
@@ -104,38 +52,56 @@ module JpPrefecture
104
52
  # # collection_select で選択肢を生成(英語表記)
105
53
  # f.collection_select :prefecture_code, JpPrefecture::Prefecture.all, :code, :name_e
106
54
  #
107
- # @return [Array] 都道府県クラスの配列
55
+ # @return [Array<JpPrefecture::Prefecture>] 都道府県インスタンスの配列
108
56
  def self.all
109
- Mapping.data.map do |pref|
110
- names = pref[1]
111
- self.build(pref[0],
112
- names[:name], names[:name_e],
113
- names[:name_h], names[:name_k], names[:area])
114
- end
57
+ Mapping.data.map { |code, _| build_by_code(code) }
115
58
  end
116
59
 
117
- protected
118
-
119
- # 名前から都道府県コードを前方一致で検索
60
+ # 都道府県を検索
61
+ #
62
+ # 文字列は前方一致で検索する
63
+ #
64
+ # @example
65
+ # # 都道府県コードを検索
66
+ # JpPrefecture::Prefecture.find(1)
67
+ # JpPrefecture::Prefecture.find(code: 1)
68
+ #
69
+ # # 都道府県名を検索
70
+ # JpPrefecture::Prefecture.find(name: '北海道')
71
+ # JpPrefecture::Prefecture.find(name: '東京')
72
+ #
73
+ # # 英語表記の都道府県名を検索
74
+ # JpPrefecture::Prefecture.find(name_e: 'Hokkaido')
75
+ # JpPrefecture::Prefecture.find(name_e: 'hokkaido')
76
+ #
77
+ # # ひらがな表記の都道府県名を検索
78
+ # JpPrefecture::Prefecture.find(name_h: 'ほっかいどう')
120
79
  #
121
- # @param name [String] 検索する都道府県名
122
- # @return [Integer] 見つかった場合は都道府県コード
123
- # @return [nil] 見つからない場合は nil
124
- def self.find_code_by_name(name)
125
- return nil if name.nil? || name.empty?
80
+ # # カタカナ表記の都道府県名を検索
81
+ # JpPrefecture::Prefecture.find(name_k: 'ホッカイドウ')
82
+ #
83
+ # # すべての項目を検索
84
+ # JpPrefecture::Prefecture.find(all_fields: '東')
85
+ #
86
+ # @param args [Integer] 都道府県コード
87
+ # @param args [Hash<Symbol, Integer>] :code 都道府県コード
88
+ # @param args [Hash<Symbol, String>] :name 漢字表記/:name_e 英語表記/:name_h ひらがな表記/:name_k カタカナ表記
89
+ # @param args [Hash<Symbol, Integer>] :zip 郵便番号
90
+ # @param args [Hash<Symbol, (String, Integer)>] :all_fields マッピングに定義しているすべてのフィールドから検索
91
+ # @return [JpPrefecture::Prefecture] 都道府県が見つかった場合は都道府県インスタンス
92
+ # @return [nil] 都道府県が見つからない場合は nil
93
+ def self.find(args)
94
+ return if args.nil?
126
95
 
127
- name = name.downcase
96
+ case args
97
+ when Integer, String
98
+ JpPrefecture::Prefecture::Finder.new.find(field: nil, value: args)
99
+ when Hash
100
+ search_field = args.keys.first
101
+ search_value = args.values.first
128
102
 
129
- Mapping.data.each do |m|
130
- m[1].values.each do |v|
131
- if v.start_with?(name)
132
- return m[0]
133
- end
134
- end
103
+ JpPrefecture::Prefecture::Finder.new.find(field: search_field, value: search_value)
135
104
  end
136
-
137
- nil
138
105
  end
139
-
140
106
  end
141
107
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jp_prefecture/mapping'
4
+ require 'jp_prefecture/zip_mapping'
5
+
6
+ module JpPrefecture
7
+ class Prefecture
8
+ # 都道府県の検索を行うクラス
9
+ class Finder
10
+ def initialize
11
+ @mapping = Mapping.data
12
+ end
13
+
14
+ # 指定した項目を検索
15
+ #
16
+ # @param field [Symbol] 検索する項目。nil の場合は都道府県コードとして扱う
17
+ # @param value [String, Integer] 検索する内容
18
+ # @return [JpPrefecture::Prefecture] 都道府県が見つかった場合は都道府県インスタンス
19
+ # @return [nil] 都道府県が見つからない場合は nil
20
+ def find(field:, value:)
21
+ code = find_code(field, value)
22
+ JpPrefecture::Prefecture.build_by_code(code)
23
+ end
24
+
25
+ private
26
+
27
+ # @param field [Symbol] 検索する項目
28
+ # @param value [String, Integer] 検索する内容
29
+ # @return [Integer] 見つかった場合は都道府県コード
30
+ # @return [nil] 見つからない場合は nil
31
+ def find_code(field, value)
32
+ return value.to_i if field.nil?
33
+
34
+ case field
35
+ when :all_fields
36
+ find_code_by_name_from_all_fields(value)
37
+ when :name, :name_h, :name_k, :name_e
38
+ find_code_by_name(field, value)
39
+ when :code
40
+ value.to_i
41
+ when :zip
42
+ ZipMapping.code_for_zip(value.to_i)
43
+ end
44
+ end
45
+
46
+ # すべての項目を前方一致で検索
47
+ def find_code_by_name_from_all_fields(value)
48
+ return if value.nil? || value.empty?
49
+
50
+ value = value.downcase
51
+
52
+ @mapping.each do |m|
53
+ m[1].each_value do |v|
54
+ return m[0] if v.start_with?(value)
55
+ end
56
+ end
57
+ end
58
+
59
+ # 指定した項目を前方一致で検索
60
+ def find_code_by_name(field, value)
61
+ return if value.nil? || value.empty?
62
+
63
+ value = value.downcase
64
+
65
+ @mapping.each do |m|
66
+ return m[0] if m[1][field].start_with?(value)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JpPrefecture
2
- VERSION = '0.11.0'
4
+ VERSION = '1.0.0.rc1'
3
5
  end
@@ -1,21 +1,21 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'yaml'
3
4
 
4
5
  module JpPrefecture
5
6
  # コードと郵便番号のマッピング
6
7
  module ZipMapping
7
-
8
8
  filepath = File.join(File.dirname(__FILE__), '../../data/zip.yml')
9
9
  @data = YAML.load_file(filepath)
10
- @data = Hash[*@data.collect{|code, arr|[code, arr.collect{|zip_from, zip_to|zip_from..zip_to}]}.flatten(1)]
10
+ @data = Hash[*@data.collect { |code, arr| [code, arr.collect { |zip_from, zip_to| zip_from..zip_to }] }.flatten(1)]
11
11
 
12
12
  def self.data
13
13
  JpPrefecture.config.zip_mapping_data || @data
14
14
  end
15
15
 
16
- def self.code_for_zip zip
17
- self.data.select do |code, zip_ranges|
18
- zip_ranges.find{|range|range.include? zip}
16
+ def self.code_for_zip(zip)
17
+ data.select do |_code, zip_ranges|
18
+ zip_ranges.find { |range| range.include? zip }
19
19
  end.keys.first
20
20
  end
21
21
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jp_prefecture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
- - chocoby
7
+ - "@chocoby"
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-18 00:00:00.000000000 Z
11
+ date: 2021-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: appraisal
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: rake
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +67,49 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
- name: activerecord
70
+ name: rubocop
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ">="
46
74
  - !ruby/object:Gem::Version
47
- version: 4.2.0
75
+ version: '0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
- version: 4.2.0
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
- name: sqlite3
84
+ name: rubocop-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
57
113
  requirement: !ruby/object:Gem::Requirement
58
114
  requirements:
59
115
  - - ">="
@@ -95,7 +151,7 @@ dependencies:
95
151
  - !ruby/object:Gem::Version
96
152
  version: '0'
97
153
  - !ruby/object:Gem::Dependency
98
- name: appraisal
154
+ name: sqlite3
99
155
  requirement: !ruby/object:Gem::Requirement
100
156
  requirements:
101
157
  - - ">="
@@ -108,51 +164,27 @@ dependencies:
108
164
  - - ">="
109
165
  - !ruby/object:Gem::Version
110
166
  version: '0'
111
- description: Convert japan prefecture code(JIS X 0402 based) into prefecture name.
167
+ description: Convert japan prefecture code (JIS X 0402 based) into prefecture name.
112
168
  email:
113
169
  - chocoby@gmail.com
114
170
  executables: []
115
171
  extensions: []
116
172
  extra_rdoc_files: []
117
173
  files:
118
- - ".github/workflows/build.yml"
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".yardopts"
122
- - Appraisals
123
174
  - CHANGELOG.md
124
- - Gemfile
125
- - MIT-LICENSE
175
+ - LICENSE
126
176
  - README.md
127
177
  - README_EN.md
128
- - Rakefile
129
178
  - data/prefecture.yml
130
179
  - data/zip.yml
131
- - gemfiles/rails32.gemfile
132
- - gemfiles/rails40.gemfile
133
- - gemfiles/rails41.gemfile
134
- - gemfiles/rails42.gemfile
135
- - gemfiles/rails50.gemfile
136
- - gemfiles/rails51.gemfile
137
- - gemfiles/rails52.gemfile
138
- - gemfiles/rails60.gemfile
139
- - gemfiles/rails61.gemfile
140
- - jp_prefecture.gemspec
141
180
  - lib/jp_prefecture.rb
142
181
  - lib/jp_prefecture/base.rb
143
182
  - lib/jp_prefecture/config.rb
144
183
  - lib/jp_prefecture/mapping.rb
145
184
  - lib/jp_prefecture/prefecture.rb
185
+ - lib/jp_prefecture/prefecture/finder.rb
146
186
  - lib/jp_prefecture/version.rb
147
187
  - lib/jp_prefecture/zip_mapping.rb
148
- - spec/base_spec.rb
149
- - spec/config_spec.rb
150
- - spec/fixtures/prefecture.yml
151
- - spec/jp_prefecture_spec.rb
152
- - spec/mapping_spec.rb
153
- - spec/prefecture_spec.rb
154
- - spec/spec_helper.rb
155
- - spec/zip_mapping_spec.rb
156
188
  homepage: https://github.com/chocoby/jp_prefecture
157
189
  licenses:
158
190
  - MIT
@@ -165,23 +197,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
197
  requirements:
166
198
  - - ">="
167
199
  - !ruby/object:Gem::Version
168
- version: '0'
200
+ version: 2.4.0
169
201
  required_rubygems_version: !ruby/object:Gem::Requirement
170
202
  requirements:
171
- - - ">="
203
+ - - ">"
172
204
  - !ruby/object:Gem::Version
173
- version: '0'
205
+ version: 1.3.1
174
206
  requirements: []
175
- rubygems_version: 3.2.2
207
+ rubygems_version: 3.1.4
176
208
  signing_key:
177
209
  specification_version: 4
178
210
  summary: Convert japan prefecture code into prefecture name
179
- test_files:
180
- - spec/base_spec.rb
181
- - spec/config_spec.rb
182
- - spec/fixtures/prefecture.yml
183
- - spec/jp_prefecture_spec.rb
184
- - spec/mapping_spec.rb
185
- - spec/prefecture_spec.rb
186
- - spec/spec_helper.rb
187
- - spec/zip_mapping_spec.rb
211
+ test_files: []