gimei 0.2.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6fd8b6ca2ca9d8bdf3bbac3fcd6ef5975eb79696
4
- data.tar.gz: d74ef4820a28495ba91fb6142d576d7c451b9a62
2
+ SHA256:
3
+ metadata.gz: c647940ae0bd7a3df1f2bb8cdebfe33703701f3edf8495ffc72ed918a1cbb066
4
+ data.tar.gz: 0eafe0d2bb191084624b9dd7e37f77b15a7bb4dcff9e6c1fab92b1a192e01b0f
5
5
  SHA512:
6
- metadata.gz: 8680e297e54c961c8b4a0363ee84fa432dec1619ebe44ce58e1357efe2bb91396cfcbf7863a55e108d660cfbef6f84d6a2b1ce4511ce558d3c764eb865b8f43b
7
- data.tar.gz: a118471e381eed4dc6a13a7ab8d88a2978db4785c8f1cd4c8146f2f80bcffa485a5f0c3bd2e374b2acb70b3d0541c44b8b8ff6202a70e07b695fd238bf3fc817
6
+ metadata.gz: bbb471e7f12d534bf5dc1f88f71e7784a62ebf4f390a4ea83d107406c620f141c79f2a09bb51a76399ef109d81ad55fcd2803f25508faf34b923249e8df7e764
7
+ data.tar.gz: 78a71e6f0d6515422cecd32f52302eaee4edc60a34374126032b1a76df268d6ea465f54c3955defc68af7bfbbcf1f5c25fed83e7a36854fa91b19b782104ce2a
@@ -0,0 +1,60 @@
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ types:
9
+ - opened
10
+ - synchronize
11
+ - reopened
12
+
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-latest
16
+
17
+ container: ${{ matrix.ruby }}
18
+
19
+ strategy:
20
+ fail-fast: false
21
+
22
+ matrix:
23
+ ruby:
24
+ - ruby:2.2
25
+ - ruby:2.3
26
+ - ruby:2.4
27
+ - ruby:2.5
28
+ - ruby:2.6
29
+ - ruby:2.7
30
+ - ruby:3.0
31
+ - rubylang/ruby:master-nightly-bionic
32
+ include:
33
+ - ruby: rubylang/ruby:master-nightly-bionic
34
+ allow_failures: "true"
35
+
36
+ steps:
37
+ - uses: actions/checkout@v2
38
+
39
+ - name: Cache vendor/bundle
40
+ uses: actions/cache@v1
41
+ id: cache_gem
42
+ with:
43
+ path: vendor/bundle
44
+ key: v1-gem-${{ runner.os }}-${{ matrix.ruby }}-${{ github.sha }}
45
+ restore-keys: |
46
+ v1-gem-${{ runner.os }}-${{ matrix.ruby }}-
47
+ continue-on-error: ${{ matrix.allow_failures == 'true' }}
48
+
49
+ - name: bundle update
50
+ run: |
51
+ set -xe
52
+ bundle config path vendor/bundle
53
+ bundle update --jobs $(nproc) --retry 3
54
+ continue-on-error: ${{ matrix.allow_failures == 'true' }}
55
+
56
+ - name: Run test
57
+ run: |
58
+ set -xe
59
+ bundle exec rake
60
+ continue-on-error: ${{ matrix.allow_failures == 'true' }}
data/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ ## 1.0.0
2
+
3
+ * データの読み込みを遅延させた [@willnet](https://github.com/willnet) (https://github.com/willnet/gimei/pull/41)
4
+ * Ruby2.2以下のサポートを削除 [@willnet](https://github.com/willnet)
5
+ * [Drop ruby suport < 2.2.0 · willnet/gimei@d02363f](https://github.com/willnet/gimei/commit/d02363f2fc6ffa31a531576cb9f599a01e25194f)
6
+ * 現時点ではテストしていないだけなので、未サポートのRubyでも動作はすると思いますが保証外です
7
+
8
+ ## 0.5.1
9
+
10
+ * 住所データの更新 [kossy0701 (kawagoekeisuke)](https://github.com/kossy0701) (https://github.com/willnet/gimei/pull/38)
11
+
12
+ ## 0.5.0
13
+
14
+ * Gimei.uniqueメソッドの追加 [@willnet](https://github.com/willnet) (https://github.com/willnet/gimei/pull/35)
15
+ * 乱数生成器を Config 経由で設定できるようにした [@purintai](https://github.com/purintai) ( https://github.com/willnet/gimei/pull/34 )
16
+
17
+ ## 0.4.0
18
+
19
+ * Gimei#genderメソッドの追加 - [@nard-tech](https://github.com/nard-tech)
20
+ * Ruby 1.9のサポートを停止
21
+ * Ruby 2.7のサポートを開始
22
+
23
+ ## 0.3.0
24
+
25
+ * ローマ字対応 - [@takkanm](https://github.com/takkanm)
26
+
1
27
  ## 0.2.0
2
28
 
3
29
  * 住所対応 - [@miyohide](https://github.com/miyohide)
@@ -5,7 +31,7 @@
5
31
  ## 0.1.0
6
32
 
7
33
  * サンプルデータの拡充 - [@2celeb](https://github.com/2celeb)
8
- * `Gimei.male`, `Gimei.female` 等の男女指定用のメソッドを追加 - [@willnet](https://github.com/willnet)
34
+ * `Gimei.male`, `Gimei.female` 等の男女指定用のメソッドを追加 - [@2celeb](https://github.com/2celeb)
9
35
 
10
36
  ```ruby
11
37
  gimei = Gimei.male
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Gimei
2
2
 
3
- [![Build Status](https://travis-ci.org/willnet/gimei.png)](https://travis-ci.org/willnet/gimei)
4
- [![Coverage Status](https://coveralls.io/repos/willnet/gimei/badge.png)](https://coveralls.io/r/willnet/gimei)
5
- [![Gem Version](https://badge.fury.io/rb/gimei.png)](http://badge.fury.io/rb/gimei)
6
- [![endorse](https://api.coderwall.com/willnet/endorsecount.png)](https://coderwall.com/willnet)
3
+ [![Travis](https://img.shields.io/travis/willnet/gimei.svg)](https://travis-ci.org/willnet/gimei)
4
+ [![Coveralls](https://coveralls.io/repos/willnet/gimei/badge.svg)](https://coveralls.io/r/willnet/gimei)
5
+ [![Code Climate](https://codeclimate.com/github/willnet/gimei/badges/gpa.svg)](https://codeclimate.com/github/willnet/gimei)
6
+ [![Gem](https://img.shields.io/gem/v/gimei.svg)](https://rubygems.org/gems/gimei)
7
7
 
8
- gimei は、日本人の名前や、日本の住所をランダムに返すライブラリです。テストの時などに使います。似たようなライブラリに[faker](https://github.com/stympy/faker)があります。[faker](https://github.com/stympy/faker)はとても優れたライブラリで、多言語対応もしていますが、ふりがな(フリガナ)は流石に対応していません。gimei ふりがな(及びフリガナ)に対応しています。
8
+ gimei は、日本人の名前や、日本の住所をランダムに返すライブラリです。テストの時などに使います。似たようなライブラリに[faker](https://github.com/stympy/faker)があります。[faker](https://github.com/stympy/faker)はとても優れたライブラリで、多言語対応もしていますが、ふりがな(フリガナ)は流石に対応していません。gimei はふりがな(及びフリガナ)に対応しています。
9
9
 
10
10
 
11
11
  ## 使い方
@@ -16,45 +16,100 @@ gimei は、日本人の名前や、日本の住所をランダムに返すラ
16
16
 
17
17
  ```ruby
18
18
  gimei = Gimei.name
19
- gimei.kanji #=> "斎藤 陽菜"
20
- gimei.hiragana #=> "さいとう はるな"
21
- gimei.katakana #=> "サイトウ ハルナ"
22
- gimei.last.kanji #=> "斎藤"
23
- gimei.last.hiragana #=> "さいとう"
24
- gimei.last.katakana #=> "サイトウ"
25
- gimei.first.kanji #=> "陽菜"
19
+ gimei.kanji #=> "斎藤 陽菜"
20
+ gimei.hiragana #=> "さいとう はるな"
21
+ gimei.katakana #=> "サイトウ ハルナ"
22
+ gimei.romaji #=> "Haruna Saitou"
23
+ gimei.gender #=> :female
24
+ gimei.male? #=> false
25
+ gimei.female? #=> true
26
+ gimei.last.kanji #=> "斎藤"
27
+ gimei.last.hiragana #=> "さいとう"
28
+ gimei.last.katakana #=> "サイトウ"
29
+ gimei.last.romaji #=> "Saitou"
30
+ gimei.first.kanji #=> "陽菜"
26
31
  gimei.first.hiragana #=> "はるな"
27
32
  gimei.first.katakana #=> "ハルナ"
33
+ gimei.first.romaji #=> "Haruna"
28
34
  ```
29
35
 
30
36
  下記のように男性/女性の名前を返すことを明示的に指定できます。`Gimei.name` の場合は男女の名前を等確率で返します。
31
37
 
32
38
  ```ruby
33
39
  gimei = Gimei.male
34
- gimei.male? #=> true
40
+ gimei.male? #=> true
35
41
  gimei.female? #=> false
36
- gimei.kanji #=> "小林 顕士"
42
+ gimei.gender #=> :male
43
+ gimei.kanji #=> "小林 顕士"
37
44
 
38
45
  gimei = Gimei.female
39
- gimei.male? #=> false
46
+ gimei.male? #=> false
40
47
  gimei.female? #=> true
41
- gimei.kanji #=> "根本 彩世"
48
+ gimei.gender #=> :female
49
+ gimei.kanji #=> "根本 彩世"
42
50
  ```
43
51
 
44
- 漢字、ひらがな、カタカナどれか一種類だけ取得できればよい場合には、下記のように短縮して書くことも出来ます。
52
+ 漢字、ひらがな、カタカナ、ローマ字どれか一種類だけ取得できればよい場合には、下記のように短縮して書くことも出来ます。
45
53
 
46
54
  ```ruby
47
- Gimei.kanji #=> "伊藤 結衣"
48
- Gimei.hiragana #=> "いとう みさき"
49
- Gimei.katakana #=> "タカハシ ユイナ"
50
- Gimei.last.kanji #=> "清水"
51
- Gimei.last.hiragana #=> "いとう"
52
- Gimei.last.katakana #=> "コバヤシ"
53
- Gimei.first.kanji #=> "結菜"
55
+ Gimei.kanji #=> "伊藤 結衣"
56
+ Gimei.hiragana #=> "いとう みさき"
57
+ Gimei.katakana #=> "タカハシ ユイナ"
58
+ Gimei.romaji #=> "Miki Obara"
59
+ Gimei.last.kanji #=> "清水"
60
+ Gimei.last.hiragana #=> "いとう"
61
+ Gimei.last.katakana #=> "コバヤシ"
62
+ Gimei.last.romaji #=> "Wakabayashi"
63
+ Gimei.first.kanji #=> "結菜"
54
64
  Gimei.first.hiragana #=> "ここあ"
55
65
  Gimei.first.katakana #=> "ヤマト"
66
+ Gimei.first.romaji #=> "Noriyuki"
56
67
  ```
57
68
 
69
+ 同じ名前を二度取得したくない場合には、以下のように`unique`を挟みます。次のようにすると、利用した名前をGimei内で保持することで必ず一意な名前を返すようにできます。
70
+
71
+ ```ruby
72
+ Gimei.unique.name
73
+ ```
74
+
75
+ 上記の場合は、フルネームの漢字が一意であることを保証します。つまり、次のように姓や名の単位では重複することもありえます。
76
+
77
+ ```ruby
78
+ Gimei.unique.name.kanji #=> "前島 真一"
79
+ Gimei.unique.name.kanji #=> "神谷 真一"
80
+ Gimei.unique.name.kanji #=> "前島 太郎"
81
+ ```
82
+
83
+ これを避けたいときは次のように`last`や`first`を利用してください。これは姓や名の単位で一意な名前を返します。
84
+
85
+ ```ruby
86
+ Gimei.unique.last
87
+ Gimei.unique.first
88
+ ```
89
+
90
+ この場合でも、ふりがな(フリガナ)の単位では重複することがあります。
91
+
92
+ ```ruby
93
+ Gimei.unique.first.hiragana #=> "しんいち"
94
+ Gimei.unique.first.hiragana #=> "しんいち"
95
+ ```
96
+
97
+ もし名前の候補が枯渇するなど、一意な名前を返せない場合はエラーになります。
98
+
99
+ これまで利用した名前のリストを消去したい場合は、次のようにします。
100
+
101
+ ```ruby
102
+ Gimei.unique.clear # 全体を消去
103
+ Gimei.unique.clear(:name) # Gimei.unique.name の結果を消去
104
+ Gimei.unique.clear(:first) # Gimei.unique.first の結果を消去
105
+ ```
106
+
107
+ 次のメソッドで生成された名前は`Gimei.unique.clear(:name)`で消去します。
108
+
109
+ - `Gimei.unique.male`
110
+ - `Gimei.unique.female`
111
+ - `Gimei.unique.kanji`
112
+
58
113
  出力される名前の候補となるデータは `lib/data/names.yml` にあるので、必要であればファイルを修正してください。
59
114
 
60
115
  ### 住所をランダムで返す
@@ -67,21 +122,25 @@ address.kanji # => 岡山県大島郡大和村稲木町
67
122
  address.to_s # => 岡山県大島郡大和村稲木町
68
123
  address.hiragana # => おかやまけんおおしまぐんやまとそんいなぎちょう
69
124
  address.katakana # => オカヤマケンオオシマグンヤマトソンイナギチョウ
125
+ address.romaji # => Okayamaken Ooshimagunyamatoson Inagicho
70
126
 
71
127
  address.prefecture.kanji # => 岡山県
72
128
  address.prefecture.to_s # => 岡山県
73
129
  address.prefecture.hiragana # => おかやまけん
74
130
  address.prefecture.katakana # => オカヤマケン
131
+ address.prefecture.romaji # => Okayamaken
75
132
 
76
133
  address.city.kanji # => 大島郡大和村
77
134
  address.city.to_s # => 大島郡大和村
78
135
  address.city.hiragana # => おおしまぐんやまとそん
79
136
  address.city.katakana # => オオシマグンヤマトソン
137
+ address.city.romaji # => Ooshimagunyamatoson
80
138
 
81
139
  address.town.kanji # => 稲木町
82
140
  address.town.to_s # => 稲木町
83
141
  address.town.hiragana # => いなぎちょう
84
142
  address.town.katakana # => イナギチョウ
143
+ address.town.romaji # => Inagicho
85
144
  ```
86
145
 
87
146
  省略形も用意しています。
@@ -91,19 +150,73 @@ Gimei.prefecture.kanji # => 青森県
91
150
  Gimei.prefecture.to_s # => 滋賀県
92
151
  Gimei.prefecture.hiragana # => やまがたけん
93
152
  Gimei.prefecture.katakana # => チバケン
153
+ Gimei.prefecture.romaji # => Wakayamaken
94
154
 
95
155
  Gimei.city.kanji # => 利根郡昭和村
96
156
  Gimei.city.hiragana # => うべし
97
157
  Gimei.city.katakana # => カモグンヤオツチョウ
158
+ Gimei.city.romaji # => Itanogunaizumichou
98
159
 
99
160
  Gimei.town.kanji # => 竹野
100
161
  Gimei.town.to_s # => 富久山町南小泉
101
162
  Gimei.town.hiragana # => じょうしんでん
102
163
  Gimei.town.katakana # => イケナイ
164
+ Gimei.town.romaji # => Heisei
165
+ ```
166
+
167
+ 同じ住所を二度取得したくない場合には、以下のように`unique`を挟みます。次のようにすると、利用した住所をGimei内で保持することで必ず一意な名前を返すようにできます。
168
+
169
+ ```ruby
170
+ address = Gimei.unique.address
171
+ ```
172
+
173
+ 上記の場合は、住所全体が一意であることを保証します。つまり、次のように県や市町村の単位では重複することもありえます。
174
+
175
+ ```ruby
176
+ Gimei.unique.address.prefecture.kanji #=> 東京都
177
+ Gimei.unique.address.prefecture.kanji #=> 東京都
178
+ ```
179
+
180
+ もし県や市町村の単位で一意であることを保証したいのであれば、次のように短縮形を使います。
181
+
182
+ ```ruby
183
+ Gimei.unique.prefecture.kanji #=> 東京都
184
+ Gimei.unique.prefecture.kanji #=> 神奈川県
185
+ ```
186
+
187
+ もし住所の候補が枯渇するなど、一意な名前を返せない場合はエラーになります。
188
+
189
+ これまで利用した住所のリストを消去したい場合は、次のようにします。
190
+
191
+ ```ruby
192
+ Gimei.unique.clear # 全体を消去
193
+ Gimei.unique.clear(:address) # Gimei.unique.address の結果を消去
194
+ Gimei.unique.clear(:prefecture) # Gimei.unique.prefecture の結果を消去
103
195
  ```
104
196
 
105
197
  出力される住所の候補となるデータは `lib/data/addresses.yml` にあるので、必要であればファイルを修正してください。
106
198
 
199
+ ## Supported versions
200
+
201
+ - 2.2.x
202
+ - 2.3.x
203
+ - 2.4.x
204
+ - 2.5.x
205
+ - 2.6.x
206
+ - 2.7.x
207
+ - 3.0.x
208
+
209
+ ## 他言語による実装
210
+
211
+ - [mattn/go-gimei](https://github.com/mattn/go-gimei)
212
+ - [moznion/gimei-java](https://github.com/moznion/gimei-java)
213
+ - [nabetama/gimei](https://github.com/nabetama/gimei)
214
+ - [gongo/emacs-gimei](https://github.com/gongo/emacs-gimei)
215
+ - [ma2gedev/gimei_ex](https://github.com/ma2gedev/gimei_ex)
216
+ - [demiglacesource/node-gimei](https://github.com/demiglacesource/node-gimei)
217
+ - [matarillo/dot-gimei](https://github.com/matarillo/dot-gimei)
218
+ - [abcb2/type-gimei](https://github.com/abcb2/type-gimei)
219
+
107
220
  ## Installation
108
221
 
109
222
  Add this line to your application's Gemfile:
data/_config.yml ADDED
@@ -0,0 +1 @@
1
+ theme: jekyll-theme-cayman
data/gimei.gemspec CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
+ gem.add_dependency('romaji')
20
21
  gem.add_development_dependency('rake')
21
- gem.add_development_dependency('moji')
22
22
  gem.add_development_dependency('minitest')
23
23
  gem.add_development_dependency('coveralls')
24
24
  end
@@ -326,6 +326,7 @@ addresses:
326
326
  - ['栗原市', 'くりはらし', 'クリハラシ']
327
327
  - ['東松島市', 'ひがしまつしまし', 'ヒガシマツシマシ']
328
328
  - ['大崎市', 'おおさきし', 'オオサキシ']
329
+ - ['富谷市', 'とみやし', 'トミヤシ']
329
330
  - ['刈田郡蔵王町', 'かったぐんざおうまち', 'カッタグンザオウマチ']
330
331
  - ['刈田郡七ヶ宿町', 'かったぐんしちかしゅくまち', 'カッタグンシチカシュクマチ']
331
332
  - ['柴田郡大河原町', 'しばたぐんおおがわらまち', 'シバタグンオオガワラマチ']
@@ -340,7 +341,6 @@ addresses:
340
341
  - ['宮城郡利府町', 'みやぎぐんりふちょう', 'ミヤギグンリフチョウ']
341
342
  - ['黒川郡大和町', 'くろかわぐんたいわちょう', 'クロカワグンタイワチョウ']
342
343
  - ['黒川郡大郷町', 'くろかわぐんおおさとちょう', 'クロカワグンオオサトチョウ']
343
- - ['黒川郡富谷町', 'くろかわぐんとみやまち', 'クロカワグントミヤマチ']
344
344
  - ['黒川郡大衡村', 'くろかわぐんおおひらむら', 'クロカワグンオオヒラムラ']
345
345
  - ['加美郡色麻町', 'かみぐんしかまちょう', 'カミグンシカマチョウ']
346
346
  - ['加美郡加美町', 'かみぐんかみまち', 'カミグンカミマチ']
@@ -1352,7 +1352,7 @@ addresses:
1352
1352
  - ['小野市', 'おのし', 'オノシ']
1353
1353
  - ['三田市', 'さんだし', 'サンダシ']
1354
1354
  - ['加西市', 'かさいし', 'カサイシ']
1355
- - ['篠山市', 'ささやまし', 'ササヤマシ']
1355
+ - ['丹波篠山市', 'たんばささやまし', 'タンバササヤマシ']
1356
1356
  - ['養父市', 'やぶし', 'ヤブシ']
1357
1357
  - ['丹波市', 'たんばし', 'タンバシ']
1358
1358
  - ['南あわじ市', 'みなみあわじし', 'ミナミアワジシ']
@@ -1693,7 +1693,7 @@ addresses:
1693
1693
  - ['朝倉市', 'あさくらし', 'アサクラシ']
1694
1694
  - ['みやま市', 'みやまし', 'ミヤマシ']
1695
1695
  - ['糸島市', 'いとしまし', 'イトシマシ']
1696
- - ['筑紫郡那珂川町', 'ちくしぐんなかがわまち', 'チクシグンナカガワマチ']
1696
+ - ['那珂川市', 'なかがわし', 'ナカガワシ']
1697
1697
  - ['糟屋郡宇美町', 'かすやぐんうみまち', 'カスヤグンウミマチ']
1698
1698
  - ['糟屋郡篠栗町', 'かすやぐんささぐりまち', 'カスヤグンササグリマチ']
1699
1699
  - ['糟屋郡志免町', 'かすやぐんしめまち', 'カスヤグンシメマチ']
data/lib/gimei.rb CHANGED
@@ -3,15 +3,15 @@ require 'yaml'
3
3
  require 'gimei/version'
4
4
  require 'gimei/name'
5
5
  require 'gimei/address'
6
+ require 'gimei/unique_generator'
7
+ require 'gimei/config'
6
8
 
7
9
  class Gimei
8
10
  extend Forwardable
9
11
 
10
- NAMES = YAML.load_file(File.expand_path(File.join('..', 'data', 'names.yml'), __FILE__))
11
- ADDRESSES = YAML.load_file(File.expand_path(File.join('..', 'data', 'addresses.yml'), __FILE__))
12
- GENDER = [:male, :female].freeze
12
+ GENDERS = [:male, :female].freeze
13
13
 
14
- def_delegators :@name, :kanji, :hiragana, :katakana, :first, :last, :male?, :female?
14
+ def_delegators :@name, :gender, :kanji, :hiragana, :katakana, :first, :last, :male?, :female?, :romaji
15
15
  def_delegators :@address, :prefecture, :city, :town
16
16
  alias_method :to_s, :kanji
17
17
 
@@ -20,19 +20,53 @@ class Gimei
20
20
  class << self
21
21
  extend Forwardable
22
22
 
23
- def_delegators :name, :kanji, :hiragana, :katakana, :first, :last
24
23
  def_delegators Gimei::Name, :male, :female
25
24
  def_delegators :address, :prefecture, :city, :town
26
25
 
27
- def name
28
- Name.new
26
+ def name(gender = nil)
27
+ Name.new(gender)
28
+ end
29
+
30
+ def names
31
+ @names ||= YAML.load_file(File.expand_path(File.join('..', 'data', 'names.yml'), __FILE__))
32
+ end
33
+
34
+ def addresses
35
+ @addresses ||= YAML.load_file(File.expand_path(File.join('..', 'data', 'addresses.yml'), __FILE__))
36
+ end
37
+
38
+ %i[kanji hiragana katakana romaji first last].each do |method_name|
39
+ define_method(method_name) do |gender = nil|
40
+ name(gender).public_send(method_name)
41
+ end
29
42
  end
30
43
 
31
44
  def address
32
45
  Address.new
33
46
  end
47
+
48
+ def unique(max_retries = 10_000)
49
+ return @unique if defined? @unique
50
+
51
+ @unique = UniqueGenerator.new(self, max_retries)
52
+
53
+ %i[name last first hiragana katakana romaji address prefecture city town].each do |method_name|
54
+ @unique.define_unique_method(method_name)
55
+ end
56
+
57
+ %i[male female kanji].each do |method_name|
58
+ @unique.define_unique_method(method_name, :name)
59
+ end
60
+
61
+ @unique
62
+ end
63
+
64
+ def config
65
+ @config ||= Config.new
66
+ end
34
67
  end
35
68
 
69
+
36
70
  def initialize(gender = nil)
37
71
  @name = Name.new(gender)
38
72
  @address = Address.new