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
@@ -1,28 +1,17 @@
1
1
  module RandomPerson
2
2
 
3
- class Generator
3
+ module Generator
4
4
 
5
- require_relative './choice.rb'
6
5
  require_relative './person.rb'
7
6
 
8
- attr_reader :generators
9
-
10
- # Sets up a list of generators
7
+ # Build a demographic generator
8
+ # @param [RandomPerson::Demographic] demographic The demographic you would like.
11
9
  # @example
12
- # g = RandomPerson::Generator.new
13
- def initialize
14
- @generators = [ ]
15
- end
16
-
17
-
18
- # Build a choice generator
19
- # @param [RandomPerson::Choice] choice A Choice object.
20
- # @example
21
- # g.make_generator choice
22
- def make_generator( choice )
10
+ # Generator.make_generator demographic
11
+ def self.make_generator( demographic )
23
12
  f = -> {
24
- g = Generator.pick_gender( choice.gender_ratio )
25
- age = Generator.pick_age( choice.age_lower, choice.age_upper)
13
+ g = Generator.pick_gender( demographic.gender_ratio )
14
+ age = Generator.pick_age( demographic.age_lower, demographic.age_upper)
26
15
 
27
16
  person = Person.new(
28
17
  :gender => g,
@@ -31,80 +20,68 @@ module RandomPerson
31
20
  )
32
21
 
33
22
  if person.gender == 'm'
34
- person.first = choice.malefirst.execute( person ) unless choice.malefirst.nil?
23
+ person.first = demographic.malefirst.execute( person ) unless demographic.malefirst.nil?
35
24
  else
36
- person.first = choice.femalefirst.execute( person ) unless choice.femalefirst.nil?
25
+ person.first = demographic.femalefirst.execute( person ) unless demographic.femalefirst.nil?
37
26
  end
38
27
 
39
- person.last = choice.last.execute( person ) unless choice.last.nil?#lastname,
40
- person.prefix = choice.prefix.execute( person ) unless choice.prefix.nil? #title
41
- person.suffix = choice.suffix.execute( person ) unless choice.suffix.nil?#suffix
28
+ person.last = demographic.last.execute( person ) unless demographic.last.nil? #lastname,
29
+ person.prefix = demographic.prefix.execute( person ) unless demographic.prefix.nil? #title
30
+ person.suffix = demographic.suffix.execute( person ) unless demographic.suffix.nil?#suffix
42
31
 
43
32
  person
44
33
  }
45
-
46
- @generators << f
34
+
35
+ f
47
36
  end
48
37
 
49
- class << self
50
-
51
- #create a ratio that is made up of ranges
52
- #to help hit with multiple valued ratios
53
- def ratiod( ratio=[1,1] )
54
- sum = ratio.reduce(:+) #sum
55
- mult = 100.divmod( sum ).first #get a bigger spread of numbers
56
- ratio.map! { |n| n * mult }
57
- new_ratio = ratio.inject([0..0]) {|acc,n| acc + [acc.last.last ... (n + acc.last.last)] }
58
- new_ratio.shift #get rid of 0..0
59
- return new_ratio
60
- end
61
38
 
62
- # Takes a ratio and uses this to randomly select either a male or a female. To get only males or only females, pass in a 0 for either gender to make sure of getting the other gender for definite.
63
- # @example To only get males:
64
- # pick_gender( [1,0] )
65
- # @example To only get females:
66
- # pick_gender( [0,1] )
67
- # @example To be likely to get 2 females to every male:
68
- # pick_gender( [1,2] )
69
- # @param [optional,Array<Integer,Integer>] ratio The ratio of males to females expressed in an array, e.g. [1,1] is (a chance of) one male for every female, [1,2] is one male to two females. The default is [1,1].
70
- # @return [String] Returns a 'f' for female or an 'm' for male.
71
- def pick_gender( ratio=[1,1] ) #male first
72
- if ratio.length == 2
73
- return 'f' if ratio.first == 0
74
- return 'm' if ratio.last == 0
75
- end
76
- rat = ratiod( ratio )
77
- r = rand(rat.last.last)
78
- case r
79
- when rat[0] then 'm'
80
- when rat[1] then 'f'
81
- end
82
- end
83
-
84
- def pick_age( lower=0, upper=100 )
85
- age = rand(upper - lower).to_i + lower
39
+ #create a ratio that is made up of ranges
40
+ #to help hit with multiple valued ratios
41
+ def self.ratiod( ratio=[1,1] )
42
+ sum = ratio.reduce(:+) #sum
43
+ mult = 100.divmod( sum ).first #get a bigger spread of numbers
44
+ ratio.map! { |n| n * mult }
45
+ new_ratio = ratio.inject([0..0]) {|acc,n| acc + [acc.last.last ... (n + acc.last.last)] }
46
+ new_ratio.shift #get rid of 0..0
47
+ return new_ratio
48
+ end
49
+
50
+ # Takes a ratio and uses this to randomly select either a male or a female. To get only males or only females, pass in a 0 for either gender to make sure of getting the other gender for definite.
51
+ # @example To only get males:
52
+ # pick_gender( [1,0] )
53
+ # @example To only get females:
54
+ # pick_gender( [0,1] )
55
+ # @example To be likely to get 2 females to every male:
56
+ # pick_gender( [1,2] )
57
+ # @param [optional,Array<Integer,Integer>] ratio The ratio of males to females expressed in an array, e.g. [1,1] is (a chance of) one male for every female, [1,2] is one male to two females. The default is [1,1].
58
+ # @return [String] Returns a 'f' for female or an 'm' for male.
59
+ def self.pick_gender( ratio=[1,1] ) #male first
60
+ if ratio.length == 2
61
+ return 'f' if ratio.first == 0
62
+ return 'm' if ratio.last == 0
86
63
  end
87
-
88
- def pick_dob( y=16 )
89
- year = Time.now.year - y
90
- month = rand(12) + 1;
91
- day = rand( Date.days_in_month( year, month ) ) + 1
92
- Time.local( year, month, day )
64
+ rat = ratiod( ratio )
65
+ r = rand(rat.last.last)
66
+ case r
67
+ when rat[0] then 'm'
68
+ when rat[1] then 'f'
93
69
  end
94
-
95
-
96
- end #class << self
97
-
98
-
99
-
100
-
70
+ end
101
71
 
102
- def reset
103
- @generators = [ ]
72
+ def self.pick_age( lower=0, upper=100 )
73
+ age = rand(upper - lower).to_i + lower
74
+ end
75
+
76
+ def self.pick_dob( y=16 )
77
+ year = Time.now.year - y
78
+ month = rand(12) + 1;
79
+ day = rand( Date.days_in_month( year, month ) ) + 1
80
+ Time.local( year, month, day )
104
81
  end
105
82
 
106
83
 
107
84
 
108
85
  end
109
86
 
110
- end
87
+ end
@@ -1,20 +1,25 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./Outputter.rb"
4
+
5
+
1
6
  module RandomPerson
2
7
 
3
8
  class Name
9
+ include Outputter
10
+
11
+ attr_accessor :formats, :formats_ratiod, :names, :possibles
12
+
13
+ def initialize
14
+ @possibles = Hash[ @formats_ratiod.zip @formats ] if @possibles.nil? unless @formats_ratiod.nil?
15
+
16
+ @on_execute ||= for_standard
17
+
18
+ @possibles
19
+ end
4
20
 
5
- attr_accessor :formats, :formats_ratiod, :names
6
21
 
7
- def execute( person=nil )
8
- if @formats.length > 1
9
- r = rand(@formats_ratiod.last.end)
10
- i = @formats_ratiod.index_in_range( r )
11
- f = @formats.by_index(i).last
12
- else
13
- k, f = @formats.first #throw away the key name
14
- end
15
- f.( @names )
16
- end
17
22
 
18
- end
23
+ end # class
19
24
 
20
- end
25
+ end # RandomPerson
@@ -5,6 +5,8 @@ module RandomPerson
5
5
 
6
6
  attr_accessor :gender, :age, :dob, :first, :last, :prefix, :suffix
7
7
 
8
+ alias :lastname :last
9
+
8
10
  ## @param [optional,Hash] h A hash of the person's attributes
9
11
  # @option h [String] :gender nil Gender, 'm' for male or 'f' for female
10
12
  # @option h [Integer] :age nil Age
@@ -1,3 +1,3 @@
1
1
  module RandomPerson
2
- VERSION = "0.0.19"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/randomperson.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  # encoding: UTF-8
2
+
3
+
2
4
  module RandomPerson
3
5
 
4
6
  #require all the scaffolding
@@ -14,10 +16,133 @@ module RandomPerson
14
16
  require_relative './randomperson/ext/Kernel.rb'
15
17
  require_relative './randomperson/ext/Set.rb'
16
18
 
17
- require_relative './randomperson/choice.rb'
19
+ require_relative './randomperson/demographic.rb'
18
20
  require_relative './randomperson/generator.rb'
19
21
  require_relative './randomperson/name.rb'
20
22
  require_relative './randomperson/person.rb'
21
23
  #require_relative './randomperson/ratio.rb'
22
24
 
25
+
26
+ class Facade
27
+
28
+ def demographics
29
+ @demos ||= {}
30
+ end
31
+
32
+ #class instance variable to keep track of generators
33
+ def generators
34
+ @generators ||= {}
35
+ end
36
+
37
+
38
+ # little factory
39
+ def demographic( name=nil, opts={} )
40
+ if name.kind_of? Hash
41
+ opts = name
42
+ name = nil
43
+ end
44
+ name = demographics.length.to_s if name.nil?
45
+ demo = Demographic.new name, opts
46
+ demographics[name] = demo
47
+ generators.delete name # just in case it already exists
48
+ demo
49
+ end
50
+
51
+
52
+ # start afresh
53
+ def clear
54
+ @demos = nil
55
+ @generators = nil
56
+ @person = nil
57
+ @last_demo_name = nil
58
+ end
59
+
60
+ alias :reset :clear
61
+ attr_accessor :last_demo_name
62
+
63
+
64
+ # The last person generated.
65
+ # If a demographic name is given that is different to the last then a new person is generated. If no name is given then the last is used.
66
+ def person( demo_name=nil )
67
+ person, last_demo_name =
68
+ if demo_name.nil?
69
+
70
+ if @person.nil?
71
+
72
+ # either generate a new one
73
+ gen_new( demo_name ) # gen a new person and get back demo name
74
+ else
75
+
76
+ # get last one
77
+ [@person, @last_demo_name]
78
+ end
79
+ else # demo name given
80
+
81
+ if demographics.has_key? demo_name
82
+
83
+ if demo_name == @last_demo_name
84
+
85
+ [@person, @last_demo_name]
86
+ else
87
+
88
+ gen_new( demo_name )
89
+ end
90
+ else
91
+
92
+ if demographics.nil? || demographics.empty?
93
+
94
+ raise "No demographics have been selected yet! Try something like r.demographic.add_Spanish..."
95
+ else # that demo name doesn't exist...
96
+
97
+ [nil, @last_demo_name] # so preserve the last good demo name
98
+ end
99
+ end
100
+ end
101
+ return nil if person.nil?
102
+ @person, @last_demo_name = [person, last_demo_name]
103
+
104
+ @person
105
+ end
106
+
107
+
108
+ # generate a new person
109
+ # either with the last demographic loaded, or a specific one by passing the name.
110
+ def generate( demo_name=nil )
111
+ ds = gen_new( demo_name )
112
+ ds.nil? ? nil : ds.first
113
+ end
114
+
115
+
116
+ # If not given a demographic's name then the *last demographic defined* will be used.
117
+ def gen_new( demo_name=nil )
118
+ if demographics.nil? || demographics.empty?
119
+ raise "No demographics have been selected yet! Try something like r.demographic.add_Spanish..."
120
+ end
121
+ demo_name, demo = if demo_name.nil?
122
+ demographics.to_a.last # this produces a 2 dimensional array
123
+ else
124
+ demographics.assoc(demo_name)
125
+ end
126
+
127
+ if demo_name
128
+ @last_demo_name = demo_name
129
+ unless generators.has_key? demo.name
130
+ generators[demo.name] = Generator.make_generator( demo )
131
+ end
132
+
133
+ @person = generators[@last_demo_name].call
134
+
135
+ [@person, @last_demo_name]
136
+ else
137
+ nil
138
+ end
139
+ end
140
+
141
+ end # class
142
+
143
+
144
+ end
145
+
146
+ def RandomPerson
147
+ RandomPerson::Facade.new
23
148
  end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./rspec_helper.rb"
