battleroom 0.0.2x → 0.0.3

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
  SHA1:
3
- metadata.gz: 7b95c630774eac85f4874d405bc1a6fd8b80f5ef
4
- data.tar.gz: bf928ca6a161a73ebc9e6f72e8c488ef727b06d9
3
+ metadata.gz: c68abc679f13da1a621073aca8a602f5a9286308
4
+ data.tar.gz: 84726ceed2983a20e8b40c54f593695ac8eae42e
5
5
  SHA512:
6
- metadata.gz: 5477c37f8c00484bde29ac86c9cd70fb956a3111ac1e0364e474d24d0ba9ce3a2094dcfd00e13144ad452fcdd45509093805cc9cc794269a8d06d44d1723a1c3
7
- data.tar.gz: cb1ffc7deab34ed6947cbd7600562ace7ca6546e473ce08757d164bbbd736a3ef6fb22fc0e9a91158a6d8a883a8b5c5587132726d7c67d6144a8ccd84930c59d
6
+ metadata.gz: 5c334740b7e5c250e0307ee836ec9a4fe262ef55f41440e1cf683fbc235de128604c0c3769283bdebcdde02cb2a685af7b35095757da880f5576703e19ee3631
7
+ data.tar.gz: 06d615176abf29da1cd9243f861c0b6626fcc136bbf02a6b016643320f4e0be9aa57ac3277cbd1b013e0fd572717a4b8f6b1efe02afc9c52bc4aba3a1df4595d
@@ -2,28 +2,9 @@ require 'pry'
2
2
  # eliminates deprecation warning
3
3
  I18n.config.enforce_available_locales = false
4
4
 
5
- require_relative '../data_generation_machinery'
6
- include DataGenerationMachinery
7
- require 'active_support/inflector'
8
-
9
5
  $random_names_array = gen_random_names_array
10
6
 
