jp_address 1.0.1 → 1.0.2

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 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