nerd_dice 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/nerd_dice.rb CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  require "nerd_dice/version"
4
4
  require "nerd_dice/configuration"
5
+ require "nerd_dice/sets_randomization_technique"
6
+ require "nerd_dice/die"
7
+ require "nerd_dice/dice_set"
8
+ require "nerd_dice/class_methods"
5
9
  require "securerandom"
6
10
  # Nerd dice allows you to roll polyhedral dice and add bonuses as you would in
7
11
  # a tabletop roleplaying game. You can choose to roll multiple dice and keep a
@@ -9,168 +13,14 @@ require "securerandom"
9
13
  # ability scores or rolling with advantage and disadvantage if those mechanics
10
14
  # exist in your game.
11
15
  #
12
- # Usage:
13
- # Right now there is only a single class method :total_dice
16
+ # This module is broken down into multiple source files:
17
+ # The class_methods file has all of the module_level methods called by NerdDice.method_name
14
18
  #
15
- # If you wanted to roll a single d4, you would execute:
16
- # <tt>NerdDice.total_dice(4)</tt>
17
- #
18
- # If you wanted to roll 3d6, you would execute
19
- # <tt>NerdDice.total_dice(6, 3)</tt>
20
- #
21
- # If you wanted to roll a d20 and add 5 to the value, you would execute
22
- # <tt>NerdDice.total_dice(20, 1, { bonus: 5 })</tt>
23
- #
24
- # The bonus in the options hash must be an Integer or it will be ignored
19
+ # See the README for overall usage for the module
25
20
  module NerdDice
26
21
  class Error < StandardError; end
27
22
 
28
23
  RANDOMIZATION_TECHNIQUES = %i[securerandom random_rand random_object randomized].freeze
