nerd_dice 0.2.1 → 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/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