markdown_exec 1.8.2 → 1.8.4

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.
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # encoding=utf-8
5
+ module MarkdownExec
6
+ class LinkState
7
+ attr_accessor :block_name, :document_filename,
8
+ :inherited_block_names, :inherited_lines
9
+
10
+ # Initialize the LinkState with keyword arguments for each attribute.
11
+ # @param block_name [String, nil] the name of the block.
12
+ # @param document_filename [String, nil] the filename of the document.
13
+ # @param inherited_block_names [Array<String>, nil] the names of the inherited blocks.
14
+ # @param inherited_lines [Array<String>, nil] the inherited lines of code.
15
+ def initialize(block_name: nil, document_filename: nil,
16
+ inherited_block_names: [], inherited_lines: nil)
17
+ @block_name = block_name
18
+ @document_filename = document_filename
19
+ @inherited_block_names = inherited_block_names
20
+ @inherited_lines = inherited_lines
21
+ end
22
+
23
+ # Creates an empty LinkState instance.
24
+ # @return [LinkState] an instance with all attributes set to their default values.
25
+ def self.empty
26
+ new
27
+ end
28
+
29
+ # Custom equality method to compare LinkState objects.
30
+ # @param other [LinkState] the other LinkState object to compare with.
31
+ # @return [Boolean] true if the objects are equal, false otherwise.
32
+ def ==(other)
33
+ other.class == self.class &&
34
+ other.block_name == block_name &&
35
+ other.document_filename == document_filename &&
36
+ other.inherited_block_names == inherited_block_names &&
37
+ other.inherited_lines == inherited_lines
38
+ end
39
+ end
40
+
41
+ class LinkHistory
42
+ def initialize
43
+ @history = []
44
+ end
45
+
46
+ # Peeks at the most recent LinkState, returns an empty LinkState if stack is empty.
47
+ def peek
48
+ @history.last || LinkState.empty
49
+ end
50
+
51
+ # Pops the most recent LinkState off the stack, returns an empty LinkState if stack is empty.
52
+ def pop
53
+ @history.pop || LinkState.empty
54
+ end
55
+
56
+ def prior_state_exist?
57
+ peek.document_filename.present?
58
+ end
59
+
60
+ # Pushes a LinkState onto the stack.
61
+ def push(link_state)
62
+ @history.push(link_state)
63
+ end
64
+ end
65
+ end
66
+
67
+ if $PROGRAM_NAME == __FILE__
68
+ require 'bundler/setup'
69
+ Bundler.require(:default)
70
+
71
+ require 'minitest/autorun'
72
+ require 'mocha/minitest'
73
+
74
+ module MarkdownExec
75
+ class TestLinkHistory < Minitest::Test
76
+ def setup
77
+ @link_history = LinkHistory.new
78
+ @link_state1 = LinkState.new(block_name: 'block1', document_filename: 'document1.txt',
79
+ inherited_lines: ['code1.rb'])
80
+ @link_state2 = LinkState.new(block_name: 'block2', document_filename: 'document2.txt',
81
+ inherited_lines: ['code2.rb'])
82
+ end
83
+
84
+ def test_push
85
+ @link_history.push(@link_state1)
86
+ assert_equal @link_state1, @link_history.peek
87
+ end
88
+
89
+ def test_pop
90
+ @link_history.push(@link_state1)
91
+ @link_history.push(@link_state2)
92
+ assert_equal @link_state2, @link_history.pop
93
+ assert_equal @link_state1, @link_history.peek
94
+ end
95
+
96
+ def test_peek_empty
97
+ assert_equal LinkState.empty, @link_history.peek
98
+ end
99
+
100
+ def test_pop_empty
101
+ assert_equal LinkState.empty, @link_history.pop
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ __END__
108
+
109
+ To generate the Ruby classes `LinkState` and `LinkHistory` with their current features and specifications, including the custom `==` method for object comparison and the implementation to handle empty states, you can use the following prompt:
110
+
111
+ ---
112
+
113
+ Create Ruby classes `LinkState` and `LinkHistory` with the following specifications:
114
+
115
+ 1. **Class `LinkState`**:
116
+ - Attributes: `block_name`, `document_filename`, `inherited_lines`.
117
+ - Initialize with optional parameters for each attribute, defaulting to `nil`.
118
+ - Include a class method `empty` that creates an instance with all attributes set to `nil`.
119
+ - Implement a custom `==` method for comparing instances based on attribute values.
120
+
121
+ 2. **Class `LinkHistory`**:
122
+ - Use an array to manage a stack of `LinkState` instances.
123
+ - Implement the following methods:
124
+ - `push`: Adds a `LinkState` instance to the top of the stack.
125
+ - `pop`: Removes and returns the most recent `LinkState` from the stack, or returns an empty `LinkState` if the stack is empty.
126
+ - `peek`: Returns the most recent `LinkState` without removing it from the stack, or an empty `LinkState` if the stack is empty.
127
+
128
+ 3. **Testing**:
129
+ - Write Minitest test cases to validate each method in `LinkHistory`. Test scenarios should include pushing and popping `LinkState` instances, and handling an empty `LinkHistory`.
130
+
131
+ The goal is to create a robust and efficient implementation of these classes, ensuring proper handling of stack operations and object comparisons.
@@ -7,5 +7,5 @@ module MarkdownExec
7
7
  BIN_NAME = 'mde'
