ep-codebreaker 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bfaaf8084c62deada86235e21b8d00083cffb19
4
- data.tar.gz: 074d6e1faa9313dda342f0955185208eea75139f
3
+ metadata.gz: e05c4edb923a6f54eb0da845b28dd17f5570a5b9
4
+ data.tar.gz: a689f4e0784fb2e5c0f6624e8264e7b8ca615f84
5
5
  SHA512:
6
- metadata.gz: c0972fdbfa7fc7b1df76b16f595080f1f88c5ed200c4839469af0cd01193b8723538e6949ba342cf1142999f43d075a38f28b3c24c328f75027bf03c4a3a28d7
7
- data.tar.gz: 5a674713394eda837d6ef357282499cc913608276f307cf1d166bdbb61e4b4783a4114a379bc2daf827a0af08902ae046ddb9bb61872bb629c37c54bf5fdcb2a
6
+ metadata.gz: 9beefb2854278824b9c74a4db3b5b371db45e81f3c01c4a4fa5bf70c82c4018412215be06fbe9c1504419a7c38b8b54d19f61ec55b9fd3d761c995e73b342735
7
+ data.tar.gz: 23c3f048292b411c1cd4cf25fb9d2d5f6b2c3585cd73bd4f9f2ad1470f0eba09c9ba9028ff52f8a2262ef50579f24478a8cc3d7d8b314604164a2ace1016e87e
@@ -57,9 +57,10 @@ module Codebreaker
57
57
 
58
58
  return 'No scores' if scores.empty?
59
59
 
60
- scores.map
61
- .with_index { |player, i| format("%2i #{player.formatted}", i + 1) }
62
- .unshift(format('%2s %10s %6s', '', 'Name', 'Points'))
60
+ scores
61
+ .map
62
+ .with_index { |player, i| format("%2i #{player.formatted}", i + 1) }
63
+ .unshift(format('%2s %10s %6s', '', 'Name', 'Points'))
63
64
  end
64
65
 
65
66
  def check_guess(input)
@@ -5,8 +5,6 @@ require_relative 'game_writer'
5
5
 
6
6
  module Codebreaker
7
7
  class Game
8
- include GameWriter
9
-
10
8
  MIN = 1
11
9
  MAX = 6
12
10
  LENGTH = 4
@@ -14,9 +12,15 @@ module Codebreaker
14
12
  TRIES = 10
15
13
  HINTS = 3
16
14
 
17
- private_constant :MIN, :MAX, :LENGTH, :TRIES, :HINTS
18
15
  attr_reader :tries_left, :hints_left
19
16
 
17
+ private_constant :MIN, :MAX, :LENGTH, :TRIES, :HINTS
18
+
19
+ def initialize(writer = GameWriter.new, player_class = Player)
20
+ @writer = writer
21
+ @player_class = player_class
22
+ end
23
+
20
24
  def start
21
25
  @code = Array.new(LENGTH) { rand(MIN..MAX) }.join
22
26
  @result = ''
@@ -51,11 +55,11 @@ module Codebreaker
51
55
  end
52
56
 
53
57
  def save_score(name)
54
- write Player.new(name, @tries_left, @hints_left)
58
+ @writer.write @player_class.new(name, @tries_left, @hints_left)
55
59
  end
56
60
 
57
61
  def high_scores
58
- process_file
62
+ @writer.load_scores
59
63
  end
60
64
 
61
65
  def as_json
@@ -90,15 +94,14 @@ module Codebreaker
90
94
  end
91
95
 
92
96
  def generate_hint
93
- hint = '_' * LENGTH
94
97
  index = @indexes_for_hint.delete(@indexes_for_hint.sample)
95
- hint[index] = @code[index]
96
- hint
98
+ ('_' * LENGTH).tap { |hint| hint[index] = @code[index] }
97
99
  end
98
100
 
99
101
  def verify(input)
100
- regexp = Regexp.new("^[#{MIN}-#{MAX}]{#{LENGTH}}$")
101
- msg = "Guesses must consist of #{LENGTH} digits from #{MIN} to #{MAX}"
102
+ regexp = /\A[#{MIN}-#{MAX}]{#{LENGTH}}\z/
103
+ msg = "Guesses must consist of #{LENGTH} digits from #{MIN} to #{MAX}"
104
+
102
105
  raise(ArgumentError, msg) if !input.is_a?(String) || !input.match?(regexp)
103
106
  end
104
107
  end
@@ -3,21 +3,25 @@
3
3
  require 'yaml'
4
4
 
5
5
  module Codebreaker
6
- module GameWriter
7
- private
6
+ class GameWriter
7
+ FILE_NAME = 'scores.yml'
8
+ private_constant :FILE_NAME
8
9
 
9
- FILE_NAME = 'scores.yml'.freeze
10
+ def initialize(file_name = nil)
11
+ @file_name = file_name || FILE_NAME
12
+ end
10
13
 
11
14
  def write(player)
12
15
  scores = process_file
13
16
  scores << player
14
17
  scores = scores.max_by(10, &:points)
15
- File.open(FILE_NAME, 'w') { |f| f.write scores.to_yaml }
18
+ File.open(@file_name, 'w') { |f| f.write scores.to_yaml }
16
19
  end
17
20
 
18
21
  def process_file
19
- return [] if !File.exist?(FILE_NAME) || File.zero?(FILE_NAME)
20
- YAML.load_file(FILE_NAME)
22
+ return [] if !File.exist?(@file_name) || File.zero?(@file_name)
23
+ YAML.load_file(@file_name)
21
24
  end
25
+ alias load_scores process_file
22
26
  end
23
27
  end
@@ -3,7 +3,7 @@
3
3
  module Codebreaker
4
4
  class Player
5
5
  def initialize(name, tries_left, hints_left)
6
- self.name = name
6
+ self.name = name
7
7
  @tries_left = tries_left
8
8
  @hints_left = hints_left
9
9
  end
@@ -28,7 +28,7 @@ module Codebreaker
28
28
 
29
29
  def name=(value)
30
30
  msg = 'The name must be between 1 and 10 characters long'
31
- raise(ArgumentError, msg) unless (1...10).cover? value.length
31
+ raise(ArgumentError, msg) unless (1..10).cover?(value.length)
32
32
  @name = value
33
33
  end
34
34
  end
@@ -1,3 +1,3 @@
1
1
  module Codebreaker
2
- VERSION = '0.3.2'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ep-codebreaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Poberezhny
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-22 00:00:00.000000000 Z
11
+ date: 2017-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler