dmtool 0.0.1
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 +7 -0
- data/.codeclimate.yml +6 -0
- data/.gitignore +11 -0
- data/.pryrc +6 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +8 -0
- data/README.md +32 -0
- data/Rakefile +1 -0
- data/bin/dmtool +31 -0
- data/bin/roll +36 -0
- data/dmtool.gemspec +28 -0
- data/lib/core_extensions/string/prep.rb +9 -0
- data/lib/dmtool.rb +20 -0
- data/lib/dmtool/cli.rb +41 -0
- data/lib/dmtool/die.rb +30 -0
- data/lib/dmtool/errors.rb +6 -0
- data/lib/dmtool/parser.rb +73 -0
- data/lib/dmtool/parser/dice_string.rb +69 -0
- data/lib/dmtool/parser/die_directive.rb +65 -0
- data/lib/dmtool/result.rb +59 -0
- data/lib/dmtool/roller.rb +14 -0
- data/lib/dmtool/version.rb +3 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a1aead2702873fef5a13a94eac855e3849ace58d
|
4
|
+
data.tar.gz: 0785e86c6a66e28b275da398ee145aeddadb0402
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ace519fffa7a679beade46b9f1cc56ca1fb556242a979910979e14d84d4074085f070124925eda32cfb4d152c857c7ddbcd06400074789a850e2bc7e9be24058
|
7
|
+
data.tar.gz: b62c3d97177edcbf75b5fbe1ec2cab06283cd451ca3ab11e33581bacd94e282922e580dacb42e4a3e6e1d6ff384871e1c26458b2e30db5fd082ffb652643fcb5
|
data/.codeclimate.yml
ADDED
data/.gitignore
ADDED
data/.pryrc
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# DMTool
|
2
|
+
[](https://travis-ci.org/ffleming/dogsay)
|
3
|
+
[](https://codeclimate.com/github/ffleming/dogsay)
|
4
|
+
[](https://codeclimate.com/github/ffleming/dogsay)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'dmtool'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install dmtool
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
Use the classes as you see fit, or use the command-line tools.
|
25
|
+
|
26
|
+
## Contributing
|
27
|
+
|
28
|
+
1. Fork it ( https://github.com/ffleming/dmtool/fork )
|
29
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
30
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
31
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
32
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/dmtool
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'dmtool'
|
3
|
+
|
4
|
+
trap 'SIGINT' do
|
5
|
+
exit
|
6
|
+
end
|
7
|
+
|
8
|
+
def parse_opts!
|
9
|
+
options = {}
|
10
|
+
opt_parser = OptionParser.new do |opts|
|
11
|
+
opts.program_name = "dmtool"
|
12
|
+
opts.banner = "#{opts.program_name} [options]"
|
13
|
+
opts.on('-v', '--version', 'Print version information') do
|
14
|
+
puts "#{opts.program_name} #{DMTool::VERSION}"
|
15
|
+
exit true
|
16
|
+
end
|
17
|
+
opts.on('-h', '--help', 'Display this screen') do
|
18
|
+
puts opts
|
19
|
+
exit true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
begin
|
23
|
+
opt_parser.parse!
|
24
|
+
rescue OptionParser::InvalidOption => e
|
25
|
+
puts e.message
|
26
|
+
exit false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
parse_opts!
|
31
|
+
DMTool::CLI.start
|
data/bin/roll
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'dmtool'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
def opts_from_cli
|
6
|
+
options = {}
|
7
|
+
opt_parser = OptionParser.new do |opts|
|
8
|
+
opts.program_name = File.basename(__FILE__)
|
9
|
+
opts.banner = "#{opts.program_name} [options]"
|
10
|
+
opts.on('-r', '--raw', 'Display raw results (ignores +/- modifiers)') { options[:raw] = true }
|
11
|
+
opts.on('-v', '--version', 'Print version information') do
|
12
|
+
puts "#{File.basename(__FILE__)} #{DMTool::VERSION}"
|
13
|
+
exit true
|
14
|
+
end
|
15
|
+
opts.on('-h', '--help', 'Display this screen') do
|
16
|
+
puts opts
|
17
|
+
exit true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
begin
|
21
|
+
opt_parser.parse!
|
22
|
+
rescue OptionParser::InvalidOption => e
|
23
|
+
puts e.message
|
24
|
+
exit false
|
25
|
+
end
|
26
|
+
options
|
27
|
+
end
|
28
|
+
|
29
|
+
def results_from(options)
|
30
|
+
parser = DMTool::Parser.new
|
31
|
+
input = ARGV.join(' ')
|
32
|
+
command = options[:raw] ? 'raw' : 'roll'
|
33
|
+
parser.parse("#{command} #{input}")
|
34
|
+
end
|
35
|
+
|
36
|
+
puts results_from(opts_from_cli)
|
data/dmtool.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dmtool/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'dmtool'
|
8
|
+
spec.version = DMTool::VERSION
|
9
|
+
spec.authors = ['Forrest Fleming']
|
10
|
+
spec.email = ['ffleming@gmail.com']
|
11
|
+
|
12
|
+
spec.summary = %q{Suite of tools for RPGs}
|
13
|
+
spec.description = %q{Suite of tools for RPGs. An excuse to create a fun little parser.}
|
14
|
+
spec.homepage = 'http://github.com/ffleming/dmtool'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = 'bin'
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_runtime_dependency 'activesupport', '~> 3'
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1', '>= 1.6.5'
|
24
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
25
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
26
|
+
spec.add_development_dependency 'byebug', '~> 4'
|
27
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.1'
|
28
|
+
end
|
data/lib/dmtool.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'byebug'
|
3
|
+
require 'pry-byebug'
|
4
|
+
require 'active_support'
|
5
|
+
require 'active_support/core_ext'
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
require 'core_extensions/string/prep'
|
9
|
+
require 'dmtool/version'
|
10
|
+
require 'dmtool/result'
|
11
|
+
require 'dmtool/errors'
|
12
|
+
require 'dmtool/die'
|
13
|
+
require 'dmtool/parser'
|
14
|
+
require 'dmtool/parser/die_directive'
|
15
|
+
require 'dmtool/parser/dice_string'
|
16
|
+
require 'dmtool/roller'
|
17
|
+
require 'dmtool/cli'
|
18
|
+
String.include CoreExtensions::String::Prep
|
19
|
+
module DMTool
|
20
|
+
end
|
data/lib/dmtool/cli.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module DMTool::CLI
|
2
|
+
class << self
|
3
|
+
def start
|
4
|
+
@parser = DMTool::Parser.new
|
5
|
+
ui_loop
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def input
|
12
|
+
@input ||= $stdin
|
13
|
+
end
|
14
|
+
|
15
|
+
def output
|
16
|
+
@output ||= $stdout
|
17
|
+
end
|
18
|
+
|
19
|
+
def ui_loop
|
20
|
+
prompt do
|
21
|
+
while str = input.gets.chomp rescue ''
|
22
|
+
break if str.blank?
|
23
|
+
begin
|
24
|
+
output.puts @parser.parse(str)
|
25
|
+
rescue SystemExit => e
|
26
|
+
output.puts 'Goodbye'
|
27
|
+
break
|
28
|
+
rescue => e
|
29
|
+
output.puts "#{e.class} #{e.message}"
|
30
|
+
end
|
31
|
+
prompt
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def prompt
|
37
|
+
output.print 'dmtool > '
|
38
|
+
yield if block_given?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/dmtool/die.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
class DMTool::Die
|
2
|
+
attr_reader :sides, :explodes, :history
|
3
|
+
|
4
|
+
def initialize(sides: 6, explodes: false)
|
5
|
+
raise ArgumentError.new("Invalid sides: #{sides}") unless sides.is_a?(Fixnum) && sides > 1
|
6
|
+
@sides = sides
|
7
|
+
@explodes = explodes
|
8
|
+
@history = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def value
|
12
|
+
@history.last
|
13
|
+
end
|
14
|
+
|
15
|
+
def roll
|
16
|
+
result = rand_roll
|
17
|
+
result += rand_roll while explodes? && result % sides == 0
|
18
|
+
history.push result
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
alias explodes? explodes
|
23
|
+
alias roll! roll
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def rand_roll
|
28
|
+
rand(1..sides)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class DMTool::Parser
|
2
|
+
attr_reader :history
|
3
|
+
def initialize
|
4
|
+
@history = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def parse!(input)
|
8
|
+
history.push input
|
9
|
+
command, remainder = input.split(/ /, 2).map(&:prep)
|
10
|
+
dice_string, directives_string = remainder.to_s.split(',', 2).map(&:prep)
|
11
|
+
|
12
|
+
if respond_to?("cmd_#{command}", true)
|
13
|
+
ret = send("cmd_#{command}", dice_string, directives_string)
|
14
|
+
ret = "[#{ret.join ', '}]" if ret.is_a? Array
|
15
|
+
return "#{ret}"
|
16
|
+
end
|
17
|
+
raise ParserError.new "Command #{command} not found"
|
18
|
+
end
|
19
|
+
|
20
|
+
alias parse parse!
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def cmd_roll(dice_string, directives_string=nil)
|
25
|
+
dice = DMTool::Parser::DiceString.new(dice_string)
|
26
|
+
directives = directives_from(directives_string, dice)
|
27
|
+
result = DMTool::Roller.sum(dice.dice, directives)
|
28
|
+
dice.modifier.call(result)
|
29
|
+
end
|
30
|
+
|
31
|
+
def cmd_raw(dice_string, directives_string=nil)
|
32
|
+
dice = DMTool::Parser::DiceString.new(dice_string)
|
33
|
+
directives = directives_from(directives_string, dice)
|
34
|
+
DMTool::Roller.roll(dice.dice, directives).map(&:value)
|
35
|
+
end
|
36
|
+
|
37
|
+
def cmd_help(*args)
|
38
|
+
<<-EOS
|
39
|
+
dmtool v#{DMTool::VERSION} help
|
40
|
+
dmtool> <command> <dice>, <directives>
|
41
|
+
|
42
|
+
<commands>
|
43
|
+
roll: sums output
|
44
|
+
raw: displays individual die values (ignores +/- modifiers)
|
45
|
+
|
46
|
+
<dice>
|
47
|
+
e.g. 3d6 for three six-sided dice
|
48
|
+
3d6+2 to add 2 to the result of rollng 3d6
|
49
|
+
3df for 3 Fudge dice
|
50
|
+
|
51
|
+
<directives>
|
52
|
+
|
53
|
+
Examples:
|
54
|
+
roll 2d6
|
55
|
+
roll d20+5
|
56
|
+
roll d10-2
|
57
|
+
roll 3d6, reroll 1-2
|
58
|
+
EOS
|
59
|
+
end
|
60
|
+
|
61
|
+
def cmd_exit(*args)
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
|
65
|
+
def directives_from(directives_string, dice)
|
66
|
+
directives_string = '' if directives_string.nil?
|
67
|
+
directives = directives_string.split ','
|
68
|
+
directives.map! { |str| DMTool::Parser::DieDirective.new(str) }
|
69
|
+
directives += dice.directives
|
70
|
+
directives.select! {|d| d.text != 'roll' } if directives.length > 1
|
71
|
+
directives
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
class DMTool::Parser::DiceString
|
2
|
+
attr_reader :string, :type, :number, :sides, :modifier
|
3
|
+
def initialize(string)
|
4
|
+
@string = string
|
5
|
+
validate_format!
|
6
|
+
parse_string
|
7
|
+
end
|
8
|
+
|
9
|
+
def dice
|
10
|
+
(1..number).map { DMTool::Die.new(sides: sides)}
|
11
|
+
end
|
12
|
+
|
13
|
+
def directives
|
14
|
+
[DIRECTIVES[type]].compact
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
SYMBOLS = {
|
20
|
+
d: :standard,
|
21
|
+
df: :fudge,
|
22
|
+
f: :fudge,
|
23
|
+
e: :exploding
|
24
|
+
}
|
25
|
+
|
26
|
+
DIRECTIVES = {
|
27
|
+
fudge: DMTool::Parser::DieDirective.new('fudge'),
|
28
|
+
standard: DMTool::Parser::DieDirective.new('roll'),
|
29
|
+
exploding: DMTool::Parser::DieDirective.new('explode')
|
30
|
+
}
|
31
|
+
|
32
|
+
def parse_string
|
33
|
+
num_str, type_str, sides_str, mod_string = regex.match(string).captures
|
34
|
+
@number = number_from num_str
|
35
|
+
@type = type_from type_str
|
36
|
+
@sides = sides_from sides_str
|
37
|
+
@modifier = modifier_from mod_string
|
38
|
+
end
|
39
|
+
|
40
|
+
def number_from(string)
|
41
|
+
return 1 if string.blank?
|
42
|
+
string.to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def sides_from(string)
|
46
|
+
return 6 if type == :fudge
|
47
|
+
string.to_i
|
48
|
+
end
|
49
|
+
|
50
|
+
def type_from(string)
|
51
|
+
SYMBOLS.fetch(string.downcase.to_sym)
|
52
|
+
end
|
53
|
+
|
54
|
+
def modifier_from(string)
|
55
|
+
return Proc.new { |arg| arg } if string.blank?
|
56
|
+
method = string[0].to_sym
|
57
|
+
mod = string[1..-1].to_i
|
58
|
+
Proc.new { |arg| arg.send(method, mod) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate_format!
|
62
|
+
raise DiceStringError.new("#{@string} doesn't match /#{regex}/") unless @string =~ regex
|
63
|
+
end
|
64
|
+
|
65
|
+
def regex
|
66
|
+
@regex ||= /^(\d*)(d|e|f|df)(\d*)\s*([-+]\s*\d+)?$/i
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class DMTool::Parser::DieDirective
|
2
|
+
attr_reader :text
|
3
|
+
|
4
|
+
def initialize(text='roll')
|
5
|
+
@text = text
|
6
|
+
build_proc_from text
|
7
|
+
end
|
8
|
+
|
9
|
+
def process(die)
|
10
|
+
@proc.call(die, proc_opts)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
attr_reader :proc, :proc_opts
|
16
|
+
|
17
|
+
def build_proc_from(text)
|
18
|
+
keyword, remainder = text.split(/ /)
|
19
|
+
raise DirectiveError.new("Invalid directive: #{text}") if keyword.blank?
|
20
|
+
method = METHODS.fetch(keyword.to_sym, nil)
|
21
|
+
raise DirectiveError.new("Invalid directive: #{text}") if method.nil?
|
22
|
+
@proc = method
|
23
|
+
@proc_opts = remainder
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.reroll
|
27
|
+
Proc.new do |die, on|
|
28
|
+
min, max = on.split('-').map(&:to_i)
|
29
|
+
max = min if max.nil?
|
30
|
+
die.roll
|
31
|
+
die.roll while (min..max).include? die.value
|
32
|
+
die.value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.roll
|
37
|
+
Proc.new do |die|
|
38
|
+
die.history.push die.roll
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.explode
|
43
|
+
Proc.new do |die|
|
44
|
+
result = die.roll
|
45
|
+
result += die.roll while result % die.sides == 0
|
46
|
+
die.history.push result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.fudge
|
51
|
+
Proc.new do |die|
|
52
|
+
index = die.roll % 3
|
53
|
+
res = [DMTool::Result::Success, DMTool::Result::NilResult, DMTool::Result::Failure][index]
|
54
|
+
die.history.push res
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
METHODS = {
|
59
|
+
reroll: DMTool::Parser::DieDirective.reroll,
|
60
|
+
roll: DMTool::Parser::DieDirective.roll,
|
61
|
+
explode: DMTool::Parser::DieDirective.explode,
|
62
|
+
fudge: DMTool::Parser::DieDirective.fudge
|
63
|
+
}
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class DMTool::Result
|
2
|
+
include Comparable
|
3
|
+
|
4
|
+
def initialize(success: false, failure: false, critical: false, symbol: :nil_result)
|
5
|
+
@success = success
|
6
|
+
@failure = failure
|
7
|
+
@critical = critical
|
8
|
+
@symbol = symbol
|
9
|
+
end
|
10
|
+
|
11
|
+
public
|
12
|
+
|
13
|
+
Success = DMTool::Result.new(success: true, failure: false, critical: false, symbol: :success)
|
14
|
+
Failure = DMTool::Result.new(success: false, failure: true, critical: false, symbol: :failure)
|
15
|
+
NilResult = DMTool::Result.new(success: false, failure: false, critical: false, symbol: :nil_result)
|
16
|
+
CriticalSuccess = DMTool::Result.new(success: true, failure: false, critical: true, symbol: :critical_success)
|
17
|
+
CriticalFailure = DMTool::Result.new(success: false, failure: true, critical: true, symbol: :critical_failure)
|
18
|
+
|
19
|
+
attr_reader :success, :failure, :critical, :symbol
|
20
|
+
|
21
|
+
def critical_success
|
22
|
+
critical? && success?
|
23
|
+
end
|
24
|
+
|
25
|
+
def critical_failure
|
26
|
+
critical? && failure?
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
"#{to_sym}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_i
|
34
|
+
val = 0
|
35
|
+
val += 1 if success?
|
36
|
+
val -=1 if failure?
|
37
|
+
val *=2 if critical?
|
38
|
+
val
|
39
|
+
end
|
40
|
+
|
41
|
+
def coerce(other)
|
42
|
+
[other, self.to_i]
|
43
|
+
end
|
44
|
+
|
45
|
+
def +(other)
|
46
|
+
self.to_i + other.to_i
|
47
|
+
end
|
48
|
+
|
49
|
+
def <=>(other)
|
50
|
+
self.to_i <=> other.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
alias success? success
|
54
|
+
alias failure? failure
|
55
|
+
alias critical? critical
|
56
|
+
alias critical_failure? critical_failure
|
57
|
+
alias critical_success? critical_success
|
58
|
+
alias to_sym symbol
|
59
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DMTool::Roller
|
2
|
+
def self.roll(dice, directives)
|
3
|
+
ret_val = dice.map do |die|
|
4
|
+
directives.each_with_object(die) do |directive, ret|
|
5
|
+
directive.process(ret)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
ret_val
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.sum(dice, directives)
|
12
|
+
roll(dice, directives).map(&:value).inject(0, :+)
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dmtool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Forrest Fleming
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.6.5
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.6.5
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: pry
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.10'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.10'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: byebug
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '4'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '4'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: pry-byebug
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.1'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '3.1'
|
103
|
+
description: Suite of tools for RPGs. An excuse to create a fun little parser.
|
104
|
+
email:
|
105
|
+
- ffleming@gmail.com
|
106
|
+
executables:
|
107
|
+
- dmtool
|
108
|
+
- roll
|
109
|
+
extensions: []
|
110
|
+
extra_rdoc_files: []
|
111
|
+
files:
|
112
|
+
- ".codeclimate.yml"
|
113
|
+
- ".gitignore"
|
114
|
+
- ".pryrc"
|
115
|
+
- ".rspec"
|
116
|
+
- ".travis.yml"
|
117
|
+
- Gemfile
|
118
|
+
- README.md
|
119
|
+
- Rakefile
|
120
|
+
- bin/dmtool
|
121
|
+
- bin/roll
|
122
|
+
- dmtool.gemspec
|
123
|
+
- lib/core_extensions/string/prep.rb
|
124
|
+
- lib/dmtool.rb
|
125
|
+
- lib/dmtool/cli.rb
|
126
|
+
- lib/dmtool/die.rb
|
127
|
+
- lib/dmtool/errors.rb
|
128
|
+
- lib/dmtool/parser.rb
|
129
|
+
- lib/dmtool/parser/dice_string.rb
|
130
|
+
- lib/dmtool/parser/die_directive.rb
|
131
|
+
- lib/dmtool/result.rb
|
132
|
+
- lib/dmtool/roller.rb
|
133
|
+
- lib/dmtool/version.rb
|
134
|
+
homepage: http://github.com/ffleming/dmtool
|
135
|
+
licenses:
|
136
|
+
- MIT
|
137
|
+
metadata: {}
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 2.4.7
|
155
|
+
signing_key:
|
156
|
+
specification_version: 4
|
157
|
+
summary: Suite of tools for RPGs
|
158
|
+
test_files: []
|