gm-notepad 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 810f059bbc2e85fe481e437d815c66bcf6961d2a0db10961185760866d668bc3
4
- data.tar.gz: ecbd3218e749bbfda79dd4844a74f77eb550f1b28d8a95bcc847138a99717f86
3
+ metadata.gz: cf576a76ad9f5f2c4676b9a14d9f3557eeddddf74e2050ebc17a97e3d9f65f65
4
+ data.tar.gz: 81b1342b09f2321b1efa7dbd3b53acedc21303d27ce8bdb2b3e56888805b896c
5
5
  SHA512:
6
- metadata.gz: '038db1de31070662c1014545d0b812ddea79ce9e79cf2cce5d30483b6149ce9bdab3a4dcf8367bd22fbb719ac63d6b409ea7a88c41586c1caea2442a7784fbe5'
7
- data.tar.gz: aed9015c6102810fbe795654ecf4e2ba5adcfb2f9b038471f32ec44f97452437a8549dfd3fcbecd10efb439f7206639e1f8bc1611eae4c60b0a05465a7498fd9
6
+ metadata.gz: 78d7865d2e222c20e8acb490637b0442426bad4fb9d739cfb32bbb1f4c283ac92ca5037e96ec80b58bb8bdab55ad48b7dd3d699ac5b28f1817bdc86e4b6cb696
7
+ data.tar.gz: 00262af2d6920303a49c22946cf7224f8e09e6b0bfe8da2275ae283ce097079256e61574e3bb00f19c17dd48fe0d13aa4a4fd06d85ad0028806cf3661924edd2
data/README.md CHANGED
@@ -43,8 +43,6 @@ line and render it to one or more of the buffers.
43
43
 
44
44
  ## Examples
45
45
 
46
- ### Simple Help
47
-
48
46
  First, take a look at the help: `$ gm-notepad -h`
49
47
 
50
48
  ```console
@@ -100,10 +98,10 @@ glob: `./**/*.txt`.
100
98
 
101
99
  Included in the gem's test suite are four files:
102
100
 
103
- * `./spec/fixtures/name.txt`
104
- * `./spec/fixtures/first-name.txt`
105
- * `./spec/fixtures/last-name.txt`
106
- * `./spec/fixtures/location.csv`
101
+ * ./spec/fixtures/name.txt
102
+ * ./spec/fixtures/first-name.txt
103
+ * ./spec/fixtures/last-name.txt
104
+ * ./spec/fixtures/location.csv
107
105
 
108
106
  When I run `gm-notepad -l`, `gm-notepad` does the following:
109
107
 
@@ -209,34 +207,39 @@ entry has a 1 in 3 chance of being randomly chosen.
209
207
  - [X] Colorize puts to `interactive` buffer
210
208
  - [X] Disable colors as a configuration option
211
209
  - [ ] Write expected interface document
212
- - [ ] Skip table lines that begin with `#`
210
+ - [ ] Allow `{critical[2d6+1]}` to roll the dice then lookup the value in the critical table
211
+ - [X] Skip table lines that begin with `#`
213
212
  - [X] Skip processing input lines that begin with `#`
214
- - [ ] Allow configuration to specify colors
215
213
  - [X] Allow configuration to specify table delimiter
216
- - [ ] Allow option to add a table to memory (instead of writing the table)
217
214
  - [ ] Add option to dump all tables to the given directory
218
215
  - [X] Allow configuration for where to dump data
219
216
  - [ ] Normalize `WriteToTableHandler` to use a renderer
220
217
  - [ ] Normalize `WriteToTableHandler` to deliver on `grep` and `index` behavior
221
218
  - [X] Gracefully handle requesting an entry from a table with an index that does not exist (e.g. with test data try `+name[23]`)
222
219
  - [X] Gracefully handle `+name[]`, where "name" is a registered table
223
- - [ ] Add time to live for line expansion (to prevent infinite loops)
220
+ - [ ] Add time to live for line expansion (to prevent infinite loops); I suspect 100 to be reasonable
224
221
  - [X] Enable "up" and "down" to scroll through history
225
222
  - [ ] Add config that expands dice results while including the requested roll
226
- - [ ] Determine feasibility of adding dice to the `{}` expansion syntax (instead of the `[]` syntax)
227
223
  - [X] Add index name when rendering table entries
