GemCodebreaker 0.1.8 → 0.1.9

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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -6
  3. data/.rubocop.yml +10 -3
  4. data/Gemfile.lock +5 -2
  5. data/{GemCodebreaker.gemspec → gem_codebreaker.gemspec} +3 -2
  6. data/lib/{GemCodebreaker/classes/codemaker.rb → gem_codebreaker/classes/code_maker.rb} +0 -1
  7. data/lib/gem_codebreaker/classes/game.rb +67 -0
  8. data/lib/gem_codebreaker/classes/game_config.rb +65 -0
  9. data/lib/{GemCodebreaker → gem_codebreaker}/classes/game_statistic.rb +0 -1
  10. data/lib/gem_codebreaker/classes/serializer_deserializer.rb +27 -0
  11. data/lib/{GemCodebreaker → gem_codebreaker}/classes/user.rb +3 -4
  12. data/lib/{GemCodebreaker → gem_codebreaker}/config/i18n_locales.rb +0 -0
  13. data/lib/{GemCodebreaker → gem_codebreaker}/errors/incorrect_length_error.rb +0 -0
  14. data/lib/{GemCodebreaker → gem_codebreaker}/errors/name_length_error.rb +0 -0
  15. data/lib/{GemCodebreaker → gem_codebreaker}/errors/no_attempts_error.rb +0 -0
  16. data/lib/{GemCodebreaker → gem_codebreaker}/errors/no_hints_error.rb +0 -0
  17. data/lib/{GemCodebreaker → gem_codebreaker}/errors/unknow_level_error.rb +0 -0
  18. data/lib/{GemCodebreaker → gem_codebreaker}/errors/value_range_error.rb +0 -0
  19. data/lib/{GemCodebreaker → gem_codebreaker}/errors/wrong_class_error.rb +0 -0
  20. data/lib/gem_codebreaker/gem_codebreaker.rb +18 -0
  21. data/lib/gem_codebreaker/modules/validator.rb +17 -0
  22. data/lib/{GemCodebreaker → gem_codebreaker}/version.rb +1 -1
  23. metadata +35 -22
  24. data/lib/GemCodebreaker/classes/game.rb +0 -83
  25. data/lib/GemCodebreaker/classes/game_config.rb +0 -18
  26. data/lib/GemCodebreaker/gem_codebreaker.rb +0 -23
  27. data/lib/GemCodebreaker/modules/game_configurations.rb +0 -18
  28. data/lib/GemCodebreaker/modules/serializer_deserializer.rb +0 -26
  29. data/lib/GemCodebreaker/modules/validator.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d387ad1e4ffd7b5f742c61768832b940267eabd5ffbfb920acb57debc5c84492
4
- data.tar.gz: e8faf1b025e53f99585212d4264d99296d008b3696b96f8df3b8053a993b9c52
3
+ metadata.gz: 12131d83b585528d4439fce06930e09a875e97670771f8af7431a8435f92abb3
4
+ data.tar.gz: 263297083f7e135928c7abaf7d6daefab5928b865269076634d8499d27cdfe50
5
5
  SHA512:
6
- metadata.gz: a2faa57d32240522392f40efe51240956609e36253142163d71ca2d7625711a1c460a8e82ed8a02734b48c0a1cd83d9bd69c67ebd8c4248f39b8fa2d5424cc9f
7
- data.tar.gz: 26b9a4e0280a7ef4e0580c0139e086d8433cfb5a9e9ff6b5293ab327841c73495411fcd3a8832b22096f4634530772e5ffa097fbcdb97b174264afde19d4aed1
6
+ metadata.gz: 05eb5e3cdc70ef977f3e92da9ff638bbd4e2a07a8a11fc78c74c178191c8069d9e31f99375a38e31db3a8d0f1d70c785496cd0f3eb6541494d795a034bb083fd
7
+ data.tar.gz: eca18f4f867615dd5d0841c223c10b79cfe88b844ffeeaf29bc6d098ac96f77144210a5674d152332607151815b2c8e02fe48f72bbe7db33388efb6fb4eac677
@@ -38,12 +38,7 @@ commands:
38
38
  steps:
