cryptozoologist 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,8 +30,20 @@ module Cryptozoologist
30
30
  Dictionaries.addresses
31
31
  end
32
32
 
33
+ def states
34
+ Dictionaries.states
35
+ end
36
+
33
37
  def cities
34
38
  Dictionaries.cities
35
39
  end
40
+
41
+ def first_name
42
+ Dictionaries.first_name
43
+ end
44
+
45
+ def last_name
46
+ Dictionaries.last_name
47
+ end
36
48
  end
37
49
  end
@@ -4,7 +4,7 @@ module Cryptozoologist
4
4
 
5
5
  # Generates sentence_count sentences, ranging in length from 10-16 words,
6
6
  # using the dictionaries from your config.
7
- #
7
+ #
8
8
  def lorem(sentence_count)
9
9
  sentences = []
10
10
  order = Cryptozoologist.configuration.order
@@ -29,7 +29,7 @@ module Cryptozoologist
29
29
  end
30
30
 
31
31
  # Generates a string using the dictionaries and delimiter from your config.
32
- #
32
+ #
33
33
  def random
34
34
  string = ""
35
35
  order = Cryptozoologist.configuration.order
@@ -39,7 +39,7 @@ module Cryptozoologist
39
39
  string += "#{compound_word}"
40
40
 
41
41
  unless library == Cryptozoologist.configuration.order.last
42
- string += "#{Cryptozoologist.configuration.delimiter}"
42
+ string += "#{Cryptozoologist.configuration.delimiter}"
43
43
  end
44
44
  end
45
45
 
@@ -56,6 +56,25 @@ module Cryptozoologist
56
56
  "#{number} #{street} #{Dictionary.addresses.sample}"
57
57
  end
58
58
 
59
+ # Generates a string for a U.S. state name which is partially replaced by
60
+ # alliterative words from other dictionaries (e.g. "Oregon" can become "Oregoose" or "Orabbit")
61
+ # Does not respect config exclusions
62
+ # Note: optional arguments desired_library is an String containing the single replacement word of your choice
63
+ # desired_state is a String of the specific state name of your choice
64
+ #{}`desired_replace_index` is an integer that allows you to specify whether the first
65
+ #or second word will be replaced, or in the case of a one-word state - which letter is replaced
66
+ def state(desired_state, desired_library, desired_replace_index)
67
+ libraries = desired_library || [:animals, :clothing, :colors]
68
+ state_name = desired_state || Dictionary.states.sample
69
+ has_two_words = state_name.index(" ")
70
+
71
+ if has_two_words
72
+ handle_two_word(state_name, libraries, desired_replace_index)
73
+ else
74
+ handle_one_word(state_name, libraries, desired_replace_index)
75
+ end
76
+ end
77
+
59
78
  def city
60
79
  exclude = Cryptozoologist.configuration.exclude
61
80
  cities_words = Cryptozoologist::Cities::Words.list
@@ -67,10 +86,56 @@ module Cryptozoologist
67
86
  "#{one_word_animals.sample.capitalize}#{city_labels.sample}"
68
87
  end
69
88
 
89
+ def full_name
90
+ first_name = Cryptozoologist::Dictionaries::People::FirstName.list.sample
91
+ last_name = Cryptozoologist::Dictionaries::People::LastName.list.sample
92
+
93
+ "#{first_name} #{last_name}#{one_word_animals.sample.capitalize}"
94
+ end
95
+
70
96
  private
71
97
 
98
+ #completely replaces one random word from the state with an alliterative word from libraries
99
+ def handle_two_word(state_name, libraries, desired_replace_index)
100
+ base_state_words = state_name.split(" ")
101
+ replace_index = desired_replace_index || rand(0..1)
102
+ base_state_words[replace_index] = get_alliteration(libraries, base_state_words[replace_index][0]).capitalize
103
+ return base_state_words.join(" ")
104
+ end
105
+
106
+ #selects a random key_letter from state_name, and finds an alliterative word from libraries for replacement
107
+ def handle_one_word(state_name, libraries, desired_replace_index)
108
+ key_letter_index = desired_replace_index || rand(0...state_name.length-1)
109
+ insert_word = get_alliteration(libraries, state_name[key_letter_index]).downcase
110
+
111
+ #if the randomly selected word from libraries has more letters than the substring from key_letter_index to state_name.length
112
+ #completely replace that substring
113
+ if insert_word.length > (state_name.length - key_letter_index) && key_letter_index > 0
114
+ final_word = state_name.slice(0...key_letter_index) + insert_word
115
+ #otherwise, replace only the key_letter with the entire random word from libraries
116
+ else
117
+ state_name[key_letter_index] = insert_word
118
+ final_word = state_name
119
+ end
120
+
121
+ final_word.capitalize
122
+ end
123
+
124
+ #finds a word from libraries that begins with key_letter
125
+ def get_alliteration(libraries, key_letter)
126
+ return libraries if libraries.is_a? String #this is the case for testing
127
+ replacement_options = Dictionary.send(libraries.sample).select { |word| word[0] == key_letter || word[0] == key_letter.downcase }
128
+
129
+ #default to :animals library if the randomly-selected library has no words that begin with key_letter
130
+ if replacement_options.empty?
131
+ replacement_options = Dictionary.send(:animals).select { |word| word[0] == key_letter || word[0] == key_letter.downcase }
132
+ end
133
+
134
+ replacement_options.sample
135
+ end
136
+
72
137
  def one_word_animals