228
224
  - [ ] Gracefully handle loading a malformed data file (maybe?)
229
225
  - [ ] Add force write results to `output`
230
226
  - [X] Add concept of history
231
227
  - [ ] When expanding tables account for line expansion (via \n and \t)
232
228
  - [ ] Separate the InputHandler into pre-amble (e.g. allow overrides to where we are writing, determine what command we are writing)
229
+ - [X] Create a configuration object that captures the initial input (reduce passing around parameters and persisting copies of the config)
230
+ - [ ] Add concept of "journal entry"; its not a table (perhaps) but something that you could capture notes.
231
+ - [ ] Add column handling `{table[][]}`
232
+ - [X] Support `\{\{table}-name}` You should be able to do `\{\{culture}-name}` and first evaluate to `{arabic-name}` and then get a value from the `arabic-name` table
233
+ - [X] Ensure index names are lower-case
234
+ - [ ] Hit 100% spec coverage
235
+
236
+ ### Stretch TODO
237
+
233
238
  - [ ] Handle a `.gm-notepadrc` to inject default configurations
239
+ - [ ] Allow configuration to specify colors
240
+ - [ ] Aspiration: Enable `\{\{monster}[ac]}` to pick a random monster and then fetch that monster's AC
241
+ - [ ] Allow option to add a table to memory (instead of writing the table)
234
242
  - [ ] Add auto table expansion for "{}"
235
243
  - [ ] Add auto table expansion for "+"
236
244
  - [ ] Add auto index expansion for "["
237
- - [ ] Create a configuration object that captures the initial input (reduce passing around parameters and persisting copies of the config)
238
- - [ ] Aspiration: Enable `{{monster}[ac]}` to pick a random monster and then fetch that monster's AC
239
- - [ ] Add concept of "journal entry"; its not a table (perhaps) but something that you could capture notes.
240
- - [ ] Add column handling `{table[][]}`
241
- - [X] Support `{{table}-name}` You should be able to do `{{culture}-name}` and first evaluate to `{arabic-name}` and then get a value from the `arabic-name` table
242
- - [X] Ensure index names are lower-case
245
+ - [ ] Determine feasibility of adding dice to the `{}` expansion syntax (instead of the `[]` syntax)
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ namespace :commitment do
17
17
  lastrun_filename = File.expand_path('../coverage/.last_run.json', __FILE__)
18
18
  if File.exist?(lastrun_filename)
19
19
  coverage_percentage = JSON.parse(File.read(lastrun_filename)).fetch('result').fetch('covered_percent').to_i
20
- EXPECTED_COVERAGE_GOAL = 96
20
+ EXPECTED_COVERAGE_GOAL = 97
21
21
  if coverage_percentage < EXPECTED_COVERAGE_GOAL
22
22
  abort("ERROR: Code Coverage Goal Not Met:\n\t#{coverage_percentage}%\tExpected\n\t#{EXPECTED_COVERAGE_GOAL}%\tActual")
23
23
  else
data/exe/gm-notepad CHANGED
@@ -2,22 +2,7 @@
2
2
  require 'gm/notepad'
3
3
 
4
4
  require 'optparse'
5
- config = {
6
- report_config: false,
7
- defer_output: false,
8
- filesystem_directory: '.',
9
- interactive_buffer: $stderr,
10
- interactive_color: true,
11
- output_color: false,
12
- list_tables: false,
13
- output_buffer: $stdout,
14
- paths: ['.'],
15
- column_delimiter: Gm::Notepad::DEFAULT_COLUMN_DELIMITER,
16
- shell_prompt: Gm::Notepad::DEFAULT_SHELL_PROMPT,
17
- skip_readlines: false,
18
- table_extension: '.txt',
19
- with_timestamp: false
20
- }
5
+ config = Gm::Notepad::Configuration::CLI_CONFIG_DEFAULTS.clone
21
6
 
22
7
  command_name = File.basename(__FILE__)
23
8
 
