gm-notepad 0.0.10 → 0.0.11
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
- data/README.md +8 -4
- data/Rakefile +1 -1
- data/exe/gm-notepad +18 -20
- data/gm-notepad.gemspec +3 -0
- data/lib/gm/notepad.rb +8 -6
- data/lib/gm/notepad/app.rb +45 -0
- data/lib/gm/notepad/buffer_wrapper.rb +47 -0
- data/lib/gm/notepad/config.rb +31 -0
- data/lib/gm/notepad/container.rb +50 -0
- data/lib/gm/notepad/exceptions.rb +1 -1
- data/lib/gm/notepad/input_handler_registry.rb +3 -3
- data/lib/gm/notepad/input_handlers/comment_handler.rb +6 -8
- data/lib/gm/notepad/input_handlers/default_handler.rb +12 -20
- data/lib/gm/notepad/input_handlers/help_handler.rb +4 -8
- data/lib/gm/notepad/input_handlers/query_table_handler.rb +16 -14
- data/lib/gm/notepad/input_handlers/query_table_names_handler.rb +12 -17
- data/lib/gm/notepad/input_handlers/write_line_handler.rb +4 -12
- data/lib/gm/notepad/input_handlers/write_to_table_handler.rb +9 -12
- data/lib/gm/notepad/input_processor.rb +10 -11
- data/lib/gm/notepad/line_evaluator.rb +16 -15
- data/lib/gm/notepad/line_renderer.rb +24 -62
- data/lib/gm/notepad/table.rb +17 -6
- data/lib/gm/notepad/table_column_set.rb +20 -7
- data/lib/gm/notepad/table_entry.rb +12 -4
- data/lib/gm/notepad/table_registry.rb +23 -16
- data/lib/gm/notepad/throughput_text.rb +80 -0
- data/lib/gm/notepad/version.rb +1 -1
- metadata +49 -5
- data/lib/gm/notepad/configuration.rb +0 -138
- data/lib/gm/notepad/defaults.rb +0 -6
- data/lib/gm/notepad/pad.rb +0 -36
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'dry-initializer'
|
2
|
+
require 'gm/notepad/container'
|
3
3
|
|
4
4
|
module Gm
|
5
5
|
module Notepad
|
@@ -10,23 +10,36 @@ module Gm
|
|
10
10
|
def names
|
11
11
|
[]
|
12
12
|
end
|
13
|
+
|
14
|
+
def column_index_for(cell:)
|
15
|
+
cell.to_i
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
19
|
+
extend Dry::Initializer
|
20
|
+
option :line, proc(&:to_s)
|
21
|
+
option :table
|
22
|
+
option :column_delimiter, default: -> { Container.resolve(:config).column_delimiter }
|
23
|
+
|
24
|
+
def initialize(*args)
|
25
|
+
super
|
18
26
|
process_line!
|
19
27
|
end
|
20
28
|
|
21
29
|
def names
|
22
|
-
@
|
30
|
+
@column_registry.map(&:to_s)
|
23
31
|
end
|
24
32
|
|
33
|
+
def column_index_for(cell:)
|
34
|
+
@column_registry.index(cell.downcase)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
25
38
|
private
|
26
39
|
def process_line!
|
27
40
|
columns = line.split(column_delimiter)
|
28
41
|
@index = columns.shift
|
29
|
-
@
|
42
|
+
@column_registry = columns.map {|c| c.strip.downcase }
|
30
43
|
end
|
31
44
|
end
|
32
45
|
end
|
@@ -1,9 +1,17 @@
|
|
1
|
-
require '
|
1
|
+
require 'dry-initializer'
|
2
|
+
require 'gm/notepad/container'
|
3
|
+
|
2
4
|
module Gm
|
3
5
|
module Notepad
|
4
6
|
TABLE_ENTRY_RANGE_MARKER = "-".freeze
|
5
7
|
class TableEntry
|
6
|
-
|
8
|
+
extend Dry::Initializer
|
9
|
+
option :line, proc(&:to_s)
|
10
|
+
option :table
|
11
|
+
option :column_delimiter, default: -> { Container.resolve(:config).column_delimiter }
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
super
|
7
15
|
row = line.split(column_delimiter)
|
8
16
|
self.index = row.shift
|
9
17
|
self.cells = row
|
@@ -15,8 +23,8 @@ module Gm
|
|
15
23
|
end
|
16
24
|
|
17
25
|
def lookup(cell:)
|
18
|
-
|
19
|
-
cells[
|
26
|
+
index = table.column_index_for(cell: cell)
|
27
|
+
cells[index] || cells[0]
|
20
28
|
end
|
21
29
|
|
22
30
|
NUMBER_RANGE_REGEXP = %r{(?<left>\d+) *- *(?<right>\d+)}
|
@@ -1,29 +1,27 @@
|
|
1
|
+
require 'dry-initializer'
|
1
2
|
require "gm/notepad/table"
|
2
3
|
require "gm/notepad/exceptions"
|
3
4
|
require 'gm/notepad/line_evaluator'
|
5
|
+
require 'gm/notepad/container'
|
4
6
|
|
5
7
|
module Gm
|
6
8
|
module Notepad
|
7
9
|
# Responsible for loading and registering all of the named tables
|
8
10
|
class TableRegistry
|
9
|
-
def self.
|
10
|
-
|
11
|
-
table_registry.load!
|
12
|
-
table_registry
|
11
|
+
def self.build_and_load
|
12
|
+
new { load! }
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
extend Dry::Initializer
|
16
|
+
option :paths, default: -> { Container.resolve(:config).paths }
|
17
|
+
option :table_extension, default: -> { Container.resolve(:config).table_extension }
|
18
|
+
option :filesystem_directory, default: -> { Container.resolve(:config).filesystem_directory }
|
19
|
+
option :registry, default: -> { Hash.new }
|
20
|
+
option :line_evaluator, default: -> { LineEvaluator.new(table_registry: self) }
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
table_name = File.basename(filename, table_extension)
|
24
|
-
register_by_filename(table_name: table_name, filename: filename)
|
25
|
-
end
|
26
|
-
end
|
22
|
+
def initialize(*args, &block)
|
23
|
+
super
|
24
|
+
instance_exec(&block) if block_given?
|
27
25
|
end
|
28
26
|
|
29
27
|
attr_reader :line_evaluator, :registry
|
@@ -71,10 +69,19 @@ module Gm
|
|
71
69
|
|
72
70
|
private
|
73
71
|
|
72
|
+
def load!
|
73
|
+
paths.each do |path|
|
74
|
+
Dir.glob(File.join(path, "**/*#{table_extension}")).each do |filename|
|
75
|
+
table_name = File.basename(filename, table_extension)
|
76
|
+
register_by_filename(table_name: table_name, filename: filename)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
74
81
|
def register(table_name:, lines:, filename: nil)
|
75
82
|
table_name = table_name.downcase
|
76
83
|
raise DuplicateKeyError.new(key: table_name, object: self) if registry.key?(table_name.downcase)
|
77
|
-
registry[table_name] = Table.new(
|
84
|
+
registry[table_name] = Table.new(table_name: table_name, lines: lines, filename: filename)
|
78
85
|
end
|
79
86
|
end
|
80
87
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'dry-initializer'
|
2
|
+
module Gm
|
3
|
+
module Notepad
|
4
|
+
# Keep the original text close to the text that we are changing.
|
5
|
+
# This way we can dump the original text as a comment.
|
6
|
+
class ThroughputText
|
7
|
+
extend Dry::Initializer
|
8
|
+
option :original_text, proc(&:strip)
|
9
|
+
option :table_registry, default: -> { Container.resolve(:table_registry) }, reader: :private
|
10
|
+
option :lines_for_rendering, default: -> { [] }, reader: :private
|
11
|
+
def initialize(*args)
|
12
|
+
super
|
13
|
+
self.text_to_evaluate = original_text.strip
|
14
|
+
original_text.freeze
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :text_to_evaluate
|
18
|
+
|
19
|
+
def match(regexp)
|
20
|
+
text_to_evaluate.match(regexp)
|
21
|
+
end
|
22
|
+
|
23
|
+
def sub!(from, to)
|
24
|
+
@text_to_evaluate = text_to_evaluate.sub(from, to)
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](*args)
|
28
|
+
@text_to_evaluate[*args]
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_str
|
32
|
+
@text_to_evaluate.to_str
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
@text_to_evaluate.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_writer :text_to_evaluate
|
40
|
+
|
41
|
+
def for_rendering(text:, **kwargs)
|
42
|
+
@lines_for_rendering << LineForRendering.new(text: text, table_registry: table_registry, **kwargs)
|
43
|
+
end
|
44
|
+
|
45
|
+
def render_current_text(**kwargs)
|
46
|
+
for_rendering(text: text_to_evaluate, **kwargs)
|
47
|
+
end
|
48
|
+
|
49
|
+
def evaluate!
|
50
|
+
lines_for_rendering.each do |line|
|
51
|
+
line.expand!
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def lines_for_rendering
|
56
|
+
@lines_for_rendering
|
57
|
+
end
|
58
|
+
|
59
|
+
alias lines lines_for_rendering
|
60
|
+
end
|
61
|
+
|
62
|
+
class LineForRendering
|
63
|
+
extend Dry::Initializer
|
64
|
+
option :text, proc(&:to_s)
|
65
|
+
option :to_interactive
|
66
|
+
option :to_output
|
67
|
+
option :to_filesystem, default: -> { false }
|
68
|
+
option :expand_line, default: -> { true }
|
69
|
+
option :table_registry, default: -> { Container.resolve(:table_registry) }, reader: :private
|
70
|
+
|
71
|
+
alias to_s text
|
72
|
+
alias to_str text
|
73
|
+
|
74
|
+
def expand!
|
75
|
+
return false unless expand_line
|
76
|
+
instance_variable_set("@text", table_registry.evaluate(line: text).to_s)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
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.11
|
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-
|
11
|
+
date: 2019-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dice_parser
|
@@ -24,6 +24,48 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dry-configurable
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dry-container
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dry-initializer
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: term-ansicolor
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,8 +186,10 @@ files:
|
|
144
186
|
- exe/gm-notepad
|
145
187
|
- gm-notepad.gemspec
|
146
188
|
- lib/gm/notepad.rb
|
147
|
-
- lib/gm/notepad/
|
148
|
-
- lib/gm/notepad/
|
189
|
+
- lib/gm/notepad/app.rb
|
190
|
+
- lib/gm/notepad/buffer_wrapper.rb
|
191
|
+
- lib/gm/notepad/config.rb
|
192
|
+
- lib/gm/notepad/container.rb
|
149
193
|
- lib/gm/notepad/evaluators/dice_evaluator.rb
|
150
194
|
- lib/gm/notepad/exceptions.rb
|
151
195
|
- lib/gm/notepad/input_handler_registry.rb
|
@@ -159,13 +203,13 @@ files:
|
|
159
203
|
- lib/gm/notepad/input_processor.rb
|
160
204
|
- lib/gm/notepad/line_evaluator.rb
|
161
205
|
- lib/gm/notepad/line_renderer.rb
|
162
|
-
- lib/gm/notepad/pad.rb
|
163
206
|
- lib/gm/notepad/parameters/table_lookup.rb
|
164
207
|
- lib/gm/notepad/readline.rb
|
165
208
|
- lib/gm/notepad/table.rb
|
166
209
|
- lib/gm/notepad/table_column_set.rb
|
167
210
|
- lib/gm/notepad/table_entry.rb
|
168
211
|
- lib/gm/notepad/table_registry.rb
|
212
|
+
- lib/gm/notepad/throughput_text.rb
|
169
213
|
- lib/gm/notepad/version.rb
|
170
214
|
homepage: https://github.com/jeremyf/gm-notepad
|
171
215
|
licenses:
|
@@ -1,138 +0,0 @@
|
|
1
|
-
require 'gm/notepad/defaults'
|
2
|
-
module Gm
|
3
|
-
module Notepad
|
4
|
-
# Global configuration values
|
5
|
-
class Configuration
|
6
|
-
CLI_CONFIG_DEFAULTS = {
|
7
|
-
report_config: false,
|
8
|
-
defer_output: false,
|
9
|
-
filesystem_directory: '.',
|
10
|
-
index_entry_prefix: "index",
|
11
|
-
interactive_buffer: $stderr,
|
12
|
-
interactive_color: true,
|
13
|
-
output_color: false,
|
14
|
-
list_tables: false,
|
15
|
-
output_buffer: $stdout,
|
16
|
-
paths: [],
|
17
|
-
column_delimiter: Gm::Notepad::DEFAULT_COLUMN_DELIMITER,
|
18
|
-
skip_readlines: false,
|
19
|
-
table_extension: '.txt',
|
20
|
-
with_timestamp: false
|
21
|
-
}
|
22
|
-
|
23
|
-
# NOTE: ORDER MATTERS! I have a temporal dependency in these
|
24
|
-
# defaults
|
25
|
-
INTERNAL_CONFIG_DEFAULTS_METHOD_NAMES = [
|
26
|
-
:table_registry,
|
27
|
-
:input_handler_registry,
|
28
|
-
:input_processor,
|
29
|
-
:renderer,
|
30
|
-
]
|
31
|
-
|
32
|
-
def self.init!(target:, from_config: [], additional_params: [], &block)
|
33
|
-
# Need to rebind the parameter
|
34
|
-
_additional_params = additional_params
|
35
|
-
target.define_method(:initialize) do |config: nil, **params|
|
36
|
-
@config = config || CLI_CONFIG_DEFAULTS
|
37
|
-
from_config.each do |method_name|
|
38
|
-
send("#{method_name}=", @config[method_name])
|
39
|
-
end
|
40
|
-
_additional_params.each do |key|
|
41
|
-
send("#{key}=", params.fetch(key))
|
42
|
-
end
|
43
|
-
instance_exec(&block) if block
|
44
|
-
end
|
45
|
-
from_config.each do |method_name|
|
46
|
-
target.module_exec do
|
47
|
-
attr_accessor(method_name)
|
48
|
-
protected "#{method_name}="
|
49
|
-
end
|
50
|
-
end
|
51
|
-
_additional_params.each do |method_name|
|
52
|
-
target.module_exec do
|
53
|
-
attr_accessor(method_name)
|
54
|
-
protected "#{method_name}="
|
55
|
-
end
|
56
|
-
end
|
57
|
-
target.attr_reader :config
|
58
|
-
end
|
59
|
-
|
60
|
-
def initialize(input_handler_registry: nil, table_registry: nil, renderer: nil, input_processor: nil, **overrides)
|
61
|
-
CLI_CONFIG_DEFAULTS.each_pair do |key, default_value|
|
62
|
-
value = overrides.fetch(key, default_value)
|
63
|
-
if !value.is_a?(IO)
|
64
|
-
value = value.clone
|
65
|
-
value.freeze
|
66
|
-
end
|
67
|
-
self.send("#{key}=", value)
|
68
|
-
end
|
69
|
-
self.table_registry = (table_registry || default_table_registry)
|
70
|
-
self.input_handler_registry = (input_handler_registry || default_input_handler_registry)
|
71
|
-
self.renderer = (renderer || default_renderer)
|
72
|
-
self.input_processor = (input_processor || default_input_processor)
|
73
|
-
end
|
74
|
-
attr_reader(*CLI_CONFIG_DEFAULTS.keys)
|
75
|
-
attr_reader(*INTERNAL_CONFIG_DEFAULTS_METHOD_NAMES)
|
76
|
-
|
77
|
-
def to_hash
|
78
|
-
config = CLI_CONFIG_DEFAULTS.keys.each_with_object({}) do |key, mem|
|
79
|
-
mem[key] = send(key)
|
80
|
-
end
|
81
|
-
INTERNAL_CONFIG_DEFAULTS_METHOD_NAMES.each_with_object(config) do |key, mem|
|
82
|
-
mem[key] = send(key)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def [](value)
|
87
|
-
public_send(value)
|
88
|
-
end
|
89
|
-
|
90
|
-
private
|
91
|
-
attr_writer(*CLI_CONFIG_DEFAULTS.keys)
|
92
|
-
attr_writer(*INTERNAL_CONFIG_DEFAULTS_METHOD_NAMES)
|
93
|
-
|
94
|
-
def paths=(input)
|
95
|
-
if input.empty?
|
96
|
-
@paths = ["."]
|
97
|
-
else
|
98
|
-
@paths = Array(input)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def default_input_processor
|
103
|
-
require "gm/notepad/input_processor"
|
104
|
-
InputProcessor.new(config: self)
|
105
|
-
end
|
106
|
-
|
107
|
-
def default_table_registry
|
108
|
-
require "gm/notepad/table_registry"
|
109
|
-
TableRegistry.load_for(config: self)
|
110
|
-
end
|
111
|
-
|
112
|
-
def default_renderer
|
113
|
-
require 'gm/notepad/line_renderer'
|
114
|
-
LineRenderer.new(config: self)
|
115
|
-
end
|
116
|
-
|
117
|
-
def default_input_handler_registry
|
118
|
-
# Order matters. The first registered will be the first to
|
119
|
-
# answer "Can you handle the input?"
|
120
|
-
require "gm/notepad/input_handler_registry"
|
121
|
-
require "gm/notepad/input_handlers/help_handler"
|
122
|
-
require "gm/notepad/input_handlers/comment_handler"
|
123
|
-
require "gm/notepad/input_handlers/query_table_handler"
|
124
|
-
require "gm/notepad/input_handlers/query_table_names_handler"
|
125
|
-
require "gm/notepad/input_handlers/write_to_table_handler"
|
126
|
-
require "gm/notepad/input_handlers/write_line_handler"
|
127
|
-
InputHandlerRegistry.new do |registry|
|
128
|
-
registry.register(handler: InputHandlers::HelpHandler)
|
129
|
-
registry.register(handler: InputHandlers::CommentHandler)
|
130
|
-
registry.register(handler: InputHandlers::QueryTableHandler)
|
131
|
-
registry.register(handler: InputHandlers::QueryTableNamesHandler)
|
132
|
-
registry.register(handler: InputHandlers::WriteToTableHandler)
|
133
|
-
registry.register(handler: InputHandlers::WriteLineHandler)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|