cb-core 0.1.4 → 0.1.6

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
  SHA256:
3
- metadata.gz: 18661aca941b2fc34a283e42e4383edabd21aa54acd6efc113dc959dcb390163
4
- data.tar.gz: 343b6f6594d1e4d887ed1346a72fbf1fea7ddf0357ca6263ce909d7a5466d659
3
+ metadata.gz: eaa6a62438cc6336ddc9329d0c56f9b070f52d66bdee469d0bd2ec5f16ed6a72
4
+ data.tar.gz: 3ef241b273c84403f66ff74521e3b6f234f7af9758f3ad96e40473f40815d561
5
5
  SHA512:
6
- metadata.gz: 4eba975e4f25c42865531fdcc509e6b2d901d936e1d5eaeabe39544e271c0181203c6e99b55c98787b768545c9e7c3ff99c3338c72562bdbfd895f618b5c3bd0
7
- data.tar.gz: 16cb5d4b8991e9adbe3245482905d31e0ab6d7a39c27ea540ee4c5832e2917a46187e7f04643edf7ef8d1c0468f777ce9006ea9d766d4e0923de27ee8acc1cff
6
+ metadata.gz: acaed6517f2d08384eac662e39ae0ca174822572ca9efe6d19861b71c42403b402f9674605ddde7a0fde82cc6516632867fabc0936966f4f39808624d7b44435
7
+ data.tar.gz: e4da06e1b72430b70a7b3a669da965a65795dc6a0f620030e7aeb5dfd819b8423a44b9ed52ab89a30431ef298db370e48ad277a0db1112a3c28c2357e78a2d55
data/.rubocop.yml CHANGED
@@ -12,6 +12,10 @@ Metrics/BlockLength:
12
12
  Exclude:
13
13
  - 'spec/**/*.rb'
14
14
 
15
+ Metrics/ModuleLength:
16
+ Exclude:
17
+ - 'spec/**/*.rb'
18
+
15
19
  Style/Documentation:
16
20
  Enabled: false
