rodders 0.2.0 → 0.3.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
data/lib/FixedOdds.rb CHANGED
@@ -11,14 +11,16 @@ class FixedOdds
11
11
 
12
12
  # creates a new FixedOdds from a string which can be in fractional,
13
13
  # moneyline or decimal format
14
+ # @note strings like '5' are parsed as decimal odds, not as being
15
+ # equivalent to '5/1'
14
16
  # @param [String] odds the odds in fractional, moneyline or decimal form
15
17
  # @return [FixedOdds]
16
18
  def FixedOdds.from_s(odds)
17
19
  case
18
- when FixedOdds.fractional_odds?(odds) then FixedOdds.fractional_odds odds
19
- when FixedOdds.moneyline_odds?(odds) then FixedOdds.moneyline_odds odds
20
- when FixedOdds.decimal_odds?(odds) then FixedOdds.decimal_odds odds
21
- else raise ArgumentError, %{could not parse "#{odds}"}
20
+ when self.fractional_odds?(odds) then self.fractional_odds odds
21
+ when self.moneyline_odds?(odds) then self.moneyline_odds odds
22
+ when self.decimal_odds?(odds) then self.decimal_odds odds
23
+ else raise ArgumentError, %{could not parse "#{odds}"}
22
24
  end
23
25
  end
24
26
 
@@ -55,7 +57,7 @@ class FixedOdds
55
57
  # @param [String] fractional odds in fractional form
56
58
  # @return (see FixedOdds.from_s)
57
59
  def FixedOdds.fractional_odds(fractional)
58
- raise %{could not parse "#{fractional}" as fractional odds} unless FixedOdds.fractional_odds?(fractional)
60
+ raise %{could not parse "#{fractional}" as fractional odds} unless self.fractional_odds?(fractional)
59
61
  return new(Rational('1/1')) if fractional == 'evens' || fractional == 'even money'
60
62
  if /(?<numerator>\d+)(\/|-to-)(?<denominator>\d+)/ =~ fractional then r = Rational("#{numerator}/#{denominator}") end
61
63
  r = r.reciprocal if fractional.end_with? ' on'
@@ -71,10 +73,11 @@ class FixedOdds
71
73
  # creates a new FixedOdds from moneyline form. Examples are
72
74
  # * +400
73
75
  # * -500
76
+ # @note (see #from_s)
74
77
  # @param [String] moneyline odds in moneyline form
75
78
  # @return (see FixedOdds.from_s)
76
79
  def FixedOdds.moneyline_odds(moneyline)
77
- raise %{could not parse "#{moneyline}" as moneyline odds} unless FixedOdds.moneyline_odds?(moneyline)
80
+ raise %{could not parse "#{moneyline}" as moneyline odds} unless self.moneyline_odds?(moneyline)
78
81
  sign = moneyline[0]
79
82
  if sign == '+' then new(Rational("#{moneyline}/100"))
80
83
  else new(Rational("100/#{moneyline.to_i.magnitude}"))
@@ -87,15 +90,15 @@ class FixedOdds
87
90
  # @param [String] decimal odds in decimal form
88
91
  # @return (see FixedOdds.from_s)
89
92
  def FixedOdds.decimal_odds(decimal)
90
- raise %{could not parse "#{decimal}" as decimal odds} unless FixedOdds.decimal_odds?(decimal)
93
+ raise %{could not parse "#{decimal}" as decimal odds} unless self.decimal_odds?(decimal)
91
94
  new(Rational(decimal.to_f - 1))
92
95
  end
93
96
 
94
97
  # calculates the profit won on a winning bet
95
- # @param [String] stake the stake
98
+ # @param [Money] stake the stake
96
99
  # @return [Money] the profit
97
100
  def profit_on_winning_stake(stake)
98
- stake.to_money * @fractional_odds
101
+ stake * @fractional_odds
99
102
  end
100
103
 
101
104
  # calculates the total return on a winning bet
@@ -103,15 +106,15 @@ class FixedOdds
103
106
  # @param (see #profit_on_winning_stake)
104
107
  # @return [Money] the total winnings
105
108
  def total_return_on_winning_stake(stake)
106
- profit_on_winning_stake(stake) + stake.to_money
109
+ profit_on_winning_stake(stake) + stake
107
110
  end
108
111
 
109
112
  # calculates the magnitude of the stake needed to
110
113
  # win the specified amount in profit