4
+ require_relative "./support/shared_examples/names.rb"
5
+ require_relative "../lib/randomperson/Names/AmericanSuffix.rb"
6
+ require_relative "../lib/randomperson/person.rb"
7
+
8
+ module RandomPerson
9
+ module Names
10
+
11
+ describe AmericanSuffix do
12
+ let(:instance) { AmericanSuffix.new }
13
+ subject{ instance }
14
+ it_should_behave_like "a Name class"
15
+ describe :execute do
16
+ context "Who is young" do
17
+ let(:p) { instance.execute Person.new( age: 16) }
18
+ subject { p }
19
+ it { should_not be_nil }
20
+ 1000.times do |_|
21
+ it { should be_in instance.names[0..-2] }
22
+ end
23
+ end
24
+ context "Who is older" do
25
+ let(:p) { instance.execute Person.new( age: 18) }
26
+ subject { p }
27
+ it { should_not be_nil }
28
+ 1000.times do |_|
29
+ it { should be_in instance.names[1..-1] }
30
+ end
31
+ end
32
+ end # execute
33
+
34
+ end # AmericanSuffix
35
+
36
+ end # Names
37
+ end # RandomPerson
@@ -0,0 +1,25 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./rspec_helper.rb"
4
+ require_relative "./support/shared_examples/names.rb"
5
+ require_relative "../lib/randomperson/Names/AnyLast.rb"
6
+ require_relative "../lib/randomperson/person.rb"
7
+
8
+ module RandomPerson
9
+ module Names
10
+
11
+ describe AnyLast do
12
+ let(:instance) { AnyLast.new }
13
+ subject{ instance }
14
+ it_should_behave_like "a Name class"
15
+ describe :execute do
16
+ subject { instance.execute Person.new( gender: "m", age: rand(100)) }
17
+ it { should_not be_nil }
18
+ 1000.times do |_|
19
+ it { should match /^ \b\p{Upper}\p{Alpha}+?\b (?:(?:\s|-)\b\p{Upper}\p{Alpha}+?\b)?$/x }
20
+ end
21
+ end # execute
22
+ end # AnyLast
23
+
24
+ end # Names
25
+ end # RandomPerson
@@ -0,0 +1,113 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./rspec_helper.rb"
4
+ require_relative "./support/shared_examples/names.rb"
5
+ require_relative "../lib/randomperson/person.rb"
6
+ require_relative "../lib/randomperson/demographic.rb"
7
+
8
+ module RandomPerson
9
+ module Names
10
+
11
+ available_classes = Demographic.load_names
12
+ available_classes.each do |klass|
13
+ klass = Demographic.requiring klass
14
+
15
+ k = eval "RandomPerson::Names::#{klass}"
16
+
17
+
18
+
19
+ word = /\b\p{Upper}\p{Alpha}+?\b (?:(?:\s|-)\b\p{Upper}\p{Alpha}+?\b)?/x
20
+ hypenated_rgx = /^#{word}$/x
21
+ french_rgx = /^(?:(?: (?:\bLe\b\s) | (?:\bd[eu]\b)\s) | (?:#{word}-))? #{word}$/x
22
+ hypenated_many_rgx = /^#{word} (?:(?:\s|-)#{word})*$/x
23
+ unhypenated_rgx = /^#{word}\s#{word}?$/x
24
+ poss_unhyph = /^#{word}(?:\s#{word})?$/
25
+ thai_style = /^\b\p{Graph}+?\b$/x
26
+ default_fix = {times: 50 }
27
+ fixtures = {}
28
+ fixtures.default = default_fix
29
+ fixtures["SpanishLast"] = default_fix.merge({ rgx: /^ \b\p{Upper}(?:\p{Alpha}+-)?\p{Alpha}+?\b\s (?: (?:\bde\b\s) | (?: \b\p{Upper}(?:\p{Alpha}+-)?\p{Alpha}+?\b\s (?:\by\b\s)? ) )? \b\p{Upper}(?:\p{Alpha}+-)?\p{Alpha}+?\b$/x })
30
+ fixtures["AmericanLast"] = default_fix.merge({ rgx: hypenated_rgx } )
31
+ fixtures["AnyLast"] = default_fix.merge({ rgx: hypenated_rgx } )
32
+ fixtures["BritishLast"] = default_fix.merge({ rgx: hypenated_rgx } )
33
+ fixtures["EnglishLast"] = default_fix.merge({ rgx: hypenated_rgx } )
34
+ fixtures["ScottishLast"] = default_fix.merge({ rgx: hypenated_rgx } )
35
+ fixtures["WelshLast"] = default_fix.merge({ rgx: poss_unhyph } )
36
+ fixtures["FrenchLast"] = default_fix.merge({ rgx: french_rgx} )
37
+ fixtures["FrenchFemaleFirst"] = default_fix.merge({ rgx: hypenated_rgx } )
38
+ fixtures["FrenchMaleFirst"] = default_fix.merge({ rgx: hypenated_rgx } )
39
+ fixtures["BasqueMaleFirst"] = default_fix.merge({ rgx: hypenated_rgx } )
40
+ fixtures["BasqueLast"] = default_fix.merge({ rgx: unhypenated_rgx } )
41
+ fixtures["ThaiRomanisedLast"] = default_fix.merge({ rgx: hypenated_rgx } )
42
+ fixtures["ThaiFemaleFirst"] = default_fix.merge({ rgx: thai_style } )
43
+ fixtures["ThaiMaleFirst"] = default_fix.merge({ rgx: thai_style} )
44
+ fixtures["ThaiLast"] = default_fix.merge({ rgx: thai_style} )
45
+ fixtures["ThaiFirst"] = default_fix.merge({ rgx: thai_style} )
46
+ fixtures["ThaiRomanisedMaleFirst"] = default_fix.merge({ rgx: hypenated_many_rgx} )
47
+ fixtures["ThaiRomanisedFemaleFirst"] = default_fix.merge({ rgx: hypenated_many_rgx} )
48
+ fixtures["AncientGreekLast"] = default_fix.merge(
49
+ { rgx: /^\bof\b\s(?:\b\p{Alpha}+?\b(?:\s|-)){0,2}\b\p{Alpha}+?\b$/x } )
50
+
51
+ #PREFIXES
52
+ fix_fixtures = {}
53
+ fix_fixtures["FinnishPrefix"] = {
54
+ young_male: {gender: "m", age: rand(17), in: ["herra"]}, #rgx: /^\bherra\b$/x },
55
+ older_male: {gender: "m", in: ["herra", "Dr"]}, #rgx: /^\b(?:herra|Dr)\b$/x },
56
+ young_female: {gender: "f", age: rand(17), in: ["neiti"]}, #rgx: /^\bneiti\b$/x },
57
+ older_female: {gender: "f", age: rand(17), in: ["rouva", "neiti", "Dr"]} #rgx: /^\b(?:rouva)|(?:neiti)|(?:Dr)\b$/x },
58
+ }
59
+ fix_fixtures["SpanishPrefix"] = {
60
+ young_male: {gender: "m", age: rand(17), in: ["Sr."]}, #rgx: /^\bSr\b\.$/x },
61
+ older_male: {gender: "m", in: ["Sr.", "Dr."]}, #rgx: /^\b(?:[SD]r\b\.)$/x },
62
+ young_female: {gender: "f", age: rand(17), in: ["Srta."]}, #rgx: /^\bSrta\b.$/x },
63
+ older_female: {gender: "f", in: ["Dra.", "Srta.", "Sra."]}#rgx: /^[DS]rt?a\b\.$/x }
64
+ }
65
+ fix_fixtures["AmericanPrefix"] = {
66
+ young_female: {gender: "f", age: rand(17), rgx: /^\bMiss\b$/},
67
+ older_female: {gender: "f", in: ["Miss", "Mrs.", "Dr.", "Ms."]}, #rgx: /^\bM(?:(?:iss\b)|(?:(?:r?s)\b\.))$|(?:Dr\b\.$)/x },
68
+ young_male: {gender: "m", age: rand(17), in: ["Mr."]}, #rgx: /^\bMr\b\.$/},
69
+ older_male: {gender: "m", in: ["Mr.", "Dr."]},
70
+ } #rgx: /^\b[MD]r\b\.$/}, }
71
+ fix_fixtures["AmericanSuffix"] = {
72
+ young_female: {},
73
+ older_female: {},
74
+ young_male: {},
75
+ older_male: {} }
76
+ fix_fixtures["BritishPrefix"] = {
77
+ young_female: {gender: "f", age: rand(17), rgx: /^\bMiss\b$/},
78
+ older_female: {gender: "f", rgx: /^\b(?:M(?:is|r)?s)|(?:Dr)\b$/},
79
+ young_male: {gender: "m", age: rand(17), rgx: /^\bMr\b$/},
80
+ older_male: {gender: "m", rgx: /^\b[MD]r\b$/}, }
81
+ fix_fixtures["EnglishPrefix"] = fix_fixtures["ScottishPrefix"] = fix_fixtures["WelshPrefix"] = fix_fixtures["BritishPrefix"]
82
+
83
+ #SUFFIXES
84
+ fix_fixtures["BritishSuffix"] = {
85
+ young_female: {age: rand(17), gender: "f", in: [""] },
86
+ older_female: { gender: "f", in: %w( OBE MBE GBE KBE DBE CBE JP GM PhD BSc BA )},
87
+ young_male: {age: rand(17), gender: "m", in: [""] },
88
+ older_male: {gender: "m", in: %w( OBE MBE GBE KBE DBE CBE JP GM PhD BSc BA ) },
89
+ }
90
+ fix_fixtures["AmericanSuffix"] = { # strictly speaking, gender doesn't matter here, but I'll leave the test in.
91
+ young_female: {age: rand(17), gender: "f", in: [ 'Jr.', ''] + %w( I II III IV V) },
92
+ young_male: { age: rand(17), gender: "m", in: [ 'Jr.', ''] + %w( I II III IV V ) },
93
+ older_male: { gender: "m", in: [ ''] + %w( I II III IV V Sr. ) },
94
+ older_female: { gender: "f", in: [ ''] + %w( I II III IV V Sr. ) },
95
+ }
96
+
97
+
98
+ puts "Describe #{klass}" #because rspec doesn't output this before it blow up! Sheesh!!
99
+ describe klass do
100
+ let(:instance) { k.new }
101
+ subject{ instance }
102
+ it_should_behave_like "a Name class"
103
+ if ["Prefix", "Suffix"].any?{|x| klass.include? x }
104
+
105
+ it_should_behave_like "it cares about gender and/or age", fix_fixtures[klass]
106
+ else
107
+ it_should_behave_like "a name generator", fixtures[klass]
108
+ end
109
+ end # describe
110
+ end # loop
111
+
112
+ end # Names
113
+ end # RandomPerson
@@ -0,0 +1,49 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "./rspec_helper.rb"
4
+ require_relative "../lib/randomperson/ext/array.rb"
5
+
6
+ describe Array do
7
+
8
+ describe :rand do
9
+ let(:m1) { 1_000_000 }
10
+ let(:r) { m1 * 10 }
11
+ let(:range) {
12
+ u = rand(r) + m1
13
+ (u..u+10)
14
+ }
15
+ subject { range.to_a.rand }
16
+ it { range.cover?( subject ).should be_true }
17
+ end
18
+
19
+ describe :index_in_range do
20
+ context "Given an number" do
21
+ let(:max) { 99 }
22
+ let(:array) {
23
+ array = []
24
+ i = 0
25
+ until i >= max
26
+ last = array.empty? ? 0 : array.last.max + 1
27
+ i = (i == 0 ? rand(99) : rand(max - i)) + last
28
+ array << (last..i)
29
+ end
30
+ array
31
+ }
32
+ context "That is not in the ranges in the array" do
33
+ let(:n) { max + 1}
34
+ subject{ array.index_in_range( n ) }
35
+ it { should be_nil }
36
+ end
37
+ context "That is in the ranges in the array" do
38
+ 0.upto(99) do |n|
39
+ subject{ array.index_in_range( n ) }
40
+ it { subject.should_not be_nil }
41
+ it { should be_a_kind_of Integer}
42
+ it { should be_between( 0, array.length - 1 ) }
43
+ end
44
+ end
45
+ end
46
+ end # :index_in_range
47
+
48
+
49
+ end # Array
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rspec'
4
+ require_relative "../lib/randomperson/demographic.rb"
5
+
6
+
7
+ module RandomPerson
8
+
9
+ describe Demographic do
10
+
11
+ it "should not blow up on instatiation" do
12
+ Demographic.new.should_not == nil
13
+ end
14
+ end # Demographic
15
+ end # RandomPerson
@@ -6,8 +6,5 @@ module RandomPerson
6
6
 
7
7
  describe Generator do
8
8
 
9
- it "should not blow up on instatiation" do
10
- Generator.new.should_not == nil
11
- end
12
9
  end # Generator
13
- end # RandomPerson
10
+ end # RandomPerson
data/spec/name_spec.rb CHANGED
@@ -1,7 +1,8 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'rspec'
2
4
  require_relative "../lib/randomperson/name.rb"
3
5
 
4
-
5
6
  module RandomPerson
6
7
 
7
8
  describe Name do
@@ -10,4 +11,4 @@ module RandomPerson
10
11
  Name.new.should_not == nil
11
12
  end
12
13
  end # Name
13
- end # RandomPerson
14
+ end # RandomPerson