39
39
  - run:
40
40
  name: run spec
41
- command: |
42
- mkdir /tmp/test-results
43
- TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
44
- bundle exec rspec --format progress \
45
- --out /tmp/test-results/rspec.xml \
46
- $TEST_FILES
41
+ command: bundle exec rspec --format progress spec
47
42
 
48
43
  jobs:
49
44
  lintering:
@@ -1,15 +1,22 @@
1
1
  require:
2
+ - rubocop-performance
2
3
  - rubocop-rspec
3
4
 
4
5
  AllCops:
5
6
  TargetRubyVersion: 2.7.1
6
7
  NewCops: enable
7
8
 
9
+ Style/Documentation:
10
+ Enabled: false
11
+
8
12
  Layout/LineLength:
9
13
  Max: 120
10
- Metrics/ModuleLength:
11
- Max: 270
14
+
12
15
  RSpec/MessageSpies:
13
16
  EnforcedStyle: receive
17
+
18
+ RSpec/NestedGroups:
19
+ Max: 6
20
+
14
21
  Metrics/BlockLength:
15
- ExcludedMethods: ['describe', 'context']
22
+ ExcludedMethods: ['describe', 'context']
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- GemCodebreaker (0.1.8)
4
+ GemCodebreaker (0.1.9)
5
+ i18n (~> 1.8.3)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -45,6 +46,8 @@ GEM
45
46
  unicode-display_width (>= 1.4.0, < 2.0)
46
47
  rubocop-ast (0.0.3)
47
48
  parser (>= 2.7.0.1)
49
+ rubocop-performance (1.6.1)
50
+ rubocop (>= 0.71.0)
48
51
  rubocop-rspec (1.41.0)
49
52
  rubocop (>= 0.68.1)
50
53
  ruby-progressbar (1.10.1)
@@ -63,10 +66,10 @@ PLATFORMS
63
66
  DEPENDENCIES
64
67
  GemCodebreaker!
65
68
  fasterer (~> 0.8.3)
66
- i18n (~> 1.8.3)
67
69
  rake (~> 13.0.1)
68
70
  rspec (~> 3.7.0)
69
71
  rubocop (~> 0.84.0)
72
+ rubocop-performance (~> 1.6.1)
70
73
  rubocop-rspec (~> 1.41.0)
71
74
  simplecov (~> 0.18.5)
72
75
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require_relative 'lib/GemCodebreaker/version'
5
+ require_relative 'lib/gem_codebreaker/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'GemCodebreaker'
@@ -28,10 +28,11 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ['lib']
30
30
  spec.add_development_dependency 'fasterer', '~> 0.8.3'
31
- spec.add_development_dependency 'i18n', '~> 1.8.3'
31
+ spec.add_dependency 'i18n', '~> 1.8.3'
32
32
  spec.add_development_dependency 'rake', '~> 13.0.1'
33
33
  spec.add_development_dependency 'rspec', '~> 3.7.0'
34
34
  spec.add_development_dependency 'rubocop', '~> 0.84.0'
35
+ spec.add_development_dependency 'rubocop-performance', '~> 1.6.1'
35
36
  spec.add_development_dependency 'rubocop-rspec', '~> 1.41.0'
36
37
  spec.add_development_dependency 'simplecov', '~> 0.18.5'
37
38
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # Marker class for game
5
4
  class CodeMaker
6
5
  attr_reader :plus_match, :minus_match, :empty_match
