randomperson 0.0.19 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/.gitignore +2 -0
  2. data/CHANGELOG +2 -0
  3. data/Manifest +22 -2
  4. data/README.markdown +475 -0
  5. data/lib/randomperson/Loader.rb +62 -0
  6. data/lib/randomperson/Names/AmericanFemaleFirst.rb +10 -8
  7. data/lib/randomperson/Names/AmericanLast.rb +13 -10
  8. data/lib/randomperson/Names/AmericanMaleFirst.rb +11 -8
  9. data/lib/randomperson/Names/AmericanPrefix.rb +16 -18
  10. data/lib/randomperson/Names/AmericanSuffix.rb +26 -16
  11. data/lib/randomperson/Names/AncientGreekFemaleFirst.rb +12 -8
  12. data/lib/randomperson/Names/AncientGreekLast.rb +11 -8
  13. data/lib/randomperson/Names/AncientGreekMaleFirst.rb +11 -8
  14. data/lib/randomperson/Names/AnyLast.rb +11 -9
  15. data/lib/randomperson/Names/BasqueFemaleFirst.rb +10 -9
  16. data/lib/randomperson/Names/BasqueLast.rb +9 -8
  17. data/lib/randomperson/Names/BasqueMaleFirst.rb +10 -9
  18. data/lib/randomperson/Names/BritishPrefix.rb +10 -16
  19. data/lib/randomperson/Names/BritishSuffix.rb +21 -16
  20. data/lib/randomperson/Names/EnglishFemaleFirst.rb +10 -9
  21. data/lib/randomperson/Names/EnglishLast.rb +12 -11
  22. data/lib/randomperson/Names/EnglishMaleFirst.rb +10 -9
  23. data/lib/randomperson/Names/EnglishPrefix.rb +11 -15
  24. data/lib/randomperson/Names/FinnishFemaleFirst.rb +10 -8
  25. data/lib/randomperson/Names/FinnishLast.rb +9 -8
  26. data/lib/randomperson/Names/FinnishMaleFirst.rb +10 -9
  27. data/lib/randomperson/Names/FinnishPrefix.rb +16 -18
  28. data/lib/randomperson/Names/FrenchFemaleFirst.rb +10 -9
  29. data/lib/randomperson/Names/FrenchLast.rb +12 -11
  30. data/lib/randomperson/Names/FrenchMaleFirst.rb +11 -10
  31. data/lib/randomperson/Names/GermanFemaleFirst.rb +10 -9
  32. data/lib/randomperson/Names/GermanLast.rb +9 -8
  33. data/lib/randomperson/Names/GermanMaleFirst.rb +10 -9
  34. data/lib/randomperson/Names/ScottishFemaleFirst.rb +10 -9
  35. data/lib/randomperson/Names/ScottishLast.rb +11 -10
  36. data/lib/randomperson/Names/ScottishMaleFirst.rb +13 -12
  37. data/lib/randomperson/Names/ScottishPrefix.rb +10 -16
  38. data/lib/randomperson/Names/SpanishFemaleFirst.rb +11 -10
  39. data/lib/randomperson/Names/SpanishLast.rb +15 -12
  40. data/lib/randomperson/Names/SpanishMaleFirst.rb +12 -11
  41. data/lib/randomperson/Names/SpanishPrefix.rb +17 -19
  42. data/lib/randomperson/Names/SwedishFemaleFirst.rb +10 -9
  43. data/lib/randomperson/Names/SwedishLast.rb +10 -9
  44. data/lib/randomperson/Names/SwedishMaleFirst.rb +15 -14
  45. data/lib/randomperson/Names/ThaiFemaleFirst.rb +9 -8
  46. data/lib/randomperson/Names/ThaiFirst.rb +9 -8
  47. data/lib/randomperson/Names/ThaiLast.rb +9 -8
  48. data/lib/randomperson/Names/ThaiMaleFirst.rb +9 -8
  49. data/lib/randomperson/Names/ThaiRomanisedFemaleFirst.rb +10 -9
  50. data/lib/randomperson/Names/ThaiRomanisedLast.rb +11 -10
  51. data/lib/randomperson/Names/ThaiRomanisedMaleFirst.rb +10 -9
  52. data/lib/randomperson/Names/WelshFemaleFirst.rb +9 -8
  53. data/lib/randomperson/Names/WelshLast.rb +11 -10
  54. data/lib/randomperson/Names/WelshMaleFirst.rb +9 -8
  55. data/lib/randomperson/Names/WelshPrefix.rb +10 -16
  56. data/lib/randomperson/Outputter.rb +53 -0
  57. data/lib/randomperson/demographic.rb +75 -0
  58. data/lib/randomperson/ext/Array.rb +6 -2
  59. data/lib/randomperson/generator.rb +54 -77
  60. data/lib/randomperson/name.rb +18 -13
  61. data/lib/randomperson/person.rb +2 -0
  62. data/lib/randomperson/version.rb +1 -1
  63. data/lib/randomperson.rb +126 -1
  64. data/spec/AmericanSuffix_spec.rb +37 -0
  65. data/spec/AnyLast_spec.rb +25 -0
  66. data/spec/Last_and_First_Names_spec.rb +113 -0
  67. data/spec/array_spec.rb +49 -0
  68. data/spec/demographic_spec.rb +15 -0
  69. data/spec/generator_spec.rb +1 -4
  70. data/spec/name_spec.rb +3 -2
  71. data/spec/randomperson_spec.rb +321 -0
  72. data/spec/rspec_helper.rb +22 -0
  73. data/spec/support/helpers.rb +13 -0
  74. data/spec/support/matchers/all.rb +14 -0
  75. data/spec/support/matchers/be_in.rb +9 -0
  76. data/spec/support/shared_examples/names.rb +59 -0
  77. data/test/benchmarks/concat_or_add.rb +30 -0
  78. data/test/benchmarks/my_assoc_or_select.rb +60 -0
  79. data.tar.gz.sig +0 -0
  80. metadata +35 -7
  81. metadata.gz.sig +2 -3
  82. data/README +0 -324
  83. data/lib/randomperson/choice.rb +0 -113
  84. data/spec/choice_spec.rb +0 -13
data/.gitignore CHANGED
@@ -14,3 +14,5 @@
14
14
  *.zip
15
15
  pkg
16
16
  rdoc
17
+ *.swp
18
+ coverage/
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v1.0.0 Lots of breaking changes to API. Lots more specs, for code and namefiles. Some general cleaning of data too.
2
+
1
3
  v0.0.19 Start of some specs.