111
- # @param [String] win the desired profit
114
+ # @param [Money] win the desired profit
112
115
  # @return [Money] the stake required to realise that profit on a winning bet
113
116
  def stake_needed_to_win win
114
- win.to_money / @fractional_odds
117
+ win / @fractional_odds
115
118
  end
116
119
 
117
120
  # string representation in fractional form like '4/1'
@@ -129,7 +132,7 @@ class FixedOdds
129
132
  # string representation in moneyline form
130
133
  # @return [String] moneyline form representation
131
134
  def to_s_moneyline
132
- integral_number_with_sign_regex = "%+d"
135
+ integral_number_with_sign_regex = '%+d'
133
136
 
134
137
  if @fractional_odds > 1.0
135
138
  integral_number_with_sign_regex % (fractional_odds * 100).to_i
@@ -141,17 +144,29 @@ class FixedOdds
141
144
  # string representation in decimal form
142
145
  # @return [String] decimal form representation
143
146
  def to_s_decimal
144
- "%g" % (fractional_odds + 1)
147
+ '%g' % (fractional_odds + 1)
145
148
  end
146
149
 
147
- # equality method
148
- def ==(other)
149
- other.fractional_odds == @fractional_odds
150
- end
150
+ protected
151
151
 
152
- # low odds are those which pay out the most money
153
- # on a winning bet and vice-versa
154
- def <=>(other)
155
- other.fractional_odds <=> @fractional_odds
156
- end
152
+ # equality method
153
+ def ==(other)
154
+ other.fractional_odds == @fractional_odds
155
+ end
156
+
157
+ # low odds are those which pay out the most money
158
+ # on a winning bet and vice-versa
159
+ def <=>(other)
160
+ other.fractional_odds <=> @fractional_odds
161
+ end
157
162
  end
163
+
164
+ class Rational
165
+ # calculates the reciprocal
166
+ # @example
167
+ # Rational(2/3).reciprocal #=> Rational(3/2)
168
+ # @return [Rational] the reciprocal
169
+ def reciprocal
170
+ 1 / self
171
+ end
172
+ end
data/rodders.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rodders"
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
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"]
12
- s.date = "2011-11-10"
12
+ s.date = "2011-12-11"
13
13
  s.description = "Converts between fractional, decimal and moneyline odds for betting and gambling. Calculates how much can be won on a given stake."
14
14
  s.email = "nigel-lowry@ultra.eclipse.co.uk"
15
15
  s.extra_rdoc_files = [
@@ -27,7 +27,6 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "lib/FixedOdds.rb",
29
29
  "lib/MutuallyExclusiveCollection.rb",
30
- "lib/Rational.rb",
31
30
  "rodders.gemspec",
32
31
  "spec/FixedOdds_spec.rb",
33
32
  "spec/MutuallyExclusiveCollection_spec.rb",
@@ -37,7 +36,7 @@ Gem::Specification.new do |s|
37
36
  s.homepage = "http://github.com/nigel-lowry/rodders"
38
37
  s.licenses = ["MIT"]
39
38
  s.require_paths = ["lib"]
40
- s.rubygems_version = "1.8.10"
39
+ s.rubygems_version = "1.8.12"
41
40
  s.summary = "Fixed odds betting library"
42
41
 
43
42
  if s.respond_to? :specification_version then
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
3
 
3
4
  describe "FixedOdds" do
@@ -5,10 +6,10 @@ describe "FixedOdds" do
5
6
  describe "fractional_odds factory" do
6
7
  it "should raise error if not fractional odds" do
7
8
  expect {
8
- FixedOdds.fractional_odds '-400'
9
+ FixedOdds.fractional_odds '5'
9
10
  }.to raise_error(
10
11
  RuntimeError,
11
- /could not parse "-400" as fractional odds/
12
+ /could not parse "5" as fractional odds/
12
13
  )
13
14
  end
14
15
 
@@ -100,26 +101,26 @@ describe "FixedOdds" do
100
101
  end
101
102
 
102
103
  describe "positive figures" do
103
- it "should treat '+400' as meaning winning $400 on a $100 bet" do
104
+ it "should treat '+400' as meaning winning £400 on a £100 bet" do
104
105
  plus400 = FixedOdds.moneyline_odds('+400')
105
- plus400.profit_on_winning_stake('$100').should == '$400'
106
+ plus400.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(400, :GBP)
106
107
  end
107
108
 
108
- it "should treat +100 as meaning winning $100 on a $100 bet" do
109
+ it "should treat +100 as meaning winning £100 on a £100 bet" do
109
110
  plus100 = FixedOdds.moneyline_odds('+100')
110
- plus100.profit_on_winning_stake('$100').should == '$100'
111
+ plus100.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(100, :GBP)
111
112
  end
112
113
  end
113
114
 
114
115
  describe "negative figures" do
115
- it "should treat '-400' as meaning you need to wager $400 to win $100" do
116
+ it "should treat '-400' as meaning you need to wager £400 to win £100" do
116
117
  minus400 = FixedOdds.moneyline_odds('-400')
117
- minus400.profit_on_winning_stake('$400').should == '$100'
118
+ minus400.profit_on_winning_stake(Money.from_fixnum(400, :GBP)).should == Money.from_fixnum(100, :GBP)
118
119
  end
119
120
 
120
- it "should treat '-100' as meaning you need to wager $100 to win $100 (which is identical to '+100')" do
121
+ it "should treat '-100' as meaning you need to wager £100 to win £100 (which is identical to '+100')" do
121
122
  minus100 = FixedOdds.moneyline_odds('-100')
122
- minus100.profit_on_winning_stake('$100').should == '$100'
123
+ minus100.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(100, :GBP)
123
124
  end
124
125
  end
125
126
  end
@@ -134,19 +135,19 @@ describe "FixedOdds" do
134
135
  )
