nerd_dice 0.3.1 → 0.4.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/main.yml +3 -3
- data/.rubocop.yml +200 -14
- data/CHANGELOG.md +78 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +44 -49
- data/README.md +131 -1
- data/bin/generate_checksums +2 -2
- data/bin/nerd_dice_benchmark +118 -0
- data/certs/msducheminjr.pem +24 -25
- data/lib/nerd_dice/convenience_methods.rb +279 -0
- data/lib/nerd_dice/version.rb +1 -1
- data/lib/nerd_dice.rb +3 -0
- data/nerd_dice.gemspec +5 -6
- data.tar.gz.sig +0 -0
- metadata +46 -47
- metadata.gz.sig +2 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f64389429514a7d0c2a8410b2e27575e5c11b316b50cee41b37c58d8f8af953
|
4
|
+
data.tar.gz: 4d2365e3ce8139d4675695dfe47edf9ef5d52b9cc873beb5c7c314b8955aaa33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8bf0ea2c85e3aedf952d82d0f511463accedcad5122b14a7d6769a94100902887ca0e52cf85a6d8b69a75a6cd750858852ad71e34980e61624d39666bedff5b
|
7
|
+
data.tar.gz: ee2e8117b3071872a3d07353dabd4685c4a20e188591e80cbcb93609ba9f134ab22082ae01bee152c34c9cdd1a81a6a40aec2b1521d3e2a106d10f0c8fa313ae
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.github/workflows/main.yml
CHANGED
@@ -14,7 +14,7 @@ jobs:
|
|
14
14
|
runs-on: ubuntu-latest
|
15
15
|
strategy:
|
16
16
|
matrix:
|
17
|
-
ruby-version: ['
|
17
|
+
ruby-version: ['2.7', '3.0']
|
18
18
|
|
19
19
|
steps:
|
20
20
|
- uses: actions/checkout@v2
|
@@ -39,7 +39,7 @@ jobs:
|
|
39
39
|
- name: Set up Ruby
|
40
40
|
uses: ruby/setup-ruby@v1
|
41
41
|
with:
|
42
|
-
ruby-version: '3.
|
42
|
+
ruby-version: '3.0'
|
43
43
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
44
44
|
- name: Run rubocop
|
45
45
|
run: bundle exec rubocop --parallel
|
@@ -51,7 +51,7 @@ jobs:
|
|
51
51
|
- name: Set up Ruby
|
52
52
|
uses: ruby/setup-ruby@v1
|
53
53
|
with:
|
54
|
-
ruby-version: '3.
|
54
|
+
ruby-version: '3.0'
|
55
55
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
56
56
|
- name: Run benchmark script
|
57
57
|
run: bin/nerd_dice_benchmark
|
data/.rubocop.yml
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
# RuboCop configuration file for NerdDice gem
|
2
|
-
#
|
3
|
-
# This is the RuboCop configuration for the gem. By default new cops are enabled
|
4
|
-
# by default when the RuboCop gems are updated in the bundle. Before the would
|
5
|
-
# show up as warnings until they were added to the configuration file. Now they
|
6
|
-
# will be enabled by default, and a case-by-case descision can be made whether
|
7
|
-
# to exclude new violations in the configuration explicitly or update the
|
8
|
-
# codebase to the gem to conform to the new standard.
|
9
1
|
require:
|
10
2
|
- rubocop-performance
|
11
3
|
- rubocop-rake
|
@@ -16,12 +8,14 @@ AllCops:
|
|
16
8
|
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
17
9
|
# to ignore them, so only the ones explicitly set in this file are enabled.
|
18
10
|
#DisabledByDefault: true
|
19
|
-
|
20
|
-
# New cops are now enabled by default as of 2023-02-20
|
21
|
-
NewCops: enable
|
22
11
|
Exclude:
|
23
12
|
- '**/templates/**/*'
|
24
13
|
- '**/vendor/**/*'
|
14
|
+
- 'node_modules/**/*'
|
15
|
+
|
16
|
+
Performance:
|
17
|
+
Exclude:
|
18
|
+
- '**/test/**/*'
|
25
19
|
|
26
20
|
# Prefer &&/|| over and/or.
|
27
21
|
Style/AndOr:
|
@@ -117,6 +111,15 @@ Style/MethodDefParentheses:
|
|
117
111
|
Style/FrozenStringLiteralComment:
|
118
112
|
Enabled: true
|
119
113
|
EnforcedStyle: always
|
114
|
+
Exclude:
|
115
|
+
- 'actionview/test/**/*.builder'
|
116
|
+
- 'actionview/test/**/*.ruby'
|
117
|
+
- 'actionpack/test/**/*.builder'
|
118
|
+
- 'actionpack/test/**/*.ruby'
|
119
|
+
- 'activestorage/db/migrate/**/*.rb'
|
120
|
+
- 'activestorage/db/update_migrate/**/*.rb'
|
121
|
+
- 'actionmailbox/db/migrate/**/*.rb'
|
122
|
+
- 'actiontext/db/migrate/**/*.rb'
|
120
123
|
|
121
124
|
Style/RedundantFreeze:
|
122
125
|
Enabled: true
|
@@ -188,6 +191,30 @@ Lint/UselessAssignment:
|
|
188
191
|
Lint/DeprecatedClassMethods:
|
189
192
|
Enabled: true
|
190
193
|
|
194
|
+
Lint/DuplicateBranch: # (new in 1.3)
|
195
|
+
Enabled: true
|
196
|
+
|
197
|
+
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
|
198
|
+
Enabled: true
|
199
|
+
|
200
|
+
Lint/EmptyBlock: # (new in 1.1)
|
201
|
+
Enabled: true
|
202
|
+
|
203
|
+
Lint/EmptyClass: # (new in 1.3)
|
204
|
+
Enabled: true
|
205
|
+
|
206
|
+
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
|
207
|
+
Enabled: true
|
208
|
+
|
209
|
+
Lint/ToEnumArguments: # (new in 1.1)
|
210
|
+
Enabled: true
|
211
|
+
|
212
|
+
Lint/UnexpectedBlockArity: # (new in 1.5)
|
213
|
+
Enabled: true
|
214
|
+
|
215
|
+
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
|
216
|
+
Enabled: true
|
217
|
+
|
191
218
|
Style/ParenthesesAroundCondition:
|
192
219
|
Enabled: true
|
193
220
|
|
@@ -209,6 +236,27 @@ Style/ColonMethodCall:
|
|
209
236
|
Style/TrivialAccessors:
|
210
237
|
Enabled: true
|
211
238
|
|
239
|
+
Style/ArgumentsForwarding: # (new in 1.1)
|
240
|
+
Enabled: true
|
241
|
+
|
242
|
+
Style/CollectionCompact: # (new in 1.2)
|
243
|
+
Enabled: true
|
244
|
+
|
245
|
+
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
|
246
|
+
Enabled: true
|
247
|
+
|
248
|
+
Style/NegatedIfElseCondition: # (new in 1.2)
|
249
|
+
Enabled: true
|
250
|
+
|
251
|
+
Style/NilLambda: # (new in 1.3)
|
252
|
+
Enabled: true
|
253
|
+
|
254
|
+
Style/RedundantArgument: # (new in 1.4)
|
255
|
+
Enabled: true
|
256
|
+
|
257
|
+
Style/SwapValues: # (new in 1.1)
|
258
|
+
Enabled: true
|
259
|
+
|
212
260
|
Performance/FlatMap:
|
213
261
|
Enabled: true
|
214
262
|
|
@@ -227,9 +275,147 @@ Performance/RegexpMatch:
|
|
227
275
|
Performance/UnfreezeString:
|
228
276
|
Enabled: true
|
229
277
|
|
278
|
+
Performance/AncestorsInclude: # (new in 1.7)
|
279
|
+
Enabled: true
|
280
|
+
|
281
|
+
Performance/BigDecimalWithNumericArgument: # (new in 1.7)
|
282
|
+
Enabled: true
|
283
|
+
|
284
|
+
Performance/BlockGivenWithExplicitBlock: # (new in 1.9)
|
285
|
+
Enabled: true
|
286
|
+
|
287
|
+
Performance/CollectionLiteralInLoop: # (new in 1.8)
|
288
|
+
Enabled: true
|
289
|
+
|
290
|
+
Performance/ConstantRegexp: # (new in 1.9)
|
291
|
+
Enabled: true
|
292
|
+
|
293
|
+
Performance/MethodObjectAsBlock: # (new in 1.9)
|
294
|
+
Enabled: true
|
295
|
+
|
296
|
+
Performance/RedundantSortBlock: # (new in 1.7)
|
297
|
+
Enabled: true
|
298
|
+
|
299
|
+
Performance/RedundantStringChars: # (new in 1.7)
|
300
|
+
Enabled: true
|
301
|
+
|
302
|
+
Performance/ReverseFirst: # (new in 1.7)
|
303
|
+
Enabled: true
|
304
|
+
|
305
|
+
Performance/SortReverse: # (new in 1.7)
|
306
|
+
Enabled: true
|
307
|
+
|
308
|
+
Performance/Squeeze: # (new in 1.7)
|
309
|
+
Enabled: true
|
310
|
+
|
311
|
+
Performance/StringInclude: # (new in 1.7)
|
312
|
+
Enabled: true
|
313
|
+
|
314
|
+
Performance/Sum: # (new in 1.8)
|
315
|
+
Enabled: true
|
316
|
+
|
317
|
+
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
318
|
+
Enabled: true
|
319
|
+
|
320
|
+
Lint/AmbiguousAssignment: # (new in 1.7)
|
321
|
+
Enabled: true
|
322
|
+
|
323
|
+
Lint/DeprecatedConstants: # (new in 1.8)
|
324
|
+
Enabled: true
|
325
|
+
|
326
|
+
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
|
327
|
+
Enabled: true
|
328
|
+
|
329
|
+
Lint/RedundantDirGlobSort: # (new in 1.8)
|
330
|
+
Enabled: true
|
331
|
+
|
332
|
+
Style/EndlessMethod: # (new in 1.8)
|
333
|
+
Enabled: true
|
334
|
+
|
335
|
+
Style/HashExcept: # (new in 1.7)
|
336
|
+
Enabled: true
|
337
|
+
|
338
|
+
# Added 2021-08-14
|
339
|
+
Gemspec/DateAssignment: # (new in 1.10)
|
340
|
+
Enabled: true
|
341
|
+
|
342
|
+
Layout/LineEndStringConcatenationIndentation: # (new in 1.18)
|
343
|
+
Enabled: true
|
344
|
+
|
345
|
+
Lint/EmptyInPattern: # (new in 1.16)
|
346
|
+
Enabled: true
|
347
|
+
|
348
|
+
Lint/NumberedParameterAssignment: # (new in 1.9)
|
349
|
+
Enabled: true
|
350
|
+
|
351
|
+
Lint/OrAssignmentToConstant: # (new in 1.9)
|
352
|
+
Enabled: true
|
353
|
+
|
354
|
+
Lint/SymbolConversion: # (new in 1.9)
|
355
|
+
Enabled: true
|
356
|
+
|
357
|
+
Lint/TripleQuotes: # (new in 1.9)
|
358
|
+
Enabled: true
|
359
|
+
|
360
|
+
Naming/InclusiveLanguage: # (new in 1.18)
|
361
|
+
Enabled: false
|
362
|
+
|
363
|
+
Style/HashConversion: # (new in 1.10)
|
364
|
+
Enabled: true
|
365
|
+
|
366
|
+
Style/IfWithBooleanLiteralBranches: # (new in 1.9)
|
367
|
+
Enabled: true
|
368
|
+
|
369
|
+
Style/InPatternThen: # (new in 1.16)
|
370
|
+
Enabled: true
|
371
|
+
|
372
|
+
Style/MultilineInPatternThen: # (new in 1.16)
|
373
|
+
Enabled: true
|
374
|
+
|
375
|
+
Style/QuotedSymbols: # (new in 1.16)
|
376
|
+
Enabled: true
|
377
|
+
|
378
|
+
Style/StringChars: # (new in 1.12)
|
379
|
+
Enabled: true
|
380
|
+
|
381
|
+
Performance/MapCompact: # (new in 1.11)
|
382
|
+
Enabled: true
|
383
|
+
|
384
|
+
Performance/RedundantEqualityComparisonBlock: # (new in 1.10)
|
385
|
+
Enabled: true
|
386
|
+
|
387
|
+
Performance/RedundantSplitRegexpArgument: # (new in 1.10)
|
388
|
+
Enabled: true
|
389
|
+
|
390
|
+
RSpec/IdenticalEqualityAssertion: # (new in 2.4)
|
391
|
+
Enabled: true
|
392
|
+
|
393
|
+
RSpec/Rails/AvoidSetupHook: # (new in 2.4)
|
394
|
+
Enabled: true
|
395
|
+
|
230
396
|
RSpec/MessageSpies:
|
231
397
|
EnforcedStyle: receive
|
232
398
|
|
233
|
-
#
|
234
|
-
|
235
|
-
|
399
|
+
Lint/AmbiguousRange: # new in 1.19
|
400
|
+
Enabled: true
|
401
|
+
Style/RedundantSelfAssignmentBranch: # new in 1.19
|
402
|
+
Enabled: true
|
403
|
+
|
404
|
+
Lint/AmbiguousOperatorPrecedence: # new in 1.21
|
405
|
+
Enabled: true
|
406
|
+
Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
|
407
|
+
Enabled: true
|
408
|
+
Lint/RequireRelativeSelfPath: # new in 1.22
|
409
|
+
Enabled: true
|
410
|
+
Security/IoMethods: # new in 1.22
|
411
|
+
Enabled: true
|
412
|
+
Style/NumberedParameters: # new in 1.22
|
413
|
+
Enabled: true
|
414
|
+
Style/NumberedParametersLimit: # new in 1.22
|
415
|
+
Enabled: true
|
416
|
+
Style/SelectByRegexp: # new in 1.22
|
417
|
+
Enabled: true
|
418
|
+
RSpec/ExcessiveDocstringSpacing: # new in 2.5
|
419
|
+
Enabled: true
|
420
|
+
RSpec/SubjectDeclaration: # new in 2.5
|
421
|
+
Enabled: true
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,82 @@
|
|
1
1
|
# Nerd Dice Changelog
|
2
2
|
|
3
|
-
|
3
|
+
## master \(unreleased\)
|
4
|
+
### Added
|
5
|
+
### Changed
|
6
|
+
### Fixed
|
4
7
|
|
5
|
-
##
|
6
|
-
|
8
|
+
## 0.4.0 \(2021-10-23\)
|
9
|
+
### Added
|
10
|
+
* Add `NerdDice::ConvenienceMethods` method_missing mixin module that allows for dynamic invocation of patterns in the method name that get converted into calls to `NerdDice.roll_dice` or `NerdDice.total_dice` along with allowing the advantage/disadvantage mechanic or bonuses to be parsed from the method name. Full documentation of the module can be found in the [Convenience Methods Mixin](README.md#convenience-methods-mixin) section of the README.
|
11
|
+
* Add exensive specs to support the ConvenienceMethods module
|
12
|
+
### Changed
|
13
|
+
* Replace `Benchmark.bmbm` with `Benchmark.bm` in the nerd_dice_benchmark
|
14
|
+
* Add convenience_methods to nerd_dice_benchmark
|
15
|
+
* Extend `NerdDice::ConvenienceMethods` into top-level module as class methods
|
16
|
+
### Fixed
|
17
|
+
* Fix typos and horizontal scrolling in README
|
18
|
+
* Fix CodeClimate Code Smell on harvest_totals
|
7
19
|
|
8
|
-
|
20
|
+
## 0.3.0 \(2021-09-11\)
|
21
|
+
### Added
|
22
|
+
* Add new options to `NerdDice::Configuration`
|
23
|
+
- `ability_score_number_of_sides`
|
24
|
+
- `ability_score_dice_rolled`
|
25
|
+
- `ability_score_dice_kept`
|
26
|
+
* Add `NerdDice.harvest_totals` method that takes in a collection and returns the results of calling `total` on each element
|
27
|
+
* Add `NerdDice.roll_ability_scores` convenience method that returns an array of `DiceSet` objects based on options and/or configuration
|
28
|
+
* Add `NerdDice.total_ability_scores` convenience method that returns an array of integers based on options and/or configuration
|
29
|
+
* Add `NerdDice::Die` class that represents a single die object and mixes in the `Comparable` module
|
30
|
+
* Add `NerdDice::DiceSet` class that represents a collection of `Die` objects and mixes in the `Enumerable` module
|
31
|
+
* Add `NerdDice::SetsRandomizationTechnique` mixin module and include in the `DiceSet` and `Die` classes
|
32
|
+
* Add `die_background_color` and `die_foreground_color` to `Configuration` class with defaults defined as constants
|
33
|
+
* Add `NerdDice.roll_dice` method that behaves in a similar fashion to `total_dice` but returns a `DiceSet` object instead of an `Integer` and has additional optional arguments relating to the non-numeric attributes of the dice
|
34
|
+
* Add `coveralls_reborn` to RSpec and GitHub actions
|
35
|
+
* Add build badge to README
|
36
|
+
* Add Code Climate maintainability integration and badge to README
|
37
|
+
* Add `nerd_dice_benchmark` script to bin directory
|
38
|
+
* Add GitHub Action CI build
|
39
|
+
- Run RSpec test suite, fail if specs fail, report coverage via Coveralls
|
40
|
+
- Run RuboCop and fail if violations
|
41
|
+
- Run benchmark suite and fail if outside of allowed ratios
|
42
|
+
### Changed
|
43
|
+
* Update RuboCop version and configuration
|
44
|
+
* Break up the NerdDice source code file into several smaller files that are included by the module
|
45
|
+
* Enforce that `NerdDice.configuration.ability_score_array_size` must be a positive duck-type integer
|
46
|
+
### Fixed
|
47
|
+
|
48
|
+
## 0.2.0 \(2021-01-28\)
|
49
|
+
### Added
|
50
|
+
* Add ability to configure with `NerdDice.configure` block or `NerdDice.configuration`
|
51
|
+
- Configure `randomization_technique` as `:random_rand`, `:securerandom`, `:random_object`, or `randomized`
|
52
|
+
- Configure `refresh_seed_interval` to allow a periodic refresh of the seed
|
53
|
+
* Add `randomization_technique` option to `NerdDice.total_dice` method keyword arguments
|
54
|
+
* Add a lower-level `execute_die_roll` method that allows you to roll a single die with a generator specified
|
55
|
+
* Add ability to manually refresh or specify seed with `:refresh_seed!` method
|
56
|
+
### Changed
|
57
|
+
* Change `opts = {}` final argument to use keyword args `**opts` in the `NerdDice.total_dice` method. Now the method can be called as follows:
|
58
|
+
```ruby
|
59
|
+
# old
|
60
|
+
NerdDice.total_dice(20, 1, {bonus: 5})
|
61
|
+
NerdDice.total_dice(6, 3, {bonus: 1})
|
62
|
+
|
63
|
+
# new
|
64
|
+
NerdDice.total_dice(20, bonus: 5)
|
65
|
+
NerdDice.total_dice(6, 3, bonus: 1)
|
66
|
+
```
|
67
|
+
* Call `:to_i` on bonus instead of using `:is_a?` and raise ArgumentError in the `NerdDice.total_dice` method if it doesn't respond to `:to_i`
|
68
|
+
* Added `securerandom` as an explicit dependency due to Ruby 3.x change to bundled gem
|
69
|
+
* `total_dice` no longer calls unqualified `.rand` which improves performance on all generators except for `:securerandom`
|
70
|
+
### Fixed
|
71
|
+
|
72
|
+
## 0.1.1 \(2020-12-12\)
|
73
|
+
### Added
|
74
|
+
### Changed
|
75
|
+
### Fixed
|
76
|
+
* Fix broken link to CHANGELOG in gemspec
|
77
|
+
* Fix rubocop offenses from 0.1.0 and refactor specs
|
78
|
+
|
79
|
+
## 0.1.0 \(2020-12-07\)
|
80
|
+
|
81
|
+
### Added
|
82
|
+
* Add NerdDice.total_dice class method with the ability to roll multiple polyhedral dice and add a bonus
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,92 +1,87 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nerd_dice (0.
|
5
|
-
securerandom (~> 0.
|
4
|
+
nerd_dice (0.4.0)
|
5
|
+
securerandom (~> 0.1, >= 0.1.1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
ast (2.4.2)
|
11
|
-
coveralls_reborn (0.
|
12
|
-
simplecov (
|
13
|
-
term-ansicolor (~> 1.
|
14
|
-
thor (
|
15
|
-
tins (~> 1.
|
16
|
-
diff-lcs (1.
|
11
|
+
coveralls_reborn (0.23.0)
|
12
|
+
simplecov (>= 0.18.1, < 0.22.0)
|
13
|
+
term-ansicolor (~> 1.6)
|
14
|
+
thor (>= 0.20.3, < 2.0)
|
15
|
+
tins (~> 1.16)
|
16
|
+
diff-lcs (1.4.4)
|
17
17
|
docile (1.4.0)
|
18
|
-
|
19
|
-
|
20
|
-
parser (3.2.1.0)
|
18
|
+
parallel (1.21.0)
|
19
|
+
parser (3.0.2.0)
|
21
20
|
ast (~> 2.4.1)
|
22
|
-
rainbow (3.
|
21
|
+
rainbow (3.0.0)
|
23
22
|
rake (13.0.6)
|
24
|
-
regexp_parser (2.
|
23
|
+
regexp_parser (2.1.1)
|
25
24
|
rexml (3.2.5)
|
26
|
-
rspec (3.
|
27
|
-
rspec-core (~> 3.
|
28
|
-
rspec-expectations (~> 3.
|
29
|
-
rspec-mocks (~> 3.
|
30
|
-
rspec-core (3.
|
31
|
-
rspec-support (~> 3.
|
32
|
-
rspec-expectations (3.
|
25
|
+
rspec (3.10.0)
|
26
|
+
rspec-core (~> 3.10.0)
|
27
|
+
rspec-expectations (~> 3.10.0)
|
28
|
+
rspec-mocks (~> 3.10.0)
|
29
|
+
rspec-core (3.10.1)
|
30
|
+
rspec-support (~> 3.10.0)
|
31
|
+
rspec-expectations (3.10.1)
|
33
32
|
diff-lcs (>= 1.2.0, < 2.0)
|
34
|
-
rspec-support (~> 3.
|
35
|
-
rspec-mocks (3.
|
33
|
+
rspec-support (~> 3.10.0)
|
34
|
+
rspec-mocks (3.10.2)
|
36
35
|
diff-lcs (>= 1.2.0, < 2.0)
|
37
|
-
rspec-support (~> 3.
|
38
|
-
rspec-support (3.
|
39
|
-
rubocop (1.
|
40
|
-
json (~> 2.3)
|
36
|
+
rspec-support (~> 3.10.0)
|
37
|
+
rspec-support (3.10.2)
|
38
|
+
rubocop (1.22.2)
|
41
39
|
parallel (~> 1.10)
|
42
|
-
parser (>= 3.
|
40
|
+
parser (>= 3.0.0.0)
|
43
41
|
rainbow (>= 2.2.2, < 4.0)
|
44
42
|
regexp_parser (>= 1.8, < 3.0)
|
45
|
-
rexml
|
46
|
-
rubocop-ast (>= 1.
|
43
|
+
rexml
|
44
|
+
rubocop-ast (>= 1.12.0, < 2.0)
|
47
45
|
ruby-progressbar (~> 1.7)
|
48
|
-
unicode-display_width (>=
|
49
|
-
rubocop-ast (1.
|
50
|
-
parser (>= 3.
|
51
|
-
rubocop-
|
52
|
-
rubocop (~> 1.41)
|
53
|
-
rubocop-performance (1.16.0)
|
46
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
47
|
+
rubocop-ast (1.12.0)
|
48
|
+
parser (>= 3.0.1.1)
|
49
|
+
rubocop-performance (1.11.5)
|
54
50
|
rubocop (>= 1.7.0, < 2.0)
|
55
51
|
rubocop-ast (>= 0.4.0)
|
56
52
|
rubocop-rake (0.6.0)
|
57
53
|
rubocop (~> 1.0)
|
58
|
-
rubocop-rspec (2.
|
59
|
-
rubocop (~> 1.
|
60
|
-
rubocop-capybara (~> 2.17)
|
54
|
+
rubocop-rspec (2.5.0)
|
55
|
+
rubocop (~> 1.19)
|
61
56
|
ruby-progressbar (1.11.0)
|
62
|
-
securerandom (0.
|
63
|
-
simplecov (0.
|
57
|
+
securerandom (0.1.1)
|
58
|
+
simplecov (0.21.2)
|
64
59
|
docile (~> 1.1)
|
65
60
|
simplecov-html (~> 0.11)
|
66
61
|
simplecov_json_formatter (~> 0.1)
|
67
62
|
simplecov-html (0.12.3)
|
68
63
|
simplecov-lcov (0.8.0)
|
69
|
-
simplecov_json_formatter (0.1.
|
64
|
+
simplecov_json_formatter (0.1.3)
|
70
65
|
sync (0.5.0)
|
71
66
|
term-ansicolor (1.7.1)
|
72
67
|
tins (~> 1.0)
|
73
|
-
thor (1.
|
74
|
-
tins (1.
|
68
|
+
thor (1.1.0)
|
69
|
+
tins (1.29.1)
|
75
70
|
sync
|
76
|
-
unicode-display_width (2.
|
71
|
+
unicode-display_width (2.1.0)
|
77
72
|
|
78
73
|
PLATFORMS
|
79
74
|
ruby
|
80
75
|
|
81
76
|
DEPENDENCIES
|
82
|
-
coveralls_reborn (~> 0.
|
77
|
+
coveralls_reborn (~> 0.23.0)
|
83
78
|
nerd_dice!
|
84
79
|
rake (~> 13.0)
|
85
|
-
rspec (~> 3.
|
86
|
-
rubocop (~> 1.
|
87
|
-
rubocop-performance (~> 1.
|
80
|
+
rspec (~> 3.10)
|
81
|
+
rubocop (~> 1.22, >= 1.22.2)
|
82
|
+
rubocop-performance (~> 1.11, >= 1.11.5)
|
88
83
|
rubocop-rake (~> 0.6, >= 0.6.0)
|
89
|
-
rubocop-rspec (~> 2.
|
84
|
+
rubocop-rspec (~> 2.5, >= 2.5.0)
|
90
85
|
simplecov-lcov (~> 0.8.0)
|
91
86
|
|
92
87
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -24,6 +24,15 @@ Or install it yourself as:
|
|
24
24
|
$ gem install nerd_dice
|
25
25
|
|
26
26
|
## Usage
|
27
|
+
After the gem is installed, you can require it as you would any other gem.
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
require 'nerd_dice'
|
31
|
+
```
|
32
|
+
|
33
|
+
### Module methods or a dynamic method_missing DSL
|
34
|
+
There are two main patterns for using NerdDice in your project. You can invoke the module-level methods like `NerdDice.total_dice` or you can include the `NerdDice::ConvenienceMethods` module to your class \(or IRB \). Once mixed in, you can dynamically invoke methods like `roll_d20_with_advantage` or `total_3d8_plus5`. See the [Convenience Methods Mixin](#convenience-methods-mixin) section for usage details.
|
35
|
+
|
27
36
|
### Configuration
|
28
37
|
You can customize the behavior of NerdDice via a configuration block as below or by assigning an individual property via the ```NerdDice.configuration.property = value``` syntax \(where ```property``` is the config property and ```value``` is the value you want to assign\)\. The available configuration options as well as their defaults, if applicable, are listed in the example configuration block below:
|
29
38
|
|
@@ -268,6 +277,126 @@ totals_array = NerdDice.harvest_totals(totals_array)
|
|
268
277
|
# => [15, 14, 13, 12, 10, 8]
|
269
278
|
# yes, it just happened to be the standard array by amazing coincidence
|
270
279
|
```
|
280
|
+
<a name="convenience-methods-mixin"></a>
|
281
|
+
### Convenience Methods Mixin
|
282
|
+
NerdDice provides an optional mixin `NerdDice::ConvenienceMethods` that uses Ruby\'s `method_missing` metaprogramming pattern to allow you to roll any number of dice with bonuses and/or the advantage/disadvantage mechanic by dynamically responding to methods that you type that match the `roll_` or `total_` pattern.
|
283
|
+
|
284
|
+
#### Considerations for ConvenienceMethods
|
285
|
+
Before mixing in this method with a class, be aware of other `method_missing` gems that you are also mixing into your project and be sure to write robust tests. We have sought to use `method_missing` in a responsible manner that delegates back to the default implementation using `super` if the method does not match the `ConvenienceMethods` pattern, but there is no guarantee that other gems included in your project are doing the same. If you run into problems with the `ConvenienceMethods` module interacting with other `method_missing` gems, everything that the `ConvenienceMethods` module does can be replicated using the module\-level methods described above or by calling the convenience method on `NerdDice`.
|
286
|
+
|
287
|
+
Once a particular method has been called, it will define that method so that the next time it will invoke the method directly instead of traversing up the call stack for `method_missing`, which improves performance. The method will remain defined for the duration of the Ruby interpreter process.
|
288
|
+
|
289
|
+
#### Calling ConvenienceMethods as NerdDice class methods
|
290
|
+
NerdDice extends the `ConvenienceMethods` module into the top-level module as class methods, so you can call the methods on the NerdDice module without needing to worry about the implications of extending it into your own class.
|
291
|
+
```ruby
|
292
|
+
require 'nerd_dice'
|
293
|
+
# works with all the examples and patterns below
|
294
|
+
NerdDice.roll_3d6_lowest2_minus1
|
295
|
+
NerdDice.total_d20_with_advantage_p6
|
296
|
+
```
|
297
|
+
|
298
|
+
#### Mixing in the ConvenienceMethods module
|
299
|
+
To mix the NerdDice DSL into your class, make sure the gem is required if not already and then use `include NerdDice::ConvenienceMethods` as shown below:
|
300
|
+
```ruby
|
301
|
+
# example of a class that mixes in NerdDice::ConvenienceMethods
|
302
|
+
require 'nerd_dice'
|
303
|
+
class Monster
|
304
|
+
include NerdDice::ConvenienceMethods
|
305
|
+
|
306
|
+
# hard-coding probably not the best solution
|
307
|
+
# but gives you an idea how to mix in to a simple class
|
308
|
+
def hits_the_monster
|
309
|
+
# using the ConvenienceMethods version
|
310
|
+
total_d20_plus5 >= @armor_class ? "hit" : "miss"
|
311
|
+
end
|
312
|
+
|
313
|
+
def initialize(armor_class=16)
|
314
|
+
@armor_class = armor_class
|
315
|
+
end
|
316
|
+
end
|
317
|
+
```
|
318
|
+
To mix in the module as class methods, you can use `extend NerdDice::ConvenienceMethods`
|
319
|
+
```ruby
|
320
|
+
# example of a class that mixes in NerdDice::ConvenienceMethods
|
321
|
+
require 'nerd_dice'
|
322
|
+
class OtherClass
|
323
|
+
extend NerdDice::ConvenienceMethods
|
324
|
+
end
|
325
|
+
OtherClass.roll_3d6_lowest2_minus1 # returns NerdDice::DiceSet
|
326
|
+
```
|
327
|
+
|
328
|
+
#### ConvenienceMethods usage examples
|
329
|
+
Any invocation of `NerdDice.roll_dice` and `NerdDice.total_dice` can be duplicated using the `NerdDice::ConvenienceMethods` mixin. Here are some examples of what you can do with the return types and equivalent methods in the comments:
|
330
|
+
|
331
|
+
* `roll_dNN` and `total_dNN` roll one die
|
332
|
+
```ruby
|
333
|
+
roll_d20 # => DiceSet: NerdDice.roll_dice(20)
|
334
|
+
roll_d8 # => DiceSet: NerdDice.roll_dice(8)
|
335
|
+
roll_d1000 # => DiceSet: NerdDice.roll_dice(1000)
|
336
|
+
total_d20 # => Integer NerdDice.total_dice(20)
|
337
|
+
total_d8 # => Integer NerdDice.total_dice(8)
|
338
|
+
total_d1000 # => Integer NerdDice.total_dice(1000)
|
339
|
+
```
|
340
|
+
* `roll_NNdNN` and `total_NNdNN` roll specified quantity of dice
|
341
|
+
```ruby
|
342
|
+
roll_2d20 # => DiceSet: NerdDice.roll_dice(20, 2)
|
343
|
+
roll_3d8 # => DiceSet: NerdDice.roll_dice(8, 3)
|
344
|
+
roll_22d1000 # => DiceSet: NerdDice.roll_dice(1000, 22)
|
345
|
+
total_2d20 # => Integer NerdDice.total_dice(20, 2)
|
346
|
+
total_3d8 # => Integer NerdDice.total_dice(8, 3)
|
347
|
+
total_22d1000 # => Integer NerdDice.total_dice(1000, 22)
|
348
|
+
```
|
349
|
+
* Keyword arguments are passed on to `roll_dice`/`total_dice` method
|
350
|
+
```ruby
|
351
|
+
roll_2d20 foreground_color: "blue" # => DiceSet: NerdDice.roll_dice(20, 2, foreground_color: "blue")
|
352
|
+
|
353
|
+
total_d12 randomization_technique: :randomized
|
354
|
+
# => Integer NerdDice.total_dice(12, randomization_technique: :randomized)
|
355
|
+
total_22d1000 randomization_technique: :random_rand
|
356
|
+
# => Integer NerdDice.total_dice(1000, 22, randomization_technique: :random_rand)
|
357
|
+
|
358
|
+
roll_4d6_with_advantage3 background_color: 'blue'
|
359
|
+
# => DiceSet: NerdDice.roll_dice(4, 3, background_color: 'blue').highest(3)
|
360
|
+
total_4d6_with_advantage3 randomization_technique: :random_rand
|
361
|
+
# => Integer: NerdDice.roll_dice(4, 3, randomization_technique: :random_rand).highest(3).total
|
362
|
+
```
|
363
|
+
* Positive and negative bonuses can be used with `plus` (alias `p`) or `minus` (alias `m`)
|
364
|
+
```ruby
|
365
|
+
roll_d20_plus6 # => DiceSet: NerdDice.roll_dice(20, bonus: 6)
|
366
|
+
total_3d8_p2 # => Integer: NerdDice.total_dice(8, 3, bonus: 2)
|
367
|
+
total_d20_minus5 # => Integer: NerdDice.total_dice(20, bonus: -6)
|
368
|
+
roll_3d8_m3 # => DiceSet: NerdDice.roll_dice(8, 3, bonus: -3)
|
369
|
+
```
|
370
|
+
* `_with_advantageN` or `highestN` roll with advantage
|
371
|
+
* `_with_disadvantageN` or `lowestN` roll with disadvantage
|
372
|
+
* Calling `roll_dNN_with_advantage` \(and variants\) rolls 2 dice and keeps one
|
373
|
+
```ruby
|
374
|
+
# equivalent
|
375
|
+
roll_3d8_with_advantage1
|
376
|
+
roll_3d8_highest1
|
377
|
+
# => DiceSet: NerdDice.roll_dice(8, 3).with_advantage(1)
|
378
|
+
|
379
|
+
# calls roll_dice and total to return an integer
|
380
|
+
total_3d8_with_advantage1
|
381
|
+
total_3d8_highest1
|
382
|
+
# => Integer: NerdDice.roll_dice(8, 3).with_advantage(1).total
|
383
|
+
|
384
|
+
# rolls two dice in this case
|
385
|
+
# equal to roll_2d20_with_advantage but more natural
|
386
|
+
roll_d20_with_advantage # => DiceSet: NerdDice.roll_dice(20, 2).with_advantage(1)
|
387
|
+
# equal to total_2d20_with_advantage but more natural
|
388
|
+
total_d20_with_advantage # => Integer: NerdDice.roll_dice(20, 2).with_advantage(1).total
|
389
|
+
```
|
390
|
+
#### ConvenienceMethods error handling
|
391
|
+
* If you try to call with a plus and a minus, an Exception is raised
|
392
|
+
* If you call with a bonus and a keyword argument and they don't match, an Exception is raised
|
393
|
+
* Any combination not expressly allowed or matched will call `super` on `method_missing`
|
394
|
+
```ruby
|
395
|
+
roll_3d8_plus3_m2 # will raise NameError using super method_missing
|
396
|
+
roll_3d8_plus3 bonus: 1 # will raise NerdDice::Error with message about "Bonus integrity failure"
|
397
|
+
roll_d20_with_advantage_lowest # will raise NameError using super method_missing
|
398
|
+
total_4d6_lowest3_highest2 # will raise NameError using super method_missing
|
399
|
+
```
|
271
400
|
|
272
401
|
## Development
|
273
402
|
|
@@ -277,7 +406,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
277
406
|
|
278
407
|
## Contributing
|
279
408
|
|
280
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/statelesscode/nerd_dice/issues. We welcome and encourage your participation in this open-source project. We welcome those of all backgrounds and abilities, but we refuse to adopt the Contributor Covenant for reasons outlined in [BURN_THE_CONTRIBUTOR_COVENANT_WITH_FIRE.md](BURN_THE_CONTRIBUTOR_COVENANT_WITH_FIRE.md)
|
409
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/statelesscode/nerd_dice/issues. We welcome and encourage your participation in this open-source project. We welcome those of all backgrounds and abilities, but we refuse to adopt the Contributor Covenant for reasons outlined in [BURN_THE_CONTRIBUTOR_COVENANT_WITH_FIRE.md](https://github.com/statelesscode/nerd_dice/blob/master/BURN_THE_CONTRIBUTOR_COVENANT_WITH_FIRE.md)
|
410
|
+
|
281
411
|
|
282
412
|
## Unlicense, License, and Copyright
|
283
413
|
|