2
4
 
3
5
  v0.0.18 Improved documentation a bit. Changed some filenames to fix a problem with case sensitivity on some systems.
data/Manifest CHANGED
@@ -1,10 +1,11 @@
1
1
  .gitignore
2
2
  CHANGELOG
3
3
  Manifest
4
- README
4
+ README.markdown
5
5
  Rakefile
6
6
  gem-public_cert.pem
7
7
  lib/randomperson.rb
8
+ lib/randomperson/Loader.rb
8
9
  lib/randomperson/Names/AmericanFemaleFirst.rb
9
10
  lib/randomperson/Names/AmericanLast.rb
10
11
  lib/randomperson/Names/AmericanMaleFirst.rb
@@ -55,7 +56,8 @@ lib/randomperson/Names/WelshFemaleFirst.rb
55
56
  lib/randomperson/Names/WelshLast.rb
56
57
  lib/randomperson/Names/WelshMaleFirst.rb
57
58
  lib/randomperson/Names/WelshPrefix.rb
58
- lib/randomperson/choice.rb
59
+ lib/randomperson/Outputter.rb
60
+ lib/randomperson/demographic.rb
59
61
  lib/randomperson/ext/Array.rb
60
62
  lib/randomperson/ext/Date.rb
61
63
  lib/randomperson/ext/Enumerable.rb
@@ -68,5 +70,23 @@ lib/randomperson/person.rb
68
70
  lib/randomperson/ratio.rb
69
71
  lib/randomperson/version.rb
70
72
  randomperson.gemspec
73
+ spec/AmericanPrefix_spec.rb
74
+ spec/AmericanSuffix_spec.rb
75
+ spec/AnyLast_spec.rb
76
+ spec/FinnishPrefix_spec.rb
77
+ spec/Last_and_First_Names_spec.rb
78
+ spec/SpanishPrefix_spec.rb
79
+ spec/array_spec.rb
80
+ spec/demographic_spec.rb
81
+ spec/generator_spec.rb
82
+ spec/name_spec.rb
83
+ spec/randomperson_spec.rb
84
+ spec/rspec_helper.rb
85
+ spec/support/helpers.rb
86
+ spec/support/matchers/all.rb
87
+ spec/support/matchers/be_in.rb
88
+ spec/support/shared_examples/names.rb
89
+ test/benchmarks/concat_or_add.rb
90
+ test/benchmarks/my_assoc_or_select.rb
71
91
  test/test_Choice.rb
72
92
  test/test_Generator.rb