17
21
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cb-core (0.1.3)
4
+ cb-core (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/lib/codebreaker.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+ require 'yaml'
3
+
1
4
  require_relative 'codebreaker/difficulty_factory'
2
5
  require_relative 'codebreaker/difficulty_type'
3
6
  require_relative 'codebreaker/difficulties/base'
@@ -5,15 +8,18 @@ require_relative 'codebreaker/difficulties/easy'
5
8
  require_relative 'codebreaker/difficulties/medium'
6
9
  require_relative 'codebreaker/difficulties/hell'
7
10
  require_relative 'codebreaker/errors/game_over_error'
11
+ require_relative 'codebreaker/errors/game_save_error'
8
12
  require_relative 'codebreaker/errors/invalid_difficulty_error'
9
13
  require_relative 'codebreaker/errors/no_hints_error'
10
14
  require_relative 'codebreaker/errors/validation_length_error'
15
+ require_relative 'codebreaker/file_storage'
11
16
  require_relative 'codebreaker/game'
12
17
  require_relative 'codebreaker/hint'
13
18
  require_relative 'codebreaker/mixins/validatable'
14
19
  require_relative 'codebreaker/player'
15
20
  require_relative 'codebreaker/secret_code_generator'
16
21
  require_relative 'codebreaker/secret_code_matcher'
22
+ require_relative 'codebreaker/stats'
17
23
  require_relative 'codebreaker/version'
18
24
 
19
25
  module Codebreaker
@@ -1,6 +1,10 @@
1
1
  module Codebreaker
2
2
  module Difficulties
3
3
  class Base
4
+ def type
5
+ raise NotImplementedError
6
+ end
7
+
4
8
  def attempts
5
9
  raise NotImplementedError
6
10
  end
@@ -1,6 +1,10 @@
1
1
  module Codebreaker
2
2
  module Difficulties
3
3
  class Easy < Base
4
+ def type
5
+ DifficultyType::EASY
6
+ end
7
+
4
8
  def attempts
5
9
  15
6
10
  end
@@ -1,6 +1,10 @@
1
1
  module Codebreaker
2
2
  module Difficulties
3
3
  class Hell < Base
4
+ def type
5
+ DifficultyType::HELL
6
+ end
7
+
4
8
  def attempts
5
9
  5
6
10
  end
@@ -1,6 +1,10 @@
1
1
  module Codebreaker
2
2
  module Difficulties
3
3
  class Medium < Base
4
+ def type
5
+ DifficultyType::MEDIUM
6
+ end
7
+
4
8
  def attempts
5
9
  10
6
10
  end
@@ -0,0 +1,9 @@
1
+ module Codebreaker
2
+ module Errors
3
+ class GameSaveError < StandardError
4
+ def initialize(msg = 'Only won game could be saved')
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Codebreaker
2
+ class FileStorage
3
+ def initialize(path)
4
+ @path = path
5
+ end
6
+
7
+ def load
8
+ File.file?(@path) ? YAML.load_file(@path) : nil
9
+ end
10
+
11
+ def save(data)
12
+ Pathname(@path).dirname.mkpath
13
+ File.write(@path, data.to_yaml)
14
+ end
15
+ end
16
+ end
@@ -1,6 +1,6 @@
1
1
  module Codebreaker
2
2
  class Game
3
- attr_reader :secret_code
3
+ attr_reader :secret_code, :player, :difficulty
4
4
 
5
5
  def initialize(player, difficulty_type)
6
6
  @player = player
@@ -44,6 +44,10 @@ module Codebreaker
44
44
  @difficulty.attempts - @attempts_used
45
45
  end
46
46
 
47
+ def save_result
48
+ Stats.new.save_game(self)
49
+ end
50
+
47
51
  private
48
52
 
49
53
  def no_attempts?
@@ -0,0 +1,37 @@
1
+ module Codebreaker
2
+ class Stats
3
+ PATH = './db/data.yml'.freeze
4
+
5
+ def initialize
6
+ @storage = FileStorage.new(PATH)
7
+ end
8
+
9
+ def load
10
+ @storage.load || []
11
+ end
12
+
13
+ def save_game(game)
14
+ validate_game_is_win(game)
15
+ data = load
16
+ data << game_data(game)
17
+ @storage.save(data)
18
+ end
19
+
20
+ private
21
+
22
+ def game_data(game)
23
+ {
24
+ name: game.player.name,
25
+ difficulty: game.difficulty.type,
26
+ attempts_total: game.difficulty.attempts,
27
+ attempts_used: game.difficulty.attempts - game.attempts_left,
28
+ hints_total: game.difficulty.hints,
29
+ hints_used: game.difficulty.hints - game.hints_left
30
+ }
31
+ end
32
+
33
+ def validate_game_is_win(game)
34
+ raise Errors::GameSaveError unless game.win?
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module Codebreaker
2
- VERSION = '0.1.4'.freeze
2
+ VERSION = '0.1.6'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cb-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmytro Yakupov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-28 00:00:00.000000000 Z
11
+ date: 2021-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fasterer
@@ -137,15 +137,18 @@ files:
137
137
  - lib/codebreaker/difficulty_factory.rb
138
138
  - lib/codebreaker/difficulty_type.rb
139
139
  - lib/codebreaker/errors/game_over_error.rb
140
+ - lib/codebreaker/errors/game_save_error.rb
140
141
  - lib/codebreaker/errors/invalid_difficulty_error.rb
141
142
  - lib/codebreaker/errors/no_hints_error.rb
142
143
  - lib/codebreaker/errors/validation_length_error.rb
144
+ - lib/codebreaker/file_storage.rb
143
145
  - lib/codebreaker/game.rb
144
146
  - lib/codebreaker/hint.rb
145
147
  - lib/codebreaker/mixins/validatable.rb
146
148
  - lib/codebreaker/player.rb
147
149
  - lib/codebreaker/secret_code_generator.rb
148
150
  - lib/codebreaker/secret_code_matcher.rb
151
+ - lib/codebreaker/stats.rb
149
152
  - lib/codebreaker/version.rb
150
153
  homepage: https://github.com/YakupovDima/rubygarage-codebreaker-core
151
154
  licenses: