gm-notepad 0.0.17 → 0.0.18

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4175bf606855b4c2be432ac4520727705e708f16583cbf9a616d5246e46aa1f2
4
- data.tar.gz: 1877cf77a1aef0e1e7697d673d1a021fe907b964ab21c9adbb38c1ecda784428
3
+ metadata.gz: '0784714674a998ddc3d5fc89ca12a9bbff1837a18472236c66588b147fc62683'
4
+ data.tar.gz: cd5e95e5b42684c6d005d696e194c35bbe2ee7c130382e5b1b4ab75b12c09673
5
5
  SHA512:
6
- metadata.gz: d6b1d4a852e32922d6c18529584c9eb06645f440f7286b363b87767cb5094a6ae18dbf82f53c227bc2485d739a14b7b540482e0422ba81785db8e8337a92b763
7
- data.tar.gz: 33b44cb7f7888c038152cc738ab861734b73509db733c2c5ee451270ad0936f883246735300a6b02ff9f760c119be38bb8209a0d99ca4b7575c25da5229dcb3b
6
+ metadata.gz: 34053cf8caa8baf0a30cc5bef686f55e84ae464e296072fc1e3074af259dc05001f433937b7df42627b56076a807ea4bce8f5ba55b1fcde60e00194bcb0f4ed4
7
+ data.tar.gz: 0d16b0d3f31df32c84ec8f298634d2bf98cdb2806d2cfb0b47e32a33bd9103aacdc199f5594bc964ae6ef610a9298db352747a8f348bdd878826026e0a9aa904
data/README.md CHANGED
@@ -10,6 +10,10 @@ Next, you'll want to install the `gm-notepad` gem.
10
10
 
11
11
  `$ gem install gm-notepad`
12
12
 
13
+ ## Datasets
14
+
15
+ * `[gm-notepad-swn-free](//github.com/jeremyf/gm-notepad-swn-free)` a subset of tables available in [Stars without Number: Revised Edition](https://www.drivethrurpg.com/product/226996/Stars-Without-Number-Revised-Edition?affiliate_id=318171)
16
+
13
17
  ## Background
14
18
 
15
19
  On a commute home from work, while listening to [Judd Karlman's "Daydreaming about Dragons" podcast](https://anchor.fm/daydreaming-about-dragons/)
@@ -64,7 +68,7 @@ Options:
64
68
  -p, --path=PATH Path(s) for {table_name}.<config.table_extension> files (Default: ["."])
65
69
  -f, --filesystem_directory=DIR Path to dump tables (Default: ".")
66
70
  -x, --table_extension=EXT Extension to use for selecting tables (Default: ".txt")
67
- --time_to_live=TTL Per line of input, how many times to allow text expansion (Default: 20)
71
+ --time_to_live=TTL Per line of input, how many times to allow text expansion (Default: 100)
68
72
  -d, --delimiter=DELIM Default column delimiter for tables (Default: "|")
69
73
 
70
74
  Output options:
@@ -98,7 +102,7 @@ Which writes the following to the `interactive` buffer (eg. `$stderr`)::
98
102
  # config[:report_config] = true
99
103
  # config[:skip_readlines] = false
100
104
  # config[:table_extension] = ".txt"
101
- # config[:time_to_live] = 20
105
+ # config[:time_to_live] = 100
102
106
  # config[:with_timestamp] = false
103
107
  ```
104
108
 
@@ -270,10 +274,11 @@ You can then immediately access the `junk` table, by typing the following: `+jun
270
274
  - [X] Gracefully handle cell lookup when named cell for entry is not found
271
275
  - [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
272
276
  - [X] Ensure index names are lower-case
273
- - [ ] Hit 100% spec coverage
277
+ - [X] Hit 100% spec coverage
274
278
  - [X] Create a "To Render Object"; When you parse the input, you push relevant lines to that "To Render Object". When you look at a table, you want to know what the column names are.
275
279
  - [X] Remove "defer" printing concept
276
280
  - [X] Add ability to shell out; I would love to leverage the [swnt](https://github.com/nboughton/swnt) command line tool
281
+ - [ ] Refine row/column grep behavior, as it is pre-dates the idea of a table having columns
277
282
 
278
283
  ### Stretch TODO
279
284
 
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 = 98
20
+ EXPECTED_COVERAGE_GOAL = 100
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
@@ -39,12 +39,12 @@ OptionParser.new do |options|
39
39
  config[:table_extension] = table_extension
40
40
  end
41
41
 
42
- options.on("-tTTL", "--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|
42
+ options.on("-vTTL", "--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
43
  config[:time_to_live] = time_to_live
44
44
  end
45
45
 
46
46
  options.on("-dDELIM", "--delimiter=DELIM", String, "Default column delimiter for tables (Default: #{defaults.column_delimiter.inspect})") do |column_delimiter|
47
- map = { "t" => "\t" }
47
+ map = { "t" => "\t", '\t' => "\t" }
48
48
  config[:column_delimiter] = map.fetch(column_delimiter) { column_delimiter }
49
49
  end
50
50
 
@@ -57,11 +57,15 @@ OptionParser.new do |options|
57
57
  options.separator("")
58
58
  options.separator("Color options:")
59
59
 
60
- options.on("-i", "--skip-interactive-color", "Disable color rendering for interactive buffer (Default: #{(!defaults.interactive_color).inspect})") do |interactive_color|
61
- config[:interactive_color] = !interactive_color
60
+ options.on("-iCOLOR", "--interactive-color=COLOR", "Disable color rendering for interactive buffer (Default: #{(defaults.interactive_color).inspect})") do |interactive_color|
61
+ if ["false", "f" ,"no", "n"].include?(interactive_color.downcase)
62
+ config[:interactive_color] = false
63
+ else
64
+ config[:interactive_color] = interactive_color
65
+ end
62
66
  end
63
67
 
64
- options.on("-o", "--with-output-color", "Enable color rendering for output buffer (Default: #{(!defaults.output_color).inspect})") do |output_color|
68
+ options.on("-oCOLOR", "--with-output-color=COLOR", "Enable color rendering for output buffer (Default: #{(defaults.output_color).inspect})") do |output_color|
65
69
  config[:output_color] = output_color
66
70
  end
67
71
 
@@ -15,6 +15,9 @@ module Gm
15
15
 
16
16
  def initialize(*args, input_processor: nil, renderer: nil)
17
17
  super
18
+ # Note: I could note use Dry::Initializer.option with Container as I ended
19
+ # up with multiple table registry objects created. Which is why I'm using the
20
+ # keyword's with nil, so I can set two elements after the table_registry is "resolved"
18
21
  @renderer = renderer || LineRenderer.new(table_registry: table_registry)
19
22
  @input_processor = input_processor || InputProcessor.new(table_registry: table_registry)
20
23
  open!
@@ -17,7 +17,7 @@ module Gm
17
17
  setting :report_config, false, reader: true
18
18
  setting :skip_readlines, false, reader: true
19
19
  setting :table_extension, '.txt', reader: true
20
- setting :time_to_live, 20, reader: true
20
+ setting :time_to_live, 100, reader: true
21
21
  setting :with_timestamp, false, reader: true
22
22
 
23
23
  def self.index_entry_prefix_regexp
@@ -4,37 +4,24 @@ module Gm
4
4
  module Notepad
5
5
  module InputHandlers
6
6
  class WriteToTableHandler < DefaultHandler
7
- HANDLED_PREFIX = "<".freeze
7
+ WITH_WRITE_TARGET_REGEXP = %r{\A\<(?<table_name>[^:]+):(?<line>.*)}
8
8
  def self.handles?(input:)
9
- return true if input.match(/^\</)
9
+ return true if input.match(WITH_WRITE_TARGET_REGEXP)
10
10
  end
11
11
 
12
- NON_EXPANDING_CHARATER = '!'.freeze
13
- WITH_INDEX_REGEXP = %r{(?<declaration>\[(?<index>[^\]]+)\])}
14
- WITH_GREP_REGEXP = %r{(?<declaration>\/(?<grep>[^\/]+)/)}
15
- WITH_WRITE_TARGET_REGEXP = %r{\A#{HANDLED_PREFIX}(?<table_name>[^:]+):(?<line>.*)}
16
12
  def after_initialize!
17
- if match = input.match(WITH_WRITE_TARGET_REGEXP)
18
- input.text_to_evaluate = match[:line].strip
19
- table_name = match[:table_name]
20
- if index_match = WITH_INDEX_REGEXP.match(table_name)
21
- table_name = table_name.sub(index_match[:declaration], '')
22
- index = index_match[:index]
23
- elsif grep_match = WITH_GREP_REGEXP.match(table_name)
24
- table_name = table_name.sub(grep_match[:declaration], '')
25
- grep = grep_match[:grep]
26
- end
27
- table_name = table_name.downcase
28
- else
29
- raise "I don't know what to do"
30
- end
31
- if input.match(/^\!/)
32
- expand_line = false
33
- input.sub!(/^\!/, '')
34
- else
35
- expand_line = true
36
- end
37
- 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)
13
+ match = input.match(WITH_WRITE_TARGET_REGEXP)
14
+ input.text_to_evaluate = match[:line].strip
15
+ table_name = match[:table_name]
16
+ table_name = table_name.downcase
17
+ input.for_rendering(
18
+ table_name: table_name,
19
+ text: input.text_to_evaluate,
20
+ to_interactive: true,
21
+ to_output: false,
22
+ to_filesystem: true,
23
+ expand_line: true
24
+ )
38
25
  end
39
26
  end
40
27
  end
@@ -35,32 +35,25 @@ module Gm
35
35
  end
36
36
  end
37
37
 
38
+ CELL_AND_INDEX_DECLARED_REGEXP = %r{(?<declaration>\[(?<index>[^\[\]]*)\]\[(?<cell>[^\[\]]*)\])}
39
+
38
40
  WITH_GREP_REGEXP = %r{(?<declaration>\/(?<found>[^\/]+)/)}
39
41
  WITH_INDEX_REGEXP = %r{(?<declaration>\[(?<found>[^\]]+)\])}
40
- CELL_WITHOUT_INDEX_REGEXP = %r{(?<declaration>\[\]\[(?<found>[^\]]+)\])}
41
- EMPTY_INDEX_EMPTY_CELL_REGEXP = %r{(?<declaration>\[\]\[\])}
42
42
  WITH_EMPTY_INDEX_REGEX = %r{(?<declaration>\[\])}
43
43
  WITH_EMPTY_GREP_REGEX = %r{(?<declaration>\/\/)}
44
44
 
45
+ # TODO: Revisit this method to see if I can remove some pre-amble
45
46
  def extract_parameters!
46
47
  text = @text
47
- if match = EMPTY_INDEX_EMPTY_CELL_REGEXP.match(text)
48
- text = text.sub(match[:declaration], '')
49
- elsif match = CELL_WITHOUT_INDEX_REGEXP.match(text)
48
+ if match = CELL_AND_INDEX_DECLARED_REGEXP.match(text)
49
+ self.index = match[:index] if match[:index].present?
50
+ self.cell = match[:cell] if match[:cell].present?
50
51
  text = text.sub(match[:declaration], '')
51
- self.cell = match[:found]
52
52
  elsif match = WITH_EMPTY_INDEX_REGEX.match(text)
53
53
  text = text.sub(match[:declaration], '')
54
54
  elsif match = WITH_INDEX_REGEXP.match(text)
55
55
  text = text.sub(match[:declaration], '')
56
56
  self.index = match[:found]
57
- # Moving on to the cell
58
- if match = WITH_EMPTY_INDEX_REGEX.match(text)
59
- text = text.sub(match[:declaration], '')
60
- elsif match = WITH_INDEX_REGEXP.match(text)
61
- text = text.sub(match[:declaration], '')
62
- self.cell = match[:found]
63
- end
64
57
  elsif match = WITH_EMPTY_GREP_REGEX.match(text)
65
58
  text = text.sub(match[:declaration], '')
66
59
  elsif match = WITH_GREP_REGEXP.match(text)
@@ -8,7 +8,7 @@ module Gm
8
8
  module Notepad
9
9
  class Table
10
10
  extend Dry::Initializer
11
- option :table_name, proc(&:to_s)
11
+ option :table_name, -> (value) { value.to_s.downcase.strip }
12
12
  option :filename, optional: true
13
13
  option :lines, type: method(:Array)
14
14
  option :index_entry_prefix_regexp, default: -> { Container.resolve(:config).index_entry_prefix_regexp }
@@ -93,13 +93,6 @@ module Gm
93
93
  @table.values[random_index]
94
94
  end
95
95
 
96
- attr_accessor :filename
97
- attr_reader :table_name
98
-
99
- def table_name=(input)
100
- @table_name = input.downcase
101
- end
102
-
103
96
  def random_index
104
97
  rand(@table.size)
105
98
  end
@@ -12,7 +12,9 @@ module Gm
12
12
  end
13
13
 
14
14
  def column_index_for(cell:)
15
- cell.to_i
15
+ # In the file, we have cell 0 is the index. This is hidden from the cell lookup, so I
16
+ # want to internally treat the given cell as one less.
17
+ cell.to_i - 1
16
18
  end
17
19
  end
18
20
 
@@ -36,7 +36,13 @@ module Gm
36
36
 
37
37
  def lookup(cell:)
38
38
  index = table.column_index_for(cell: cell)
39
- cells[index] || cells[0]
39
+ if index.nil?
40
+ # In the file, we have cell 0 is the index. This is hidden from the cell lookup, so I
41
+ # want to internally treat the given cell as one less.
42
+ cells[cell.to_i - 1]
43
+ else
44
+ cells[index] || cells[0]
45
+ end
40
46
  end
41
47
 
42
48
  NUMBER_RANGE_REGEXP = %r{(?<left>\d+) *- *(?<right>\d+)}
@@ -1,5 +1,5 @@
1
1
  module Gm
2
2
  module Notepad
3
- VERSION = "0.0.17"
3
+ VERSION = "0.0.18"
4
4
  end
5
5
  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.17
4
+ version: 0.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Friesen