gm-notepad 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/exe/gm-notepad +4 -0
- data/lib/gm/notepad/app.rb +7 -3
- data/lib/gm/notepad/config.rb +5 -4
- data/lib/gm/notepad/container.rb +0 -10
- data/lib/gm/notepad/evaluators/dice_evaluator.rb +1 -1
- data/lib/gm/notepad/exceptions.rb +9 -0
- data/lib/gm/notepad/input_handlers/write_to_table_handler.rb +1 -12
- data/lib/gm/notepad/line_evaluator.rb +20 -15
- data/lib/gm/notepad/line_renderer.rb +13 -0
- data/lib/gm/notepad/parameters/table_lookup.rb +1 -1
- data/lib/gm/notepad/table.rb +1 -1
- data/lib/gm/notepad/table_registry.rb +0 -2
- data/lib/gm/notepad/throughput_text.rb +1 -0
- data/lib/gm/notepad/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 639ecbd6c3ab1d9ca709d743c23b88fbfc2deab18a25254bf3c27c71d1c4328e
|
4
|
+
data.tar.gz: e0adf1f064950a784c0a84349c92a7e10240990967a2c042166e2845e246d869
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45e58dd1073d6a3b269b7ee87ef30643833ba0f71737265a4197802577b9254bc97c2a91042ef566ee440c39ac4dc0f24782cedd61d1d54a7e8712d3c76e4b4c
|
7
|
+
data.tar.gz: b06fd07045eb893e31c832117fa849cadeccd0447a0386c5ee09a46e9eae6bdbe87decadc72f4c9264b0a182eb4784d3e0f2358c241f1430146b4f69798b0ccb
|
data/README.md
CHANGED
@@ -184,7 +184,7 @@ You can also roll within a table. In the `gm-notepad` type the following:
|
|
184
184
|
You won't get a "SamWise" or "FrodoWise" (or "FrodoWiseWise").
|
185
185
|
|
186
186
|
To wrap up our first session, let's try one more thing. In your `gm-notepad`
|
187
|
-
session type the following: `{first-name} owes
|
187
|
+
session type the following: `{first-name} owes {2d6}gp to {first-name}`:
|
188
188
|
|
189
189
|
```console
|
190
190
|
Frodo owes 3gp to SamWise
|
@@ -213,6 +213,7 @@ columns. _I am still working on retrieving by column names as well as rendering
|
|
213
213
|
- [ ] Write expected interface document
|
214
214
|
- [X] Handle `{critical[5]}`
|
215
215
|
- [X] Allow `{critical[{2d6+1}]}` to roll the dice then lookup the value in the critical table
|
216
|
+
- [X] Handle `{critical[{2d6}]} for {2d6} damage`
|
216
217
|
- [ ] For `{critical[{2d6+1}]}`, how to handle out of bounds
|
217
218
|
- [X] Skip table lines that begin with `#`
|
218
219
|
- [X] Skip processing input lines that begin with `#`
|
@@ -223,7 +224,7 @@ columns. _I am still working on retrieving by column names as well as rendering
|
|
223
224
|
- [ ] Normalize `WriteToTableHandler` to deliver on `grep` and `index` behavior
|
224
225
|
- [X] Gracefully handle requesting an entry from a table with an index that does not exist (e.g. with test data try `+name[23]`)
|
225
226
|
- [X] Gracefully handle `+name[]`, where "name" is a registered table
|
226
|
-
- [
|
227
|
+
- [X] Add time to live for line expansion (to prevent infinite loops); I suspect 100 to be reasonable
|
227
228
|
- [X] Enable "up" and "down" to scroll through history
|
228
229
|
- [X] Add index name when rendering table entries
|
229
230
|
- [ ] Gracefully handle loading a malformed data file (maybe?)
|
data/exe/gm-notepad
CHANGED
@@ -39,6 +39,10 @@ OptionParser.new do |options|
|
|
39
39
|
config[:table_extension] = table_extension
|
40
40
|
end
|
41
41
|
|
42
|
+
options.on("-lTTL", "--time_to_live=TTL", Integer, "Per line of input, how many times to allow text expansion (Default: #{defaults.time_to_live.inspect})") do |time_to_live|
|
43
|
+
config[:time_to_live] = time_to_live
|
44
|
+
end
|
45
|
+
|
42
46
|
options.on("-dDELIM", "--delimiter=DELIM", String, "Default column delimiter for tables (Default: #{defaults.column_delimiter.inspect})") do |column_delimiter|
|
43
47
|
map = { "t" => "\t" }
|
44
48
|
config[:column_delimiter] = map.fetch(column_delimiter) { column_delimiter }
|
data/lib/gm/notepad/app.rb
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
require 'dry-initializer'
|
2
2
|
require 'gm/notepad/container'
|
3
|
+
require 'gm/notepad/line_renderer'
|
3
4
|
require 'gm/notepad/throughput_text'
|
5
|
+
require 'gm/notepad/input_processor'
|
4
6
|
|
5
7
|
module Gm
|
6
8
|
module Notepad
|
7
9
|
# Responsible for recording entries and then dumping them accordingly.
|
8
10
|
class App
|
9
11
|
extend Dry::Initializer
|
10
|
-
option :
|
11
|
-
option :input_processor, default: -> { Container.resolve(:input_processor) }
|
12
|
+
option :table_registry, default: -> { Container.resolve(:table_registry) }, reader: :private
|
12
13
|
option :report_config, default: -> { Container.resolve(:config).report_config }, reader: :private
|
13
14
|
option :list_tables, default: -> { Container.resolve(:config).list_tables }, reader: :private
|
14
15
|
|
15
|
-
def initialize(*args)
|
16
|
+
def initialize(*args, input_processor: nil, renderer: nil)
|
16
17
|
super
|
18
|
+
@renderer = renderer || LineRenderer.new(table_registry: table_registry)
|
19
|
+
@input_processor = input_processor || InputProcessor.new(table_registry: table_registry)
|
17
20
|
open!
|
18
21
|
end
|
22
|
+
attr_reader :renderer, :input_processor
|
19
23
|
|
20
24
|
def process(text:)
|
21
25
|
output = input_processor.convert_to_output(input: text)
|
data/lib/gm/notepad/config.rb
CHANGED
@@ -4,19 +4,20 @@ module Gm
|
|
4
4
|
class Config
|
5
5
|
extend Dry::Configurable
|
6
6
|
|
7
|
-
setting :
|
7
|
+
setting :column_delimiter, "|", reader: true
|
8
8
|
setting :filesystem_directory, '.', reader: true
|
9
|
+
setting :include_original_command_as_comment, true, reader: true
|
9
10
|
setting :index_entry_prefix, "index", reader: true
|
10
11
|
setting :interactive_buffer, $stderr, reader: true
|
11
12
|
setting :interactive_color, :faint, reader: true
|
12
|
-
setting :output_color, false, reader: true
|
13
13
|
setting :list_tables, false, reader: true
|
14
14
|
setting :output_buffer, $stdout, reader: true
|
15
|
+
setting :output_color, false, reader: true
|
15
16
|
setting :paths, ['.'], reader: true
|
16
|
-
setting :
|
17
|
+
setting :report_config, false, reader: true
|
17
18
|
setting :skip_readlines, false, reader: true
|
18
|
-
setting :include_original_command_as_comment, true, reader: true
|
19
19
|
setting :table_extension, '.txt', reader: true
|
20
|
+
setting :time_to_live, 20, reader: true
|
20
21
|
setting :with_timestamp, false, reader: true
|
21
22
|
|
22
23
|
def self.index_entry_prefix_regexp
|
data/lib/gm/notepad/container.rb
CHANGED
@@ -6,11 +6,6 @@ module Gm
|
|
6
6
|
class Container
|
7
7
|
extend Dry::Container::Mixin
|
8
8
|
|
9
|
-
register "input_processor" do
|
10
|
-
require 'gm/notepad/input_processor'
|
11
|
-
InputProcessor.new
|
12
|
-
end
|
13
|
-
|
14
9
|
register "config" do
|
15
10
|
require 'gm/notepad/config'
|
16
11
|
Config
|
@@ -21,11 +16,6 @@ module Gm
|
|
21
16
|
TableRegistry.build_and_load
|
22
17
|
end
|
23
18
|
|
24
|
-
register "renderer" do
|
25
|
-
require 'gm/notepad/line_renderer'
|
26
|
-
LineRenderer.new
|
27
|
-
end
|
28
|
-
|
29
19
|
register "input_handler_registry" do
|
30
20
|
# Order matters. The first registered will be the first to
|
31
21
|
# answer "Can you handle the input?"
|
@@ -20,5 +20,14 @@ module Gm
|
|
20
20
|
end
|
21
21
|
alias to_buffer_message to_s
|
22
22
|
end
|
23
|
+
|
24
|
+
class ExceededTimeToLiveError < RuntimeError
|
25
|
+
attr_reader :text_when_time_to_live_exceeded
|
26
|
+
def initialize(text:, time_to_live:, text_when_time_to_live_exceeded:)
|
27
|
+
@text_when_time_to_live_exceeded = text_when_time_to_live_exceeded
|
28
|
+
super(%(Expanding the given text "#{text}" exceed the time to live of #{time_to_live}))
|
29
|
+
end
|
30
|
+
alias to_buffer_message to_s
|
31
|
+
end
|
23
32
|
end
|
24
33
|
end
|
@@ -35,18 +35,7 @@ module Gm
|
|
35
35
|
else
|
36
36
|
expand_line = true
|
37
37
|
end
|
38
|
-
input.
|
39
|
-
end
|
40
|
-
|
41
|
-
def lines
|
42
|
-
if index
|
43
|
-
elsif grep
|
44
|
-
end
|
45
|
-
if expand_line
|
46
|
-
else
|
47
|
-
end
|
48
|
-
table_registry.append(table_name: table_name, line: input.text_to_evaluate, write: true)
|
49
|
-
[]
|
38
|
+
input.for_rendering(table_name: table_name, text: input.text_to_evaluate, to_interactive: true , to_output: false, to_filesystem: true, expand_line: expand_line)
|
50
39
|
end
|
51
40
|
end
|
52
41
|
end
|
@@ -10,30 +10,35 @@ module Gm
|
|
10
10
|
class LineEvaluator
|
11
11
|
extend Dry::Initializer
|
12
12
|
option :table_registry, default: -> { Container.resolve(:table_registry) }, reader: :private
|
13
|
+
option :time_to_live, default: -> { Container.resolve(:config).time_to_live }, reader: :private
|
13
14
|
|
14
|
-
TABLE_NAME_REGEXP = %r{(?<table_name_container>\{(?<table_name>[^\{\}]+)\})}
|
15
15
|
def call(line:, expand_line: true)
|
16
16
|
input = ThroughputText.new(original_text: line, table_registry: table_registry)
|
17
17
|
return input unless expand_line
|
18
|
-
|
19
|
-
parse_dice(input: input)
|
18
|
+
parse(input: input)
|
20
19
|
input
|
21
20
|
end
|
22
21
|
|
23
22
|
private
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
24
|
+
TEXT_TO_EXPAND_REGEXP = %r{(?<text_container>\{(?<text>[^\{\}]+)\})}
|
25
|
+
def parse(input:)
|
26
|
+
lives = 0
|
27
|
+
while match = input.match(TEXT_TO_EXPAND_REGEXP)
|
28
|
+
lives += 1
|
29
|
+
if lives > time_to_live
|
30
|
+
raise ExceededTimeToLiveError.new(text: input.original_text, time_to_live: time_to_live, text_when_time_to_live_exceeded: input.to_s)
|
31
|
+
end
|
32
|
+
rolled_text = Evaluators::DiceEvaluator.call(text: match[:text])
|
33
|
+
# We sent the text through a dice roller. It came back unchanged, therefore
|
34
|
+
# the text is not a dice expression. Now expand the table.
|
35
|
+
if rolled_text == match[:text]
|
36
|
+
table_lookup = Parameters::TableLookup.new(text: match[:text], roll_dice: true)
|
37
|
+
entry = table_registry.lookup(**table_lookup.parameters)
|
38
|
+
input.sub!(match[:text_container], entry)
|
39
|
+
else
|
40
|
+
input.sub!(match[:text_container], rolled_text)
|
41
|
+
end
|
37
42
|
end
|
38
43
|
end
|
39
44
|
end
|
@@ -11,6 +11,7 @@ module Gm
|
|
11
11
|
option :with_timestamp, default: -> { Container[:config].with_timestamp }
|
12
12
|
option :interactive_buffer, type: -> (buffer, renderer) { BufferWrapper.for_interactive(buffer: buffer) }, default: -> { Container[:config].interactive_buffer }
|
13
13
|
option :output_buffer, type: -> (buffer, renderer) { BufferWrapper.for_output(buffer: buffer) }, default: -> { Container[:config].output_buffer }
|
14
|
+
option :table_registry, default: -> { Container.resolve(:table_registry) }
|
14
15
|
|
15
16
|
def render(output:, as_of: Time.now)
|
16
17
|
output.evaluate!
|
@@ -22,6 +23,10 @@ module Gm
|
|
22
23
|
next unless line.to_output
|
23
24
|
render_output(line, as_of: as_of)
|
24
25
|
end
|
26
|
+
output.lines_for_rendering.each do |line|
|
27
|
+
next unless line.to_filesystem
|
28
|
+
render_filesystem(line)
|
29
|
+
end
|
25
30
|
end
|
26
31
|
|
27
32
|
def call(lines, to_output: false, to_interactive: true, as_of: Time.now)
|
@@ -51,6 +56,14 @@ module Gm
|
|
51
56
|
end
|
52
57
|
end
|
53
58
|
|
59
|
+
def render_filesystem(lines)
|
60
|
+
return unless lines.table_name
|
61
|
+
table_name = lines.table_name
|
62
|
+
each_expanded_line(lines: lines) do |line|
|
63
|
+
table_registry.append(table_name: table_name, line: line, write: true)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
54
67
|
# Gracefully expand the \t and \n for the output buffer
|
55
68
|
def each_expanded_line(lines:)
|
56
69
|
Array(lines).each do |unexpanded_line|
|
data/lib/gm/notepad/table.rb
CHANGED
@@ -15,6 +15,7 @@ module Gm
|
|
15
15
|
|
16
16
|
def initialize(*args)
|
17
17
|
super
|
18
|
+
@table = {}
|
18
19
|
set_null_table_column_set!
|
19
20
|
process(lines: lines)
|
20
21
|
end
|
@@ -89,7 +90,6 @@ module Gm
|
|
89
90
|
|
90
91
|
STARTS_WITH_COMMENT_REGEXP = %r{\A#}
|
91
92
|
def process(lines:)
|
92
|
-
@table = {}
|
93
93
|
lines.each do |line|
|
94
94
|
line = line.strip
|
95
95
|
# Handle Comment
|
@@ -65,6 +65,7 @@ module Gm
|
|
65
65
|
option :to_interactive
|
66
66
|
option :to_output
|
67
67
|
option :to_filesystem, default: -> { false }
|
68
|
+
option :table_name, default: -> { nil }
|
68
69
|
option :expand_line, default: -> { true }
|
69
70
|
option :table_registry, default: -> { Container.resolve(:table_registry) }, reader: :private
|
70
71
|
|
data/lib/gm/notepad/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gm-notepad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Friesen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dice_parser
|