elo_demo 0.1.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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +162 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/run_demo +85 -0
- data/bin/setup +8 -0
- data/elo_demo.gemspec +29 -0
- data/lib/elo_demo.rb +87 -0
- data/lib/elo_demo/version.rb +3 -0
- metadata +115 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e726a1cf9b570c320a2db70e33cdb574fa3e6a49
|
4
|
+
data.tar.gz: e6feab4d422bd8db9f8a915406e55875184c120c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f422db78f8176d2ef7801552fcf460e749f73b1cdd435681dfaa733a80a091a206d582c342b59afaabde167b2ac114ad03f475b239d5022293cd39b253606644
|
7
|
+
data.tar.gz: 4539decaa860a62c0dd6192a7c2ef47b69d042de16f7ab053439d7dcdd80e0e933a942b4608aac8b21c766e91569a9beac2aebeef849109b4211a8b057980f9e
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 TODO: Write your name
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
# Elo Rating Demonstration
|
2
|
+
|
3
|
+
Most people do ranking wrong. In this small demonstration I have 10 players battling each other through 1,000 random matches.
|
4
|
+
|
5
|
+
The most naive sorting would be to create a simple score (such as number of wins subtracted by number of loses). In this case, this is the simple ranking:
|
6
|
+
|
7
|
+
```
|
8
|
+
Ranking sorted by Points (wins - loses)
|
9
|
+
Name Games Wins Loses Points Elo Rating
|
10
|
+
1 Kong 217 117 100 17 802
|
11
|
+
2 Samus 211 110 101 9 842
|
12
|
+
3 Wario 197 102 95 7 824
|
13
|
+
4 Luigi 186 95 91 4 841
|
14
|
+
5 Zelda 160 81 79 2 847
|
15
|
+
6 Pikachu 209 105 104 1 851
|
16
|
+
7 Yoshi 223 112 111 1 803
|
17
|
+
8 Mario 203 101 102 -1 820
|
18
|
+
9 Fox 208 95 113 -18 754
|
19
|
+
10 Bowser 186 82 104 -22 785
|
20
|
+
```
|
21
|
+
|
22
|
+
Now we make Samus (2nd) wins from Wario (3rd) 10 times in a row, without no one else battling this time.
|
23
|
+
|
24
|
+
```
|
25
|
+
Ranking sorted by Points (wins - loses)
|
26
|
+
Name Games Wins Loses Points Elo Rating
|
27
|
+
1 Samus 221 120 101 19 896
|
28
|
+
2 Kong 217 117 100 17 802
|
29
|
+
3 Luigi 186 95 91 4 841
|
30
|
+
4 Zelda 160 81 79 2 847
|
31
|
+
5 Pikachu 209 105 104 1 851
|
32
|
+
6 Yoshi 223 112 111 1 803
|
33
|
+
7 Mario 203 101 102 -1 820
|
34
|
+
8 Wario 207 102 105 -3 760
|
35
|
+
9 Fox 208 95 113 -18 754
|
36
|
+
10 Bowser 186 82 104 -22 785
|
37
|
+
```
|
38
|
+
|
39
|
+
You can see that Samus went to the top of the ranking while poor Wario drastically dropped from 3rd to 8th place.
|
40
|
+
|
41
|
+
This is very unfair as Wario was already weaker than then Samus so the odds of him winning were not high to begin with, and the penalty of trying against a stronger opponent made him drop a lot in the ranking.
|
42
|
+
|
43
|
+
Let's try to make Kong (2nd) losing to Bowser (10th) 10 times.
|
44
|
+
|
45
|
+
```
|
46
|
+
Ranking sorted by Points (wins - loses)
|
47
|
+
Name Games Wins Loses Points Elo Rating
|
48
|
+
1 Samus 221 120 101 19 896
|
49
|
+
2 Kong 227 117 110 7 732
|
50
|
+
3 Luigi 186 95 91 4 841
|
51
|
+
4 Zelda 160 81 79 2 847
|
52
|
+
5 Pikachu 209 105 104 1 851
|
53
|
+
6 Yoshi 223 112 111 1 803
|
54
|
+
7 Mario 203 101 102 -1 820
|
55
|
+
8 Wario 207 102 105 -3 760
|
56
|
+
9 Bowser 196 92 104 -12 845
|
57
|
+
10 Fox 208 95 113 -18 754
|
58
|
+
```
|
59
|
+
|
60
|
+
Now even though Kong was supposed to have better odds for being stronger, he lost 10 times in a row but he's still at 2nd place.
|
61
|
+
|
62
|
+
And Bowser, who performed an impressive winning streak of 10 wins agains the 2nd most stronger, still only jumped up one position in the ranking, to 9th place.
|
63
|
+
|
64
|
+
Again, this is very unfair. And this is why simple counting methods such as absolute ammout of wins and loses are not used in real rankings.
|
65
|
+
|
66
|
+
|
67
|
+
## Elo Rating Run
|
68
|
+
|
69
|
+
Starting over with the exact 1,000 matches in the exact same order and win x lose scenario, we already arrive to a very different ranking than the first one:
|
70
|
+
|
71
|
+
In the naive system, the current top player Pikachu was only in 6th, and Kong, who is at 8th here was considered the top player.
|
72
|
+
|
73
|
+
```
|
74
|
+
Ranking sorted by Elo Rating
|
75
|
+
Name Games Wins Loses Points Elo Rating
|
76
|
+
1 Pikachu 209 105 104 1 851
|
77
|
+
2 Zelda 160 81 79 2 847
|
78
|
+
3 Samus 211 110 101 9 842
|
79
|
+
4 Luigi 186 95 91 4 841
|
80
|
+
5 Wario 197 102 95 7 824
|
81
|
+
6 Mario 203 101 102 -1 820
|
82
|
+
7 Yoshi 223 112 111 1 803
|
83
|
+
8 Kong 217 117 100 17 802
|
84
|
+
9 Bowser 186 82 104 -22 785
|
85
|
+
10 Fox 208 95 113 -18 754
|
86
|
+
```
|
87
|
+
|
88
|
+
Now let's make Zelda (2nd) win from Samus (3rd) 10 times.
|
89
|
+
|
90
|
+
They are almost evenly matched (almost same level in the ranking), so Zelda jumps to 1st place and Samus drops from 3rd to 9th.
|
91
|
+
|
92
|
+
```
|
93
|
+
Ranking sorted by Elo Rating
|
94
|
+
Name Games Wins Loses Points Elo Rating
|
95
|
+
1 Zelda 170 91 79 12 904
|
96
|
+
2 Pikachu 209 105 104 1 851
|
97
|
+
3 Luigi 186 95 91 4 841
|
98
|
+
4 Wario 197 102 95 7 824
|
99
|
+
5 Mario 203 101 102 -1 820
|
100
|
+
6 Yoshi 223 112 111 1 803
|
101
|
+
7 Kong 217 117 100 17 802
|
102
|
+
8 Bowser 186 82 104 -22 785
|
103
|
+
9 Samus 221 110 111 -1 775
|
104
|
+
10 Fox 208 95 113 -18 754
|
105
|
+
```
|
106
|
+
|
107
|
+
Now let's try the improbable scenario of Pikachu (2nd) losing to Fox (10th) 10 times.
|
108
|
+
|
109
|
+
```
|
110
|
+
Ranking sorted by Elo Rating
|
111
|
+
Name Games Wins Loses Points Elo Rating
|
112
|
+
1 Zelda 170 91 79 12 904
|
113
|
+
2 Luigi 186 95 91 4 841
|
114
|
+
3 Fox 218 105 113 -8 829
|
115
|
+
4 Wario 197 102 95 7 824
|
116
|
+
5 Mario 203 101 102 -1 820
|
117
|
+
6 Yoshi 223 112 111 1 803
|
118
|
+
7 Kong 217 117 100 17 802
|
119
|
+
8 Bowser 186 82 104 -22 785
|
120
|
+
9 Samus 221 110 111 -1 775
|
121
|
+
10 Pikachu 219 105 114 -9 766
|
122
|
+
```
|
123
|
+
|
124
|
+
They almost swapped positions because by the skill reflected in the ranking, Pikachu had a higher probability of winning against a 'weak' opponent such as Fox.
|
125
|
+
|
126
|
+
But instead, Fox did an impressive winning streak, so he deserved jumping up from 10th to 3rd, and Pikachu suffered a severe penalty of dropping from 3rd to 10th for losing so many times.
|
127
|
+
|
128
|
+
This is a much fair system where we use the probability of wins and loses.
|
129
|
+
|
130
|
+
If a strong player does a match against a weaker player, he shouldn't jump up too much in the ranking while the weaker shouldn't drop down so much from the ranking, as it's all expected outcomes.
|
131
|
+
|
132
|
+
Now, in the case of improbable matches where a stronger player loses against a weaker player, the stronger should drop down a lot more and the weaker should jump up a lot more as reward.
|
133
|
+
|
134
|
+
This motivates the stronger player to play their best to stay up and the weaker to risk against stronger opponents to wield better rewards.
|
135
|
+
|
136
|
+
That's what makes a more competitive environment for players.
|
137
|
+
|
138
|
+
## Installation
|
139
|
+
|
140
|
+
And then execute:
|
141
|
+
|
142
|
+
$ bundle
|
143
|
+
|
144
|
+
Or install it yourself as:
|
145
|
+
|
146
|
+
$ gem install elo_demo
|
147
|
+
|
148
|
+
## Usage
|
149
|
+
|
150
|
+
Just execute the scenario runner:
|
151
|
+
|
152
|
+
$ bin/run_demo
|
153
|
+
|
154
|
+
## Contributing
|
155
|
+
|
156
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/akitaonrails/elo_demo.
|
157
|
+
|
158
|
+
|
159
|
+
## License
|
160
|
+
|
161
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
162
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "elo_demo"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/run_demo
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "elo_demo"
|
5
|
+
|
6
|
+
puts "##"
|
7
|
+
puts "## NAIVE RUN"
|
8
|
+
|
9
|
+
t = EloDemo::Tournment.new
|
10
|
+
t.run!
|
11
|
+
t.print_naive_ranking
|
12
|
+
|
13
|
+
attempts = 10
|
14
|
+
|
15
|
+
second_player = t.sorted_by_naive[1]
|
16
|
+
third_player = t.sorted_by_naive[2]
|
17
|
+
|
18
|
+
puts "#{second_player.name} (2nd) wins from #{third_player.name} (3rd) #{attempts} times"
|
19
|
+
attempts.times do
|
20
|
+
t.mark_win(second_player, third_player)
|
21
|
+
end
|
22
|
+
|
23
|
+
t.print_naive_ranking
|
24
|
+
|
25
|
+
second_player = t.sorted_by_naive[1]
|
26
|
+
worst_player = t.sorted_by_naive.last
|
27
|
+
|
28
|
+
puts "#{second_player.name} (2nd) loses to #{worst_player.name} (10th) #{attempts} times"
|
29
|
+
attempts.times do
|
30
|
+
t.mark_win(worst_player, second_player)
|
31
|
+
end
|
32
|
+
|
33
|
+
t.print_naive_ranking
|
34
|
+
|
35
|
+
fourth_player = t.sorted_by_naive[3]
|
36
|
+
fifth_player = t.sorted_by_naive[4]
|
37
|
+
|
38
|
+
puts "#{fourth_player.name} (4th) wins to #{fifth_player.name} (5th) #{attempts} times"
|
39
|
+
attempts.times do
|
40
|
+
t.mark_win(fourth_player, fifth_player)
|
41
|
+
end
|
42
|
+
|
43
|
+
t.print_naive_ranking
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
puts "##"
|
49
|
+
puts "## ELO RUN"
|
50
|
+
|
51
|
+
t = EloDemo::Tournment.new
|
52
|
+
t.run!
|
53
|
+
t.print_elo_ranking
|
54
|
+
|
55
|
+
attempts = 10
|
56
|
+
|
57
|
+
second_player = t.sorted_by_elo[1]
|
58
|
+
third_player = t.sorted_by_elo[2]
|
59
|
+
|
60
|
+
puts "#{second_player.name} (2nd) wins from #{third_player.name} (3rd) #{attempts} times"
|
61
|
+
attempts.times do
|
62
|
+
t.mark_win(second_player, third_player)
|
63
|
+
end
|
64
|
+
|
65
|
+
t.print_elo_ranking
|
66
|
+
|
67
|
+
second_player = t.sorted_by_elo[1]
|
68
|
+
worst_player = t.sorted_by_elo.last
|
69
|
+
|
70
|
+
puts "#{second_player.name} (2nd) loses to #{worst_player.name} (10th) #{attempts} times"
|
71
|
+
attempts.times do
|
72
|
+
t.mark_win(worst_player, second_player)
|
73
|
+
end
|
74
|
+
|
75
|
+
t.print_elo_ranking
|
76
|
+
|
77
|
+
fourth_player = t.sorted_by_elo[3]
|
78
|
+
fifth_player = t.sorted_by_elo[4]
|
79
|
+
|
80
|
+
puts "#{fourth_player.name} (4th) wins to #{fifth_player.name} (5th) #{attempts} times"
|
81
|
+
attempts.times do
|
82
|
+
t.mark_win(fourth_player, fifth_player)
|
83
|
+
end
|
84
|
+
|
85
|
+
t.print_elo_ranking
|
data/bin/setup
ADDED
data/elo_demo.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'elo_demo/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "elo_demo"
|
8
|
+
spec.version = EloDemo::VERSION
|
9
|
+
spec.authors = ["Fabio Akita"]
|
10
|
+
spec.email = ["boss@akitaonrails.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{This is a short demonstration of one of the most miunderstood topic in programming: ranking}
|
13
|
+
spec.description = %q{This short demo will show what most people think of ranking and what the beginnings of a good ranking system actually look like}
|
14
|
+
spec.homepage = "https://github.com/akitaonrails/elo_demo"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_runtime_dependency "elo", "~> 0.1.0"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.13"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
end
|
data/lib/elo_demo.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require "elo_demo/version"
|
2
|
+
require "elo"
|
3
|
+
|
4
|
+
module EloDemo
|
5
|
+
class Player
|
6
|
+
attr_accessor :name, :games_played, :wins, :loses, :elo_player
|
7
|
+
def initialize(options = {})
|
8
|
+
self.name = options[:name]
|
9
|
+
self.games_played = options[:games_played] || 0
|
10
|
+
self.wins = options[:wins] || 0
|
11
|
+
self.loses = options[:loses] || 0
|
12
|
+
self.elo_player = Elo::Player.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Tournment
|
17
|
+
attr_reader :players
|
18
|
+
NAMES = %w[Mario Luigi Zelda Bowser Yoshi Wario Fox Pikachu Kong Samus Kirby]
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
srand(666)
|
22
|
+
|
23
|
+
@players = []
|
24
|
+
10.times do |i|
|
25
|
+
@players << Player.new(name: NAMES[i])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def run!
|
30
|
+
1000.times do
|
31
|
+
player_0 = @players[rand(1..players.size) - 1]
|
32
|
+
player_1 = @players[rand(1..players.size) - 1]
|
33
|
+
game = [player_0, player_1]
|
34
|
+
winner = game[rand(0..1)]
|
35
|
+
|
36
|
+
if player_0.name == winner.name
|
37
|
+
mark_win(player_0, player_1)
|
38
|
+
else
|
39
|
+
mark_win(player_1, player_0)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def mark_win(p1, p2)
|
45
|
+
p1.games_played += 1
|
46
|
+
p2.games_played += 1
|
47
|
+
p1.wins += 1
|
48
|
+
p2.loses += 1
|
49
|
+
p1.elo_player.wins_from(p2.elo_player)
|
50
|
+
end
|
51
|
+
|
52
|
+
def print_ranking
|
53
|
+
print_naive_ranking
|
54
|
+
print_elo_ranking
|
55
|
+
end
|
56
|
+
|
57
|
+
def print_naive_ranking
|
58
|
+
puts "Ranking sorted by Points (wins - loses)"
|
59
|
+
puts " #{"Name".ljust(10)} Games Wins Loses Points Elo Rating"
|
60
|
+
sorted_by_naive.each_with_index do |p, index|
|
61
|
+
print_line p, index + 1
|
62
|
+
end
|
63
|
+
puts ""
|
64
|
+
end
|
65
|
+
|
66
|
+
def print_elo_ranking
|
67
|
+
puts "Ranking sorted by Elo Rating"
|
68
|
+
puts " #{"Name".ljust(10)} Games Wins Loses Points Elo Rating"
|
69
|
+
sorted_by_elo.each_with_index do |p, index|
|
70
|
+
print_line p, index + 1
|
71
|
+
end
|
72
|
+
puts ""
|
73
|
+
end
|
74
|
+
|
75
|
+
def sorted_by_naive
|
76
|
+
players.sort_by { |p| p.wins - p.loses }.reverse
|
77
|
+
end
|
78
|
+
|
79
|
+
def sorted_by_elo
|
80
|
+
players.sort_by { |p| p.elo_player.rating }.reverse
|
81
|
+
end
|
82
|
+
|
83
|
+
def print_line(p, index)
|
84
|
+
puts "#{index.to_s.rjust(3)} #{p.name.ljust(10)} #{p.games_played.to_s.rjust(5)} #{p.wins.to_s.rjust(4)} #{p.loses.to_s.rjust(5)} #{(p.wins - p.loses).to_s.rjust(5)} #{p.elo_player.rating.to_s.rjust(10)}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elo_demo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabio Akita
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: elo
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.13'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.13'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: This short demo will show what most people think of ranking and what
|
70
|
+
the beginnings of a good ranking system actually look like
|
71
|
+
email:
|
72
|
+
- boss@akitaonrails.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rspec"
|
79
|
+
- ".travis.yml"
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- bin/console
|
85
|
+
- bin/run_demo
|
86
|
+
- bin/setup
|
87
|
+
- elo_demo.gemspec
|
88
|
+
- lib/elo_demo.rb
|
89
|
+
- lib/elo_demo/version.rb
|
90
|
+
homepage: https://github.com/akitaonrails/elo_demo
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 2.5.1
|
111
|
+
signing_key:
|
112
|
+
specification_version: 4
|
113
|
+
summary: 'This is a short demonstration of one of the most miunderstood topic in programming:
|
114
|
+
ranking'
|
115
|
+
test_files: []
|