11
- DATA_STRUCTURE_QUESTIONS = [
12
- {
13
- data_structure: {
14
- home_team: 'Green Bay Packers',
15
- capacity: 72_928,
16
- established: 1957,
17
- publicly_owned: true,
18
- real_grass: true,
19
- price_of_beer: 5.5,
20
- namesake: 'Curly Lambeau',
21
- address: '1265 Lombardi',
22
- suite_count: 168,
23
- banners: true,
24
- },
25
- possible_variable_names: ['lambeau_field', 'the_frozen_tundra'],
26
- },
7
+ ARRAY_QUESTIONS = [
27
8
  {
28
9
  data_structure: [
29
10
  'Foundation',
@@ -202,27 +183,6 @@ DATA_STRUCTURE_QUESTIONS = [
202
183
  'fab_four_tunes',
203
184
  ].shuffle,
204
185
  },
205
- {
206
- data_structure: {
207
- stars: ['Ryan Gosling', 'Rachel McAdams'],
208
- released: 2004,
209
- tearjerker: true,
210
- director: 'Nick Cassavetes',
211
- mtv_movie_award_count: 1,
212
- box_office_millions: 81.5,
213
- macho: false,
214
- },
215
- possible_variable_names: ['the_notebook'],
216
- },
217
- {
218
- data_structure: {
219
- stars: ['Nicholas Cage', 'Meryl Streep'],
220
- rt_rating: 98.0,
221
- released: 2002,
222
- screenwriters: ['Charlie Kaufman', 'Donald Kaufman'],
223
- },
224
- possible_variable_names: ['adaptation'],
225
- },
226
186
  {
227
187
  data_structure: [
228
188
  'When Harry Met Sally',
@@ -293,22 +253,3 @@ DATA_STRUCTURE_QUESTIONS = [
293
253
  ].shuffle
294
254
  },
295
255
  ]
296
-
297
- 5.times do
298
- user = gen_user
299
- DATA_STRUCTURE_QUESTIONS.push(user)
300
- business = gen_business
301
- DATA_STRUCTURE_QUESTIONS.push(business)
302
- end
303
-
304
- 4.times do
305
- location = gen_location
306
- DATA_STRUCTURE_QUESTIONS.push(location)
307
- end
308
-
309
- 2.times do
310
- app = gen_app
311
- DATA_STRUCTURE_QUESTIONS.push(app)
312
- end
313
-
314
- DATA_STRUCTURE_QUESTIONS.shuffle!
@@ -0,0 +1,63 @@
1
+ require_relative '../data_generation_machinery'
2
+ include DataGenerationMachinery
3
+ require 'active_support/inflector'
4
+
5
+ HASH_QUESTIONS = [
6
+ {
7
+ data_structure: {
8
+ home_team: 'Green Bay Packers',
9
+ capacity: 72_928,
10
+ established: 1957,
11
+ publicly_owned: true,
12
+ real_grass: true,
13
+ price_of_beer: 5.5,
14
+ namesake: 'Curly Lambeau',
15
+ address: '1265 Lombardi',
16
+ suite_count: 168,
17
+ banners: true,
18
+ },
19
+ possible_variable_names: ['lambeau_field', 'the_frozen_tundra'],
20
+ },
21
+ {
22
+ data_structure: {
23
+ stars: ['Ryan Gosling', 'Rachel McAdams'],
24
+ released: 2004,
25
+ tearjerker: true,
26
+ director: 'Nick Cassavetes',
27
+ mtv_movie_award_count: 1,
28
+ box_office_millions: 81.5,
29
+ macho: false,
30
+ },
31
+ possible_variable_names: ['the_notebook'],
32
+ },
33
+ {
34
+ data_structure: {
35
+ stars: ['Nicholas Cage', 'Meryl Streep'],
36
+ rt_rating: 98.0,
37
+ released: 2002,
38
+ screenwriters: ['Charlie Kaufman', 'Donald Kaufman'],
39
+ },
40
+ possible_variable_names: ['adaptation'],
41
+ },
42
+ ]
43
+
44
+ HASH_QUESTIONS
45
+
46
+ 5.times do
47
+ user = gen_user
48
+ HASH_QUESTIONS.push(user)
49
+ business = gen_business
50
+ HASH_QUESTIONS.push(business)
51
+ end
52
+
53
+ 4.times do
54
+ location = gen_location
55
+ HASH_QUESTIONS.push(location)
56
+ end
57
+
58
+ 2.times do
59
+ app = gen_app
60
+ HASH_QUESTIONS.push(app)
61
+ end
62
+
63
+ HASH_QUESTIONS.shuffle!
@@ -0,0 +1,26 @@
1
+ # things to consider
2
+ # some should start as arrays, others as hashes
3
+ # is awesome_print the best solution?
4
+ # I should keep whatever data structures I create brief
5
+ # I should keep the first key-value pair of a hash to simple datatypes. the second k-v pair should be the nested data structure
6
+ # key lengths should be close, for readability (keep in mind this is for absolute beginners)
7
+
8
+ NESTED_DATA_STRUCTURE_ACCESS_QUESTIONS = [
9
+ {
10
+ data_structure: [
11
+ { title: 'The Stone Roses', released: 1989 },
12
+ { title: 'Second Coming', released: 1994 },
13
+ ],
14
+ possible_variable_names: ['stone_roses_albums']
15
+ },
16
+ {
17
+ data_structure: [
18
+ { song_title: 'Material Girl', billboard_peak: 2 },
19
+ { song_title: 'Borderline', billboard_peak: 10 },
20
+ { song_title: 'Lucky Star', billboard_peak: 4 },
21
+ { song_title: 'Holiday', billboard_peak: 16 },
22
+ { song_title: 'Vogue', billboard_peak: 1 },
23
+ ],
24
+ possible_variable_names: ['madonna_singles']
25
+ }
26
+ ]
@@ -0,0 +1,19 @@
1
+ require_relative '../data/array_questions'
2
+ require_relative './data_structure_access_question'
3
+
4
+ class ArrayAccessQuestion < DataStructureAccessQuestion
5
+
6
+ @questions = ARRAY_QUESTIONS.shuffle
7
+
8
+ def initialize(scope)
9
+ super(scope)
10
+ format_array_for_access
11
+ end
12
+
13
+ def format_array_for_access
14
+ self.data_structure = data_structure[0, rand(4..6)]
15
+ self.answer_value = data_structure.sample
16
+ self.hint = 'index values start at 0.'
17
+ end
18
+
19
+ end
@@ -0,0 +1,91 @@
1
+ require_relative '../data/array_questions'
2
+ require_relative './data_structure_assignment_question'
3
+
4
+ class ArrayAssignmentQuestion < DataStructureAssignmentQuestion
5
+
6
+ @questions = ARRAY_QUESTIONS
7
+
8
+ def initialize(scope)
9
+ super(scope)
10
+ format_array_for_assignment
11
+ end
12
+
13
+ def format_array_for_assignment
14
+ desired_array_size = rand(3..6)
15
+ cull_array_to_valid_size_for_output(desired_array_size)
16
+ if [1, 2, 3, 4, 5].sample.odd?
17
+ self.value_to_replace = data_structure.sample
18
+ self.value_to_replace_formatted = format_value_for_stdout_and_eval(value_to_replace)
19
+ end
20
+ self.assignment_value = possible_assignments.sample
21
+ self.assignment_value_class = format_class_for_output(assignment_value.class)
22
+ self.formatted_assignment_value = format_value_for_stdout_and_eval(assignment_value)
23
+ end
24
+
25
+ def cull_array_to_valid_size_for_output(desired_size)
26
+ while data_structure.size > desired_size
27
+ new_assignment_possibility = data_structure.delete(data_structure.sample)
28
+ possible_assignments.push(new_assignment_possibility)
29
+ end
30
+ end
31
+
32
+ def print_replace_array_value_prompt
33
+ puts "Given the data structure below, replace the #{replacement_value_class_formatted} value ".blue +
34
+ value_to_replace_formatted.yellow + " with the #{assignment_value_class} value ".blue +
35
+ formatted_assignment_value.yellow + ".\n\n"
36
+ end
37
+
38
+ def print_data_structure_assignment_prompt
39
+ if value_to_replace
40
+ self.replacement_index = data_structure.index(value_to_replace)
41
+ self.replacement_value_class_formatted = format_class_for_output(value_to_replace.class)
42
+ print_replace_array_value_prompt
43
+ else
44
+ puts "Use an array method to add the #{assignment_value_class} value ".blue + "#{formatted_assignment_value}".yellow + " to the ".blue + "end".blue.underline + " of the Array below.\n".blue
45
+ end
46
+ print "#{variable_name} = ".green
47
+ ap(data_structure, { indent: -2, index: false, multiline: true, plain: true })
48
+ puts ''
49
+ end
50
+
51
+ def handle_replacement_of_array_value_input(user_input)
52
+ if evaluation_scope.eval("#{variable_name}[#{replacement_index}] == #{formatted_assignment_value}") && user_input.include?(variable_name)
53
+ print_resulting_data_structure
54
+ true
55
+ else
56
+ puts "\nNope! Here's what the data stucture would look like given your code:\n".red
57
+ resulting_data_structure = evaluation_scope.eval(variable_name)
58
+ ap(resulting_data_structure, { indent: -2, index: false, multiline: true, plain: true })
59
+ puts "\nCheck your index and assignment values and try again.\n".red
60
+ end
61
+ end
62
+
63
+ def handles_user_workarounds(user_input)
64
+ cheater_regex = Regexp.new("#{variable_name}\s+?\=\s+?(\\[)?")
65
+ # checks if user reassigned the variable to a new array of identical values
66
+ if user_input.match(cheater_regex)
67
+ if $1
68
+ puts 'You reassigned the variable to a new array object, when you could have worked with the array provided! Look up Ruby\'s Array#push method and try again!'.red
69
+ else
70
+ puts 'You reassigned the variable '.red + variable_name.green + ' rather than working with the array provided. Try again.'.red
71
+ end
72
+ puts ''
73
+ true
74
+ end
75
+ end
76
+
77
+ def evaluate_user_input(user_input)
78
+ if handles_user_workarounds(user_input)
79
+ false
80
+ end
81
+ if value_to_replace
82
+ handle_replacement_of_array_value_input(user_input)
83
+ elsif evaluation_scope.eval("#{variable_name}.last == #{formatted_assignment_value}") && user_input.include?(variable_name)
84
+ print_resulting_data_structure
85
+ true
86
+ else
87
+ puts 'Nope! Try again.'.red
88
+ end
89
+ end
90
+
91
+ end
@@ -0,0 +1,50 @@
1
+ require_relative './data_structure_question'
2
+
3
+ class DataStructureAssignmentQuestion < DataStructureQuestion
4
+
5
+ attr_accessor :assignment_value, :assignment_key, :assignment_value_class,
6
+ :formatted_assignment_value, :value_to_replace,
7
+ :value_to_replace_formatted, :replacement_index,
8
+ :replacement_value_class_formatted
9
+
10
+ def initialize(eval_scope)
11
+ super(eval_scope)
12
+ end
13
+
14
+ def print_resulting_data_structure
15
+ possible_intro_congratulations = [
16
+ 'Brilliant',
17
+ 'Wonderful',
18
+ 'Jackpot',
19
+ 'Impressive work',
20
+ 'Bang-up job',
21
+ 'Dynamite',
22
+ 'Premier work',
23
+ 'Quality work',
24
+ 'Terrific'
25
+ ]
26
+ intro_congrat = possible_intro_congratulations.sample
27
+ puts "\n#{intro_congrat}. Here's the resulting data structure:\n".green
28
+ sleep 1.0
29
+ resulting_data_structure = evaluation_scope.eval(variable_name)
30
+ ap(resulting_data_structure, { indent: -2, index: false, multiline: true, plain: true })
31
+ puts ''
32
+ sleep 3.2
33
+ end
34
+
35
+ def evaluate_data_structure_assignment_input
36
+ enter_evaluation_loop do |user_input|
37
+ begin
38
+ # provides the evaluation scope with variable assignment necessary for answer eval
39
+ evaluation_scope.eval("#{variable_name} = #{data_structure.to_s}")
40
+ evaluation_scope.eval(user_input)
41
+ evaluate_user_input(user_input)
42
+ rescue NoMethodError, NameError => e
43
+ print_colorized_error_prompt(e)
44
+ rescue TypeError => e
45
+ print_colorized_type_error_prompt(e)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../data/hash_questions'
2
+ require_relative './data_structure_access_question'
3
+
4
+ class HashAccessQuestion < DataStructureAccessQuestion
5
+
6
+ @questions = HASH_QUESTIONS.shuffle
7
+
8
+ def initialize(scope)
9
+ super(scope)
10
+ format_hash
11
+ end
12
+
13
+ def format_hash
14
+ cull_hash_to_valid_size_for_output
15
+ remove_multiple_booleans
16
+ self.answer_value = data_structure[data_structure.keys.sample]
17
+ self.hint = 'you have to use the EXACT hash key to retrieve the associated value.'
18
+ end
19
+
20
+ def remove_multiple_booleans
21
+ boolean_count = find_number_of_boolean_values_in_hash
22
+ while boolean_count > 1
23
+ grouped_by_value = data_structure.group_by { |k, v| v }
24
+ boolean_to_delete = [true, false].sample
25
+ key_to_delete = grouped_by_value[boolean_to_delete].sample[0] if grouped_by_value[boolean_to_delete]
26
+ data_structure.delete(key_to_delete)
27
+ boolean_count = find_number_of_boolean_values_in_hash
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../data/hash_questions'
2
+ require_relative './data_structure_access_question'
3
+
4
+ class HashAssignmentQuestion < DataStructureAssignmentQuestion
5
+
6
+ @questions = HASH_QUESTIONS.shuffle
7
+
8
+ def initialize(scope)
9
+ super(scope)
10
+ format_hash_for_assignment
11
+ end
12
+
13
+ def format_hash_for_assignment
14
+ cull_hash_to_valid_size_for_output
15
+ assignment = possible_assignments.sample
16
+ self.assignment_value = assignment.values[0]
17
+ self.assignment_value_class = format_class_for_output(assignment_value.class)
18
+ self.formatted_assignment_value = format_value_for_stdout_and_eval(assignment_value)
19
+ self.assignment_key = format_value_for_stdout_and_eval(assignment.keys[0])
20
+ end
21
+
22
+ def print_data_structure_assignment_prompt
23
+ puts 'Given the Hash below, add a key of '.blue + assignment_key.yellow + " that points to the #{assignment_value_class} value of ".blue + "#{formatted_assignment_value}".yellow + ".\n\n"
24
+ print "#{variable_name} = ".green
25
+ ap(data_structure, { indent: -2, index: false, multiline: true, plain: true })
26
+ puts ''
27
+ end
28
+
29
+ def evaluate_user_input(user_input)
30
+ if evaluation_scope.eval("#{variable_name}[#{assignment_key}] == #{formatted_assignment_value}") && user_input.include?(variable_name)
31
+ print_resulting_data_structure
32
+ true
33
+ else
34
+ puts 'Nope! Try again!'.red
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'data_structure_access_question'
2
+ require_relative '../data/nested_data_structure_access_questions'
3
+
4
+ class NestedDataStructureAccessQuestion < DataStructureAccessQuestion
5
+ attr_accessor :inner_hash, :inner_array
6
+ # class instance variable used within the initialize method for Question
7
+ @questions = NESTED_DATA_STRUCTURE_ACCESS_QUESTIONS.shuffle
8
+
9
+ def initialize(eval_scope)
10
+ super(eval_scope)
11
+ if data_structure.class == Array
12
+ self.inner_hash = data_structure.sample
13
+ self.answer_value = inner_hash[inner_hash.keys.sample]
14
+ else
15
+ self.answer_value = data_structure[data_structure.keys.sample]
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,63 @@
1
+ require_relative 'question'
2
+ require_relative '../data/variable_assignment_questions'
3
+
4
+ class VariableQuestion < Question
5
+ attr_accessor :formatted_value
6
+ # using a class instance variable, as manipulating a single class var
7
+ # in the parent class is troublesome
8
+ @questions = VARIABLE_QUESTIONS.shuffle
9
+
10
+ def initialize(eval_scope)
11
+ super(eval_scope)
12
+ @variable_value = rotate_array(data[:possible_variable_values]).first
13
+ @formatted_value = format_value_for_stdout_and_eval(variable_value)
14
+ end
15
+
16
+ def print_variable_assignment_prompt
17
+ formatted_class = format_class_for_output(variable_value.class)
18
+ substrings = [
19
+ 'Create a variable '.blue,
20
+ variable_name.yellow,
21
+ ' and assign it the '.blue,
22
+ formatted_class.blue,
23
+ ' value '.blue,
24
+ formatted_value.yellow
25
+ ]
26
+ puts substrings.join
27
+ end
28
+
29
+ def reveal_name_error_follies_to_user(user_input)
30
+ if user_input.include?(variable_name) && !user_input.match(/[^=]=[^=]/i)
31
+ puts 'You\'re not using the assignment operator!'.red
32
+ elsif !user_input.match(/("|')/) && variable_value.class == String
33
+ puts 'Rats! You\'ve just made a common rookie mistake! ' +
34
+ 'Strings are always surrounded by quotes. Otherwise, Ruby will ' +
35
+ 'think you\'re referencing a variable or method name. Try again.'.red
36
+ else
37
+ puts 'Looks like you mistyped the variable name. Check for misspellings and try again.'.red
38
+ end
39
+ end
40
+
41
+ def evaluate_variable_assignment_input
42
+ enter_evaluation_loop do |user_input|
43
+ begin
44
+ evaluation_scope.eval(user_input)
45
+ if evaluation_scope.eval("#{variable_name} == #{formatted_value}")
46
+ # this last returned value of 'true' is vital;
47
+ # the return value of yield is used in a conditional
48
+ true
49
+ else
50
+ puts "You mis-assigned #{variable_name}. Try again!".red
51
+ end
52
+ rescue NameError => e
53
+ reveal_name_error_follies_to_user(user_input)
54
+ rescue Exception => e
55
+ if e.message.match(/unterminated string/)
56
+ puts 'Blurg! You neglected to provide closing quotes for your string. Try again!'.red
57
+ else
58
+ puts e.message
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end # VariableQuestion
data/lib/battleroom.rb CHANGED
@@ -9,7 +9,10 @@ require 'Faker'
9
9
 
10
10
  require_relative './battleroom/models/nested_data_structure_access_question'
11
11
  require_relative './battleroom/models/data_structure_assignment_question'
12
- require_relative './battleroom/models/data_structure_access_question'
12
+ require_relative './battleroom/models/hash_access_question'
13
+ require_relative './battleroom/models/hash_assignment_question'
14
+ require_relative './battleroom/models/array_access_question'
15
+ require_relative './battleroom/models/array_assignment_question'
13
16
  require_relative './battleroom/models/variable_question'
14
17
 
15
18
  require_relative 'battleroom/battleroom_machinery'
@@ -36,13 +39,13 @@ loop do
36
39
  end
37
40
  when '2'
38
41
  5.times do
39
- q = DataStructureAccessQuestion.new(b)
42
+ q = [ArrayAccessQuestion.new(b), HashAccessQuestion.new(b)].sample
40
43
  q.print_data_structure_access_prompt
41
44
  q.evaluate_data_structure_access_input
42
45
  end
43
46
  when '3'
44
47
  5.times do
45
- q = DataStructureAssignmentQuestion.new(b)
48
+ q = [ArrayAssignmentQuestion.new(b), HashAssignmentQuestion.new(b)].sample
46
49
  q.print_data_structure_assignment_prompt
47
50
  q.evaluate_data_structure_assignment_input
48
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: battleroom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2x
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Travis Vander Hoop
@@ -60,8 +60,17 @@ files:
60
60
  - bin/battleroom
61
61
  - lib/battleroom.rb
62
62
  - lib/battleroom/battleroom_machinery.rb
63
- - lib/battleroom/data/data_structure_questions.rb
63
+ - lib/battleroom/data/array_questions.rb
64
+ - lib/battleroom/data/hash_questions.rb
65
+ - lib/battleroom/data/nested_data_structure_access_questions.rb
64
66
  - lib/battleroom/data/variable_assignment_questions.rb
67
+ - lib/battleroom/models/array_access_question.rb
68
+ - lib/battleroom/models/array_assignment_question.rb
69
+ - lib/battleroom/models/data_structure_assignment_question.rb
70
+ - lib/battleroom/models/hash_access_question.rb
71
+ - lib/battleroom/models/hash_assignment_question.rb
72
+ - lib/battleroom/models/nested_data_structure_access_question.rb
73
+ - lib/battleroom/models/variable_question.rb
65
74
  homepage: https://github.com/vanderhoop/battleroom
66
75
  licenses:
67
76
  - MIT
@@ -74,12 +83,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
74
83
  requirements:
75
84
  - - ">="
76
85
  - !ruby/object:Gem::Version
77
- version: '0'
86
+ version: 1.9.3
78
87
  required_rubygems_version: !ruby/object:Gem::Requirement
79
88
  requirements:
80
- - - ">"
89
+ - - ">="
81
90
  - !ruby/object:Gem::Version
82
- version: 1.3.1
91
+ version: '0'
83
92
  requirements: []
84
93
  rubyforge_project:
85
94
  rubygems_version: 2.2.2