diceroller 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.swp
2
+ *.swo
2
3
  pkg/*
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+
5
+ script: bundle exec rspec
data/README.txt CHANGED
@@ -5,4 +5,12 @@ Currently it supports the following:
5
5
  - Creating a new roll with dice of one size and a number of dice
6
6
  - Rerolling all dice of a certain value
7
7
  - Exploding all dice of a certain value (this creates a die with a value of original roll + the value of another die)
8
- This makes it possible to roll a 16 on a ten-sided die
8
+ This makes it possible to roll a 16 on a ten-sided die (for those systems that need to support this mechanic)
9
+
10
+ CONTRIBUTION GUIDELINES:
11
+
12
+ I want 'em.
13
+
14
+ I'd love to talk with you about building the right specs and the right API. I'm available as
15
+ twitter - emonical
16
+ email - solrane.altari@gmail.com (though this is subject to change)
@@ -1 +1 @@
1
- require 'roll'
1
+ require 'roller/roll'
@@ -0,0 +1,19 @@
1
+ class Die
2
+ attr_reader :value
3
+
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def ==(other_die)
9
+ if other_die.respond_to?(:value)
10
+ @value == other_die.value
11
+ else
12
+ @value == other_die
13
+ end
14
+ end
15
+
16
+ def +(other_die)
17
+ Die.new(@value + other_die.value)
18
+ end
19
+ end
@@ -0,0 +1,54 @@
1
+ require_relative 'die'
2
+ require_relative 'ruleset/base_ruleset'
3
+
4
+ class Roll
5
+ include Enumerable
6
+
7
+ attr_reader :dice
8
+
9
+ def initialize(num_of_dice, options = {})
10
+ @options = default_options.merge(options)
11
+ @rand_generator = @options[:rand_generator]
12
+ @dice = roll(num_of_dice)
13
+ unless @options[:ruleset].nil?
14
+ self.extend(@options[:ruleset])
15
+ end
16
+ end
17
+
18
+ def size
19
+ @dice.count
20
+ end
21
+
22
+ def ==(other)
23
+ @dice == other
24
+ end
25
+
26
+ private
27
+
28
+ def each
29
+ @dice.each { |die| yield die }
30
+ end
31
+
32
+ def default_options
33
+ { :die_size => 10, :rand_generator => Random, :ruleset => Ruleset::BaseRuleset}
34
+ end
35
+
36
+ def roll(number)
37
+ number.times.collect { roll_die }
38
+ end
39
+
40
+ def roll_die
41
+ Die.new(@rand_generator.rand(@options[:die_size]))
42
+ end
43
+
44
+ def each_die_that_matches(values)
45
+ @dice.map! do |die|
46
+ last_die = die
47
+ while values.any? { |value| last_die == value }
48
+ die, last_die = yield(die)
49
+ last_die = (last_die.nil? && die) || last_die
50
+ end
51
+ die
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,16 @@
1
+ module Ruleset
2
+ module BaseRuleset
3
+ def reroll(*values)
4
+ each_die_that_matches(values) { roll_die }
5
+ self
6
+ end
7
+
8
+ def explode(*values)
9
+ each_die_that_matches(values) do |die|
10
+ last_die = roll_die
11
+ [die + last_die, last_die]
12
+ end
13
+ self
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Roller
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,82 +1,50 @@
1
1
  require 'rspec'
2
- require 'roll'
3
-
4
- describe Roll do
2
+ require 'roller/roll'
5
3
 
4
+ describe "roll with base ruleset" do
6
5
  let(:rand_generator) do
7
6
  rand_generator = double('rand_gen').as_null_object
8
7
  rand_generator.stub(:rand).and_return(1,2,3,4,5,6,7,8,9,10)
9
8
  rand_generator
10
9
  end
11
10
 
12
- before(:each) do
13
- unless Roll.respond_to?(:size)
14
- class Roll
15
- def size
16
- @dice.count
17
- end
18
- end
19
- end
20
- end
21
-
22
- describe "roll" do
23
- it "should have <parameters> elements" do
24
- roll = Roll.new(2, rand_generator)
25
- roll.should have(2).items
26
- end
27
-
28
- it "returns a list of numbers" do
29
- roll = Roll.new(10, rand_generator)
30
- roll.should == [1,2,3,4,5,6,7,8,9,10]
31
- end
11
+ let(:mock_obj_hash) { Hash[:rand_generator, rand_generator] }
32
12
 
33
- it "calls Random once for each call" do
34
- Random.should_receive(:rand).exactly(5)
35
- roll = Roll.new(5)
36
- end
37
-
38
- it "calls Random with default value of 10 when no options provided" do
39
- Random.should_receive(:rand).with(10).exactly(5)
40
- roll = Roll.new(5)
41
- end
42
- end
43
-
44
- describe "reroll" do
13
+ describe "rerolls" do
45
14
  it "rerolls all dice that match the parameter" do
46
- roll = Roll.new(5, rand_generator)
15
+ roll = Roll.new(5, mock_obj_hash)
47
16
  roll.reroll(3).should == [1,2,6,4,5]
48
17
  end
49
18
 
50
19
  it "rerolls all dice that match any of the parameters" do
51
- roll = Roll.new(5, rand_generator)
20
+ roll = Roll.new(5, mock_obj_hash)
52
21
  roll.reroll(3,4).should == [1,2,6,7,5]
53
22
  end
54
23
 
55
24
  it "applies until it can't" do
56
25
  rand_generator = double('rand_gen').as_null_object
57
26
  rand_generator.stub(:rand).and_return(1,1,1,4)
58
- roll = Roll.new(1, rand_generator)
27
+ roll = Roll.new(1, Hash[:rand_generator, rand_generator])
59
28
  roll.reroll(1).should == [4]
60
29
  end
61
30
  end
62
31
 
63
32
  describe "explode" do
64
33
  it "adds die to the result of all dice that match the parameter" do
65
- roll = Roll.new(5, rand_generator)
34
+ roll = Roll.new(5, mock_obj_hash)
66
35
  roll.explode(3).should == [1,2,9,4,5]
67
36
  end
68
37
 
69
38
  it "adds die to the result of all dice that match any of the parameters" do
70
- roll = Roll.new(5, rand_generator)
39
+ roll = Roll.new(5, mock_obj_hash)
71
40
  roll.explode(3,4).should == [1,2,9,11,5]
72
41
  end
73
42
 
74
43
  it "applies until it can't" do
75
44
  rand_generator = double('rand_gen').as_null_object
76
45
  rand_generator.stub(:rand).and_return(10,10,10,9)
77
- roll = Roll.new(1, rand_generator)
46
+ roll = Roll.new(1, Hash[:rand_generator, rand_generator])
78
47
  roll.explode(10).should == [39]
79
48
  end
80
49
  end
81
-
82
50
  end
@@ -0,0 +1,47 @@
1
+ require 'rspec'
2
+ require 'roller/roll'
3
+
4
+ describe Roll do
5
+ let(:rand_generator) do
6
+ rand_generator = double('rand_gen').as_null_object
7
+ rand_generator.stub(:rand).and_return(1,2,3,4,5,6,7,8,9,10)
8
+ rand_generator
9
+ end
10
+
11
+ let(:mock_obj_hash) { Hash[:rand_generator, rand_generator] }
12
+
13
+ describe "by default" do
14
+ it "uses the base ruleset" do
15
+ roll = Roll.new(1)
16
+ roll.is_a?(Ruleset::BaseRuleset).should be_true
17
+ end
18
+ end
19
+
20
+ describe "roll" do
21
+ it "should have <parameters> elements" do
22
+ roll = Roll.new(2, mock_obj_hash)
23
+ roll.should have(2).items
24
+ end
25
+
26
+ it "returns a list of numbers" do
27
+ roll = Roll.new(10, mock_obj_hash)
28
+ roll.should == [1,2,3,4,5,6,7,8,9,10]
29
+ end
30
+
31
+ it "calls Random once for each call" do
32
+ Random.should_receive(:rand).exactly(5)
33
+ roll = Roll.new(5)
34
+ end
35
+
36
+ it "calls Random with default value of 10 when no options provided" do
37
+ Random.should_receive(:rand).with(10).exactly(5)
38
+ roll = Roll.new(5)
39
+ end
40
+
41
+ it "calls Random with specified value if options provided" do
42
+ options = { :die_size => 8, :rand_generator => Random }
43
+ Random.should_receive(:rand).with(8).exactly(5)
44
+ roll = Roll.new(5, options)
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,78 +1,78 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: diceroller
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
4
5
  prerelease:
5
- version: 0.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Edward Monical-Vuylsteke
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-06 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-11-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
23
21
  version: 2.6.0
24
22
  type: :development
25
- version_requirements: *id001
26
- description: |-
27
- A dice rolling gem that provides an effective
28
- and hopefully extensible API to meet the extensive
29
- needs of the roleplaying game community
30
- email:
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.6.0
30
+ description: ! "A dice rolling gem that provides an effective\n and
31
+ hopefully extensible API to meet the extensive\n needs of the
32
+ roleplaying game community"
33
+ email:
31
34
  - solrane.altari@gmail.com
32
35
  executables: []
33
-
34
36
  extensions: []
35
-
36
37
  extra_rdoc_files: []
37
-
38
- files:
38
+ files:
39
39
  - .gitignore
40
40
  - .rspec
41
+ - .travis.yml
41
42
  - Gemfile
42
43
  - Gemfile.lock
43
44
  - README.txt
44
45
  - Rakefile
45
46
  - lib/diceroller.rb
46
- - lib/roll.rb
47
+ - lib/roller/die.rb
48
+ - lib/roller/roll.rb
49
+ - lib/roller/ruleset/base_ruleset.rb
47
50
  - lib/roller/version.rb
48
51
  - roller.gemspec
49
- - spec/roll_spec.rb
52
+ - spec/roller/base_ruleset_spec.rb
53
+ - spec/roller/roll_spec.rb
50
54
  homepage: https://github.com/emonical/roller
51
55
  licenses: []
52
-
53
56
  post_install_message:
54
57
  rdoc_options: []
55
-
56
- require_paths:
58
+ require_paths:
57
59
  - lib
58
- required_ruby_version: !ruby/object:Gem::Requirement
60
+ required_ruby_version: !ruby/object:Gem::Requirement
59
61
  none: false
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: "0"
64
- required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
67
  none: false
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: "0"
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
70
72
  requirements: []
71
-
72
73
  rubyforge_project:
73
- rubygems_version: 1.8.5
74
+ rubygems_version: 1.8.24
74
75
  signing_key:
75
76
  specification_version: 3
76
77
  summary: Dice roller for roleplaying games
77
78
  test_files: []
78
-
@@ -1,48 +0,0 @@
1
- class Roll
2
- include Enumerable
3
-
4
- def initialize(num_of_dice, options = { :die_size => 10, :rand_generator => Random})
5
- @options = options
6
- @rand_generator = @options[:rand_generator]
7
- @dice = roll(num_of_dice)
8
- end
9
-
10
- def reroll(*values)
11
- each_die_that_matches(values) { roll_die }
12
- self
13
- end
14
-
15
- def explode(*values)
16
- each_die_that_matches(values) { |die| last_die = roll_die; [die + last_die, last_die] }
17
- self
18
- end
19
-
20
- def ==(other)
21
- @dice == other
22
- end
23
-
24
- def each
25
- @dice.each { |die| yield die }
26
- end
27
-
28
- private
29
-
30
- def roll(number)
31
- number.times.collect { roll_die }
32
- end
33
-
34
- def roll_die
35
- @rand_generator.rand(@options[:die_size])
36
- end
37
-
38
- def each_die_that_matches(values)
39
- @dice.map! do |die|
40
- last_die = die
41
- while values.any? { |value| value == last_die}
42
- die, last_die = yield(die)
43
- last_die = (last_die.nil? && die) || last_die
44
- end
45
- die
46
- end
47
- end
48
- end