29
-
30
- class << self
31
- attr_reader :count_since_last_refresh
32
-
33
- ############################
34
- # configure class method
35
- ############################
36
- # Arguments: None
37
- # Expects and yields to a block where configuration is specified.
38
- # See README and NerdDice::Configuration class for config options
39
- # Return (NerdDice::Configuration) the Configuration object tied to the
40
- # @configuration class instance variable
41
- def configure
42
- yield configuration
43
- configuration
44
- end
45
-
46
- ############################
47
- # configuration class method
48
- ############################
49
- # Arguments: None
50
- # Provides the lazy-loaded class instance variable @configuration
51
- # Return (NerdDice::Configuration) the Configuration object tied to the
52
- # @configuration class instance variable
53
- def configuration
54
- @configuration ||= Configuration.new
55
- end
56
-
57
- ############################
58
- # total_dice class method
59
- ############################
60
- # Arguments:
61
- # number_of_sides (Integer) => the number of sides of the dice to roll
62
- # number_of_dice (Integer, DEFAULT: 1) => the quantity to roll of the type
63
- # of die specified in the number_of_sides argument.
64
- # options (Hash, DEFAULT: {}) any additional options you wish to include
65
- # :bonus (Integer) => The total bonus (positive integer) or penalty
66
- # (negative integer) to modify the total by. Is added to the total of
67
- # all dice after they are totaled, not to each die rolled
68
- #
69
- # Return (Integer) => Total of the dice rolled, plus modifier if applicable
70
- def total_dice(number_of_sides, number_of_dice = 1, **opts)
71
- total = 0
72
- number_of_dice.times do
73
- total += execute_die_roll(number_of_sides, opts[:randomization_technique])
74
- end
75
- begin
76
- total += opts[:bonus].to_i
77
- rescue NoMethodError
78
- raise ArgumentError, "Bonus must be a value that responds to :to_i"
79
- end
80
- total
81
- end
82
-
83
- ############################
84
- # execute_die_roll class method
85
- ############################
86
- # Arguments:
87
- # number_of_sides (Integer) => the number of sides of the die to roll
88
- # using_generator (Symbol) => must be one of the symbols in
89
- # RANDOMIZATION_TECHNIQUES or nil
90
- #
91
- # Return (Integer) => Value of the single die rolled
92
- def execute_die_roll(number_of_sides, using_generator = nil)
93
- @count_since_last_refresh ||= 0
94
- gen = get_number_generator(using_generator)
95
- result = gen.rand(number_of_sides) + 1
96
- increment_and_evalutate_refresh_seed
97
- result
98
- end
99
-
100
- ############################
101
- # refresh_seed! class method
102
- ############################
103
- # Options: (none required)
104
- # randomization_technique (Symbol) => must be one of the symbols in
105
- # RANDOMIZATION_TECHNIQUES if specified
106
- # random_rand_seed (Integer) => Seed to set for Random
107
- # random_object_seed (Integer) => Seed to set for new Random object
108
- # Return (Hash or nil) => Previous values of generator seeds that were refreshed
109
- def refresh_seed!(**opts)
110
- technique, random_rand_new_seed, random_object_new_seed = parse_refresh_options(opts)
111
- @count_since_last_refresh = 0
112
- return nil if technique == :securerandom
113
-
114
- reset_appropriate_seeds!(technique, random_rand_new_seed, random_object_new_seed)
115
- end
116
-
117
- private
118
-
119
- def get_number_generator(using_generator = nil)
120
- using_generator ||= configuration.randomization_technique
121
- case using_generator
122
- when :securerandom then SecureRandom
123
- when :random_rand then Random
124
- when :random_object then @random_object ||= Random.new
125
- when :randomized then random_generator
126
- else raise ArgumentError, "Unrecognized generator. Must be one of #{RANDOMIZATION_TECHNIQUES.join(', ')}"
127
- end
128
- end
129
-
130
- def random_generator
131
- gen = RANDOMIZATION_TECHNIQUES.reject { |el| el == :randomized }.sample
132
- get_number_generator(gen)
133
- end
134
-
135
- def refresh_random_rand_seed!(new_seed)
136
- new_seed ? Random.srand(new_seed) : Random.srand
137
- end
138
-
139
- def refresh_random_object_seed!(new_seed)
140
- old_seed = @random_object&.seed
141
- @random_object = new_seed ? Random.new(new_seed) : Random.new
142
- old_seed
143
- end
144
-
145
- def parse_refresh_options(opts)
146
- [
147
- opts[:randomization_technique] || configuration.randomization_technique,
148
- opts[:random_rand_seed],
149
- opts[:random_object_seed]
150
- ]
151
- end
152
-
153
- # rubocop:disable Metrics/MethodLength
154
- def reset_appropriate_seeds!(technique, random_rand_new_seed, random_object_new_seed)
155
- return_hash = {}
156
- case technique
157
- when :random_rand
158
- return_hash[:random_rand_prior_seed] = refresh_random_rand_seed!(random_rand_new_seed)
159
- when :random_object
160
- return_hash[:random_object_prior_seed] = refresh_random_object_seed!(random_object_new_seed)
161
- when :randomized
162
- return_hash[:random_rand_prior_seed] = refresh_random_rand_seed!(random_rand_new_seed)
163
- return_hash[:random_object_prior_seed] = refresh_random_object_seed!(random_object_new_seed)
164
- end
165
- return_hash
166
- end
167
- # rubocop:enable Metrics/MethodLength
168
-
169
- def increment_and_evalutate_refresh_seed
170
- @count_since_last_refresh += 1
171
- return unless configuration.refresh_seed_interval
172
-
173
- refresh_seed! if @count_since_last_refresh >= configuration.refresh_seed_interval
174
- end
175
- end
24
+ ABILITY_SCORE_KEYS = %i[ability_score_array_size ability_score_number_of_sides ability_score_dice_rolled
25
+ ability_score_dice_kept].freeze
176
26
  end
