jp_address 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef948c1cac5b64467a6007a4679ce93ef6be1e68e367dbf52cabd69f7d3099f5
4
- data.tar.gz: e08a3c24c255492740a037f02f27b09b3522034186753711c1f0fe1f524afa8a
3
+ metadata.gz: 71e8a270d6771b635d0de517833ad5b21c97558800c2ef459c2493cdc68f8ec9
4
+ data.tar.gz: 960f5bc5a54d66f929ab141cee756099b71a9f3a66f64a2ea757ce4e772ae84b
5
5
  SHA512:
6
- metadata.gz: 489a71906ce28abc642138bc4129d8f3608098d1d6a666d43bef11ee083e6a31ccc4364f51a55a37ddae0eaad5e98bac1abe57041b5fbafd9aaf1a83d8cb2afb
7
- data.tar.gz: 44d2f3ea727acff307d755a186817f341b6fb7e0b539822e65f39a294b78ec066903a5fa062835b367e3353bd05414ead9a84eadfbb4bb9d003ac7fa1a3d6d95
6
+ metadata.gz: c1ab63af145ca2654ea5383bf459eea3465678013a32589304c46daea4e9f69e99c03ab9bcd4f7db4a43dea9ebcaa00bc5b3c6ffc9fd0591bf5285fee1dae664
7
+ data.tar.gz: a87ecc0525afaa28ed2c75caaacdae8ff98191b3118d7d990b5066b1eb95c677e40f1addc0ce3fa47626fdaa6dd26ede79bbb2d3b5d4590f59a5f6da67483682
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Ruby on Rails 6 で 郵便番号住所検索 な gem
2
2
 
3
3
  ## JpAddressとは
4
- 日本郵便の「[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)」を Rails 6.1 で使用するための gem です。
4
+ 日本郵便の「[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)」を用いて、あなたの Rails 6.1 サイトに「郵便番号からの住所検索機能」を組み込むための gem です。
5
5
  以下の機能を提供します。
6
6
 
7
7
  * [[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip "ken_all.zip")]をダウンロードして自前DBのテーブル(jp_address_zipcodes)にロードするクラスメソッド。(```JpAddress::Zipcode.load_master_data```)
@@ -36,13 +36,30 @@ $ bundle exec rails runner -e development 'JpAddress::Zipcode.load_master_data'
36
36
  $ bundle exec rails runner -e production 'JpAddress::Zipcode.load_master_data'
37
37
  ```
38
38
 
39
- 環境にもよりますが、1~3分ぐらいかかると思います。
39
+ 環境にもよりますが、5分ぐらいかかると思います。
40
40
 
41
- APP_ROOT/tmp/ を作業ディレクトリに使用しています。<br>
42
- 最初にテーブルをトランケートしますので、毎回「全件insert」になります。
41
+ APP_ROOT/tmp/ を作業ディレクトリに使用しています。<br>
42
+ 最初にテーブルをトランケートしますので、毎回「全件insert」になります。<br>
43
+
44
+ 同じ郵便番号を持つレコードは統合されます。<br>
45
+ <br>
46
+ 例:9896712<br>
47
+ ```
48
+ "宮城県","大崎市","鳴子温泉水沼"
49
+ "宮城県","大崎市","鳴子温泉南山"
50
+ "宮城県","大崎市","鳴子温泉山際"
51
+ "宮城県","大崎市","鳴子温泉和田"
52
+ ```
53
+ これらは先頭から共通する地名を探し、うまく見つかれば
54
+ ```
55
+ "宮城県","大崎市","鳴子温泉"
56
+ ```
57
+ として1つのレコードにします。
58
+ 共通する地名が抜き出せない場合は空の町名にします。
43
59
 
44
60
  ### APIのマウント
45
61
  Railsアプリの config/routes.rb に追記。
62
+ at: に渡す値は /jp_address でなくても /service や /api などでも構いません。
46
63
  ```ruby
47
64
  mount JpAddress::Engine, at: "/jp_address"