@@ -0,0 +1,130 @@
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
+ interactive_buffer: $stderr,
11
+ interactive_color: true,
12
+ output_color: false,
13
+ list_tables: false,
14
+ output_buffer: $stdout,
15
+ paths: ['.'],
16
+ column_delimiter: Gm::Notepad::DEFAULT_COLUMN_DELIMITER,
17
+ shell_prompt: Gm::Notepad::DEFAULT_SHELL_PROMPT,
18
+ skip_readlines: false,
19
+ table_extension: '.txt',
20
+ with_timestamp: false
21
+ }.freeze
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 default_input_processor
95
+ require "gm/notepad/input_processor"
96
+ InputProcessor.new(config: self)
97
+ end
98
+
99
+ def default_table_registry
100
+ require "gm/notepad/table_registry"
101
+ TableRegistry.load_for(config: self)
102
+ end
103
+
104
+ def default_renderer
105
+ require 'gm/notepad/line_renderer'
106
+ LineRenderer.new(config: self)
107
+ end
108
+
109
+ def default_input_handler_registry
110
+ # Order matters. The first registered will be the first to
111
+ # answer "Can you handle the input?"
112
+ require "gm/notepad/input_handler_registry"
113
+ require "gm/notepad/input_handlers/help_handler"
114
+ require "gm/notepad/input_handlers/comment_handler"
115
+ require "gm/notepad/input_handlers/query_table_handler"
116
+ require "gm/notepad/input_handlers/query_table_names_handler"
117
+ require "gm/notepad/input_handlers/write_to_table_handler"
118
+ require "gm/notepad/input_handlers/write_line_handler"
119
+ InputHandlerRegistry.new do |registry|
120
+ registry.register(handler: InputHandlers::HelpHandler)
121
+ registry.register(handler: InputHandlers::CommentHandler)
122
+ registry.register(handler: InputHandlers::QueryTableHandler)
123
+ registry.register(handler: InputHandlers::QueryTableNamesHandler)
124
+ registry.register(handler: InputHandlers::WriteToTableHandler)
125
+ registry.register(handler: InputHandlers::WriteLineHandler)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -3,10 +3,10 @@ module Gm
3
3
  module Notepad
4
4
  module InputHandlers
5
5
  class CommentHandler < DefaultHandler
6
- COMMEND_PREFIX = '#'.freeze
6
+ COMMENT_PREFIX = '#'.freeze
7
7
 
8
8
  def self.handles?(input:)
9
- return false unless input[0] == COMMEND_PREFIX
9
+ return false unless input[0] == COMMENT_PREFIX
10
10
  true
11
11
  end
12
12
 
@@ -1,12 +1,9 @@
1
-
1
+ require 'gm/notepad/configuration'
2
2
  module Gm
3
3
  module Notepad
4
4
  # Responsible for processing the given input into a renderable state
5
5
  class InputProcessor
6
- def initialize(table_registry:, **config)
7
- self.table_registry = table_registry
8
- self.input_handler_registry = config.fetch(:input_handler_registry) { default_input_handler_registry }
9
- end
6
+ Configuration.init!(target: self, from_config: [:table_registry, :input_handler_registry])
10
7
 
11
8
  def process(input:)
12
9
  processor = build_for(input: input)
@@ -15,9 +12,6 @@ module Gm
15
12
  end
16
13
  end
17
14
 
18
- attr_accessor :table_registry, :input_handler_registry
19
- private :table_registry=, :input_handler_registry
20
-
21
15
  private
22
16
 
23
17
  def build_for(input:)
@@ -26,24 +20,6 @@ module Gm
26
20
  handler.table_registry = table_registry
27
21
  handler
28
22
  end
29
-
30
- def default_input_handler_registry
31
- require "gm/notepad/input_handler_registry"
32
- require "gm/notepad/input_handlers/help_handler"
33
- require "gm/notepad/input_handlers/comment_handler"
34
- require "gm/notepad/input_handlers/query_table_handler"
35
- require "gm/notepad/input_handlers/query_table_names_handler"
36
- require "gm/notepad/input_handlers/write_to_table_handler"
37
- require "gm/notepad/input_handlers/write_line_handler"
38
- InputHandlerRegistry.new do |registry|
39
- registry.register(handler: InputHandlers::HelpHandler)
40
- registry.register(handler: InputHandlers::CommentHandler)
41
- registry.register(handler: InputHandlers::QueryTableHandler)
42
- registry.register(handler: InputHandlers::QueryTableNamesHandler)
43
- registry.register(handler: InputHandlers::WriteToTableHandler)
44
- registry.register(handler: InputHandlers::WriteLineHandler)
45
- end
46
- end
47
23
  end