data/nerd_dice.gemspec CHANGED
@@ -28,7 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.metadata["bug_tracker_uri"] = "https://github.com/statelesscode/nerd_dice/issues"
29
29
  spec.metadata["documentation_uri"] = "https://github.com/statelesscode/nerd_dice/README.md"
30
30
  spec.metadata["github_repo"] = "https://github.com/statelesscode/nerd_dice"
31
- spec.metadata["rubygems_mfa_required"] = "true"
32
31
 
33
32
  # Specify which files should be added to the gem when it is released.
34
33
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -44,13 +43,13 @@ Gem::Specification.new do |spec|
44
43
  spec.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $PROGRAM_NAME.end_with?("gem")
45
44
 
46
45
  # Dependencies
47
- spec.add_dependency "securerandom", "~> 0.2", ">= 0.2.2"
46
+ spec.add_dependency "securerandom", "~> 0.1", ">= 0.1.0"
48
47
 
49
48
  # Development Dependencies
50
- spec.add_development_dependency "coveralls_reborn", "~> 0.27.0"
51
- spec.add_development_dependency "rubocop", "~> 1.46", ">= 1.46.0"
52
- spec.add_development_dependency "rubocop-performance", "~> 1.16", ">= 1.16.0"
49
+ spec.add_development_dependency "coveralls_reborn", "~> 0.22.0"
50
+ spec.add_development_dependency "rubocop", "~> 1.20", ">= 1.20.0"
51
+ spec.add_development_dependency "rubocop-performance", "~> 1.11", ">= 1.11.5"
53
52
  spec.add_development_dependency "rubocop-rake", "~> 0.6", ">= 0.6.0"
54
- spec.add_development_dependency "rubocop-rspec", "~> 2.18", ">= 2.18.1"
53
+ spec.add_development_dependency "rubocop-rspec", "~> 2.4", ">= 2.4.0"
55
54
  spec.add_development_dependency "simplecov-lcov", "~> 0.8.0"