data/README.markdown ADDED
@@ -0,0 +1,475 @@
1
+ # RandomPerson
2
+
3
+ A port to Ruby of Perl's Data::RandomPerson.
4
+
5
+ http://search.cpan.org/~peterhi/Data-RandomPerson-0.4/
6
+
7
+ Make sure you're reading the right version of the docs to go with your library! (If you're reading this on Github look for the "Switch Tags" or "Current Branch" -> "Tags" buttons to get the right version.)
8
+
9
+ ## QUICK NOTE!
10
+
11
+ This was the first Ruby library I wrote. I'm adding specs and improving the code now I've half an idea of what I should be doing, but I'd really, *really* appreciate it that if you do see something is wrong or doesn't work for you or you've an idea for improvement **let me know**. Wow, Github makes this so easy, just go for it! I'll be happy to help and happy for the help.
12
+
13
+
14
+ ## Why did I write this?
15
+
16
+ Because the Faker library and a few of the other random ones are excellent, but they don't have the precision I needed. I wanted believable male names between a certain age range for a football game I was writing. Producing names like Mrs Albert Wiggins wasn't really going to cut it.
17
+
18
+ And I'm a masochist.
19
+
20
+ It also has unicode characters, so it'll give your database a real test. At least, if it's MySQL, all the other databases won't even notice.
21
+
22
+
23
+ ## Installation:
24
+
25
+ You'll need at least Ruby v1.9.1
26
+
27
+ Get the public key from http://github.com/yb66/RandomPerson/blob/master/gem-public_cert.pem and do:
28
+
29
+ gem cert --add /path/to/wherever/you/downloaded/this/to/public_cert.pem
30
+
31
+ then install it:
32
+
33
+ gem install randomperson -P HighSecurity
34
+
35
+
36
+ ## USAGE:
37
+
38
+ The original API (if you can call it that) was very clunky so I've endeavoured to improve it by adding a nice facade over the top. I'll start off using that but as the examples move along I might do some things "the old fashioned way" by using some of the classes underlying everything directly, just so you know what's going on under there. If you see several ways of doing the same thing don't freak out! You're probably best using the stuff just below here.
39
+
40
+ So, to generate 1000 random people with Spanish names, between the ages of 16 and 35 with a ratio of 3 males to every 5 females:
41
+
42
+ require 'randomperson'
43
+
44
+ r = RandomPerson() # don't forget the brackets!
45
+
46
+ r.demographic("Spain", gender_ratio: [3,5] , age_lower:16, age_upper:35 ).add_Spanish
47
+
48
+ people = [ ]
49
+ 1000.times { people << r.generate }
50
+
51
+ 10.times { |i| puts "#{people[i].first} #{people[i].last} age: #{people[i].age} born: #{people[i].dob.strftime("%d-%b-%Y")}" }
52
+
53
+ Output:
54
+
55
+ Bartolomé Andrés de Elixaeberna age: 20 born: 28-Apr-1990
56
+ Fabiana Cordero Balmaceda age: 21 born: 14-Jun-1989
57
+ Jorge Alas Albarracin age: 29 born: 16-Apr-1981
58
+ Eufemia Berlanga de Sergi age: 33 born: 25-Jan-1977
59
+ David Puig Villaroel age: 19 born: 17-Apr-1991
60
+ Alba Henchoz de Hurtado age: 30 born: 14-Feb-1980
61
+ Natalia Jara de Guevara age: 33 born: 28-Jul-1977
62
+ Tito Cresaco Campo age: 20 born: 14-Feb-1990
63
+ Susana Pitillas de Vaime age: 32 born: 12-Aug-1978
64
+ Gustavo Hierro Carbajal y Plazas age: 31 born: 08-Feb-1979
65
+
66
+ Here's an example using the Thai Romanised data:
67
+
68
+ r.demographic("Thai").add_Thai_Romanised
69
+ people = [ ]
70
+ 10.times { people << r.generate( "Thai") }
71
+ 10.times { |i| puts "#{people[i].first} #{people[i].last} age: #{people[i].age} born: #{people[i].dob.strftime("%d-%b-%Y")}" }
72
+
73
+ Output:
74
+
75
+ Yongchaiyuth Sripituksakul Puntasrima age: 39 born: 29-Mar-1971
76
+ Sri-Patana Wattanasin age: 77 born: 04-Feb-1933
77
+ Wattana Rojjanasukchai age: 7 born: 27-Jun-2003
78
+ Ban Sukbunsung age: 85 born: 07-Sep-1925
79
+ Daeng Prasongsanti age: 65 born: 27-Mar-1945
80
+ Proi Paowsong Sriwarunyu age: 60 born: 06-May-1950
81
+ Ban Yongjaiyut age: 4 born: 06-Nov-2006
82
+ Siam Narkhirunkanok age: 15 born: 12-Aug-1995
83
+ Tong Punyawong Kadesadayurat age: 64 born: 01-Sep-1946
84
+ Sarai Wattanapanit Maneerattana age: 44 born: 21-Dec-1966
85
+
86
+ ## DEMOGRAPHICS
87
+
88
+ The Demographic class sets the parameters that will be used to generate people.
89
+
90
+ r.demographic("My fancy demo")
91
+
92
+ is the same as
93
+
94
+ r.demographic("My fancy demo", gender_ratio: [1,1] , age_lower: 0, age_upper: 115 )
95
+
96
+ So you'd end up with a population of roughly 50:50 male/female with ages from 0 to 115 years.
97
+
98
+ If you don't give a demographic name it will be given a number. To see the demographics use:
99
+
100
+ r.demographics
101
+
102
+ To see a particular one, use its name (it's a hash):
103
+
104
+ r.demographics["My fancy demo"]
105
+
106
+ ## LAST PERSON
107
+
108
+ r.demographic("Who was last?").add_English
109
+ r.person.lastname # generates a new person if none.
110
+ > => "Fletcher"
111
+
112
+ r.person.lastname # gets the last person if there was one.
113
+ > => "Fletcher"
114
+
115
+ r.generate.lastname # generates a new name every time
116
+ > => "Ford"
117
+
118
+ r.person.lastname
119
+ > => "Ford"
120
+
121
+ r.generate.lastname
122
+ > => "Bradley"
123
+
124
+ r.generate.lastname
125
+ > => "King"
126
+
127
+ r.person.lastname
128
+ > => "King"
129
+
130
+
131
+ # an undefined demographic will return nil
132
+ r.person("What?").lastname
133
+ > NoMethodError: undefined method `lastname' for nil:NilClass
134
+
135
+ r.person("What?")
136
+ > => nil
137
+
138
+ r.person.lastname # it still remembers the last person.
139
+ > => "King"
140
+
141
+ r.person("What?")
142
+ > => nil
143
+
144
+ r.person("Who was last?").lastname
145
+ > => "King"
146
+
147
+
148
+ r.demographic("Not English").add_Thai
149
+ r.person.lastname # not using Thais yet
150
+ > => "King"
151
+
152
+ r.generate.lastname # generate will automatically assume you want to use the last loaded demographic, unless specified otherwise
153
+ > => "Ornlamai Sriwarunyu"
154
+
155
+ r.generate("Who was last?").lastname # specify to the demographic to generate using it.
156
+ > => "Bradley-Adams"
157
+
158
+ r.person.lastname
159
+ > => "Bradley-Adams"
160
+
161
+ r.generate("Not English").lastname
162
+ > => "Suntornnitikul Parnthong"
163
+
164
+ r.person("Who was last?").lastname # this will generate a new name due to the switch between demographics. It's only keeping one lastname, not a lastname for every demographic.
165
+ > => "Jones"
166
+
167
+ ## WHY NAME THE DEMOGRAPHIC?
168
+
169
+ Because you can mix and match.
170
+
171
+
172
+ These will produce the same results (Spanish names), but are named differently.
173
+
174
+ r.demographic("Spain").add_Spanish
175
+ r.demographics.keys
176
+ > => ["Spain"]
177
+
178
+
179
+ r.demographic.add_Spanish # the name is handled for you.
180
+ r.demographics.keys
181
+ > => ["0"]
182
+
183
+ But, you can play about a bit with the name files. For example:
184
+
185
+ r.demographic("Mix n match").add_Spanish
186
+ person = r.generate
187
+ puts "#{person.prefix if person.prefix} #{person.first} #{person.last} #{person.suffix if person.suffix} age: #{person.age} born: #{person.dob.strftime("%d-%b-%Y")}"
188
+ > => Sra. Enriqueta Sedeno Arbizu age: 53 born: 22-Nov-1958
189
+
190
+ That is what we expect, but we can change the prefixes to British, the females' first names to be Finnish, and the males' first names to be French, while keeping the Spanish last names, and an American suffix for good measure!
191
+
192
+ r.demographic("Mix n match").add_BritishPrefix.add_SpanishLast.add_FinnishFemaleFirst.add_FrenchMaleFirst.add_AmericanSuffix
193
+ person = r.generate
194
+ puts "#{person.prefix if person.prefix} #{person.first} #{person.last} #{person.suffix if person.suffix} age: #{person.age} born: #{person.dob.strftime("%d-%b-%Y")}"
195
+ > => Miss Johanna Sanchez Questi age: 94 born: 20-May-1917
196
+
197
+ and the last 2 lines again:
198
+
199
+ > => Mr Rémy Escriba Sanroma age: 103 born: 16-Mar-1908
200
+
201
+ or:
202
+
203
+ r.demographic("French Spaniards").add_SpanishLast.add_French_First
204
+ person = r.generate # a couple of times and then puts...
205
+
206
+ > => Denise-Juliette Parrado Heras age: 80 born: 06-Apr-1931
207
+ > => Gustav Cordona Belsue age: 20 born: 27-Oct-1991
208
+
209
+
210
+ ## LOADING NAMEFILES
211
+
212
+ `r.demographic.add_Spanish_Female` would just load the `SpanishFemaleFirst` class into `r.demographics`.
213
+
214
+ `r.demographic.add_Spanish` would load:
215
+
216
+ `SpanishFemaleFirst` into `r.demographic["0"].femalefirst`
217
+ `SpanishMaleFirst` into `r.demographic["0"].malefirst`
218
+ `SpanishLast` into `r.demographic["0"].last`
219
+
220
+ etc etc
221
+
222
+ or you can do things the old fashioned way (but why? anyway...)
223
+
224
+ require 'namefiles/spanishfemalefirst'
225
+ #obviously you need to use the path from where you are or where the script will run from
226
+
227
+ r.demographic["My fancy demo"].femalefirst = RandomPerson::Names::SpanishFemaleFirst.new
228
+
229
+ The rule is, put\_underscores\_between\_the\_important\_words
230
+
231
+ _and_
232
+
233
+ always begin with `add_`
234
+
235
+ _and_
236
+
237
+ make sure each word is capitalised, `add_male` will actually pick up Fe_male_ whereas `add_Female` and `add_Male` will get what you want.
238
+
239
+ If you want EnglishLast names loaded:
240
+
241
+ r.demographic.add_English_Last
242
+
243
+ All English files:
244
+
245
+ r.demographic.add_English
246
+
247
+ English males:
248
+
249
+ r.demographic.add_English_Male
250
+
251
+
252
+ If you need to check what's loaded, have a look in the instance variables of the demographic:
253
+
254
+ r.demographics["Mix n match"].malefirst.class.name
255
+ > => "RandomPerson::Names::SpanishMaleFirst"
256
+
257
+ r.demographics["Mix n match"].femalefirst.class.name
258
+ > => "RandomPerson::Names::SpanishFemaleFirst"
259
+
260
+ r.demographics["Mix n match"].last.class.name
261
+ > => "RandomPerson::Names::SpanishLast"
262
+
263
+ r.demographics["Mix n match"].prefix.class.name
264
+ > => "RandomPerson::Names::SpanishPrefix"
265
+
266
+ r.demographics["Mix n match"].suffix.class.name
267
+ > => "NilClass"
268
+
269
+
270
+ ## NEGATIONS
271
+
272
+ Sometimes you'll want to load something but not another, you can do this by prepending _not_ to the things you don't want. For example, to get the Thai names that are in Thai script and not romanised:
273
+
274
+ # an already load demographic gets Thai, non romanised
275
+ r.demographic["Thai"].male.add_Thai_notRomanised
276
+
277
+ or to also get rid of the female names.
278
+
279
+ # a new demographic gets non romanised Thai and no female names
280
+ r.demographic("Thai").add_Thai_notRomanised_notFemale
281
+
282
+ This is an experimental thing. Seems to work, but may change. You cannot do this (at the moment)
283
+
284
+ r.demographic.notRomanised_add_Thai
285
+
286
+ **Always** *begin with* `add_`
287
+
288
+ Here's an example:
289
+
290
+ r.demographic("SuperThai").add_Thai_notRomanised
291
+ people = [ ]
292
+ 10.times { people << r.generate( "SuperThai") }
293
+ 10.times { |i| puts "#{people[i].first} #{people[i].last} age: #{people[i].age} born: #{people[i].dob.strftime("%d-%b-%Y")}" }
294
+
295
+ Output:
296
+
297
+ > ทักษิณ ชัยภูมิ age: 53 born: 14-May-1958
298
+ > สุริยา พิษณุโลก age: 47 born: 21-Aug-1964
299
+ > แก้วเก้า เจริญปุระ age: 61 born: 14-Mar-1950
300
+ > บัณฑิตา สระบุรี age: 113 born: 06-Nov-1898
301
+ > วิศิษฏ์ สุโขทัย age: 83 born: 23-Sep-1928
302
+ > สุประภา โลโซ age: 50 born: 09-Apr-1961
303
+ > สริตา ตรัง age: 111 born: 27-Jan-1900
304
+ > ณัฎฐา ลพบุรี age: 86 born: 24-Dec-1925
305
+ > สุชาย ลพบุรี age: 88 born: 06-Apr-1923
306
+ > ปราณี สะเมิง age: 85 born: 04-Mar-1926
307
+
308
+
309
+ ## RATIOS VS ODDS
310
+
311
+ The default gender ratio is 1:1. The male part is the left side (or Array#first), the female is the right side (or Array#last). All ratios are given as an array i.e. [1,1] or [3,2]
312
+
313
+ A ratio of 1:1 will not necessarily give you a population with exactly half male, half female. The ratio is the odds of getting that. So a ratio of [1,3] will give a 25% chance of producing a male and a 75% chance of being a female.
314
+
315
+ If you wish to have an exact ratio within the population then create two choices each with a 0% chance of producing the other. For example:
316
+
317
+ r.demographic("Men", gender_ratio:[1,0] )
318
+ r.demographic("Women", gender_ratio:[0,1] )
319
+ #...more code here...
320
+
321
+ 25.times { people << r.generate("Men") }
322
+ 75.times { people << r.generate("Women") }
323
+
324
+ This would give you a population of 25 males and 75 females. Which sounds great unless you really think about it.
325
+
326
+ ## FORMATTING
327
+
328
+ Each culture has it's own conventions around names. This makes sticking some monolithic algorithm in the centre of the code to sort out how names should be displayed impossible, so each data file describes how it thinks the names should be formatted.
329
+
330
+ For example, in the EnglishLast.rb file:
331
+
332
+ @formats = [
333
+ ->(n) { n.rand },
334
+ ->(n) { n.rand + '-' + n.rand },
335
+ ]
336
+
337
+ This tells us that there are two ways of formatting last names defined in the file. All formats are described as lambda functions in an array.
338
+
339
+ ## BIT MORE ON RATIOS
340
+
341
+ Behind the scenes, ratios like this [1,3] are converted to an array of ranges like this `[0..24, 25..99]`, called ratiod. Just so you know for this next bit.
342
+
343
+ In the EnglishLast.rb file:
344
+
345
+ @formats_ratiod = [ 0..96, 97..99 ]
346
+
347
+ This says that the chances of a name being single barrelled is 97%, and double barrelled with a hypen is 3%. I made up those figures from my own experience, but if you disagree with either the ratios or the formatting then you can change it. Either directly in the file or while running the code. It's your choice. Just make sure the numbers are right, length of arrays should be the same ( e.g. four formatting options should have a ratio with four parts like [a,b,c,d]) or it will break.
348
+
349
+ ## PREFIXES AND SUFFIXES
350
+
351
+ Each generator starts by producing a person with a gender, an age and a date of birth. These are then passed on to the subsequent name portions so that a male always gets a male name and a male prefix (if you've specified a prefix file).
352
+
353
+ Suffix files will also (I hope) do a bit of checking at what's already been set, so you won't get Dr. Bobby Horliton PhD, as it should be either Dr. or PhD (apparently). Stuff like that should get caught.
354
+
355
+ ## ADDING YOUR OWN NAMEFILES
356
+
357
+ My suggestion is to find the type of name that is closest (if you're looking for Spanishy names then look at the Spanish files as they'll have similar formatting rules there for free...) and copy and paste it in to a new one. It's easier that way.
358
+
359
+ If you do make your own name file then fork this project and send me a pull request! (See the Github help if you don't know how).
360
+
361
+ These are current name files in the library:
362
+
363
+ AmericanFemaleFirst
364
+ AmericanLast
365
+ AmericanMaleFirst
366
+ AmericanPrefix
367
+ AmericanSuffix
368
+ AncientGreekFemaleFirst
369
+ AncientGreekLast
370
+ AncientGreekMaleFirst
371
+ AnyLast
372
+ BasqueFemaleFirst
373
+ BasqueLast
374
+ BasqueMaleFirst
375
+ BritishPrefix
376
+ BritishSuffix
377
+ EnglishFemaleFirst
378
+ EnglishLast
379
+ EnglishMaleFirst
380
+ EnglishPrefix
381
+ FinnishFemaleFirst
382
+ FinnishLast
383
+ FinnishMaleFirst
384
+ FinnishPrefix
385
+ FrenchFemaleFirst
386
+ FrenchLast
387
+ FrenchMaleFirst
388
+ GermanFemaleFirst
389
+ GermanLast
390
+ GermanMaleFirst
391
+ ScottishFemaleFirst
392
+ ScottishLast
393
+ ScottishMaleFirst
394
+ ScottishPrefix
395
+ SpanishFemaleFirst
396
+ SpanishLast
397
+ SpanishMaleFirst
398
+ SpanishPrefix
399
+ SwedishFemaleFirst
400
+ SwedishLast
401
+ SwedishMaleFirst
402
+ ThaiFemaleFirst
403
+ ThaiFirst
404
+ ThaiLast
405
+ ThaiMaleFirst
406
+ ThaiRomanisedFemaleFirst
407
+ ThaiRomanisedLast
408
+ ThaiRomanisedMaleFirst
409
+ WelshFemaleFirst
410
+ WelshLast
411
+ WelshMaleFirst
412
+ WelshPrefix
413
+
414
+
415
+ ## ACCURACY OF NAMES AND RATIOS
416
+
417
+ I've taken bits and pieces from wherever I could get them, so if you see something is wrong then either let me know or produce a patch, just have a look at the help links on Github for how to do it. I'll also add you name to this readme, and worldly fame will be yours.
418
+
419
+ ## TODO:
420
+
421
+ There's lots to do. Lot of repetition and ugly bits here and there, but it works so I'll get round to it when I can.
422
+
423
+ ## THANKS GO TO
424
+
425
+ Peter Hickman for writing the original library in Perl that inspired this on in Ruby.
426
+
427
+ My good friends:
428
+ Johan Bergsten for helping me out with the Swedish names.
429
+ HALLOJULIA (hayl yeah!) for helping me with the German names.
430
+ Aino Rissanen for helping me with the Finnish names.
431
+ Fabiola Fernández Gutiérrez for help with the Spanish prefixes.
432
+ Aled Coe and Annette Smith for help with Welsh surnames.
433
+
434
+ Special thanks to my agent, all the people at Marvel and DC for such fine comics, my wife and my mom for supporting me when no one else believed in me, but (sniff) most thanks goes to Noel Edmonds and Jeremy Kyle, for making daytime TV so **creepy** and inane that I rarely waste time watching it.
435
+
436
+ ## THE END UNLESS YOU WANT TO READ THE LICENCE
437
+
438
+ *Iain Barnett*
439
+
440
+ ## LICENCE:
441
+
442
+ It's an MIT Licence, I didn't take any code from the Perl one just names and a slight idea on how to structure things, so this ain't gonna be under the GPL. MIT is better anyway ;)
443
+
444
+ Copyright (c) 2010 Iain Barnett
445
+
446
+ Permission is hereby granted, free of charge, to any person obtaining a copy
447
+ of this software and associated documentation files (the "Software"), to deal
448
+ in the Software without restriction, including without limitation the rights
449
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
450
+ copies of the Software, and to permit persons to whom the Software is
451
+ furnished to do so, subject to the following conditions:
452
+
453
+ The above copyright notice and this permission notice shall be included in
454
+ all copies or substantial portions of the Software.
455
+
456
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
457
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
458
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
459
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
460
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
461
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
462
+ THE SOFTWARE.
463
+
464
+ In other words, be good.
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
@@ -0,0 +1,62 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./ext/Kernel.rb"
4
+
5
+
6
+ module RandomPerson
7
+
8
+ # This module is here to do the loading of data into a demographic class
9
+ # It relies on there being a self.available_classes method wrapped around a Set
10
+ module Loader
11
+
12
+
13
+ module ClassMethods
14
+
15
+
16
+ def load_names( opts={} )
17
+ opts = { patterns: ['*.rb'], lib_dir: File.dirname(__FILE__) }.merge( opts )
18
+
19
+ fulls = opts[:patterns].map do |pattern|
20
+ full_pattern = File.join( opts[:lib_dir], 'Names', pattern )
21
+ end
22
+ Dir.glob( fulls )
23
+ end
24
+
25
+
26
+ def requiring( file_name )
27
+ require file_name
28
+ set_of_names = File.basename( file_name, File.extname( file_name ) ) #remove the extension too
29
+ end
30
+
31
+ def prefix_em( collection, prefix="RandomPerson::Names::" )
32
+ collection.map{|x| "#{prefix}#{x}"}
33
+ end
34
+
35
+
36
+
37
+ end # ClassMethods
38
+
39
+
40
+ module InstanceMethods
41
+
42
+ # this adds the classes as constants
43
+ # The patterns are there to stop other files being added by accident.
44
+ # and to load the right names into the right instance var
45
+ def addklass( klass, patterns=[["Male",'First'],["Female", "First"], ['Last'], ['Prefix'], ['Suffix']] )
46
+
47
+ patterns.each do |ps|
48
+ if ps.all?{|p| klass =~ /#{p}/ }
49
+ instance_variable_set( "@#{ps.join.downcase}", eval("#{klass}.new") )
50
+ end # if
51
+ end
52
+ end # addklass
53
+
54
+ end # InstanceMethods
55
+
56
+ def self.included(receiver)
57
+ receiver.extend ClassMethods
58
+ receiver.send :include, InstanceMethods
59
+ end
60
+ end # Loader
61
+
62
+ end # RandomPerson
@@ -1,20 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "../name.rb"
4
+ require_relative "../ext/Array.rb"
5
+
1
6
  module RandomPerson
2
7
  module Names
3
8
 
4
9
  class AmericanFemaleFirst < Name
5
10
 
6
11
  def initialize
7
- @formats = {
8
- :single => ->(n) { n.rand },
9
- }
10
-
12
+ @names = Names
11
13
  @formats_ratiod = [ (0..99) ]
12
- setupnames
13
- end
14
+ @formats = [ ->(n){ n.rand } ]
14
15
 
15
- def setupnames
16
- @names = %w{ Mary Patricia Linda Barbara Elizabeth Jennifer Maria Susan Margaret Dorothy Lisa Nancy Karen Betty Helen Sandra Donna Carol Ruth Sharon Michelle Laura Sarah Kimberly Deborah Jessica Shirley Cynthia Angela Melissa Brenda Amy Anna Rebecca Virginia Kathleen Pamela Martha Debra Amanda Stephanie Carolyn Christine Marie Janet Catherine Frances Ann Joyce Diane Alice Julie Heather Teresa Doris Gloria Evelyn Jean Cheryl Mildred Katherine Joan Ashley Judith Rose Janice Kelly Nicole Judy Christina Kathy Theresa Beverly Denise Tammy Irene Jane Lori Rachel Marilyn Andrea Kathryn Louise Sara Anne Jacqueline Wanda Bonnie Julia Ruby Lois Tina Phyllis Norma Paula Diana Annie Lillian Emily Robin Peggy Crystal Gladys Rita Dawn Connie Florence Tracy Edna Tiffany Carmen Rosa Cindy Grace Wendy Victoria Edith Kim Sherry Sylvia Josephine Thelma Shannon Sheila Ethel Ellen Elaine Marjorie Carrie Charlotte Monica Esther Pauline Emma Juanita Anita Rhonda Hazel Amber Eva Debbie April Leslie Clara Lucille Jamie Joanne Eleanor Valerie Danielle Megan Alicia Suzanne Michele Gail Bertha Darlene Veronica Jill Erin Geraldine Lauren Cathy Joann Lorraine Lynn Sally Regina Erica Beatrice Dolores Bernice Audrey Yvonne Annette June Samantha Marion Dana Stacy Ana Renee Ida Vivian Roberta Holly Brittany Melanie Loretta Yolanda Jeanette Laurie Katie Kristen Vanessa Alma Sue Elsie Beth Jeanne Vicki Carla Tara Rosemary Eileen Terri Gertrude Lucy Tonya Ella Stacey Wilma Gina Kristin Jessie Natalie Agnes Vera Willie Charlene Bessie Delores Melinda Pearl Arlene Maureen Colleen Allison Tamara Joy Georgia Constance Lillie Claudia Jackie Marcia Tanya Nellie Minnie Marlene Heidi Glenda Lydia Viola Courtney Marian Stella Caroline Dora Jo Vickie Mattie Terry Maxine Irma Mabel Marsha Myrtle Lena Christy Deanna Patsy Hilda Gwendolyn Jennie Nora Margie Nina Cassandra Leah Penny Kay Priscilla Naomi Carole Brandy Olga Billie Dianne Tracey Leona Jenny Felicia Sonia Miriam Velma Becky Bobbie Violet Kristina Toni Misty Mae Shelly Daisy Ramona Sherri Erika Katrina Claire Lindsey Lindsay Geneva Guadalupe Belinda Margarita Sheryl Cora Faye Ada Natasha Sabrina Isabel Marguerite Hattie Harriet Molly Cecilia Kristi Brandi Blanche Sandy Rosie Joanna Iris Eunice Angie Inez Lynda Madeline Amelia Alberta Genevieve Monique Jodi Janie Maggie Kayla Sonya Jan Lee Kristine Candace Fannie Maryann Opal Alison Yvette Melody Luz Susie Olivia Flora Shelley Kristy Mamie Lula Lola Verna Beulah Antoinette Candice Juana Jeannette Pam Kelli Hannah Whitney Bridget Karla Celia Latoya Patty Shelia Gayle Della Vicky Lynne Sheri Marianne Kara Jacquelyn Erma Blanca Myra Leticia Pat Krista Roxanne Angelica Johnnie Robyn Francis Adrienne Rosalie Alexandra Brooke Bethany Sadie Bernadette Traci Jody Kendra Jasmine Nichole Rachael Chelsea Mable Ernestine Muriel Marcella Elena Krystal Angelina Nadine Kari Estelle Dianna Paulette Lora Mona Doreen Rosemarie Angel Desiree Antonia Hope Ginger Janis Betsy Christie Freda Mercedes Meredith Lynette Teri Cristina Eula Leigh Meghan Sophia Eloise Rochelle Gretchen Cecelia Raquel Henrietta Alyssa Jana Kelley Gwen Kerry Jenna Tricia Laverne Olive Alexis Tasha Silvia Elvira Casey Delia Sophie Kate Patti Lorena Kellie Sonja Lila Lana Darla May Mindy Essie Mandy Lorene Elsa Josefina Jeannie Miranda Dixie Lucia Marta Faith Lela Johanna Shari Camille Tami Shawna Elisa Ebony Melba Ora Nettie Tabitha Ollie Jaime Winifred Kristie Marina Alisha Aimee Rena Myrna Marla Tammie Latasha Bonita Patrice Ronda Sherrie Addie Francine Deloris Stacie Adriana Cheri Shelby Abigail Celeste Jewel Cara Adele Rebekah Lucinda Dorthy Chris Effie Trina Reba Shawn Sallie Aurora Lenora Etta Lottie Kerri Trisha Nikki Estella Francisca Josie Tracie Marissa Karin Brittney Janelle Lourdes Laurel Helene Fern Elva Corinne Kelsey Ina Bettie Elisabeth Aida Caitlin Ingrid Iva Eugenia Christa Goldie Cassie Maude Jenifer Therese Frankie Dena Lorna Janette Latonya Candy Morgan Consuelo Tamika Rosetta Debora Cherie Polly Dina Jewell Fay Jillian Dorothea Nell Trudy Esperanza Patrica Kimberley Shanna Helena Carolina Cleo Stefanie Rosario Ola Janine Mollie Lupe Alisa Lou Maribel Susanne Bette Susana Elise Cecile Isabelle Lesley Jocelyn Paige Joni Rachelle Leola Daphne Alta Ester Petra Graciela Imogene Jolene Keisha Lacey Glenna Gabriela Keri Ursula Lizzie Kirsten Shana Adeline Mayra Jayne Jaclyn Gracie Sondra Carmela Marisa Rosalind Charity Tonia Beatriz Marisol Clarice Jeanine Sheena Angeline Frieda Lily Robbie Shauna Millie Claudette Cathleen Angelia Gabrielle Autumn Katharine Summer Jodie Staci Lea Christi Jimmie Justine Elma Luella Margret Dominique Socorro Rene Martina Margo Mavis Callie Bobbi Maritza Lucile Leanne Jeannine Deana Aileen Lorie Ladonna Willa Manuela Gale Selma Dolly Sybil Abby Lara Dale Ivy Dee Winnie Marcy Luisa Jeri Magdalena Ofelia Meagan Audra Matilda Leila Cornelia Bianca Simone Bettye Randi Virgie Latisha Barbra Georgina Eliza Leann Bridgette Rhoda Haley Adela Nola Bernadine Flossie Ila Greta Ruthie Nelda Minerva Lilly Terrie Letha Hilary Estela Valarie Brianna Rosalyn Earline Catalina Ava Mia Clarissa Lidia Corrine Alexandria Concepcion Tia Sharron Rae Dona Ericka Jami Elnora Chandra Lenore Neva Marylou Melisa Tabatha Serena Avis Allie Sofia Jeanie Odessa Nannie Harriett Loraine Penelope Milagros Emilia Benita Allyson Ashlee Tania Tommie Esmeralda Karina Eve Pearlie Zelma Malinda Noreen Tameka Saundra Hillary Amie Althea Rosalinda Jordan Lilia Alana Gay Clare Alejandra Elinor Michael Lorrie Jerri Darcy Earnestine Carmella Taylor Noemi Marcie Liza Annabelle Louisa Earlene Mallory Carlene Nita Selena Tanisha Katy Julianne John Lakisha Edwina Maricela Margery Kenya Dollie Roxie Roslyn Kathrine Nanette Charmaine Lavonne Ilene Kris Tammi Suzette Corine Kaye Jerry Merle Chrystal Lina Deanne Lilian Juliana Aline Luann Kasey Maryanne Evangeline Colette Melva Lawanda Yesenia Nadia Madge Kathie Eddie Ophelia Valeria Nona Mitzi Mari Georgette Claudine Fran Alissa Roseann Lakeisha Susanna Reva Deidre Chasity Sheree Carly James Elvia Alyce Deirdre Gena Briana Araceli Katelyn Rosanne Wendi Tessa Berta Marva Imelda Marietta Marci Leonor Arline Sasha Madelyn Janna Juliette Deena Aurelia Josefa Augusta Liliana Young Christian Lessie Amalia Savannah Anastasia Vilma Natalia Rosella Lynnette Corina Alfreda Leanna Carey Amparo Coleen Tamra Aisha Wilda Karyn Cherry Queen Maura Mai Evangelina Rosanna Hallie Erna Enid Mariana Lacy Juliet Jacklyn Freida Madeleine Mara Hester Cathryn Lelia Casandra Bridgett Angelita Jannie Dionne Annmarie Katina Beryl Phoebe Millicent Katheryn Diann Carissa Maryellen Liz Lauri Helga Gilda Adrian Rhea Marquita Hollie Tisha Tamera Angelique Francesca Britney Kaitlin Lolita Florine Rowena Reyna Twila Fanny Janell Ines Concetta Bertie Alba Brigitte Alyson Vonda Pansy Elba Noelle Letitia Kitty Deann Brandie Louella Leta Felecia Sharlene Lesa Beverley Robert Isabella Herminia Terra Celina }
16
+ super
17
17
  end
18
+
19
+ Names = %w{ Mary Patricia Linda Barbara Elizabeth Jennifer Maria Susan Margaret Dorothy Lisa Nancy Karen Betty Helen Sandra Donna Carol Ruth Sharon Michelle Laura Sarah Kimberly Deborah Jessica Shirley Cynthia Angela Melissa Brenda Amy Anna Rebecca Virginia Kathleen Pamela Martha Debra Amanda Stephanie Carolyn Christine Marie Janet Catherine Frances Ann Joyce Diane Alice Julie Heather Teresa Doris Gloria Evelyn Jean Cheryl Mildred Katherine Joan Ashley Judith Rose Janice Kelly Nicole Judy Christina Kathy Theresa Beverly Denise Tammy Irene Jane Lori Rachel Marilyn Andrea Kathryn Louise Sara Anne Jacqueline Wanda Bonnie Julia Ruby Lois Tina Phyllis Norma Paula Diana Annie Lillian Emily Robin Peggy Crystal Gladys Rita Dawn Connie Florence Tracy Edna Tiffany Carmen Rosa Cindy Grace Wendy Victoria Edith Kim Sherry Sylvia Josephine Thelma Shannon Sheila Ethel Ellen Elaine Marjorie Carrie Charlotte Monica Esther Pauline Emma Juanita Anita Rhonda Hazel Amber Eva Debbie April Leslie Clara Lucille Jamie Joanne Eleanor Valerie Danielle Megan Alicia Suzanne Michele Gail Bertha Darlene Veronica Jill Erin Geraldine Lauren Cathy Joann Lorraine Lynn Sally Regina Erica Beatrice Dolores Bernice Audrey Yvonne Annette June Samantha Marion Dana Stacy Ana Renee Ida Vivian Roberta Holly Brittany Melanie Loretta Yolanda Jeanette Laurie Katie Kristen Vanessa Alma Sue Elsie Beth Jeanne Vicki Carla Tara Rosemary Eileen Terri Gertrude Lucy Tonya Ella Stacey Wilma Gina Kristin Jessie Natalie Agnes Vera Willie Charlene Bessie Delores Melinda Pearl Arlene Maureen Colleen Allison Tamara Joy Georgia Constance Lillie Claudia Jackie Marcia Tanya Nellie Minnie Marlene Heidi Glenda Lydia Viola Courtney Marian Stella Caroline Dora Jo Vickie Mattie Terry Maxine Irma Mabel Marsha Myrtle Lena Christy Deanna Patsy Hilda Gwendolyn Jennie Nora Margie Nina Cassandra Leah Penny Kay Priscilla Naomi Carole Brandy Olga Billie Dianne Tracey Leona Jenny Felicia Sonia Miriam Velma Becky Bobbie Violet Kristina Toni Misty Mae Shelly Daisy Ramona Sherri Erika Katrina Claire Lindsey Lindsay Geneva Guadalupe Belinda Margarita Sheryl Cora Faye Ada Natasha Sabrina Isabel Marguerite Hattie Harriet Molly Cecilia Kristi Brandi Blanche Sandy Rosie Joanna Iris Eunice Angie Inez Lynda Madeline Amelia Alberta Genevieve Monique Jodi Janie Maggie Kayla Sonya Jan Lee Kristine Candace Fannie Maryann Opal Alison Yvette Melody Luz Susie Olivia Flora Shelley Kristy Mamie Lula Lola Verna Beulah Antoinette Candice Juana Jeannette Pam Kelli Hannah Whitney Bridget Karla Celia Latoya Patty Shelia Gayle Della Vicky Lynne Sheri Marianne Kara Jacquelyn Erma Blanca Myra Leticia Pat Krista Roxanne Angelica Johnnie Robyn Francis Adrienne Rosalie Alexandra Brooke Bethany Sadie Bernadette Traci Jody Kendra Jasmine Nichole Rachael Chelsea Mable Ernestine Muriel Marcella Elena Krystal Angelina Nadine Kari Estelle Dianna Paulette Lora Mona Doreen Rosemarie Angel Desiree Antonia Hope Ginger Janis Betsy Christie Freda Mercedes Meredith Lynette Teri Cristina Eula Leigh Meghan Sophia Eloise Rochelle Gretchen Cecelia Raquel Henrietta Alyssa Jana Kelley Gwen Kerry Jenna Tricia Laverne Olive Alexis Tasha Silvia Elvira Casey Delia Sophie Kate Patti Lorena Kellie Sonja Lila Lana Darla May Mindy Essie Mandy Lorene Elsa Josefina Jeannie Miranda Dixie Lucia Marta Faith Lela Johanna Shari Camille Tami Shawna Elisa Ebony Melba Ora Nettie Tabitha Ollie Jaime Winifred Kristie Marina Alisha Aimee Rena Myrna Marla Tammie Latasha Bonita Patrice Ronda Sherrie Addie Francine Deloris Stacie Adriana Cheri Shelby Abigail Celeste Jewel Cara Adele Rebekah Lucinda Dorthy Chris Effie Trina Reba Shawn Sallie Aurora Lenora Etta Lottie Kerri Trisha Nikki Estella Francisca Josie Tracie Marissa Karin Brittney Janelle Lourdes Laurel Helene Fern Elva Corinne Kelsey Ina Bettie Elisabeth Aida Caitlin Ingrid Iva Eugenia Christa Goldie Cassie Maude Jenifer Therese Frankie Dena Lorna Janette Latonya Candy Morgan Consuelo Tamika Rosetta Debora Cherie Polly Dina Jewell Fay Jillian Dorothea Nell Trudy Esperanza Patrica Kimberley Shanna Helena Carolina Cleo Stefanie Rosario Ola Janine Mollie Lupe Alisa Lou Maribel Susanne Bette Susana Elise Cecile Isabelle Lesley Jocelyn Paige Joni Rachelle Leola Daphne Alta Ester Petra Graciela Imogene Jolene Keisha Lacey Glenna Gabriela Keri Ursula Lizzie Kirsten Shana Adeline Mayra Jayne Jaclyn Gracie Sondra Carmela Marisa Rosalind Charity Tonia Beatriz Marisol Clarice Jeanine Sheena Angeline Frieda Lily Robbie Shauna Millie Claudette Cathleen Angelia Gabrielle Autumn Katharine Summer Jodie Staci Lea Christi Jimmie Justine Elma Luella Margret Dominique Socorro Rene Martina Margo Mavis Callie Bobbi Maritza Lucile Leanne Jeannine Deana Aileen Lorie Ladonna Willa Manuela Gale Selma Dolly Sybil Abby Lara Dale Ivy Dee Winnie Marcy Luisa Jeri Magdalena Ofelia Meagan Audra Matilda Leila Cornelia Bianca Simone Bettye Randi Virgie Latisha Barbra Georgina Eliza Leann Bridgette Rhoda Haley Adela Nola Bernadine Flossie Ila Greta Ruthie Nelda Minerva Lilly Terrie Letha Hilary Estela Valarie Brianna Rosalyn Earline Catalina Ava Mia Clarissa Lidia Corrine Alexandria Concepcion Tia Sharron Rae Dona Ericka Jami Elnora Chandra Lenore Neva Marylou Melisa Tabatha Serena Avis Allie Sofia Jeanie Odessa Nannie Harriett Loraine Penelope Milagros Emilia Benita Allyson Ashlee Tania Tommie Esmeralda Karina Eve Pearlie Zelma Malinda Noreen Tameka Saundra Hillary Amie Althea Rosalinda Jordan Lilia Alana Gay Clare Alejandra Elinor Michael Lorrie Jerri Darcy Earnestine Carmella Taylor Noemi Marcie Liza Annabelle Louisa Earlene Mallory Carlene Nita Selena Tanisha Katy Julianne John Lakisha Edwina Maricela Margery Kenya Dollie Roxie Roslyn Kathrine Nanette Charmaine Lavonne Ilene Kris Tammi Suzette Corine Kaye Jerry Merle Chrystal Lina Deanne Lilian Juliana Aline Luann Kasey Maryanne Evangeline Colette Melva Lawanda Yesenia Nadia Madge Kathie Eddie Ophelia Valeria Nona Mitzi Mari Georgette Claudine Fran Alissa Roseann Lakeisha Susanna Reva Deidre Chasity Sheree Carly James Elvia Alyce Deirdre Gena Briana Araceli Katelyn Rosanne Wendi Tessa Berta Marva Imelda Marietta Marci Leonor Arline Sasha Madelyn Janna Juliette Deena Aurelia Josefa Augusta Liliana Young Christian Lessie Amalia Savannah Anastasia Vilma Natalia Rosella Lynnette Corina Alfreda Leanna Carey Amparo Coleen Tamra Aisha Wilda Karyn Cherry Queen Maura Mai Evangelina Rosanna Hallie Erna Enid Mariana Lacy Juliet Jacklyn Freida Madeleine Mara Hester Cathryn Lelia Casandra Bridgett Angelita Jannie Dionne Annmarie Katina Beryl Phoebe Millicent Katheryn Diann Carissa Maryellen Liz Lauri Helga Gilda Adrian Rhea Marquita Hollie Tisha Tamera Angelique Francesca Britney Kaitlin Lolita Florine Rowena Reyna Twila Fanny Janell Ines Concetta Bertie Alba Brigitte Alyson Vonda Pansy Elba Noelle Letitia Kitty Deann Brandie Louella Leta Felecia Sharlene Lesa Beverley Robert Isabella Herminia Terra Celina }
18
20
  end
19
21
  end
20
22
  end