48
24
  end
49
25
  end
@@ -7,9 +7,11 @@ module Gm
7
7
  DICE_REGEXP = %r{(?<dice_container>\[(?<dice>[^\]]+)\])}
8
8
  def call(line:, table_lookup_function:, expand_line: true)
9
9
  return line unless expand_line
10
- while match = line.match(TABLE_NAME_REGEXP)
10
+ match = line.match(TABLE_NAME_REGEXP)
11
+ while match
11
12
  evaluated_table_name = table_lookup_function.call(table_name: match[:table_name].strip)
12
13
  line = line.sub(match[:table_name_container], evaluated_table_name)
14
+ match = line.match(TABLE_NAME_REGEXP)
13
15
  end
14
16
  while match = line.match(DICE_REGEXP)
15
17
  if parsed_dice = Dice.parse(match[:dice])
@@ -1,21 +1,18 @@
1
+ require 'gm/notepad/configuration'
1
2
  require 'time'
2
3
  require 'term/ansicolor'
3
4
  module Gm
4
5
  module Notepad
5
6
  # Responsible for rendering lines to the corresponding buffers
6
7
  class LineRenderer
7
- def initialize(defer_output:, output_buffer: default_output_buffer, interactive_buffer: default_interactive_buffer, **config)
8
- self.config = config
9
- self.output_buffer = output_buffer
10
- self.interactive_buffer = interactive_buffer
11
- @defer_output = defer_output
8
+ Configuration.init!(target: self, from_config: [:with_timestamp, :defer_output, :output_buffer, :interactive_buffer]) do
12
9
  @lines = []
13
10
  yield(self) if block_given?
14
11
  end
15
12
 
16
13
  def call(lines, to_output: false, to_interactive: true, as_of: Time.now)
17
14
  render_interactive(lines) if to_interactive
18
- render_output(lines, defer_output: defer_output, as_of: as_of) if to_output
15
+ render_output(lines, defer_output: config[:defer_output], as_of: as_of) if to_output
19
16
  end
20
17
 
21
18
  def close!
@@ -25,15 +22,6 @@ module Gm
25
22
 
26
23
  private
27
24
 
28
- attr_accessor :config
29
-
30
- # When true, we defer_output writing until we close the notepad
31
- # When false, we write immediately to the output buffer
32
- attr_reader :defer_output
33
-
34
- # The receiver of interactive messages
35
- attr_reader :interactive_buffer
36
-
37
25
  def interactive_buffer=(buffer)
38
26
  if config[:interactive_color]
39
27
  @interactive_buffer = BufferWrapper.new(buffer, color: :faint, as: :interactive)
@@ -42,9 +30,6 @@ module Gm
42
30
  end
43
31
  end
44
32
 
45
- # The receiver of output
46
- attr_reader :output_buffer
47
-
48
33
  def output_buffer=(buffer)
49
34
  if config[:output_color]
50
35
  @output_buffer = BufferWrapper.new(buffer, color: :bold, as: :output)
@@ -53,15 +38,9 @@ module Gm
53
38
  end
54
39
  end
55
40
 
56
-
57
- # When writing to output_buffer, should we prefix with a timestamp?
58
- def with_timestamp?
59
- config.fetch(:with_timestamp, false)
60
- end
61
-
62
41
  def render_output(lines, defer_output:, as_of:)
63
42
  Array(lines).each do |line|
64
- if with_timestamp?
43
+ if config[:with_timestamp]
65
44
  line = "#{as_of}\t#{line}"
66
45
  end
67
46
  if defer_output
@@ -77,14 +56,6 @@ module Gm
77
56
  interactive_buffer.puts("=>\t#{line}")
78
57
  end
79
58
  end
80
-
81
- def default_output_buffer
82
- $stdout
83
- end
84
-
85
- def default_interactive_buffer
86
- $stderr
87
- end
88
59
  end
89
60
 
90
61
  # To provide a means for colorizing the output