135
136
  end
136
137
 
137
- it "should treat '2' as meaning you have to wager $100 to win $100" do
138
+ it "should treat '2' as meaning you have to wager £100 to win £100" do
138
139
  d2 = FixedOdds.decimal_odds('2')
139
- d2.profit_on_winning_stake('$100').should == '$100'
140
+ d2.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(100, :GBP)
140
141
  end
141
142
 
142
- it "should treat '5' as meaning you have to wager $100 to win $400" do
143
+ it "should treat '5' as meaning you have to wager £100 to win £400" do
143
144
  d5 = FixedOdds.decimal_odds('5')
144
- d5.profit_on_winning_stake('$100').should == '$400'
145
+ d5.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(400, :GBP)
145
146
  end
146
147
 
147
- it "should treat '1.25' as meaning yo have to wager $400 to win $100" do
148
+ it "should treat '1.25' as meaning yo have to wager £400 to win £100" do
148
149
  d1_25 = FixedOdds.decimal_odds('1.25')
149
- d1_25.profit_on_winning_stake('$400').should == '$100'
150
+ d1_25.profit_on_winning_stake(Money.from_fixnum(400, :GBP)).should == Money.from_fixnum(100, :GBP)
150
151
  end
151
152
  end
152
153
 
@@ -224,8 +225,11 @@ describe "FixedOdds" do
224
225
  end
225
226
 
226
227
  describe "decimal odds" do
227
- it "should parse integral odds" do
228
- FixedOdds.from_s('2').should == FixedOdds.decimal_odds('2')
228
+ it "should parse integral odds of '2' as decimal odds, not as fractional odds of '2/1'" do
229
+ decimal_odds_2 = FixedOdds.from_s('2')
230
+
231
+ decimal_odds_2.should == FixedOdds.decimal_odds('2')
232
+ decimal_odds_2.should_not == FixedOdds.fractional_odds('2/1')
229
233
  end
230
234
 
231
235
  it "should parse floating-point odds" do
@@ -345,38 +349,38 @@ describe "FixedOdds" do
345
349
  end
346
350
 
347
351
  describe "#profit_on_winning_stake" do
348
- it "should return a profit of $400 on a $100 stake on a 4/1 bet" do
352
+ it "should return a profit of £400 on a £100 stake on a 4/1 bet" do
349
353
  fourToOne = FixedOdds.fractional_odds '4/1'
350
- fourToOne.profit_on_winning_stake('$100').should == '$400'
354
+ fourToOne.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(400, :GBP)
351
355
  end
352
356
 
353
- it "should return a profit of $25 on a $110 stake with a 1/4 bet" do
357
+ it "should return a profit of £25 on a £100 stake with a 1/4 bet" do
354
358
  oneToFour = FixedOdds.fractional_odds '1/4'
355
- oneToFour.profit_on_winning_stake('$100').should == '$25'
359
+ oneToFour.profit_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(25, :GBP)
356
360
  end
357
361
  end
358
362
 
359
363
  describe "#total_return_on_winning_stake" do