48
65
  ```
@@ -68,15 +85,12 @@ http://localhost:3000/jp_address/zipcodes/search?zip=5330033
68
85
  3. #address (住所を表示するテキストボックス)
69
86
 
70
87
  の3要素があるとします。<br>
71
- #zipcodeに入れられた値を keyup イベントで拾ってAPIを叩き、都道府県プルダウンを選択し、住所をセットするサンプルです。
88
+ #zipcodeに入れられた値を keyup イベントで拾ってAPIを叩き、都道府県プルダウンを選択し、住所をセットするサンプルです。<br>
89
+ 郵便番号の半角ハイフンは自動でカットされます。
72
90
 
73
91
  都道府県プルダウンは、戻ってくるJSONの "prefecture" すなわち都道府県名で選択します。<br>
74
92
  ですので、お持ちの都道府県マスターの各レコードがどのようなIDを持っていても構いません。
75
93
 
76
- ※ JQuery の存在を前提にしています。<br>
77
- ※ 郵便番号の半角ハイフンは自動でカットされます。<br>
78
- ※ もともと CoffeeScript で書いてあったソースを decaffeinate したものですので冗長です。本質的な処理はAddressSearch が担っているだけで、他の関数は decaffeinate に必要なだけです。
79
-
80
94
  #### フォーム
81
95
  ```
82
96
  <form>
@@ -135,7 +149,9 @@ http://localhost:3000/jp_address/zipcodes/search?zip=5330033
135
149
  ```
136
150
 
137
151
  #### application.js など共通に読み込まれるファイルに配置するJavaScript
138
-
152
+ ※ JQuery の存在を前提にしています。<br>
153
+ ※ もともと CoffeeScript で書いてあったソースを decaffeinate したものですので冗長です(汗)。<br>
154
+ 本質的な処理はAddressSearch 関数が担っているだけで、他の関数は decaffeinate に必要なだけです。
139
155
  ```js script
140
156
  function _classCallCheck(instance, Constructor) {
141
157
  if (!(instance instanceof Constructor)) {
@@ -58,9 +58,75 @@ module JpAddress
58
58
  )
59
59
  )
60
60
  end
61
+ _merge_same_zip_addresses
61
62
  _remove_csv
62
63
  end
63
64
 
65
+ # 同じ郵便番号を持つレコードを統合します。
66
+ #
67
+ # 例:9896712
68
+ # "宮城県","大崎市","鳴子温泉水沼"
69
+ # "宮城県","大崎市","鳴子温泉南山"
70
+ # "宮城県","大崎市","鳴子温泉山際"
71
+ # "宮城県","大崎市","鳴子温泉和田"
72
+ # これらは
73
+ # "宮城県","大崎市","鳴子温泉" として1つのレコードにします。
74
+ # 共通する地名が抜き出せない場合は空の町名にします。
75
+ def self._merge_same_zip_addresses
76
+ group(:zip).having('count(*) > 1').pluck(:zip).each do |dup_zip|
77
+ buf = nil
78
+ town_names = []
79
+ where(zip: dup_zip).order(:id).each_with_index do |rec, i|
80
+ town_names << rec.town if rec.town.present?
81
+ if i == 0
82
+ buf = rec.dup
83
+ end
84
+ rec.destroy
85
+ end
86
+ shared_town_name = _find_shared_name_from(town_names)
87
+ buf.town = shared_town_name
88
+ buf.save!
89
+ end
90
+ nil
91
+ end
92
+
93
+ # 引数に渡された地名群から、先頭から見て共通となる地名を返します。
94
+ #
95
+ # input = %w[鳴子温泉小身川
96
+ # 鳴子温泉川袋
97
+ # 鳴子温泉木戸脇
98
+ # ]
99
+ #
100
+ # return => 鳴子温泉
101
+ def self._find_shared_name_from(names)
102
+ return '' if names.blank?
103
+
104
+ name_length_min = names.map{ |n| n.length }.min
105
+ diff_pos = nil
106
+ chars = []
107
+
108
+ (0..(name_length_min - 1)).each do |pos|
109
+ break if diff_pos.present?
110
+ char = nil
111
+ names.each do |name|
112
+ if char.nil?
113
+ char = name.each_char.to_a[pos]
114
+ chars << char
115
+ elsif char != name.each_char.to_a[pos]
116
+ diff_pos = pos
117
+ break
118
+ end
119
+ end
120
+ end
121
+
122
+ if diff_pos.present? && diff_pos > 1
123
+ ret = chars[0, diff_pos].join
124
+ return ret
125
+ end
126
+
127
+ ''
128
+ end
129
+
64
130
  def self._clear_table
