rodders 0.1.1 → 0.1.2
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/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/Rakefile +2 -9
- data/VERSION +1 -1
- data/lib/FixedOdds.rb +29 -5
- data/lib/MutuallyExclusiveCollection.rb +5 -4
- data/lib/Rational.rb +4 -3
- data/rodders.gemspec +4 -1
- metadata +23 -12
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
@@ -38,12 +38,5 @@ end
|
|
38
38
|
|
39
39
|
task :default => :spec
|
40
40
|
|
41
|
-
require '
|
42
|
-
Rake::
|
43
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
44
|
-
|
45
|
-
rdoc.rdoc_dir = 'rdoc'
|
46
|
-
rdoc.title = "rodders #{version}"
|
47
|
-
rdoc.rdoc_files.include('README*')
|
48
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
49
|
-
end
|
41
|
+
require 'yard'
|
42
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/lib/FixedOdds.rb
CHANGED
@@ -10,7 +10,9 @@ class FixedOdds
|
|
10
10
|
attr_reader :fractional_odds
|
11
11
|
|
12
12
|
# creates a new FixedOdds from a string which can be in fractional,
|
13
|
-
# moneyline or decimal format
|
13
|
+
# moneyline or decimal format
|
14
|
+
# @param [String] odds the odds in fractional, moneyline or decimal form
|
15
|
+
# @return [FixedOdds]
|
14
16
|
def FixedOdds.from_s(odds)
|
15
17
|
case
|
16
18
|
when FixedOdds.fractional_odds?(odds) then FixedOdds.fractional_odds odds
|
@@ -21,16 +23,22 @@ class FixedOdds
|
|
21
23
|
end
|
22
24
|
|
23
25
|
# tells if the odds are in fractional form
|
26
|
+
# @param [String] odds the odds representation
|
27
|
+
# @return [Boolean] to indicate if it matches
|
24
28
|
def FixedOdds.fractional_odds?(odds)
|
25
29
|
odds =~ /\d+\/\d+|\d+-to-\d+|evens|even money/
|
26
30
|
end
|
27
31
|
|
28
32
|
# tells if the odds are in moneyline form
|
33
|
+
# @param (see FixedOdds.fractional_odds?)
|
34
|
+
# @return (see FixedOdds.fractional_odds?)
|
29
35
|
def FixedOdds.moneyline_odds?(odds)
|
30
36
|
odds =~ /[+-]\d+/
|
31
37
|
end
|
32
38
|
|
33
39
|
# tells if the odds are in decimal form
|
40
|
+
# @param (see FixedOdds.fractional_odds?)
|
41
|
+
# @return (see FixedOdds.fractional_odds?)
|
34
42
|
def FixedOdds.decimal_odds?(odds)
|
35
43
|
odds =~ /^(\d+|\d+\.\d+|\.\d+)/
|
36
44
|
end
|
@@ -44,6 +52,8 @@ class FixedOdds
|
|
44
52
|
# * 4/1 on
|
45
53
|
# * evens
|
46
54
|
# * even money
|
55
|
+
# @param [String] fractional odds in fractional form
|
56
|
+
# @return (see FixedOdds.from_s)
|
47
57
|
def FixedOdds.fractional_odds(fractional)
|
48
58
|
raise %{could not parse "#{fractional}" as fractional odds} unless FixedOdds.fractional_odds?(fractional)
|
49
59
|
return new(Rational('1/1')) if fractional == 'evens' || fractional == 'even money'
|
@@ -53,6 +63,7 @@ class FixedOdds
|
|
53
63
|
end
|
54
64
|
|
55
65
|
# creates a new FixedOdds from a Rational
|
66
|
+
# @param [Rational] fractional_odds the odds
|
56
67
|
def initialize(fractional_odds)
|
57
68
|
@fractional_odds = fractional_odds
|
58
69
|
end
|
@@ -60,6 +71,8 @@ class FixedOdds
|
|
60
71
|
# creates a new FixedOdds from moneyline form. Examples are
|
61
72
|
# * +400
|
62
73
|
# * -500
|
74
|
+
# @param [String] moneyline odds in moneyline form
|
75
|
+
# @return (see FixedOdds.from_s)
|
63
76
|
def FixedOdds.moneyline_odds(moneyline)
|
64
77
|
raise %{could not parse "#{moneyline}" as moneyline odds} unless FixedOdds.moneyline_odds?(moneyline)
|
65
78
|
sign = moneyline[0]
|
@@ -71,33 +84,42 @@ class FixedOdds
|
|
71
84
|
# creates a new FixedOdds from decimal form. Examples are
|
72
85
|
# * 1.25
|
73
86
|
# * 2
|
87
|
+
# @param [String] decimal odds in decimal form
|
88
|
+
# @return (see FixedOdds.from_s)
|
74
89
|
def FixedOdds.decimal_odds(decimal)
|
75
90
|
raise %{could not parse "#{decimal}" as decimal odds} unless FixedOdds.decimal_odds?(decimal)
|
76
91
|
new(Rational(decimal.to_f - 1))
|
77
92
|
end
|
78
93
|
|
79
|
-
# calculates the profit won on a winning
|
94
|
+
# calculates the profit won on a winning bet
|
95
|
+
# @param [String] stake the stake
|
96
|
+
# @return [Money] the profit
|
80
97
|
def profit_on_winning_stake(stake)
|
81
98
|
stake.to_money * @fractional_odds
|
82
99
|
end
|
83
100
|
|
84
|
-
# calculates the total return on a winning
|
101
|
+
# calculates the total return on a winning bet
|
85
102
|
# (which is the profit plus the initial stake)
|
103
|
+
# @param (see #profit_on_winning_stake)
|
104
|
+
# @return [Money] the total winnings
|
86
105
|
def total_return_on_winning_stake(stake)
|
87
106
|
profit_on_winning_stake(stake) + stake.to_money
|
88
107
|
end
|
89
108
|
|
90
|
-
# string representation in fractional form
|
109
|
+
# string representation in fractional form like '4/1'
|
110
|
+
# @return [String] fractional form representation
|
91
111
|
def to_s
|
92
112
|
to_s_fractional
|
93
113
|
end
|
94
114
|
|
95
|
-
# string representation in fractional form
|
115
|
+
# string representation in fractional form like '4/1'
|
116
|
+
# @return (see #to_s)
|
96
117
|
def to_s_fractional
|
97
118
|
@fractional_odds.to_s
|
98
119
|
end
|
99
120
|
|
100
121
|
# string representation in moneyline form
|
122
|
+
# @return [String] moneyline form representation
|
101
123
|
def to_s_moneyline
|
102
124
|
integral_number_with_sign_regex = "%+d"
|
103
125
|
|
@@ -109,10 +131,12 @@ class FixedOdds
|
|
109
131
|
end
|
110
132
|
|
111
133
|
# string representation in decimal form
|
134
|
+
# @return [String] decimal form representation
|
112
135
|
def to_s_decimal
|
113
136
|
"%g" % (fractional_odds + 1)
|
114
137
|
end
|
115
138
|
|
139
|
+
# equality method
|
116
140
|
def ==(other)
|
117
141
|
other.fractional_odds == @fractional_odds
|
118
142
|
end
|
@@ -1,30 +1,31 @@
|
|
1
1
|
# A collection of mutually exclusive events.
|
2
|
-
#--
|
3
|
-
# The events are not currently enforced as being
|
4
|
-
# mutually exclusive so are really just plain
|
5
|
-
# old events right now.
|
6
2
|
class MutuallyExclusiveCollection
|
7
3
|
# create a new collection with the given events
|
4
|
+
# @param [Array<FixedOdds>] events the events
|
8
5
|
def initialize(events)
|
9
6
|
@events = events.sort
|
10
7
|
end
|
11
8
|
|
12
9
|
# the least likely of the events to occur
|
10
|
+
# @return [FixedOdds] the least likely event
|
13
11
|
def underdog
|
14
12
|
@events.first
|
15
13
|
end
|
16
14
|
|
17
15
|
# the most likely of the events to occur
|
16
|
+
# @return [FixedOdds] the most likely event
|
18
17
|
def favorite
|
19
18
|
@events.last
|
20
19
|
end
|
21
20
|
|
22
21
|
# the events in ascending order of probability
|
22
|
+
# @return [Array<FixedOdds>] events in ascending probability
|
23
23
|
def in_ascending_probability
|
24
24
|
@events
|
25
25
|
end
|
26
26
|
|
27
27
|
# the events in descending order of probability
|
28
|
+
# @return [Array<FixedOdds>] events in descending probability
|
28
29
|
def in_descending_probability
|
29
30
|
@events.reverse
|
30
31
|
end
|
data/lib/Rational.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
class Rational
|
2
|
-
# calculates the reciprocal
|
3
|
-
|
4
|
-
#
|
2
|
+
# calculates the reciprocal
|
3
|
+
# @example
|
4
|
+
# Rational(2/3).reciprocal #=> Rational(3/2)
|
5
|
+
# @return [Rational] the reciprocal
|
5
6
|
def reciprocal
|
6
7
|
1 / self
|
7
8
|
end
|
data/rodders.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rodders"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nigel Lowry"]
|
@@ -46,12 +46,14 @@ Gem::Specification.new do |s|
|
|
46
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
47
|
s.add_runtime_dependency(%q<money>, [">= 0"])
|
48
48
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
49
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
49
50
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
50
51
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
51
52
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
53
|
else
|
53
54
|
s.add_dependency(%q<money>, [">= 0"])
|
54
55
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
56
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
55
57
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
58
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
57
59
|
s.add_dependency(%q<rcov>, [">= 0"])
|
@@ -59,6 +61,7 @@ Gem::Specification.new do |s|
|
|
59
61
|
else
|
60
62
|
s.add_dependency(%q<money>, [">= 0"])
|
61
63
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
64
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
62
65
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
63
66
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
64
67
|
s.add_dependency(%q<rcov>, [">= 0"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rodders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-11-06 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: money
|
16
|
-
requirement: &
|
16
|
+
requirement: &70323280330880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70323280330880
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70323280330380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,21 @@ dependencies:
|
|
32
32
|
version: 2.3.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70323280330380
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: yard
|
38
|
+
requirement: &70323280329900 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.6.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70323280329900
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: bundler
|
38
|
-
requirement: &
|
49
|
+
requirement: &70323280329400 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: 1.0.0
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70323280329400
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: jeweler
|
49
|
-
requirement: &
|
60
|
+
requirement: &70323280328780 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: 1.6.4
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70323280328780
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: rcov
|
60
|
-
requirement: &
|
71
|
+
requirement: &70323280328260 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,7 +76,7 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70323280328260
|
69
80
|
description: Converts between fractional, decimal and moneyline odds for betting and
|
70
81
|
gambling. Calculates how much can be won on a given stake.
|
71
82
|
email: nigel-lowry@ultra.eclipse.co.uk
|
@@ -106,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
117
|
version: '0'
|
107
118
|
segments:
|
108
119
|
- 0
|
109
|
-
hash:
|
120
|
+
hash: 2782545268239026614
|
110
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
122
|
none: false
|
112
123
|
requirements:
|