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.
@@ -1,5 +1,5 @@
1
- require "gm/notepad/exceptions"
2
- require "gm/notepad/configuration"
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
- Configuration.init!(target: self, additional_params: [:table, :line], from_config: [:column_delimiter]) do
16
- @columns = []
17
- @index =
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
- @columns.map(&:to_s)
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
- @columns = columns.map {|c| c.strip.downcase }
42
+ @column_registry = columns.map {|c| c.strip.downcase }
30
43
  end
31
44
  end
32
45
  end
@@ -1,9 +1,17 @@
1
- require 'gm/notepad/defaults'
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
- Configuration.init!(target: self, from_config: [:column_delimiter], additional_params: [:line, :table]) do
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
- # TODO: Need to deal with named columns
19
- cells[cell.to_i]
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.load_for(config:)
10
- table_registry = new(config: config)
11
- table_registry.load!
12
- table_registry
11
+ def self.build_and_load
12
+ new { load! }
13
13
  end
14
14
 
15
- Configuration.init!(target: self, from_config: [:paths, :table_extension, :filesystem_directory]) do
16
- @registry = {}
17
- @line_evaluator = LineEvaluator.new(table_registry: self)
18
- end
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 load!
21
- paths.each do |path|
22
- Dir.glob(File.join(path, "**/*#{table_extension}")).each do |filename|
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(config: config, table_name: table_name, lines: lines, filename: filename)
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
@@ -1,5 +1,5 @@
1
1
  module Gm
2
2
  module Notepad
3
- VERSION = "0.0.10"
3
+ VERSION = "0.0.11"
4
4
  end
5
5
  end
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.10
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-07-28 00:00:00.000000000 Z
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/configuration.rb
148
- - lib/gm/notepad/defaults.rb
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