56
55
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nerd_dice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Duchemin
@@ -10,33 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIEhTCCAu2gAwIBAgIBATANBgkqhkiG9w0BAQsFADBEMRYwFAYDVQQDDA1zdGF0
14
- ZWxlc3Njb2RlMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
15
- FgNjb20wHhcNMjMwMjIzMjMyMTQwWhcNMjQwMjIzMjMyMTQwWjBEMRYwFAYDVQQD
16
- DA1zdGF0ZWxlc3Njb2RlMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJ
17
- k/IsZAEZFgNjb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCxVzHS
18
- gYszan//tjTSO0z59UO1rUiT5G0//iyhiaYIiuwxhYFbfD+wOCou4M18pQtEb4qx
19
- o67tPfGimBAVak6fGfo8fo1ByHiKCvx3jgOjxNifT9pRFlBSr6ZvyXeu7zA0ddLr
20
- slw92DNqeRlZXqB0mxDtpKWONGc1XhAqEjEP3VL7g7x0xPQShcpXg/OyRPR5vyv8
21
- 66pXdFrXYZGrySfIB6ZOWFV6wGBj603rPdXOeYVeks6hKvw3wb4G1s7tvwTA5MWI
22
- otw6Mp9TaMdms9zTc5A3N58pueKfBJfwkICkdAGJDWC6sIXECoaTDRqVK96RSH/1
23
- 8tEPDoFYpJDOa5byX1j7srwO0B6WOtPxix7gW1wBbEp7eWSQf1k3k9XEh32SRsPq
24
- NJObRfhkzoa9p1tPkVP3nasDTK5gtisolwhb7Vimeup54yKfT/THv2iNEnGTvK1P
25
- sV4vC8nch88lBI1mIecmSh/mwED4Mb1dNtcyuB/+XnSI8vIzXJKAAKaT0eMCAwEA
26
- AaOBgTB/MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBRP42hSa0JV
27
- QGDSobiGTYyfM570hjAiBgNVHREEGzAZgRdzdGF0ZWxlc3Njb2RlQGdtYWlsLmNv
28
- bTAiBgNVHRIEGzAZgRdzdGF0ZWxlc3Njb2RlQGdtYWlsLmNvbTANBgkqhkiG9w0B
29
- AQsFAAOCAYEANtaR6OV7p1IJOsvVgGQzVg88NIOeXrfOaEDUPb6eg4JMOSL0Cvvl
30
- 2F7lB/ykbQcO4Oe7NucuavC7ClyG3c/V5eQ5TtPNWkMbVN9ESVR8wk5SjhiI8L35
31
- MBxJ6YU27eyDmazQJ7eCYcRJkuyWt3KcqgsEh7JyNnKcJ/3rgf1QW0IyJiGsXM1I
32
- SssQ/t7Ia2tVMrVMsvs834v9FRpVbO3dHdCO4t7zQBIADVcj4NqCDV10D6aji/Aa
33
- 35YJHwlkhuZH6AYC45QHt9dW0/OLmbFwoJqW7syrso2PParyMr4YcJwucXViRiL7
34
- l5aVpYdz/RTqdB92Mmud5Hj5zkuEE4CHBh8L8AJC5kZu/YUXXDtuECSMVhg5O84h
35
- QsdcuygyVASmw2aliMAFXfIBDYelduG0XwjdOREN3q4SDTKP+pfBxx6OdD1RfsYF
36
- /9HhtVbKLq34iQftF4oIH66bYDEyG5y4CLKQ8Nq0WDWq50OcaP9KpDiS21BC43SW
37
- t+NX7PDOWx4k
13
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1zdGF0
14
+ ZWxlc3Njb2RlL0RDPWdtYWlsL0RDPWNvbTAeFw0yMDEyMDYyMzQ1NTZaFw0yMTEy
15
+ MDYyMzQ1NTZaMCgxJjAkBgNVBAMMHXN0YXRlbGVzc2NvZGUvREM9Z21haWwvREM9
16
+ Y29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyHIMJi0o3bwBZsx5
17
+ TQ35XByFsdDRsro3T+0NY7EAILtOiU04o9C2NPOp/RQE7BXQgMjGebwp6bT6QvzN
18
+ 6noV4jPL7Fi5pWw08QygG7f+73YUBb+8d8o+3xGrC+UO5h1PZEtVcZwUWUG18QBE
19
+ fbDinQT6P4IDQoZwhfrPCB+aBfUyQp4Ok7oD7MEWqsq9SjrSxqxfk4+oZdXUySe7
20
+ Vi5vnzVQ5uFf56NHwWnNKCzJzmH84mBO5MzHaQpHNzKGJPoUmzLU5RBlCH6YXqBG
21
+ KhXTMUDBWKJmJ3RDry/FpGgJLKu4wzFRYjXla6IjeKozWGuPNNJ+2mesXKhsX7bo
22
+ vVCzRxPEupbEg/0FkJiWpiGlSPOdd6oJiwX8E6rlEeV605xrbOQewkbovHkYTMtG
23
+ +NH+u08x0z4Oj71kmDLwuj812uS0mtrCg2VhiYO0ZCQ4XrwBsBfK+/MtMlR+o6sG
24
+ /zvz/vHVJKaLTQxRp5oGo4QH6HfbOnwzTkXdZnt5AlN31ErJAgMBAAGjgYEwfzAJ
25
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUC7seYydsGO6O1qT4nVVD
26
+ G/LkiHYwIgYDVR0RBBswGYEXc3RhdGVsZXNzY29kZUBnbWFpbC5jb20wIgYDVR0S
27
+ BBswGYEXc3RhdGVsZXNzY29kZUBnbWFpbC5jb20wDQYJKoZIhvcNAQELBQADggGB
28
+ ADPRFRB1cjqdcE2O0jtqiDRmrR62uEYBiUbkRPVhyoEp/cK0TVhAs9mGWAyCWu0M
29
+ LewUeqNTUvQ9MgvagcKcnxa2RTjdrP3nGnwpStMr9bm3ArNJEzvWEs0Eusk9y73x
30
+ fjy0qH2pw5WPfWcKYlDehMXqOP+a4udYsz0YSNiI8qEfkDCSqTJN11d5kSjVjwGB
31
+ xkauxDT68j1JZRjPmQl3dl+DCgxkoziWX2mFTPLfGg5vZ0t6gmhdUtLvJtNIo0IX
32
+ 477E5UjmE1+rULQp/fsH6n5+H+t2eCED41ST+gkKbaQBUfIuUaCmdHz9sJaIIBw2
33
+ 6ordFa1nrLV4w5Uf6qYFnWVhIWX4GToyZSPO2s0DPYp3PWFJ4VtzKa2vp1TR5ZEA
34
+ dkij2eQ9M8bzWWmW+A7RNaI0CzLl967bKGBSaMVCsZGBarggWD8UwJnBhTuOPZGR
35
+ WQ4faXJSevxT+x9TgyUNJINPkz/KqreClzdL83cwxPzFFQto7zF6zMCsj0slqJjW
36
+ EQ==
38
37
  -----END CERTIFICATE-----