@@ -1,13 +1,9 @@
1
+ require 'gm/notepad/configuration'
1
2
  module Gm
2
3
  module Notepad
3
4
  # Responsible for recording entries and then dumping them accordingly.
4
5
  class Pad
5
- attr_reader :config
6
- def initialize(**config)
7
- self.config = config
8
- self.table_registry = config.fetch(:table_registry) { default_table_registry }
9
- self.renderer = config.fetch(:renderer) { default_renderer }
10
- self.input_processor = config.fetch(:input_processor) { default_input_processor }
6
+ Notepad::Configuration.init!(target: self, from_config: [:table_registry, :renderer, :input_processor]) do
11
7
  open!
12
8
  end
13
9
 
@@ -18,57 +14,22 @@ module Gm
18
14
  end
19
15
 
20
16
  def close!
21
- @renderer.close!
17
+ renderer.close!
22
18
  end
23
19
 
24
- attr_reader :table_registry
25
-
26
20
  private
27
21
 
28
- attr_reader :renderer
29
22
  def open!
30
- return unless config[:report_config]
23
+ return unless config.report_config
31
24
  lines = ["# Configuration Parameters:"]
32
25
  config.each_pair do |key, value|
33
26
  lines << "# config[#{key.inspect}] = #{value.inspect}"
34
27
  end
35
28
  # When running :list_tables by default I don't want to report
36
29
  # that to the output buffer.
37
- to_output = !config[:list_tables]
30
+ to_output = !config.list_tables
38
31
  renderer.call(lines, to_interactive: true, to_output: to_output)
39
32
  end
40
-
41
- attr_accessor :renderer, :input_processor
42
- attr_writer :config, :table_registry
43
-
44
- def default_input_processor
45
- require "gm/notepad/input_processor"
46
- InputProcessor.new(table_registry: table_registry)
47
- end
48
-
49
- def default_table_registry
50
- require "gm/notepad/table_registry"
51
- TableRegistry.load_for(**config)
52
- end
53
-
54
- def default_renderer
55
- require 'gm/notepad/line_renderer'
56
- LineRenderer.new(
57
- with_timestamp: config.fetch(:with_timestamp, false),
58
- defer_output: config.fetch(:defer_output, false),
59
- output_buffer: config.fetch(:output_buffer, default_output_buffer),
60
- interactive_buffer: config.fetch(:interactive_buffer, default_interactive_buffer),
61
- **config
62
- )
63
- end
64
-
65
- def default_output_buffer
66
- $stdout
67
- end
68
-
69
- def default_interactive_buffer
70
- $stderr
71
- end
72
33
  end
73
34
  end
74
35
  end
@@ -23,6 +23,11 @@ module Gm
23
23
  # Hook-in the above completion function
24
24
  ::Readline.completion_proc = completion_function
25
25
 
26
+ # In the interactive shell, where are we sending the prompts?
27
+ # If this defaults to $stdout then if we are directing $stdout
28
+ # to a file, we end up typing blind into the terminal
29
+ ::Readline.output = $stderr
30
+
26
31
  def self.input_getter(**config)
27
32
  -> { ::Readline.readline("#{config.fetch(:shell_prompt, ">")} ", true) }
28
33
  end
@@ -4,10 +4,7 @@ require "gm/notepad/table_entry"
4
4
  module Gm
5
5
  module Notepad
6
6
  class Table
7
- def initialize(table_name:, lines:, filename: nil, **config)
8
- self.config = config
9
- self.table_name = table_name
10
- self.filename = filename
7
+ Configuration.init!(target: self, additional_params: [:table_name, :filename, :lines]) do
11
8
  process(lines: lines)
12
9
  end
13
10
 
@@ -58,6 +55,7 @@ module Gm
58
55
  def process(lines:)
59
56
  @table = {}
60
57
  lines.each do |line|
58
+ next if line[0] == '#'
61
59
  entry = TableEntry.new(line: line, **config)
62
60
  entry.lookup_range.each do |i|
63
61
  key = i.to_s
@@ -3,8 +3,7 @@ module Gm
3
3
  module Notepad
4
4
  TABLE_ENTRY_RANGE_MARKER = "-".freeze
5
5
  class TableEntry