8
8
  GEM_NAME = 'markdown_exec'
9
9
  TAP_DEBUG = 'MDE_DEBUG'
10
- VERSION = '1.8.2'
10
+ VERSION = '1.8.4'
11
11
  end
data/lib/markdown_exec.rb CHANGED
@@ -41,8 +41,6 @@ tap_config envvar: MarkdownExec::TAP_DEBUG
41
41
  $stderr.sync = true
42
42
  $stdout.sync = true
43
43
 
44
- MDE_HISTORY_ENV_NAME = 'MDE_MENU_HISTORY'
45
-
46
44
  # custom error: file specified is missing
47
45
  #
48
46
  class FileMissingError < StandardError; end
@@ -172,26 +170,6 @@ module MarkdownExec
172
170
  }
173
171
  end
174
172
 
175
- def clear_required_file
176
- ENV['MDE_LINK_REQUIRED_FILE'] = ''
177
- end
178
-
179
- # # Deletes a required temporary file specified by an environment variable.
180
- # # The function checks if the file exists before attempting to delete it.
181
- # # Clears the environment variable after deletion.
182
- # #
183
- # def delete_required_temp_file
184
- # temp_blocks_file_path = ENV.fetch('MDE_LINK_REQUIRED_FILE', nil)
185
-
186
- # return if temp_blocks_file_path.nil? || temp_blocks_file_path.empty?
187
-
188
- # FileUtils.rm_f(temp_blocks_file_path)
189
-
190
- # clear_required_file
191
- # rescue StandardError
192
- # error_handler('delete_required_temp_file')
193
- # end
194
-
195
173
  public
196
174
 
197
175
  ## Determines the correct filename to use for searching files
@@ -368,6 +346,16 @@ module MarkdownExec
368
346
  :menu_chrome_color)}"
369
347
  searcher = DirectorySearcher.new(value, [@options[:path]])
370
348
 
349
+ @fout.fout 'In file contents'
350
+ hash = searcher.search_in_file_contents
351
+ hash.each.with_index do |(key, v2), i1|
352
+ @fout.fout format('- %3.d: %s', i1 + 1, key)
353
+ @fout.fout AnsiFormatter.new(options).format_and_highlight_array(
354
+ v2.map { |nl| format('=%4.d: %s', nl.index, nl.line) },
355
+ highlight: [value]
356
+ )
357
+ end
358
+
371
359
  @fout.fout 'In directory names'
372
360
  @fout.fout AnsiFormatter.new(options).format_and_highlight_array(
373
361
  searcher.search_in_directory_names, highlight: [value]
@@ -378,15 +366,6 @@ module MarkdownExec
378
366
  searcher.search_in_file_names, highlight: [value]
379
367
  ).join("\n")
380
368
 
381
- @fout.fout 'In file contents'
382
- hash = searcher.search_in_file_contents
383
- hash.each.with_index do |(key, v2), i1|
384
- @fout.fout format('- %3.d: %s', i1 + 1, key)
385
- @fout.fout AnsiFormatter.new(options).format_and_highlight_array(
386
- v2.map { |nl| format('=%4.d: %s', nl.index, nl.line) },
387
- highlight: [value]
388
- )
389
- end
390
369
  exit
391
370
  }
392
371
  when 'help'
@@ -545,10 +524,8 @@ module MarkdownExec
545
524
  public
546
525
 
547
526
  def run
548
- clear_required_file
549
527
  initialize_and_parse_cli_options
550
528
  execute_block_with_error_handling
551
- @options.delete_required_temp_file
552
529
  rescue StandardError
553
530
  error_handler('run')
554
531
  end
data/lib/mdoc.rb CHANGED
@@ -3,8 +3,8 @@
3
3
 
4
4
  # encoding=utf-8
5
5
 
6
- require_relative 'filter'
7
6
  require_relative 'block_types'
7
+ require_relative 'filter'
8
8
 
9
9
  module MarkdownExec
10
10
  ##
@@ -75,7 +75,6 @@ module MarkdownExec
75
75
  raise "Named code block `#{name}` not found. (@#{__LINE__})"
76
76
  end
77
77
 
78
- # all_dependency_names = [name_block.oname] + recursively_required(name_block[:reqs])
79
78
  dependencies = collect_dependencies(name_block[:oname])
80
79
  all_dependency_names = collect_unique_names(dependencies).push(name_block[:oname]).uniq
81
80
  unmet_dependencies = all_dependency_names.dup
@@ -91,10 +90,11 @@ module MarkdownExec
91
90
  else
92
91
  []
93
92
  end + [fcb]
94
- end.flatten(1) #.tap { rbp }
95
- { all_dependency_names: all_dependency_names,
96
- blocks: blocks,
97
- dependencies: dependencies,
93
+ end.flatten(1)
94
+
95
+ { all_dependency_names: all_dependency_names,
96
+ blocks: blocks,
97
+ dependencies: dependencies,
98
98
  unmet_dependencies: unmet_dependencies }
99
99
  end
100
100
 
@@ -103,26 +103,37 @@ module MarkdownExec
103
103
  # @param name [String] The name of the code block to start the collection from.
104
104
  # @return [Array<String>] An array of strings containing the collected code blocks.
105
105
  #
106
- def collect_recursively_required_code(name, label_body: true, label_format_above: nil, label_format_below: nil)
106
+ def collect_recursively_required_code(name, label_body: true, label_format_above: nil,
107
+ label_format_below: nil, block_source:)
107
108
  block_search = collect_recursively_required_blocks(name)
108
- block_search.merge({ code: collect_wrapped_blocks(block_search[:blocks]).map do |fcb|
109
- if fcb[:cann]
110
- collect_block_code_cann(fcb)
111
- elsif fcb[:stdout]
112
- collect_block_code_stdout(fcb)
113
- elsif [BlockType::LINK, BlockType::OPTS,
114
- BlockType::VARS].include? fcb[:shell]
115
- nil
116
- elsif fcb[:shell] == BlockType::PORT
117
- collect_block_code_shell(fcb)
118
- elsif label_body
119
- [label_format_above && format(label_format_above, { name: fcb[:oname] })] +
120
- fcb[:body] +
121
- [label_format_below && format(label_format_below, { name: fcb[:oname] })]
122
- else # raw body
123
- fcb[:body]
124
- end
125
- end.compact.flatten(1).compact })
109
+ if block_search[:blocks]
110
+ blocks = collect_wrapped_blocks(block_search[:blocks])
111
+ block_search.merge(
112
+ { block_names: blocks.map { |block| block[:oname] },
113
+ code: blocks.map do |fcb|
114
+ if fcb[:cann]
115
+ collect_block_code_cann(fcb)
116
+ elsif fcb[:stdout]
117
+ collect_block_code_stdout(fcb)
118
+ elsif [BlockType::LINK, BlockType::OPTS,
119
+ BlockType::VARS].include? fcb[:shell]
120
+ nil
121
+ elsif fcb[:shell] == BlockType::PORT
122
+ collect_block_code_shell(fcb)
123
+ elsif label_body
124
+ [label_format_above && format(label_format_above,
125
+ block_source.merge({ block_name: fcb[:oname] }))] +
126
+ fcb[:body] +
127
+ [label_format_below && format(label_format_below,
128
+ block_source.merge({ block_name: fcb[:oname] }))]
129
+ else # raw body
130
+ fcb[:body]
131
+ end
132
+ end.compact.flatten(1).compact }
133
+ )
134
+ else
135
+ block_search.merge({ block_names: [], code: [] })
136
+ end
126
137
  end
127
138
 
128
139
  def collect_unique_names(hash)
@@ -279,11 +290,10 @@ module MarkdownExec
279
290
  return memo unless source
280
291
 
281
292
  if (block = get_block_by_anyname(source)).nil? || block.keys.empty?
282
- if true
283
- return memo
284
- else
285
- raise "Named code block `#{source}` not found. (@#{__LINE__})"
286
- end
293
+ return memo if true
294
+
295
+ raise "Named code block `#{source}` not found. (@#{__LINE__})"
296
+
287
297
  end
288
298
 
289
299
  return memo unless block[:reqs]
data/lib/menu.src.yml CHANGED
@@ -96,6 +96,7 @@
96
96
  :default: false
97
97
  :description: Dump BlocksInFile (stage 1)
98
98
  :env_var: MDE_DUMP_BLOCKS_IN_FILE
99
+ :long_name: dump-blocks-in-file
99
100
  :opt_name: dump_blocks_in_file
100
101
  :procname: val_as_bool
101
102
 
@@ -103,6 +104,7 @@
103
104
  :default: false
104
105
  :description: Dump MenuBlocks (stage 2)
105
106
  :env_var: MDE_DUMP_MENU_BLOCKS
107
+ :long_name: dump-menu-blocks
106
108
  :opt_name: dump_menu_blocks
107
109
  :procname: val_as_bool
108
110
 
@@ -110,6 +112,7 @@
110
112
  :default: false
111
113
  :description: Dump selected block
112
114
  :env_var: MDE_DUMP_SELECTED_BLOCK
115
+ :long_name: dump-selected-block
113
116
  :opt_name: dump_selected_block
114
117
  :procname: val_as_bool
115
118
 
@@ -846,13 +849,13 @@
846
849
  :opt_name: shell
847
850
  :procname: val_as_str
848
851
 
849
- - :default: "# -^- +%{name} -^-"
852
+ - :default: "# -^- +%{block_name} -o- %{document_filename} -^-"
850
853
  :description: shell_code_label_format_above
851
854
  :env_var: MDE_SHELL_CODE_LABEL_FORMAT_ABOVE
852
855
  :opt_name: shell_code_label_format_above
853
856
  :procname: val_as_str
854
857
 
855
- - :default: "# -v- +%{name} -v-"
858
+ - :default: "# -v- +%{block_name} -v-"
856
859
  :description: shell_code_label_format_below
857
860
  :env_var: MDE_SHELL_CODE_LABEL_FORMAT_BELOW
858
861
  :opt_name: shell_code_label_format_below
data/lib/menu.yml CHANGED
@@ -1,4 +1,4 @@
1
- # MDE - Markdown Executor (1.8.2)
1
+ # MDE - Markdown Executor (1.8.4)
2
2
  ---
3
3
  - :description: Show current configuration values
4
4
  :procname: show_config
@@ -81,18 +81,21 @@
81
81
  :default: false
82
82
  :description: Dump BlocksInFile (stage 1)
83
83
  :env_var: MDE_DUMP_BLOCKS_IN_FILE
84
+ :long_name: dump-blocks-in-file
84
85
  :opt_name: dump_blocks_in_file
85
86
  :procname: val_as_bool
86
87
  - :arg_name: BOOL
87
88
  :default: false
88
89
  :description: Dump MenuBlocks (stage 2)
89
90
  :env_var: MDE_DUMP_MENU_BLOCKS
91
+ :long_name: dump-menu-blocks
90
92
  :opt_name: dump_menu_blocks
91
93
  :procname: val_as_bool
92
94
  - :arg_name: BOOL
93
95
  :default: false
94
96
  :description: Dump selected block
95
97
  :env_var: MDE_DUMP_SELECTED_BLOCK
98
+ :long_name: dump-selected-block
96
99
  :opt_name: dump_selected_block
97
100
  :procname: val_as_bool
98
101
  - :default: fg_rgbh_ff_00_7f
@@ -727,12 +730,12 @@
727
730
  :env_var: MDE_SHELL
728
731
  :opt_name: shell
729
732
  :procname: val_as_str
730
- - :default: "# -^- +%{name} -^-"
733
+ - :default: "# -^- +%{block_name} -o- %{document_filename} -^-"
731
734
  :description: shell_code_label_format_above
732
735
  :env_var: MDE_SHELL_CODE_LABEL_FORMAT_ABOVE
733
736
  :opt_name: shell_code_label_format_above
734
737
  :procname: val_as_str
735
- - :default: "# -v- +%{name} -v-"
738
+ - :default: "# -v- +%{block_name} -v-"
736
739
  :description: shell_code_label_format_below
737
740
  :env_var: MDE_SHELL_CODE_LABEL_FORMAT_BELOW
738
741
  :opt_name: shell_code_label_format_below
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markdown_exec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fareed Stevenson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-12 00:00:00.000000000 Z
11
+ date: 2023-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -145,6 +145,7 @@ files:
145
145
  - lib/fout.rb
146
146
  - lib/hash.rb
147
147
  - lib/hash_delegator.rb
148
+ - lib/link_history.rb
148
149
  - lib/markdown_exec.rb
149
150
  - lib/markdown_exec/version.rb
150
151
  - lib/mdoc.rb