39
- date: 2023-02-24 00:00:00.000000000 Z
38
+ date: 2021-09-11 00:00:00.000000000 Z
40
39
  dependencies:
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: securerandom
@@ -44,74 +43,74 @@ dependencies:
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: '0.2'
46
+ version: '0.1'
48
47
  - - ">="
49
48
  - !ruby/object:Gem::Version
50
- version: 0.2.2
49
+ version: 0.1.0
51
50
  type: :runtime
52
51
  prerelease: false
53
52
  version_requirements: !ruby/object:Gem::Requirement
54
53
  requirements:
55
54
  - - "~>"
56
55
  - !ruby/object:Gem::Version
57
- version: '0.2'
56
+ version: '0.1'
58
57
  - - ">="
59
58
  - !ruby/object:Gem::Version
60
- version: 0.2.2
59
+ version: 0.1.0
61
60
  - !ruby/object:Gem::Dependency
62
61
  name: coveralls_reborn
63
62
  requirement: !ruby/object:Gem::Requirement
64
63
  requirements:
65
64
  - - "~>"
66
65
  - !ruby/object:Gem::Version
67
- version: 0.27.0
66
+ version: 0.22.0
68
67
  type: :development
69
68
  prerelease: false
70
69
  version_requirements: !ruby/object:Gem::Requirement
71
70
  requirements:
72
71
  - - "~>"
73
72
  - !ruby/object:Gem::Version
74
- version: 0.27.0
73
+ version: 0.22.0
75
74
  - !ruby/object:Gem::Dependency
76
75
  name: rubocop
77
76
  requirement: !ruby/object:Gem::Requirement
78
77
  requirements:
79
78
  - - "~>"
80
79
  - !ruby/object:Gem::Version
81
- version: '1.46'
80
+ version: '1.20'
82
81
  - - ">="
83
82
  - !ruby/object:Gem::Version
84
- version: 1.46.0
83
+ version: 1.20.0
85
84
  type: :development
86
85
  prerelease: false
87
86
  version_requirements: !ruby/object:Gem::Requirement
88
87
  requirements:
89
88
  - - "~>"
90
89
  - !ruby/object:Gem::Version
91
- version: '1.46'
90
+ version: '1.20'
92
91
  - - ">="
93
92
  - !ruby/object:Gem::Version
94
- version: 1.46.0
93
+ version: 1.20.0
95
94
  - !ruby/object:Gem::Dependency
96
95
  name: rubocop-performance
97
96
  requirement: !ruby/object:Gem::Requirement
98
97
  requirements:
99
98
  - - "~>"
100
99
  - !ruby/object:Gem::Version