7
6
 
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class Game
5
+ LENGTH_OF_SECRET_CODE = 4
6
+ DIGIT_RANGE = (1..6).freeze
7
+
8
+ include Validator
9
+ attr_reader :statistic, :matcher_hash, :config
10
+
11
+ def initialize(user, level)
12
+ @config = GameConfig.new(user, level)
13
+ @statistic = []
14
+ end
15
+
16
+ def secrete_code
17
+ @secrete_code ||= (1..LENGTH_OF_SECRET_CODE).map { rand DIGIT_RANGE }
18
+ end
19
+
20
+ def guess_start(input_code)
21
+ guess_valid?(input_code)
22
+ raise GemCodebreaker::NoAttemptsError if @config.attempts_used?
23
+
24
+ @config.increase_user_attempts
25
+ user_code = input_code.chars.map(&:to_i)
26
+ code_marker = CodeMaker.new(@secrete_code, user_code)
27
+ code_marker.calculate_result_code
28
+ @matcher_hash = { plus: code_marker.plus_match, minus: code_marker.minus_match, empty: code_marker.empty_match }
29
+ end
30
+
31
+ def win_game?
32
+ @matcher_hash[:plus] == LENGTH_OF_SECRET_CODE
33
+ end
34
+
35
+ def game_over?
36
+ @config.attempts_used? && win_game? == false
37
+ end
38
+
39
+ def hint
40
+ raise GemCodebreaker::NoHintsError if @config.hints_used?
41
+
42
+ @config.increase_user_hints
43
+ @secrete_code.sample
44
+ end
45
+
46
+ def restart_game
47
+ @config.reset_user_attempts_hints
48
+ secrete_code
49
+ end
50
+
51
+ def save_user_statistic
52
+ @statistic << GameStatistic.new(self)
53
+ end
54
+
55
+ private
56
+
57
+ def guess_valid?(user_code)
58
+ validate_class(user_code, String)
59
+ raise GemCodebreaker::IncorrectLengthError if user_code.length != LENGTH_OF_SECRET_CODE
60
+ unless user_code[/\A[#{DIGIT_RANGE.first}-#{DIGIT_RANGE.last}]{#{LENGTH_OF_SECRET_CODE}}\z/]
61
+ raise GemCodebreaker::ValueRangeError
62
+ end
63
+
64
+ true
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class GameConfig
5
+ GAME_LEVEL = {
6
+ easy: {
7
+ attempts: 15,
8
+ hints: 2
9
+ },
10
+ medium: {
11
+ attempts: 10,
12
+ hints: 1
13
+ },
14
+ hell: {
15
+ attempts: 5,
16
+ hints: 1
17
+ },
18
+ strong_hell: {
19
+ attempts: 1,
20
+ hints: 0
21
+ }
22
+ }.freeze
23
+
24
+ include Validator
25
+
26
+ attr_reader :user_nick_name, :difficulty, :max_attempts, :max_hints, :user_attempts, :user_hints
27
+
28
+ def initialize(user, level)
29
+ check_difficulty(level)
30
+ @user_nick_name = user.nick_name
31
+ @difficulty = level
32
+ @max_attempts = GAME_LEVEL[level][:attempts]
33
+ @max_hints = GAME_LEVEL[level][:hints]
34
+ @user_attempts = 0
35
+ @user_hints = 0
36
+ end
37
+
38
+ def increase_user_attempts
39
+ @user_attempts += 1
40
+ end
41
+
42
+ def increase_user_hints
43
+ @user_hints += 1
44
+ end
45
+
46
+ def attempts_used?
47
+ @user_attempts >= @max_attempts
48
+ end
49
+
50
+ def hints_used?
51
+ @user_hints >= @max_hints
52
+ end
53
+
54
+ def reset_user_attempts_hints
55
+ @user_attempts = 0
56
+ @user_hints = 0
57
+ end
58
+
59
+ private
60
+
61
+ def check_difficulty(difficulty)
62
+ validate_inclusion(GAME_LEVEL.keys, difficulty)
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # Game statistic class
5
4
  class GameStatistic
6
5
  attr_reader :user_nickname, :difficulty, :attempts_total, :attempts_used, :hints_total, :hints_used
7
6
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class SerializerDeserializer
5
+ def initialize
6
+ @file_name = 'game_statistic.yml'
7
+ @statistic_dir = 'data'
8
+ @storage_path = File.expand_path("./#{@statistic_dir}/#{@file_name}")
9
+ end
10
+
11
+ def data_dir_get
12
+ data_directory = File.dirname(@storage_path)
13
+ Dir.mkdir(data_directory) unless File.directory?(data_directory)
14
+ end
15
+
16
+ def load_game_statistic
17
+ File.exist?(@storage_path) ? YAML.load_file(@storage_path) : []
18
+ end
19
+
20
+ def save_game_statistic(game_statistic)
21
+ save_game_stat = game_statistic | load_game_statistic
22
+ File.open(@storage_path, 'w') do |file|
23
+ YAML.dump(save_game_stat, file)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,18 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # User class for game
5
4
  class User
6
5
  include Validator
7
- attr_accessor :nick_name
6
+ attr_reader :nick_name
8
7
 
9
8
  def initialize(nick_name)
10
9
  @nick_name = nick_name
11
10
  end
12
11
 
13
12
  def nickname_valid?
14
- validate_string(@nick_name)
15
- validate_nickname_length(@nick_name)
13
+ validate_class(@nick_name, String)
14
+ validate_length(@nick_name, (3..20))
16
15
  true
17
16
  end
18
17
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gem_codebreaker/config/i18n_locales'
4
+ require 'gem_codebreaker/version'
5
+ require 'gem_codebreaker/errors/incorrect_length_error'
6
+ require 'gem_codebreaker/errors/name_length_error'
7
+ require 'gem_codebreaker/errors/no_attempts_error'
8
+ require 'gem_codebreaker/errors/no_hints_error'
9
+ require 'gem_codebreaker/errors/unknow_level_error'
10
+ require 'gem_codebreaker/errors/value_range_error'
11
+ require 'gem_codebreaker/errors/wrong_class_error'
12
+ require 'gem_codebreaker/modules/validator'
13
+ require 'gem_codebreaker/classes/serializer_deserializer'
14
+ require 'gem_codebreaker/classes/user'
15
+ require 'gem_codebreaker/classes/code_maker'
16
+ require 'gem_codebreaker/classes/game_config'
17
+ require 'gem_codebreaker/classes/game_statistic'
18
+ require 'gem_codebreaker/classes/game'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ module Validator
5
+ def validate_inclusion(difficulty, game_level)
6
+ raise GemCodebreaker::UnknowLevelError unless difficulty.include?(game_level)
7
+ end
8
+
9
+ def validate_class(user_code, klass)
10
+ raise GemCodebreaker::WrongClassError unless user_code.is_a?(klass)
11
+ end
12
+
13
+ def validate_length(nickname, ranges)
14
+ raise GemCodebreaker::NameLengthError unless ranges.member?(nickname.length)
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- VERSION = '0.1.8'
4
+ VERSION = '0.1.9'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: GemCodebreaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasyl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-15 00:00:00.000000000 Z
11
+ date: 2020-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fasterer
@@ -31,7 +31,7 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.8.3
34
- type: :development
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.84.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.6.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.6.1
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rubocop-rspec
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -120,31 +134,30 @@ files:
120
134
  - ".gitignore"
121
135
  - ".rspec"
122
136
  - ".rubocop.yml"
123
- - GemCodebreaker.gemspec
124
137
  - Gemfile
125
138
  - Gemfile.lock
126
139
  - LICENSE.txt
127
140
  - README.md
128
141
  - bin/console
129
142
  - bin/setup
130
- - lib/GemCodebreaker/classes/codemaker.rb
131
- - lib/GemCodebreaker/classes/game.rb
132
- - lib/GemCodebreaker/classes/game_config.rb
133
- - lib/GemCodebreaker/classes/game_statistic.rb
134
- - lib/GemCodebreaker/classes/user.rb
135
- - lib/GemCodebreaker/config/i18n_locales.rb
136
- - lib/GemCodebreaker/errors/incorrect_length_error.rb
137
- - lib/GemCodebreaker/errors/name_length_error.rb
138
- - lib/GemCodebreaker/errors/no_attempts_error.rb
139
- - lib/GemCodebreaker/errors/no_hints_error.rb
140
- - lib/GemCodebreaker/errors/unknow_level_error.rb
141
- - lib/GemCodebreaker/errors/value_range_error.rb
142
- - lib/GemCodebreaker/errors/wrong_class_error.rb
143
- - lib/GemCodebreaker/gem_codebreaker.rb
144
- - lib/GemCodebreaker/modules/game_configurations.rb
145
- - lib/GemCodebreaker/modules/serializer_deserializer.rb
146
- - lib/GemCodebreaker/modules/validator.rb
147
- - lib/GemCodebreaker/version.rb
143
+ - gem_codebreaker.gemspec
144
+ - lib/gem_codebreaker/classes/code_maker.rb
145
+ - lib/gem_codebreaker/classes/game.rb
146
+ - lib/gem_codebreaker/classes/game_config.rb
147
+ - lib/gem_codebreaker/classes/game_statistic.rb
148
+ - lib/gem_codebreaker/classes/serializer_deserializer.rb
149
+ - lib/gem_codebreaker/classes/user.rb
150
+ - lib/gem_codebreaker/config/i18n_locales.rb
151
+ - lib/gem_codebreaker/errors/incorrect_length_error.rb
152
+ - lib/gem_codebreaker/errors/name_length_error.rb
153
+ - lib/gem_codebreaker/errors/no_attempts_error.rb
154
+ - lib/gem_codebreaker/errors/no_hints_error.rb
155
+ - lib/gem_codebreaker/errors/unknow_level_error.rb
156
+ - lib/gem_codebreaker/errors/value_range_error.rb
157
+ - lib/gem_codebreaker/errors/wrong_class_error.rb
158
+ - lib/gem_codebreaker/gem_codebreaker.rb
159
+ - lib/gem_codebreaker/modules/validator.rb
160
+ - lib/gem_codebreaker/version.rb
148
161
  homepage: https://github.com/vasivaas/GemCodebreaker
149
162
  licenses:
150
163
  - MIT
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Game class
5
- class Game
6
- LENGTH_OF_SECRET_CODE = 4
7
- DIGIT_RANGE = (1..6).freeze
8
-
9
- include GameConfigurations
10
- include Validator
11
- attr_reader :secrete_code, :statistic, :matcher_hash
12
- attr_accessor :config
13
-
14
- def initialize(user, level)
15
- @config = GameConfig.new(user, level.to_sym)
16
- @statistic = []
17
- end
18
-
19
- def check_configuration
20
- validate_game_level(@config.difficulty)
21
- end
22
-
23
- def generate_secret_code
24
- @secrete_code = (1..LENGTH_OF_SECRET_CODE).map { rand DIGIT_RANGE }
25
- end
26
-
27
- def guess_valid?(user_code)
28
- validate_string(user_code)
29
- validate_guess_length if user_code.length != LENGTH_OF_SECRET_CODE
30
- validate_chars_range unless user_code[/\A[1-6]{4}\z/]
31
- true
32
- end
33
-
34
- def guess_start(input_code)
35
- validate_number_of_attempts if @config.user_attempts >= @config.max_attempts
36
-
37
- @config.user_attempts += 1
38
- user_code = convert_string_to_array(input_code)
39
- code_marker = CodeMaker.new(@secrete_code, user_code)
40
- code_marker.calculate_result_code
41
- @matcher_hash = { plus: code_marker.plus_match, minus: code_marker.minus_match, empty: code_marker.empty_match }
42
- end
43
-
44
- def win_game?
45
- @matcher_hash[:plus] == LENGTH_OF_SECRET_CODE
46
- end
47
-
48
- def game_over?
49
- (@config.user_attempts >= @config.max_attempts) && win_game? == false
50
- end
51
-
52
- def hints_used?
53
- @config.user_hints >= @config.max_hints
54
- end
55
-
56
- def hint
57
- validate_number_of_hints if hints_used?
58
-
59
- @config.user_hints += 1
60
- @secrete_code.sample
61
- end
62
-
63
- def reset
64
- @config.user_attempts = 0
65
- @config.user_hints = 0
66
- generate_secret_code
67
- end
68
-
69
- def save_user_statistic
70
- @statistic << current_user_statistic
71
- end
72
-
73
- private
74
-
75
- def current_user_statistic
76
- GameStatistic.new(self)
77
- end
78
-
79
- def convert_string_to_array(user_code)
80
- user_code.chars.map(&:to_i)
81
- end
82
- end
83
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Configuration class for game
5
- class GameConfig
6
- include GameConfigurations
7
- attr_accessor :user_nick_name, :difficulty, :max_attempts, :max_hints, :user_attempts, :user_hints
8
-
9
- def initialize(user, level)
10
- @user_nick_name = user.nick_name
11
- @difficulty = level
12
- @max_attempts = GAME_LEVEL[level][:attempts]
13
- @max_hints = GAME_LEVEL[level][:hints]
14
- @user_attempts = 0
15
- @user_hints = 0
16
- end
17
- end
18
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'GemCodebreaker/config/i18n_locales'
4
- require 'GemCodebreaker/version'
5
- require 'GemCodebreaker/errors/incorrect_length_error'
6
- require 'GemCodebreaker/errors/name_length_error'
7
- require 'GemCodebreaker/errors/no_attempts_error'
8
- require 'GemCodebreaker/errors/no_hints_error'
9
- require 'GemCodebreaker/errors/unknow_level_error'
10
- require 'GemCodebreaker/errors/value_range_error'
11
- require 'GemCodebreaker/errors/wrong_class_error'
12
- require 'GemCodebreaker/modules/validator'
13
- require 'GemCodebreaker/modules/serializer_deserializer'
14
- require 'GemCodebreaker/modules/game_configurations'
15
- require 'GemCodebreaker/classes/user'
16
- require 'GemCodebreaker/classes/codemaker'
17
- require 'GemCodebreaker/classes/game_config'
18
- require 'GemCodebreaker/classes/game_statistic'
19
- require 'GemCodebreaker/classes/game'
20
-
21
- module GemCodebreaker
22
- class Error < StandardError; end
23
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- module GameConfigurations
5
- GAME_LEVEL = { easy:
6
- { attempts: 15,
7
- hints: 2 },
8
- medium:
9
- { attempts: 10,
10
- hints: 1 },
11
- hell:
12
- { attempts: 5,
13
- hints: 1 },
14
- strong_hell:
15
- { attempts: 1,
16
- hints: 0 } }.freeze
17
- end
18
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Serialize and Deserialize data for game statistic
5
- module SerializerDeserializer
6
- FILE_NAME = 'game_statistic.yml'
7
- STATISTIC_DIR = 'data'
8
- STORAGE_PATH = File.expand_path("./#{STATISTIC_DIR}/#{FILE_NAME}")
9
-
10
- def data_dir_get
11
- data_directory = File.dirname(STORAGE_PATH)
12
- Dir.mkdir(data_directory) unless File.directory?(data_directory)
13
- end
14
-
15
- def load_game_statistic
16
- File.exist?(STORAGE_PATH) ? YAML.load_file(STORAGE_PATH) : []
17
- end
18
-
19
- def save_game_statistic(game_statistic)
20
- save_game_stat = game_statistic | load_game_statistic
21
- File.open(STORAGE_PATH, 'w') do |file|
22
- YAML.dump(save_game_stat, file)
23
- end
24
- end
25
- end
26
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Validator
5
- module Validator
6
- def validate_game_level(game_level)
7
- level = %i[easy medium hell strong_hell]
8
- raise GemCodebreaker::UnknowLevelError unless level.include?(game_level)
9
- end
10
-
11
- def validate_number_of_hints
12
- raise GemCodebreaker::NoHintsError
13
- end
14
-
15
- def validate_number_of_attempts
16
- raise GemCodebreaker::NoAttemptsError
17
- end
18
-
19
- def validate_string(object)
20
- raise GemCodebreaker::WrongClassError unless object.is_a?(String)
21
- end
22
-
23
- def validate_guess_length
24
- raise GemCodebreaker::IncorrectLengthError
25
- end
26
-
27
- def validate_chars_range
28
- raise GemCodebreaker::ValueRangeError
29
- end
30
-
31
- def validate_nickname_length(nickname)
32
- raise GemCodebreaker::NameLengthError if nickname.length < 3 || nickname.length > 20
33
- end
34
- end
35
- end