KeeperChallenge 0.0.3 → 0.0.4
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.
- data/KeeperChallenge-0.0.3.gem +0 -0
- data/KeeperChallenge.gemspec +1 -1
- data/lib/KeeperChallenge.rb +37 -25
- data/lib/keeperchallenge/database.rb +7 -6
- data/lib/keeperchallenge/player.rb +5 -1
- data/lib/keeperchallenge/score.rb +7 -6
- data/readme.md +9 -1
- data/test/test_keeperchallenge.rb +150 -6
- metadata +3 -2
Binary file
|
data/KeeperChallenge.gemspec
CHANGED
@@ -4,7 +4,7 @@ require "keeperchallenge/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "KeeperChallenge"
|
7
|
-
s.version = '0.0.
|
7
|
+
s.version = '0.0.4'
|
8
8
|
s.authors = ["Benjamin Combe"]
|
9
9
|
s.email = ["benjamin.combe@gmail.com"]
|
10
10
|
s.homepage = "https://github.com/kamiben/KeeperChallenge"
|
data/lib/KeeperChallenge.rb
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
#require './keeperchallenge/player'
|
2
|
-
#require './keeperchallenge/score'
|
3
|
-
#require './keeperchallenge/activity'
|
4
|
-
#require './keeperchallenge/database'
|
5
|
-
#TODO
|
6
|
-
#import activity and players from text file ?
|
7
1
|
require File.dirname(__FILE__) +'/keeperchallenge/player'
|
8
2
|
require File.dirname(__FILE__) +'/keeperchallenge/score'
|
9
3
|
require File.dirname(__FILE__) +'/keeperchallenge/activity'
|
@@ -11,14 +5,15 @@ require File.dirname(__FILE__) +'/keeperchallenge/database'
|
|
11
5
|
|
12
6
|
# will handle user input - will to quit the program, input from the console
|
13
7
|
class UserInput
|
14
|
-
attr_accessor :exit
|
8
|
+
attr_accessor :exit, :input
|
15
9
|
def initialize
|
16
10
|
exit = false
|
11
|
+
self.input = $stdin
|
17
12
|
end
|
18
13
|
|
19
14
|
def get_input
|
20
15
|
print '> '
|
21
|
-
result = gets.chomp()
|
16
|
+
result = input.gets.chomp()
|
22
17
|
return result
|
23
18
|
end
|
24
19
|
|
@@ -51,27 +46,30 @@ class Display
|
|
51
46
|
end
|
52
47
|
end
|
53
48
|
|
49
|
+
#will return an index to use in the [@players]
|
54
50
|
def select_player(players)
|
55
51
|
puts "Please select your player"
|
56
52
|
i=1
|
57
53
|
if !players.empty?
|
58
|
-
players.each do |player|
|
59
|
-
puts "#{
|
54
|
+
players.each do |key,player|
|
55
|
+
puts "#{player.name}"
|
60
56
|
end
|
61
57
|
choice = @input.get_input
|
62
|
-
return choice
|
58
|
+
return choice
|
63
59
|
else
|
64
60
|
puts "There are no players in the database"
|
65
61
|
return nil
|
66
62
|
end
|
67
63
|
end
|
68
64
|
|
65
|
+
# Will return the new player name
|
69
66
|
def add_player
|
70
67
|
puts "Enter the new player name :"
|
71
68
|
name = @input.get_input
|
72
69
|
return name
|
73
70
|
end
|
74
71
|
|
72
|
+
# will return the components of a new activity
|
75
73
|
def add_activity(activities_type)
|
76
74
|
|
77
75
|
puts "Enter activity type"
|
@@ -91,13 +89,23 @@ class Display
|
|
91
89
|
return type, time, cal, km
|
92
90
|
end
|
93
91
|
|
92
|
+
# Will print the scores
|
94
93
|
def display_scores(players)
|
95
94
|
puts "Scores :"
|
96
|
-
players.each do |player|
|
95
|
+
players.each do |key,player|
|
97
96
|
puts "#{player.name} : #{player.score}"
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
100
|
+
def confirm_delete
|
101
|
+
puts "Are you sure you want to erase all data? (type YES)"
|
102
|
+
return @input.get_input
|
103
|
+
end
|
104
|
+
|
105
|
+
def abort
|
106
|
+
puts "Abort"
|
107
|
+
end
|
108
|
+
|
101
109
|
end
|
102
110
|
|
103
111
|
|
@@ -107,9 +115,9 @@ class Main
|
|
107
115
|
def initialize
|
108
116
|
# load players
|
109
117
|
# load activities
|
110
|
-
@players =
|
118
|
+
@players = {}
|
111
119
|
@activities_type = ["velo", "course" , "marche", "natation"]
|
112
|
-
|
120
|
+
#setup_test_users
|
113
121
|
|
114
122
|
end
|
115
123
|
def launch
|
@@ -130,15 +138,19 @@ class Main
|
|
130
138
|
when :add_player then
|
131
139
|
name = screen.add_player
|
132
140
|
new_player = Player.new(name)
|
133
|
-
@players.
|
134
|
-
#add player
|
141
|
+
@players.update(name => new_player)
|
135
142
|
when :launch_scoreboard then
|
136
143
|
score = Score.new(@players)
|
137
144
|
score.compute(@activities_type)
|
138
145
|
screen.display_scores(@players)
|
139
146
|
when :clean_database then
|
140
|
-
|
141
|
-
|
147
|
+
response = screen.confirm_delete
|
148
|
+
if response == "YES"
|
149
|
+
db.clear
|
150
|
+
@players.clear
|
151
|
+
else
|
152
|
+
screen.abort
|
153
|
+
end
|
142
154
|
|
143
155
|
end
|
144
156
|
db.save(@players)
|
@@ -146,14 +158,14 @@ class Main
|
|
146
158
|
end
|
147
159
|
|
148
160
|
def setup_test_users
|
149
|
-
@players.
|
150
|
-
@players.
|
161
|
+
@players.update({"Ben" => Player.new("Ben")})
|
162
|
+
@players.update({"Claire" => Player.new("Claire")})
|
151
163
|
|
152
|
-
@players[
|
153
|
-
@players[
|
154
|
-
@players[
|
155
|
-
@players[
|
156
|
-
@players[
|
164
|
+
@players["Ben"].add_activity("velo", 15, 15, 15)
|
165
|
+
@players["Ben"].add_activity("course", 10, 10, 10)
|
166
|
+
@players["Claire"].add_activity("course", 20, 20, 20)
|
167
|
+
@players["Claire"].add_activity("velo", 12, 12, 12)
|
168
|
+
@players["Claire"].add_activity("natation", 30, 20, 10)
|
157
169
|
end
|
158
170
|
|
159
171
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
class FileDatabase
|
2
|
-
|
2
|
+
attr_reader :folder_path
|
3
3
|
# will create the db folder if not present on system
|
4
4
|
def initialize
|
5
5
|
#if db folder does not exist, create it
|
6
6
|
@folder_path = File.dirname(__FILE__) + "/db/"
|
7
|
+
puts @folder_path
|
7
8
|
unless File.directory?(@folder_path)
|
8
9
|
Dir.mkdir(@folder_path)
|
9
10
|
end
|
@@ -12,20 +13,20 @@ class FileDatabase
|
|
12
13
|
|
13
14
|
#will load all files from db directory and load them as player and activities
|
14
15
|
def load(players)
|
15
|
-
|
16
|
+
|
16
17
|
# read all files in database
|
17
18
|
|
18
19
|
Dir.foreach(@folder_path) do |file|
|
19
20
|
if !(file =='.' || file == '..')
|
20
21
|
# create an object per file (=player)
|
21
|
-
players.
|
22
|
+
players.update({file => Player.new(file)})
|
22
23
|
# populate with activities
|
23
24
|
content = File.open("#{@folder_path}#{file}")
|
24
25
|
content.each_line do |line|
|
25
26
|
activity = line.split(' ')
|
26
|
-
players[
|
27
|
+
players[file].add_activity(activity[0], activity[1], activity[2], activity[3])
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
content.close
|
30
31
|
end
|
31
32
|
end
|
@@ -34,7 +35,7 @@ class FileDatabase
|
|
34
35
|
#will save player to static files in db directory
|
35
36
|
def save(players)
|
36
37
|
# create a file per player
|
37
|
-
players.each do |player|
|
38
|
+
players.each do |key,player|
|
38
39
|
file_name = "#{@folder_path}#{player.name}"
|
39
40
|
player_file = File.open(file_name,'w')
|
40
41
|
# in this file : one activity per line, each attribute separated by a space
|
@@ -2,18 +2,21 @@ class Player
|
|
2
2
|
attr_reader :name
|
3
3
|
attr_accessor :activities, :score
|
4
4
|
|
5
|
+
#only need a name to initialize a player
|
5
6
|
def initialize(name)
|
6
7
|
@name = name
|
7
8
|
@activities = []
|
8
9
|
@score = 0
|
9
10
|
end
|
10
11
|
|
12
|
+
# to add an activity, need all the parameters of an activity
|
11
13
|
def add_activity(type, time, cal, km)
|
12
14
|
new_activity = Activity.new(type, time, cal, km)
|
13
15
|
@activities.push(new_activity)
|
14
16
|
end
|
15
17
|
|
16
|
-
|
18
|
+
# will return all activities taken for a type of activity in an array
|
19
|
+
def activities_taken(type)
|
17
20
|
activity_by_type = []
|
18
21
|
@activities.each do |activity|
|
19
22
|
if activity.type == type
|
@@ -23,6 +26,7 @@ class Player
|
|
23
26
|
return activity_by_type
|
24
27
|
end
|
25
28
|
|
29
|
+
# Will count all sports the player practised.
|
26
30
|
def count_activity_type
|
27
31
|
total_activities_type = 0
|
28
32
|
previous_activity = ''
|
@@ -14,12 +14,12 @@ class Score
|
|
14
14
|
total_time = {}
|
15
15
|
total_cal = {}
|
16
16
|
total_km = {}
|
17
|
-
@players.each do |player|
|
17
|
+
@players.each do |key,player|
|
18
18
|
total_time[player.name] =0
|
19
19
|
total_cal[player.name] =0
|
20
20
|
total_km[player.name] =0
|
21
21
|
|
22
|
-
player.
|
22
|
+
player.activities_taken(activity).each do |player_activity|
|
23
23
|
total_time[player.name] += player_activity.time.to_i
|
24
24
|
total_cal[player.name] += player_activity.cal.to_i
|
25
25
|
total_km[player.name] += player_activity.km.to_i
|
@@ -27,7 +27,7 @@ class Score
|
|
27
27
|
end
|
28
28
|
|
29
29
|
#d�termine le meilleur de chaque discipline
|
30
|
-
@players.each do |player|
|
30
|
+
@players.each do |key,player|
|
31
31
|
if player.name == find_best_score(total_time)
|
32
32
|
puts "Best total time in #{activity} for #{player.name}, adding 3 points"
|
33
33
|
player.score += 3
|
@@ -46,13 +46,14 @@ class Score
|
|
46
46
|
end
|
47
47
|
|
48
48
|
#Incr�mentation du compteur pour le nombre d'activit�s diff�rentes effectu�es
|
49
|
-
@players.each do |player|
|
49
|
+
@players.each do |key,player|
|
50
50
|
puts "Adding numbers of activity for #{player.name} = #{player.count_activity_type}"
|
51
51
|
player.score += player.count_activity_type
|
52
52
|
end
|
53
53
|
|
54
54
|
end
|
55
55
|
|
56
|
+
# returns the player name of the best total from the given hash.
|
56
57
|
def find_best_score(total_per_player)
|
57
58
|
best_score = 0
|
58
59
|
winner = ''
|
@@ -66,9 +67,9 @@ class Score
|
|
66
67
|
return winner
|
67
68
|
end
|
68
69
|
|
69
|
-
|
70
|
+
# Reset all scores to prevent abuse from the save file
|
70
71
|
def reset_player_scores()
|
71
|
-
@players.each do |player|
|
72
|
+
@players.each do |key,player|
|
72
73
|
player.score = 0
|
73
74
|
end
|
74
75
|
end
|
data/readme.md
CHANGED
@@ -5,4 +5,12 @@ It will allow :
|
|
5
5
|
- adding an activity for a player
|
6
6
|
- compute the score for each player in the system
|
7
7
|
- save and load from disk
|
8
|
-
- erase all data
|
8
|
+
- erase all data
|
9
|
+
|
10
|
+
To install :
|
11
|
+
gem install KeeperChallenge
|
12
|
+
|
13
|
+
To use :
|
14
|
+
KeeperChallenge
|
15
|
+
|
16
|
+
The application is console based for now.
|
@@ -1,17 +1,161 @@
|
|
1
1
|
require 'test/unit'
|
2
|
+
require 'stringio'
|
3
|
+
require_relative '../lib/keeperchallenge'
|
2
4
|
|
3
5
|
class MyUnitTest < Test::Unit::TestCase
|
4
6
|
|
5
|
-
def
|
6
|
-
|
7
|
+
def test_user_input
|
8
|
+
# STDIN should be returned by get_input
|
9
|
+
user_input = UserInput.new()
|
10
|
+
text_input = StringIO.new("velo\n")
|
11
|
+
user_input.input = text_input
|
12
|
+
assert_equal(user_input.get_input,"velo")
|
13
|
+
|
7
14
|
end
|
8
15
|
|
9
|
-
def
|
10
|
-
|
16
|
+
def test_display
|
17
|
+
# test select_player
|
18
|
+
user_input = UserInput.new()
|
19
|
+
user_input.input = StringIO.new("Ben\n")
|
20
|
+
display = Display.new(user_input)
|
21
|
+
player1 = Player.new("Ben")
|
22
|
+
player2 = Player.new("Claire")
|
23
|
+
players = {"Ben" =>player1,"Claire" =>player2}
|
24
|
+
|
25
|
+
assert_equal(display.select_player(players),"Ben")
|
26
|
+
|
27
|
+
# test add player
|
28
|
+
user_input.input = StringIO.new("Cyril")
|
29
|
+
assert_equal(display.add_player(),"Cyril")
|
30
|
+
|
31
|
+
|
11
32
|
end
|
12
33
|
|
13
|
-
def
|
14
|
-
|
34
|
+
def test_main
|
35
|
+
game = Main.new()
|
36
|
+
game.setup_test_users
|
37
|
+
# quite hard to test a console based program that loops through the main.
|
38
|
+
# this test is on hold as not vital to the aim to the app
|
15
39
|
end
|
16
40
|
|
41
|
+
def test_activity
|
42
|
+
#Only accessors here ! Nothing to test
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_add_activity
|
46
|
+
player = Player.new("Ben")
|
47
|
+
|
48
|
+
# test new activity
|
49
|
+
player.add_activity("Velo", 1, 1, 1)
|
50
|
+
|
51
|
+
assert_equal(player.activities[0].type,"Velo")
|
52
|
+
assert_equal(player.activities[0].km,1)
|
53
|
+
assert_equal(player.activities[0].cal,1)
|
54
|
+
assert_equal(player.activities[0].time,1)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_list_by_type
|
59
|
+
player = Player.new("Ben")
|
60
|
+
player.add_activity("Velo", 1, 1, 1)
|
61
|
+
|
62
|
+
assert_equal(player.activities_taken("Velo"),[player.activities[0]])
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_count_activities_type
|
67
|
+
player = Player.new("Ben")
|
68
|
+
player.add_activity("Velo", 1, 1, 1)
|
69
|
+
|
70
|
+
assert_equal(player.count_activity_type,1)
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_score
|
75
|
+
setup_test_users
|
76
|
+
@activities_type = ["velo", "course" , "marche", "natation"]
|
77
|
+
score = Score.new(@players)
|
78
|
+
|
79
|
+
score.compute(@activities_type)
|
80
|
+
assert_equal(@players["Ben"].score,11)
|
81
|
+
assert_equal(@players["Claire"].score,21)
|
82
|
+
|
83
|
+
@players.clear
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_find_best_score
|
87
|
+
|
88
|
+
score = Score.new(@players)
|
89
|
+
total_time = {}
|
90
|
+
total_time['Ben'] = 10
|
91
|
+
total_time['Claire'] = 5
|
92
|
+
assert_equal(score.find_best_score(total_time),'Ben')
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
def reset_player_score
|
97
|
+
player = Player.new("Ben")
|
98
|
+
player.score = 10
|
99
|
+
players=[player]
|
100
|
+
assert_equal(player.score,10)
|
101
|
+
score = Score.new(players)
|
102
|
+
score.reset_player_score
|
103
|
+
assert_equal(player.score,0)
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def setup_test_users
|
109
|
+
@players ={}
|
110
|
+
@players.update({"Ben" => Player.new("Ben")})
|
111
|
+
@players.update({"Claire" => Player.new("Claire")})
|
112
|
+
|
113
|
+
@players["Ben"].add_activity("velo", 15, 15, 15)
|
114
|
+
@players["Ben"].add_activity("course", 10, 10, 10)
|
115
|
+
@players["Claire"].add_activity("course", 20, 20, 20)
|
116
|
+
@players["Claire"].add_activity("velo", 12, 12, 12)
|
117
|
+
@players["Claire"].add_activity("natation", 30, 20, 10)
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
def test_load
|
122
|
+
players = {}
|
123
|
+
@folder_path = "../lib/keeperchallenge/db/"
|
124
|
+
puts @folder_path
|
125
|
+
player_file = File.open("#{@folder_path}Ben",'w')
|
126
|
+
activity_string = "Velo 1 1 1\n"
|
127
|
+
player_file.write(activity_string)
|
128
|
+
player_file.close
|
129
|
+
|
130
|
+
db = FileDatabase.new
|
131
|
+
|
132
|
+
db.load(players)
|
133
|
+
|
134
|
+
assert_equal(players["Ben"].name,"Ben")
|
135
|
+
assert_equal(players["Ben"].activities[0].type,"Velo")
|
136
|
+
|
137
|
+
db.clear
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
def test_save
|
143
|
+
setup_test_users
|
144
|
+
db = FileDatabase.new
|
145
|
+
db.save(@players)
|
146
|
+
index = 0
|
147
|
+
Dir.foreach(db.folder_path) do |file|
|
148
|
+
if !(file =='.' || file == '..')
|
149
|
+
if index == 0
|
150
|
+
assert_equal(file,'Ben')
|
151
|
+
elsif index ==1
|
152
|
+
assert_equal(file,'Claire')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
index += 1
|
156
|
+
end
|
157
|
+
|
158
|
+
db.clear
|
159
|
+
end
|
160
|
+
|
17
161
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: KeeperChallenge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-25 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: KeeperChallenge is a console based application that will allow the user
|
15
15
|
to add participants, add activities and then determine the winner of the contest.
|
@@ -21,6 +21,7 @@ extensions: []
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- KeeperChallenge-0.0.2.gem
|
24
|
+
- KeeperChallenge-0.0.3.gem
|
24
25
|
- KeeperChallenge.gemspec
|
25
26
|
- bin/keeperchallenge
|
26
27
|
- lib/KeeperChallenge.rb
|