360
- it "should show that the full amount back on a winning 4/1 bet with a $100 stake is $500" do
364
+ it "should show that the full amount back on a winning 4/1 bet with a £100 stake is £500" do
361
365
  fourToOne = FixedOdds.fractional_odds '4/1'
362
- fourToOne.total_return_on_winning_stake('$100').should == '$500'
366
+ fourToOne.total_return_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(500, :GBP)
363
367
  end
364
368
 
365
- it "should show that the full amount back on a winning 1/4 bet with a $100 stake is $125" do
369
+ it "should show that the full amount back on a winning 1/4 bet with a £100 stake is £125" do
366
370
  oneToFour = FixedOdds.fractional_odds '1/4'
367
- oneToFour.total_return_on_winning_stake('$100').should == '$125'
371
+ oneToFour.total_return_on_winning_stake(Money.from_fixnum(100, :GBP)).should == Money.from_fixnum(125, :GBP)
368
372
  end
369
373
  end
370
374
 
371
375
  describe "#stake_needed_to_win" do
372
- it "should be $1 on a 1/1 to win $1" do
376
+ it "should be £1 on a 1/1 to win £1" do
373
377
  oneToOne = FixedOdds.fractional_odds '1/1'
374
- oneToOne.stake_needed_to_win('$1').should == '$1'
378
+ oneToOne.stake_needed_to_win(Money.from_fixnum(1, :GBP)).should == Money.from_fixnum(1, :GBP)
375
379
  end
376
380
 
377
- it "should be $100 on 4/1 to win $400" do
381
+ it "should be £100 on 4/1 to win £400" do
378
382
  fourToOne = FixedOdds.fractional_odds '4/1'
379
- fourToOne.stake_needed_to_win('$400').should == '$100'
383
+ fourToOne.stake_needed_to_win(Money.from_fixnum(400, :GBP)).should == Money.from_fixnum(100, :GBP)
380
384
  end
381
385
  end
382
386
 
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.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-10 00:00:00.000000000Z
12
+ date: 2011-12-11 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: money
16
- requirement: &70129203448100 !ruby/object:Gem::Requirement
16
+ requirement: &70347044732340 !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: *70129203448100
24
+ version_requirements: *70347044732340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70129203447620 !ruby/object:Gem::Requirement
27
+ requirement: &70347044731860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.3.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70129203447620
35
+ version_requirements: *70347044731860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &70129203447120 !ruby/object:Gem::Requirement
38
+ requirement: &70347044731320 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.6.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70129203447120
46
+ version_requirements: *70347044731320
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &70129203446600 !ruby/object:Gem::Requirement
49
+ requirement: &70347044730800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70129203446600
57
+ version_requirements: *70347044730800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &70129203446080 !ruby/object:Gem::Requirement
60
+ requirement: &70347044730320 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70129203446080
68
+ version_requirements: *70347044730320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &70129203445560 !ruby/object:Gem::Requirement
71
+ requirement: &70347044729800 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70129203445560
79
+ version_requirements: *70347044729800
80
80
  description: Converts between fractional, decimal and moneyline odds for betting and
81
81
  gambling. Calculates how much can be won on a given stake.
82
82
  email: nigel-lowry@ultra.eclipse.co.uk
@@ -96,7 +96,6 @@ files:
96
96
  - VERSION
97
97
  - lib/FixedOdds.rb
98
98
  - lib/MutuallyExclusiveCollection.rb
99
- - lib/Rational.rb
100
99
  - rodders.gemspec
101
100
  - spec/FixedOdds_spec.rb
102
101
  - spec/MutuallyExclusiveCollection_spec.rb
@@ -117,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
116
  version: '0'
118
117
  segments:
119
118
  - 0
120
- hash: -3008378059454965337
119
+ hash: 2781179272829975536
121
120
  required_rubygems_version: !ruby/object:Gem::Requirement
122
121
  none: false
123
122
  requirements:
@@ -126,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
125
  version: '0'
127
126
  requirements: []
128
127
  rubyforge_project:
129
- rubygems_version: 1.8.10
128
+ rubygems_version: 1.8.12
130
129
  signing_key:
131
130
  specification_version: 3
132
131
  summary: Fixed odds betting library
data/lib/Rational.rb DELETED
@@ -1,9 +0,0 @@
1
- class Rational
2
- # calculates the reciprocal
3
- # @example
4
- # Rational(2/3).reciprocal #=> Rational(3/2)
5
- # @return [Rational] the reciprocal
6
- def reciprocal
7
- 1 / self
8
- end
9
- end