101
- version: '1.16'
100
+ version: '1.11'
102
101
  - - ">="
103
102
  - !ruby/object:Gem::Version
104
- version: 1.16.0
103
+ version: 1.11.5
105
104
  type: :development
106
105
  prerelease: false
107
106
  version_requirements: !ruby/object:Gem::Requirement
108
107
  requirements:
109
108
  - - "~>"
110
109
  - !ruby/object:Gem::Version
111
- version: '1.16'
110
+ version: '1.11'
112
111
  - - ">="
113
112
  - !ruby/object:Gem::Version
114
- version: 1.16.0
113
+ version: 1.11.5
115
114
  - !ruby/object:Gem::Dependency
116
115
  name: rubocop-rake
117
116
  requirement: !ruby/object:Gem::Requirement
@@ -138,20 +137,20 @@ dependencies:
138
137
  requirements:
139
138
  - - "~>"
140
139
  - !ruby/object:Gem::Version
141
- version: '2.18'
140
+ version: '2.4'
142
141
  - - ">="
143
142
  - !ruby/object:Gem::Version
144
- version: 2.18.1
143
+ version: 2.4.0
145
144
  type: :development
146
145
  prerelease: false
147
146
  version_requirements: !ruby/object:Gem::Requirement
148
147
  requirements:
149
148
  - - "~>"
150
149
  - !ruby/object:Gem::Version
151
- version: '2.18'
150
+ version: '2.4'
152
151
  - - ">="
153
152
  - !ruby/object:Gem::Version
154
- version: 2.18.1
153
+ version: 2.4.0
155
154
  - !ruby/object:Gem::Dependency
156
155
  name: simplecov-lcov
157
156
  requirement: !ruby/object:Gem::Requirement
@@ -206,7 +205,19 @@ files:
206
205
  - checksum/nerd_dice-0.2.0.gem.sha256
207
206
  - checksum/nerd_dice-0.2.0.gem.sha512
208
207
  - lib/nerd_dice.rb
208
+ - lib/nerd_dice/class_methods.rb
209
+ - lib/nerd_dice/class_methods/configure.rb
210
+ - lib/nerd_dice/class_methods/execute_die_roll.rb
211
+ - lib/nerd_dice/class_methods/harvest_totals.rb
212
+ - lib/nerd_dice/class_methods/refresh_seed.rb
213
+ - lib/nerd_dice/class_methods/roll_ability_scores.rb
214
+ - lib/nerd_dice/class_methods/roll_dice.rb
215
+ - lib/nerd_dice/class_methods/total_ability_scores.rb
216
+ - lib/nerd_dice/class_methods/total_dice.rb
209
217
  - lib/nerd_dice/configuration.rb
218
+ - lib/nerd_dice/dice_set.rb
219
+ - lib/nerd_dice/die.rb
220
+ - lib/nerd_dice/sets_randomization_technique.rb
210
221
  - lib/nerd_dice/version.rb
211
222
  - nerd_dice.gemspec
212
223
  homepage: https://github.com/statelesscode/nerd_dice
@@ -221,7 +232,6 @@ metadata:
221
232
  bug_tracker_uri: https://github.com/statelesscode/nerd_dice/issues
222
233
  documentation_uri: https://github.com/statelesscode/nerd_dice/README.md
223
234
  github_repo: https://github.com/statelesscode/nerd_dice
224
- rubygems_mfa_required: 'true'
225
235
  post_install_message:
226
236
  rdoc_options: []
227
237
  require_paths:
@@ -237,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
247
  - !ruby/object:Gem::Version
238
248
  version: '0'
239
249
  requirements: []
240
- rubygems_version: 3.4.7
250
+ rubygems_version: 3.2.22
241
251
  signing_key:
242
252
  specification_version: 4
243
253
  summary: A Ruby Gem for rolling polyhedral dice.
metadata.gz.sig CHANGED
Binary file