73
138
  Dictionary.animals.select {|animal| animal.split(' ').count == 1}
74
139
  end
75
140
  end
76
- end
141
+ end
@@ -1,3 +1,3 @@
1
1
  module Cryptozoologist
2
- VERSION = "3.1.0"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -14,9 +14,10 @@ describe Cryptozoologist::Dictionaries do
14
14
  }
15
15
  }
16
16
 
17
- dictionaries = {
17
+ dictionaries = {
18
18
  "clothing": Cryptozoologist::Dictionaries::Clothing,
19
- "quantity": Cryptozoologist::Dictionaries::Quantity
19
+ "quantity": Cryptozoologist::Dictionaries::Quantity,
20
+ "states": Cryptozoologist::Dictionaries::States
20
21
  }
21
22
 
22
23
  context '#libraries' do
@@ -29,6 +30,11 @@ describe Cryptozoologist::Dictionaries do
29
30
  keys = Cryptozoologist::Dictionaries.library[:colors].keys
30
31
  expect(keys.length).to eq(2)
31
32
  end
33
+
34
+ it 'contains states' do
35
+ states = Cryptozoologist::Dictionaries.states
36
+ expect(states.length).to eq(50)
37
+ end
32
38
  end
33
39
 
34
40
  subdictionaries.each do |type, subdictionary|
@@ -5,7 +5,7 @@ describe Cryptozoologist::Dictionary do
5
5
  @dictionary = Cryptozoologist::Dictionary
6
6
  end
7
7
 
8
- lists = [:animals, :colors, :clothing, :quantity]
8
+ lists = [:animals, :colors, :clothing, :quantity, :states, :first_name, :last_name]
9
9
 
10
10
  context 'word lists' do
11
11
  lists.each do |list|
@@ -77,6 +77,25 @@ describe Cryptozoologist do
77
77
  end
78
78
  end
79
79
 
80
+ context '#state' do
81
+
82
+ it 'handles a one word state' do
83
+ expect(Cryptozoologist.state("Washington", "Seal", 2)).to eq('Wasealhington')
84
+ end
85
+
86
+ it 'handles a two word state' do
87
+ expect(Cryptozoologist.state("North Dakota", "Necktie", 0)).to eq('Necktie Dakota')
88
+ end
89
+
90
+ it 'handles a replacement word longer than the remainder of the state name' do
91
+ expect(Cryptozoologist.state("California", "Iguana", 8)).to eq('Californiguana')
92
+ end
93
+
94
+ it 'handles a replacement word shorter than the remainder of the state name' do
95
+ expect(Cryptozoologist.state("Oregon", "Rat", 1)).to eq('Orategon')
96
+ end
97
+ end
98
+
80
99
  context '#city' do
81
100
  before do
82
101
  @city = Cryptozoologist.city
@@ -104,4 +123,30 @@ describe Cryptozoologist do
104
123
  expect(has_city).to be true
105
124
  end
106
125
  end
126
+
127
+ context '#full_name' do
128
+ before do
129
+ @person = Cryptozoologist.full_name
130
+ end
131
+
132
+ it 'should return datatype string' do
133
+ expect(@person).to be_instance_of(String)
134
+ end
135
+
136
+ it 'should contain an animal' do
137
+ has_animal = false
138
+ Cryptozoologist::Dictionary.animals.each do |animal|
139
+ has_animal = true if @person.downcase.include?(animal)
140
+ end
141
+ expect(has_animal).to be true
142
+ end
143
+
144
+ it 'should contain an adjective for the animal' do
145
+ has_adjective = false
146
+ Cryptozoologist::Dictionaries::People::LastName.list.each do |adjective|
147
+ has_adjective = true if @person.include?(adjective)
148
+ end
149
+ expect(has_adjective).to be true
150
+ end
151
+ end
107
152
  end
@@ -10,4 +10,4 @@ RSpec.configure do |config|
10
10
  config.before(:all) do
11
11
  Cryptozoologist.reset
12
12
  end
13
- end
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cryptozoologist
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liz Abinante
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-01 00:00:00.000000000 Z
11
+ date: 2018-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -105,8 +105,11 @@ files:
105
105
  - lib/cryptozoologist/dictionaries/colors/paint.rb
106
106
  - lib/cryptozoologist/dictionaries/colors/web_safe.rb
107
107
  - lib/cryptozoologist/dictionaries/filler.rb
108
+ - lib/cryptozoologist/dictionaries/people/first_name.rb
109
+ - lib/cryptozoologist/dictionaries/people/last_name.rb
108
110
  - lib/cryptozoologist/dictionaries/punctuation.rb
109
111
  - lib/cryptozoologist/dictionaries/quantity.rb
112
+ - lib/cryptozoologist/dictionaries/states.rb
110
113
  - lib/cryptozoologist/dictionary.rb
111
114
  - lib/cryptozoologist/errors.rb
112
115
  - lib/cryptozoologist/generator.rb
@@ -148,4 +151,3 @@ test_files:
148
151
  - spec/cryptozoologist/generator_spec.rb
149
152
  - spec/cryptozoologist_spec.rb
150
153
  - spec/spec_helper.rb
151
- has_rdoc: