diceroller 0.0.2 → 0.0.3

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/.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