6
- def initialize(line:, column_delimiter: DEFAULT_COLUMN_DELIMITER, **config)
7
- self.column_delimiter = column_delimiter
6
+ Configuration.init!(target: self, from_config: [:column_delimiter], additional_params: [:line]) do
8
7
  self.lookup_column, self.entry_column = line.split(column_delimiter)
9
8
  end
10
9
 
@@ -31,8 +30,6 @@ module Gm
31
30
 
32
31
  private
33
32
 
34
- attr_accessor :column_delimiter
35
-
36
33
  def lookup_column=(input)
37
34
  @lookup_column = input.strip.downcase.freeze
38
35
  end
@@ -1,23 +1,20 @@
1
1
  require "gm/notepad/table"
2
2
  require "gm/notepad/exceptions"
3
+ require 'gm/notepad/line_evaluator'
3
4
 
4
5
  module Gm
5
6
  module Notepad
6
7
  # Responsible for loading and registering all of the named tables
7
8
  class TableRegistry
8
- def self.load_for(**config)
9
- table_registry = new(**config)
9
+ def self.load_for(config:)
10
+ table_registry = new(config: config)
10
11
  table_registry.load!
11
12
  table_registry
12
13
  end
13
14
 
14
- def initialize(line_evaluator: default_line_evaluator, **config)
15
- self.config = config
16
- self.line_evaluator = line_evaluator
17
- self.paths = config.fetch(:paths) { [] }
18
- self.table_extension = config.fetch(:table_extension) { ".txt" }
19
- self.filesystem_directory = config.fetch(:filesystem_directory) { "." }
15
+ Configuration.init!(target: self, from_config: [:paths, :table_extension, :filesystem_directory]) do
20
16
  @registry = {}
17
+ @line_evaluator = LineEvaluator.new
21
18
  end
22
19
 
23
20
  def load!
@@ -29,16 +26,14 @@ module Gm
29
26
  end
30
27
  end
31
28
 
32
- private
33
- attr_accessor :line_evaluator, :paths, :table_extension, :filesystem_directory, :config
34
- public
29
+ attr_reader :line_evaluator, :registry
35
30
 
36
31
  def table_names
37
- @registry.keys.sort
32
+ registry.keys.sort
38
33
  end
39
34
 
40
35
  def fetch_table(name:)
41
- @registry.fetch(name.downcase)
36
+ registry.fetch(name.downcase)
42
37
  end
43
38
 
44
39
  def append(table_name:, line:, write:)
@@ -76,13 +71,8 @@ module Gm
76
71
 
77
72
  def register(table_name:, lines:, filename: nil)
78
73
  table_name = table_name.downcase
79
- raise DuplicateKeyError.new(key: table_name, object: self) if @registry.key?(table_name.downcase)
80
- @registry[table_name] = Table.new(table_name: table_name, lines: lines, filename: filename, **config)
81
- end
82
-
83
- def default_line_evaluator
84
- require 'gm/notepad/line_evaluator'
85
- LineEvaluator.new
74
+ raise DuplicateKeyError.new(key: table_name, object: self) if registry.key?(table_name.downcase)
75
+ registry[table_name] = Table.new(config: config, table_name: table_name, lines: lines, filename: filename)
86
76
  end
87
77
  end
88
78
  end
@@ -1,5 +1,5 @@
1
1
  module Gm
2
2
  module Notepad
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
data/lib/gm/notepad.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require "gm/notepad/version"
2
2
  require "gm/notepad/defaults"
3
3
  require "gm/notepad/pad"
4
+ require "gm/notepad/configuration"
4
5
  module Gm
5
6
  module Notepad
6
7
  def self.new(*args)
7
- Pad.new(*args)
8
+ config = Configuration.new(*args)
9
+ Pad.new(config: config)
8
10
  end
9
11
  end
10
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gm-notepad
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Friesen
@@ -144,6 +144,7 @@ files:
144
144
  - exe/gm-notepad
145
145
  - gm-notepad.gemspec
146
146
  - lib/gm/notepad.rb
147
+ - lib/gm/notepad/configuration.rb
147
148
  - lib/gm/notepad/defaults.rb
148
149
  - lib/gm/notepad/exceptions.rb
149
150
  - lib/gm/notepad/input_handler_registry.rb