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 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
@@ -0,0 +1,6 @@
1
+ engines:
2
+ rubocop:
3
+ enabled: true
4
+ ratings:
5
+ paths:
6
+ - "**.rb"
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
11
+ *.secret
data/.pryrc ADDED
@@ -0,0 +1,6 @@
1
+ if defined?(PryDebugger)
2
+ Pry.commands.alias_command 'c', 'continue'
3
+ Pry.commands.alias_command 's', 'step'
4
+ Pry.commands.alias_command 'n', 'next'
5
+ Pry.commands.alias_command 'f', 'finish'
6
+ end
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ script: bundle exec rspec
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'codeclimate-test-reporter'
7
+ gem 'simplecov'
8
+ end
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # DMTool
2
+ [![Build Status](https://travis-ci.org/ffleming/dmtool.svg?branch=master)](https://travis-ci.org/ffleming/dogsay)
3
+ [![Code Climate](https://codeclimate.com/github/ffleming/dmtool/badges/gpa.svg)](https://codeclimate.com/github/ffleming/dogsay)
4
+ [![Test Coverage](https://codeclimate.com/github/ffleming/dmtool/badges/coverage.svg)](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
@@ -0,0 +1,9 @@
1
+ module CoreExtensions
2
+ module String
3
+ module Prep
4
+ def prep
5
+ self.strip.squeeze(', ')
6
+ end
7
+ end
8
+ end
9
+ 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,6 @@
1
+ class ParserError < StandardError
2
+ end
3
+ class DiceStringError < ParserError
4
+ end
5
+ class DirectiveError < ParserError
6
+ 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
@@ -0,0 +1,3 @@
1
+ module DMTool
2
+ VERSION = "0.0.1"
3
+ 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: []