gimei 0.4.0 → 0.5.0

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: 35cb5bc32bc45d0b86828d6752260ea90a70c7fdd4151bd0e425425eee7cb8ca
4
- data.tar.gz: a3cbf8105592bbd8bb38753bfa5acca44ceea9675ffe9963e89dd74ab91f8e04
3
+ metadata.gz: 27f074f6bdfe0c87b52c92fd3d407b092752776022b6d84197d2c91966ed69d7
4
+ data.tar.gz: 53bcf822b645c25fb235c3b45b5b82a4d4613192b6b9b253477cb4c28cc4bfec
5
5
  SHA512:
6
- metadata.gz: 07b60a6af8982950d8786c4ee4a8d2522b4e2381e70c73e9c686238818b3117ecce405aeae08a1334d32e774caaf23e18ce0f21a6ed017679306c701415e50dc
7
- data.tar.gz: b7fcac6a4a5101ba31053153b274c0994b4b27bdf453c370ab4fa50cbde32c361357e05e4a865deb5631e316b2af7737442f03a55ef28bd8c8a207b04e909819
6
+ metadata.gz: 47eaca2ac1937f88e14c7fe904db52c30a799f19ae993939bc83a884ae1ca44bb013a1143ba2c98dbda15acddf44b5eb0d89595ee6564764dfa5eaeba27cf9e5
7
+ data.tar.gz: 510d2295139449a6a8b652947d94cbf756c331002cca6f3835f238e9e3f5c6c73395d04dd4d319c1ae9d64b94e30a590d8ce80fe0cbb59ae155e30bc04a10d01
@@ -1,8 +1,13 @@
1
+ ## 0.5.0
2
+
3
+ * Gimei.uniqueメソッドの追加 [@willnet](https://github.com/willnet) (https://github.com/willnet/gimei/pull/35)
4
+ * 乱数生成器を Config 経由で設定できるようにした [@purintai](https://github.com/purintai) ( https://github.com/willnet/gimei/pull/34 )
5
+
1
6
  ## 0.4.0
2
7
 
3
8
  * Gimei#genderメソッドの追加 - [@nard-tech](https://github.com/nard-tech)
4
- * Ruby 1.9のサポートの停止
5
- * Ruby 2.7をサポート開始
9
+ * Ruby 1.9のサポートを停止
10
+ * Ruby 2.7のサポートを開始
6
11
 
7
12
  ## 0.3.0
8
13
 
data/README.md CHANGED
@@ -66,6 +66,50 @@ Gimei.first.katakana #=> "ヤマト"
66
66
  Gimei.first.romaji #=> "Noriyuki"
67
67
  ```
68
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
+
69
113
  出力される名前の候補となるデータは `lib/data/names.yml` にあるので、必要であればファイルを修正してください。
70
114
 
71
115
  ### 住所をランダムで返す
@@ -120,6 +164,36 @@ Gimei.town.katakana # => イケナイ
120
164
  Gimei.town.romaji # => Heisei
121
165
  ```
122
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 の結果を消去
195
+ ```
196
+
123
197
  出力される住所の候補となるデータは `lib/data/addresses.yml` にあるので、必要であればファイルを修正してください。
124
198
 
125
199
  ## Supported versions
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
19
19
  gem.require_paths = ["lib"]
20
20
  gem.add_dependency('romaji')
21
21
  gem.add_development_dependency('rake')
22
- gem.add_development_dependency('moji')
23
22
  gem.add_development_dependency('minitest')
23
+ gem.add_development_dependency('minitest-stub-const')
24
24
  gem.add_development_dependency('coveralls')
25
25
  end
@@ -3,6 +3,8 @@ 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
@@ -20,19 +22,45 @@ class Gimei
20
22
  class << self
21
23
  extend Forwardable
22
24
 
23
- def_delegators :name, :kanji, :hiragana, :katakana, :first, :last, :romaji
24
25
  def_delegators Gimei::Name, :male, :female
25
26
  def_delegators :address, :prefecture, :city, :town
26
27
 
27
- def name
28
- Name.new
28
+ def name(gender = nil)
29
+ Name.new(gender)
30
+ end
31
+
32
+ %i[kanji hiragana katakana romaji first last].each do |method_name|
33
+ define_method(method_name) do |gender = nil|
34
+ name(gender).public_send(method_name)
35
+ end
29
36
  end
30
37
 
31
38
  def address
32
39
  Address.new
33
40
  end
41
+
42
+ def unique(max_retries = 10_000)
43
+ return @unique if defined? @unique
44
+
45
+ @unique = UniqueGenerator.new(self, max_retries)
46
+
47
+ %i[name last first hiragana katakana romaji address prefecture city town].each do |method_name|
48
+ @unique.define_unique_method(method_name)
49
+ end
50
+
51
+ %i[male female kanji].each do |method_name|
52
+ @unique.define_unique_method(method_name, :name)
53
+ end
54
+
55
+ @unique
56
+ end
57
+
58
+ def config
59
+ @config ||= Config.new
60
+ end
34
61
  end
35
62
 
63
+
36
64
  def initialize(gender = nil)
37
65
  @name = Name.new(gender)
38
66
  @address = Address.new
@@ -43,7 +43,7 @@ class Gimei::Address
43
43
  end
44
44
 
45
45
  def initialize
46
- @prefectures = Gimei::ADDRESSES['addresses']['prefecture'].sample
46
+ @prefectures = Gimei::ADDRESSES['addresses']['prefecture'].sample(random: Gimei.config.rng)
47
47
  end
48
48
 
49
49
  alias_method :to_s, :kanji
@@ -67,7 +67,7 @@ class Gimei::Address
67
67
  end
68
68
 
69
69
  def initialize
70
- @cities = Gimei::ADDRESSES['addresses']['city'].sample
70
+ @cities = Gimei::ADDRESSES['addresses']['city'].sample(random: Gimei.config.rng)
71
71
  end
72
72
 
73
73
  alias_method :to_s, :kanji
@@ -91,7 +91,7 @@ class Gimei::Address
91
91
  end
92
92
 
93
93
  def initialize
94
- @towns = Gimei::ADDRESSES['addresses']['town'].sample
94
+ @towns = Gimei::ADDRESSES['addresses']['town'].sample(random: Gimei.config.rng)
95
95
  end
96
96
 
97
97
  alias_method :to_s, :kanji
@@ -0,0 +1,9 @@
1
+ class Gimei
2
+ class Config
3
+ attr_accessor :rng
4
+
5
+ def initialize(rng: Random.new)
6
+ @rng = rng
7
+ end
8
+ end
9
+ end
@@ -5,7 +5,6 @@ class Gimei::Name
5
5
 
6
6
  class << self
7
7
  extend Forwardable
8
- def_delegators :new, :kanji, :hiragana, :katakana, :first, :last, :romaji
9
8
 
10
9
  def male
11
10
  new(:male)
@@ -14,10 +13,16 @@ class Gimei::Name
14
13
  def female
15
14
  new(:female)
16
15
  end
16
+
17
+ %i[kanji hiragana katakana romaji first last].each do |method_name|
18
+ define_method(method_name) do |gender = nil|
19
+ new(gender).public_send(method_name)
20
+ end
21
+ end
17
22
  end
18
23
 
19
24
  def initialize(gender = nil)
20
- @gender = gender || Gimei::GENDERS.sample
25
+ @gender = gender || Gimei::GENDERS.sample(random: Gimei.config.rng)
21
26
  @first = First.new @gender
22
27
  @last = Last.new
23
28
  end
@@ -63,8 +68,8 @@ class Gimei::Name
63
68
  def_delegators :@name, :kanji, :hiragana, :katakana, :to_s, :romaji
64
69
 
65
70
  def initialize(gender = nil)
66
- @gender = gender || Gimei::GENDERS.sample
67
- @name = NameWord.new(Gimei::NAMES['first_name'][@gender.to_s].sample)
71
+ @gender = gender || Gimei::GENDERS.sample(random: Gimei.config.rng)
72
+ @name = NameWord.new(Gimei::NAMES['first_name'][@gender.to_s].sample(random: Gimei.config.rng))
68
73
  end
69
74
 
70
75
  def male?
@@ -81,7 +86,7 @@ class Gimei::Name
81
86
  def_delegators :@name, :kanji, :hiragana, :katakana, :to_s, :romaji
82
87
 
83
88
  def initialize
84
- @name = NameWord.new(Gimei::NAMES['last_name'].sample)
89
+ @name = NameWord.new(Gimei::NAMES['last_name'].sample(random: Gimei.config.rng))
85
90
  end
86
91
  end
87
92
 
@@ -0,0 +1,47 @@
1
+ class Gimei
2
+ class RetryLimitExceeded < StandardError; end
3
+
4
+ class UniqueGenerator
5
+ class << self
6
+ def previous_results
7
+ @previous_results ||= Hash.new { |hash, key| hash[key] = Set.new }
8
+ end
9
+ end
10
+
11
+ def initialize(klass, max_retries)
12
+ @klass = klass
13
+ @max_retries = max_retries
14
+ end
15
+
16
+ def previous_results
17
+ self.class.previous_results
18
+ end
19
+
20
+ def clear(key = nil)
21
+ if key
22
+ previous_results[key.to_sym].clear
23
+ else
24
+ previous_results.clear
25
+ end
26
+ end
27
+
28
+ def define_unique_method(method_name, previous_result_key = method_name)
29
+ define_singleton_method method_name do |*args|
30
+ max_retries.times do
31
+ result = klass.public_send(method_name, *args)
32
+
33
+ next if previous_results[previous_result_key].include?(result.to_s)
34
+
35
+ previous_results[previous_result_key] << result.to_s
36
+ return result
37
+ end
38
+
39
+ raise RetryLimitExceeded, "Retry limit exceeded for #{method_name}"
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :klass, :max_retries
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  class Gimei
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -4,21 +4,21 @@ require_relative 'spec_helper'
4
4
  describe Gimei do
5
5
  describe '#kanji and #to_s' do
6
6
  it '全角文字が返ること' do
7
- _(Gimei.address.kanji).must_match(/\A[#{Moji.zen}]+\z/)
8
- _(Gimei.address.to_s).must_match(/\A[#{Moji.zen}]+\z/)
9
- _(Gimei.address.prefecture.kanji).must_match(/\A[#{Moji.zen}]+\z/)
10
- _(Gimei.address.prefecture.to_s).must_match(/\A[#{Moji.zen}]+\z/)
11
- _(Gimei.address.city.kanji).must_match(/\A[#{Moji.zen}]+\z/)
12
- _(Gimei.address.city.to_s).must_match(/\A[#{Moji.zen}]+\z/)
13
- _(Gimei.address.town.kanji).must_match(/\A[#{Moji.zen}]+\z/)
14
- _(Gimei.address.town.to_s).must_match(/\A[#{Moji.zen}]+\z/)
7
+ _(Gimei.address.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
8
+ _(Gimei.address.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
9
+ _(Gimei.address.prefecture.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
10
+ _(Gimei.address.prefecture.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
11
+ _(Gimei.address.city.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
12
+ _(Gimei.address.city.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
13
+ _(Gimei.address.town.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
14
+ _(Gimei.address.town.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
15
15
 
16
- _(Gimei.prefecture.kanji).must_match(/\A[#{Moji.zen}]+\z/)
17
- _(Gimei.prefecture.to_s).must_match(/\A[#{Moji.zen}]+\z/)
18
- _(Gimei.city.kanji).must_match(/\A[#{Moji.zen}]+\z/)
19
- _(Gimei.city.to_s).must_match(/\A[#{Moji.zen}]+\z/)
20
- _(Gimei.town.kanji).must_match(/\A[#{Moji.zen}]+\z/)
21
- _(Gimei.town.to_s).must_match(/\A[#{Moji.zen}]+\z/)
16
+ _(Gimei.prefecture.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
17
+ _(Gimei.prefecture.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
18
+ _(Gimei.city.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
19
+ _(Gimei.city.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
20
+ _(Gimei.town.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
21
+ _(Gimei.town.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
22
22
  end
23
23
  end
24
24
 
@@ -43,19 +43,19 @@ describe Gimei do
43
43
 
44
44
  describe '#kanji' do
45
45
  it '全角文字とスペースが返ること' do
46
- _(Gimei.new.kanji).must_match(/\A[#{Moji.zen}\s]+\z/)
46
+ _(Gimei.new.kanji).must_match(/\A#{zenkaku_or_space_regexp}+\z/)
47
47
  end
48
48
  end
49
49
 
50
50
  describe '#to_s' do
51
51
  it '全角文字とスペースが返ること' do
52
- _(Gimei.new.to_s).must_match(/\A[#{Moji.zen}\s]+\z/)
52
+ _(Gimei.new.to_s).must_match(/\A#{zenkaku_or_space_regexp}+\z/)
53
53
  end
54
54
  end
55
55
 
56
56
  describe '.kanji' do
57
57
  it '全角文字とスペースが返ること' do
58
- _(Gimei.kanji).must_match(/\A[#{Moji.zen}\s]+\z/)
58
+ _(Gimei.kanji).must_match(/\A#{zenkaku_or_space_regexp}+\z/)
59
59
  end
60
60
  end
61
61
 
@@ -36,7 +36,7 @@ describe Gimei::Name do
36
36
 
37
37
  describe '.kanji' do
38
38
  it '全角文字とスペースが返ること' do
39
- _(Gimei::Name.kanji).must_match(/\A[#{Moji.zen}\s]+\z/)
39
+ _(Gimei::Name.kanji).must_match(/\A#{zenkaku_or_space_regexp}+\z/)
40
40
  end
41
41
  end
42
42
 
@@ -67,7 +67,7 @@ describe Gimei::Name do
67
67
 
68
68
  describe '#kanji' do
69
69
  it '全角文字とスペースが返ること' do
70
- _(Gimei::Name.new.kanji).must_match(/\A[#{Moji.zen}\s]+\z/)
70
+ _(Gimei::Name.new.kanji).must_match(/\A#{zenkaku_or_space_regexp}+\z/)
71
71
  end
72
72
  end
73
73
 
@@ -129,7 +129,7 @@ describe Gimei::Name::First do
129
129
 
130
130
  describe '#kanji' do
131
131
  it '全角文字が返ること' do
132
- _(Gimei::Name::First.new.kanji).must_match(/\A#{Moji.zen}+\z/)
132
+ _(Gimei::Name::First.new.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
133
133
  end
134
134
  end
135
135
 
@@ -147,7 +147,7 @@ describe Gimei::Name::First do
147
147
 
148
148
  describe '#to_s' do
149
149
  it '全角文字が返ること' do
150
- _(Gimei::Name::First.new.to_s).must_match(/\A#{Moji.zen}+\z/)
150
+ _(Gimei::Name::First.new.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
151
151
  end
152
152
  end
153
153
 
@@ -163,7 +163,7 @@ describe Gimei::Name::Last do
163
163
 
164
164
  describe '#kanji' do
165
165
  it '全角文字が返ること' do
166
- _(@name.kanji).must_match(/\A#{Moji.zen}+\z/)
166
+ _(@name.kanji).must_match(/\A#{zenkaku_regexp}+\z/)
167
167
  end
168
168
  end
169
169
 
@@ -181,7 +181,7 @@ describe Gimei::Name::Last do
181
181
 
182
182
  describe '#to_s' do
183
183
  it '全角文字が返ること' do
184
- _(@name.to_s).must_match(/\A#{Moji.zen}+\z/)
184
+ _(@name.to_s).must_match(/\A#{zenkaku_regexp}+\z/)
185
185
  end
186
186
  end
187
187
 
@@ -8,4 +8,13 @@ Coveralls.wear!
8
8
 
9
9
  require 'gimei'
10
10
  require 'minitest/autorun'
11
- require 'moji'
11
+ require 'minitest/stub_const'
12
+
13
+ def zenkaku_regexp
14
+ /\p{Hiragana}|\p{Katakana}|[一-龠々]/
15
+ end
16
+
17
+ def zenkaku_or_space_regexp
18
+ /\p{Hiragana}|\p{Katakana}|[一-龠々]|\s/
19
+ end
20
+
@@ -0,0 +1,399 @@
1
+ # coding: utf-8
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'Gimei.unique' do
5
+ before do
6
+ Gimei.unique.clear
7
+ end
8
+
9
+ describe '#clear' do
10
+ describe '名前が枯渇してからclearを実行し、再度名前を取得しようとしたとき' do
11
+ it 'Gimei::RetryLimitExceededed例外が発生しないこと' do
12
+ Gimei.stub_const(:NAMES, {
13
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
14
+ 'last_name' => [%w[前島 まえしま マエシマ]]
15
+ }) do
16
+ Gimei.unique.male
17
+ Gimei.unique.clear
18
+ Gimei.unique.male
19
+ end
20
+ end
21
+ end
22
+
23
+ describe '名前が枯渇してからclear(:name)を実行し再度名前を取得しようとしたとき' do
24
+ it 'Gimei::RetryLimitExceededed例外が発生しないこと' do
25
+ Gimei.stub_const(:NAMES, {
26
+ 'first_name' => {'male' => [%w[真一 しんいち シンイチ]]},
27
+ 'last_name' => [%w[前島 まえしま マエシマ]]
28
+ }) do
29
+ Gimei.unique.male
30
+ Gimei.unique.clear(:name)
31
+ Gimei.unique.male
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '名前が枯渇してからclear(:address)を実行し再度名前を取得しようとしたとき' do
37
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
38
+ Gimei.stub_const(:NAMES, {
39
+ 'first_name' => {'male' => [%w[真一 しんいち シンイチ]]},
40
+ 'last_name' => [%w[前島 まえしま マエシマ]]
41
+ }) do
42
+ assert_raises Gimei::RetryLimitExceeded do
43
+ Gimei.unique.male
44
+ Gimei.unique.clear(:address)
45
+ Gimei.unique.male
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#male' do
53
+ describe '名前が枯渇していないとき' do
54
+ it '一意な名前(フルネームの漢字単位)が返ること' do
55
+ Gimei.stub_const(:NAMES, {
56
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
57
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
58
+ }) do
59
+ _([Gimei.unique.male.kanji, Gimei.unique.male.kanji].sort).must_equal ['前島 真一', '神谷 真一']
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '名前が枯渇したとき' do
65
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
66
+ Gimei.stub_const(:NAMES, {
67
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
68
+ 'last_name' => [%w[前島 まえしま マエシマ]]
69
+ }) do
70
+ assert_raises Gimei::RetryLimitExceeded do
71
+ Gimei.unique.male
72
+ Gimei.unique.male
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#female' do
80
+ describe '名前が枯渇していないとき' do
81
+ it '一意な名前(フルネームの漢字単位)が返ること' do
82
+ Gimei.stub_const(:NAMES, {
83
+ 'first_name' => { 'female' => [%w[花子 はなこ ハナコ]] },
84
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
85
+ }) do
86
+ _([Gimei.unique.female.kanji, Gimei.unique.female.kanji].sort).must_equal ['前島 花子', '神谷 花子']
87
+ end
88
+ end
89
+ end
90
+
91
+ describe '名前が枯渇したとき' do
92
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
93
+ Gimei.stub_const(:NAMES, {
94
+ 'first_name' => { 'female' => [%w[花子 はなこ ハナコ]] },
95
+ 'last_name' => [%w[前島 まえしま マエシマ]]
96
+ }) do
97
+ assert_raises Gimei::RetryLimitExceeded do
98
+ Gimei.unique.female
99
+ Gimei.unique.female
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ describe '#first' do
107
+ describe '名が枯渇していないとき' do
108
+ it '一意な名(漢字単位)が返ること' do
109
+ Gimei.stub_const(:NAMES, {
110
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ], %w[真二 しんじ シンジ]] },
111
+ 'last_name' => %w[]
112
+ }) do
113
+ _([Gimei.unique.first(:male).kanji, Gimei.unique.first(:male).kanji].sort).must_equal %w[真一 真二]
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '名が枯渇したとき' do
119
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
120
+ Gimei.stub_const(:NAMES, {
121
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
122
+ 'last_name' => []
123
+ }) do
124
+ assert_raises Gimei::RetryLimitExceeded do
125
+ Gimei.unique.first(:male)
126
+ Gimei.unique.first(:male)
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '#last' do
134
+ describe '姓が枯渇していないとき' do
135
+ it '一意な姓(漢字単位)が返ること' do
136
+ Gimei.stub_const(:NAMES, {
137
+ 'first_name' => { 'male' => [], 'female' => [] },
138
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
139
+ }) do
140
+ _([Gimei.unique.last.kanji, Gimei.unique.last.kanji].sort).must_equal %w[前島 神谷]
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '姓が枯渇したとき' do
146
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
147
+ Gimei.stub_const(:NAMES, {
148
+ 'first_name' => { 'male' => [], 'female' => [] },
149
+ 'last_name' => [%w[前島 まえしま マエシマ]]
150
+ }) do
151
+ assert_raises Gimei::RetryLimitExceeded do
152
+ Gimei.unique.last
153
+ Gimei.unique.last
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ describe '#kanji' do
161
+ describe '名前が枯渇していないとき' do
162
+ it '一意な名前(フルネームの漢字単位)が返ること' do
163
+ Gimei.stub_const(:NAMES, {
164
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
165
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
166
+ }) do
167
+ _([Gimei.unique.kanji(:male), Gimei.unique.kanji(:male)].sort).must_equal ['前島 真一', '神谷 真一']
168
+ end
169
+ end
170
+ end
171
+
172
+ describe '名前が枯渇したとき' do
173
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
174
+ Gimei.stub_const(:NAMES, {
175
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
176
+ 'last_name' => [%w[前島 まえしま マエシマ]]
177
+ }) do
178
+ assert_raises Gimei::RetryLimitExceeded do
179
+ Gimei.unique.kanji(:male)
180
+ Gimei.unique.kanji(:male)
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ describe '#hiragana' do
188
+ describe '名前が枯渇していないとき' do
189
+ it '一意な名前(フルネームの漢字単位)が返ること' do
190
+ Gimei.stub_const(:NAMES, {
191
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
192
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
193
+ }) do
194
+ _([Gimei.unique.hiragana(:male), Gimei.unique.hiragana(:male)].sort).must_equal ['かみや しんいち', 'まえしま しんいち']
195
+ end
196
+ end
197
+ end
198
+
199
+ describe '名前が枯渇したとき' do
200
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
201
+ Gimei.stub_const(:NAMES, {
202
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
203
+ 'last_name' => [%w[前島 まえしま マエシマ]]
204
+ }) do
205
+ assert_raises Gimei::RetryLimitExceeded do
206
+ Gimei.unique.hiragana(:male)
207
+ Gimei.unique.hiragana(:male)
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ describe '#katakana' do
215
+ describe '名前が枯渇していないとき' do
216
+ it '一意な名前(フルネームの漢字単位)が返ること' do
217
+ Gimei.stub_const(:NAMES, {
218
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
219
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
220
+ }) do
221
+ _([Gimei.unique.katakana(:male), Gimei.unique.katakana(:male)].sort).must_equal ['カミヤ シンイチ', 'マエシマ シンイチ']
222
+ end
223
+ end
224
+ end
225
+
226
+ describe '名前が枯渇したとき' do
227
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
228
+ Gimei.stub_const(:NAMES, {
229
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
230
+ 'last_name' => [%w[前島 まえしま マエシマ]]
231
+ }) do
232
+ assert_raises Gimei::RetryLimitExceeded do
233
+ Gimei.unique.katakana(:male)
234
+ Gimei.unique.katakana(:male)
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
240
+
241
+ describe '#romaji' do
242
+ describe '名前が枯渇していないとき' do
243
+ it '一意な名前(フルネームの漢字単位)が返ること' do
244
+ Gimei.stub_const(:NAMES, {
245
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
246
+ 'last_name' => [%w[前島 まえしま マエシマ], %w[神谷 かみや カミヤ]]
247
+ }) do
248
+ _([Gimei.unique.romaji(:male), Gimei.unique.romaji(:male)].sort).must_equal ['Shinichi Kamiya', 'Shinichi Maeshima']
249
+ end
250
+ end
251
+ end
252
+
253
+ describe '名前が枯渇したとき' do
254
+ it 'Gimei::RetryLimitExceededed例外が発生すること' do
255
+ Gimei.stub_const(:NAMES, {
256
+ 'first_name' => { 'male' => [%w[真一 しんいち シンイチ]] },
257
+ 'last_name' => [%w[前島 まえしま マエシマ]]
258
+ }) do
259
+ assert_raises Gimei::RetryLimitExceeded do
260
+ Gimei.unique.romaji(:male)
261
+ Gimei.unique.romaji(:male)
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end
267
+
268
+ describe '#address' do
269
+ describe '住所が枯渇していないとき' do
270
+ it '一意な住所(漢字単位)が返ること' do
271
+ Gimei.stub_const(:ADDRESSES, {
272
+ 'addresses' => {
273
+ 'prefecture' => [%w[東京都 とうきょうと トウキョウト]],
274
+ 'city' => [%w[渋谷区 しぶやく シブヤク]],
275
+ 'town' => [%w[恵比寿 えびす エビス], %w[蛭子 えびす エビス]]
276
+ }
277
+ }) do
278
+ _([Gimei.unique.address.kanji, Gimei.unique.address.kanji].sort).must_equal %w[東京都渋谷区恵比寿 東京都渋谷区蛭子]
279
+ end
280
+ end
281
+ end
282
+
283
+ describe '住所が枯渇したとき' do
284
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
285
+ Gimei.stub_const(:ADDRESSES, {
286
+ 'addresses' => {
287
+ 'prefecture' => [%w[東京都 とうきょうと トウキョウト]],
288
+ 'city' => [%w[渋谷区 しぶやく シブヤク]],
289
+ 'town' => [%w[恵比寿 えびす エビス]]
290
+ }
291
+ }) do
292
+ assert_raises Gimei::RetryLimitExceeded do
293
+ Gimei.unique.address
294
+ Gimei.unique.address
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ describe '#prefecture' do
302
+ describe '県が枯渇していないとき' do
303
+ it '一意な県が返ること' do
304
+ Gimei.stub_const(:ADDRESSES, {
305
+ 'addresses' => {
306
+ 'prefecture' => [%w[東京都 とうきょうと トウキョウト], %w[静岡県 しずおかけん シズオカケン]],
307
+ 'city' => [],
308
+ 'town' => []
309
+ }
310
+ }) do
311
+ _([Gimei.unique.prefecture.kanji, Gimei.unique.prefecture.kanji].sort).must_equal %w[東京都 静岡県]
312
+ end
313
+ end
314
+ end
315
+
316
+ describe '県が枯渇したとき' do
317
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
318
+ Gimei.stub_const(:ADDRESSES, {
319
+ 'addresses' => {
320
+ 'prefecture' => [%w[東京都 とうきょうと トウキョウト]],
321
+ 'city' => [],
322
+ 'town' => []
323
+ }
324
+ }) do
325
+ assert_raises Gimei::RetryLimitExceeded do
326
+ Gimei.unique.prefecture
327
+ Gimei.unique.prefecture
328
+ end
329
+ end
330
+ end
331
+ end
332
+ end
333
+
334
+ describe '#city' do
335
+ describe '市区町村が枯渇していないとき' do
336
+ it '一意な市区町村が返ること' do
337
+ Gimei.stub_const(:ADDRESSES, {
338
+ 'addresses' => {
339
+ 'prefecture' => [],
340
+ 'city' => [%w[渋谷区 しぶやく シブヤク], %w[新宿区 しんじゅくく シンジュクク]],
341
+ 'town' => []
342
+ }
343
+ }) do
344
+ _([Gimei.unique.city.kanji, Gimei.unique.city.kanji].sort).must_equal %w[新宿区 渋谷区]
345
+ end
346
+ end
347
+ end
348
+
349
+ describe '市区町村が枯渇したとき' do
350
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
351
+ Gimei.stub_const(:ADDRESSES, {
352
+ 'addresses' => {
353
+ 'prefecture' => [],
354
+ 'city' => [%w[渋谷区 しぶやく シブヤク]],
355
+ 'town' => []
356
+ }
357
+ }) do
358
+ assert_raises Gimei::RetryLimitExceeded do
359
+ Gimei.unique.city
360
+ Gimei.unique.city
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end
366
+
367
+ describe '#town' do
368
+ describe 'その他住所が枯渇していないとき' do
369
+ it '一意なその他住所が返ること' do
370
+ Gimei.stub_const(:ADDRESSES, {
371
+ 'addresses' => {
372
+ 'prefecture' => [],
373
+ 'city' => [],
374
+ 'town' => [%w[恵比寿 えびす エビス], %w[蛭子 えびす エビス]]
375
+ }
376
+ }) do
377
+ _([Gimei.unique.town.kanji, Gimei.unique.town.kanji].sort).must_equal %w[恵比寿 蛭子]
378
+ end
379
+ end
380
+ end
381
+
382
+ describe 'その他住所が枯渇したとき' do
383
+ it 'Gimei::RetryLimitExceeded例外が発生すること' do
384
+ Gimei.stub_const(:ADDRESSES, {
385
+ 'addresses' => {
386
+ 'prefecture' => [],
387
+ 'city' => [],
388
+ 'town' => [%w[恵比寿 えびす エビス]]
389
+ }
390
+ }) do
391
+ assert_raises Gimei::RetryLimitExceeded do
392
+ Gimei.unique.town
393
+ Gimei.unique.town
394
+ end
395
+ end
396
+ end
397
+ end
398
+ end
399
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gimei
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - willnet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-26 00:00:00.000000000 Z
11
+ date: 2020-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: romaji
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: moji
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest
56
+ name: minitest-stub-const
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -101,12 +101,15 @@ files:
101
101
  - lib/data/names.yml
102
102
  - lib/gimei.rb
103
103
  - lib/gimei/address.rb
104
+ - lib/gimei/config.rb
104
105
  - lib/gimei/name.rb
106
+ - lib/gimei/unique_generator.rb
105
107
  - lib/gimei/version.rb
106
108
  - spec/address_spec.rb
107
109
  - spec/gimei_spec.rb
108
110
  - spec/name_spec.rb
109
111
  - spec/spec_helper.rb
112
+ - spec/unique_spec.rb
110
113
  homepage: https://github.com/willnet/gimei
111
114
  licenses:
112
115
  - MIT
@@ -136,3 +139,4 @@ test_files:
136
139
  - spec/gimei_spec.rb
137
140
  - spec/name_spec.rb
138
141
  - spec/spec_helper.rb
142
+ - spec/unique_spec.rb