65
131
  begin
66
132
  connection.truncate 'jp_address_zipcodes'
@@ -1,3 +1,3 @@
1
1
  module JpAddress
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -4,3 +4,32 @@
4
4
   (0.1ms) SELECT sqlite_version(*)
5
5
   (0.1ms) SELECT sqlite_version(*)
6
6
   (0.2ms) SELECT sqlite_version(*)
7
+  (4.1ms) SELECT sqlite_version(*)
8
+ Processing by JpAddress::ZipcodesController#search as HTML
9
+ Completed 500 Internal Server Error in 0ms (ActiveRecord: 0.1ms | Allocations: 325)
10
+  (1.1ms) DELETE FROM "jp_address_zipcodes"
11
+  (3.8ms) SELECT sqlite_version(*)
12
+ Processing by JpAddress::ZipcodesController#search as HTML
13
+ Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.1ms | Allocations: 325)
14
+  (1.4ms) DELETE FROM "jp_address_zipcodes"
15
+  (4.1ms) SELECT sqlite_version(*)
16
+  (3.3ms) SELECT sqlite_version(*)
17
+  (3.7ms) SELECT sqlite_version(*)
18
+  (3.7ms) SELECT sqlite_version(*)
19
+  (3.8ms) SELECT sqlite_version(*)
20
+  (3.8ms) SELECT sqlite_version(*)
21
+  (3.8ms) SELECT sqlite_version(*)
22
+  (4.1ms) SELECT sqlite_version(*)
23
+  (3.7ms) SELECT sqlite_version(*)
24
+  (3.9ms) SELECT sqlite_version(*)
25
+  (3.6ms) SELECT sqlite_version(*)
26
+  (3.8ms) SELECT sqlite_version(*)
27
+  (3.7ms) SELECT sqlite_version(*)
28
+  (3.6ms) SELECT sqlite_version(*)
29
+ Processing by JpAddress::ZipcodesController#search as HTML
30
+ Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 325)
31
+  (1.0ms) DELETE FROM "jp_address_zipcodes"
32
+  (3.8ms) SELECT sqlite_version(*)
33
+ Processing by JpAddress::ZipcodesController#search as HTML
34
+ Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.1ms | Allocations: 321)
35
+  (1.0ms) DELETE FROM "jp_address_zipcodes"
@@ -25,5 +25,40 @@ module JpAddress
25
25
  expect(JpAddress::Zipcode.send(:_remove_needless_words, '大通西(1~19丁目)')).to eq '大通西'
26
26
  end
27
27
  end
28
+
29
+ describe "._find_shared_name_from" do
30
+ it "find shared name" do
31
+ list = %w[
32
+ 鳴子温泉小身川
33
+ 鳴子温泉川袋
34
+ 鳴子温泉木戸脇
35
+ 鳴子温泉黒崎
36
+ 鳴子温泉小室
37
+ 鳴子温泉小室山
38
+ 鳴子温泉境松
39
+ ]
40
+ expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq '鳴子温泉'
41
+
42
+ list = %w[
43
+ 大通東
44
+ 大通西
45
+ 大通西
46
+ ]
47
+ expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq '大通'
48
+
49
+ list = %w[
50
+ 大通西
51
+ 大通東
52
+ 旭ケ丘
53
+ ]
54
+ expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq ''
55
+
56
+ list = %w[
57
+ 大分
58
+ 大阪
59
+ ]
60
+ expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq ''
61
+ end
62
+ end
28
63
  end
29
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jp_address
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tad Kam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-10 00:00:00.000000000 Z
11
+ date: 2021-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip