markdown_exec 2.3.0 → 2.4.0

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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -2
  3. data/CHANGELOG.md +19 -0
  4. data/Gemfile.lock +1 -1
  5. data/Rakefile +32 -8
  6. data/bats/bats.bats +33 -0
  7. data/bats/block-types.bats +56 -0
  8. data/bats/cli.bats +74 -0
  9. data/bats/fail.bats +11 -0
  10. data/bats/history.bats +34 -0
  11. data/bats/markup.bats +66 -0
  12. data/bats/mde.bats +29 -0
  13. data/bats/options.bats +92 -0
  14. data/bats/test_helper.bash +152 -0
  15. data/bin/tab_completion.sh +44 -20
  16. data/docs/dev/block-type-opts.md +10 -0
  17. data/docs/dev/block-type-port.md +24 -0
  18. data/docs/dev/block-type-vars.md +7 -0
  19. data/docs/dev/pass-through-arguments.md +8 -0
  20. data/docs/dev/specs-import.md +9 -0
  21. data/docs/dev/specs.md +83 -0
  22. data/docs/dev/text-decoration.md +7 -0
  23. data/examples/bash-blocks.md +4 -4
  24. data/examples/block-names.md +2 -2
  25. data/examples/import0.md +23 -0
  26. data/examples/import1.md +13 -0
  27. data/examples/link-blocks-vars.md +3 -3
  28. data/examples/opts-blocks-require.md +6 -6
  29. data/examples/table-markup.md +31 -0
  30. data/examples/text-markup.md +58 -0
  31. data/examples/vars-blocks.md +2 -2
  32. data/examples/wrap.md +87 -9
  33. data/lib/ansi_formatter.rb +12 -6
  34. data/lib/ansi_string.rb +153 -0
  35. data/lib/argument_processor.rb +160 -0
  36. data/lib/cached_nested_file_reader.rb +4 -2
  37. data/lib/ce_get_cost_and_usage.rb +4 -3
  38. data/lib/cli.rb +1 -1
  39. data/lib/colorize.rb +39 -11
  40. data/lib/constants.rb +17 -0
  41. data/lib/directory_searcher.rb +4 -2
  42. data/lib/doh.rb +190 -0
  43. data/lib/env.rb +1 -1
  44. data/lib/exceptions.rb +9 -6
  45. data/lib/fcb.rb +0 -199
  46. data/lib/filter.rb +18 -5
  47. data/lib/find_files.rb +8 -3
  48. data/lib/format_table.rb +406 -0
  49. data/lib/hash_delegator.rb +888 -603
  50. data/lib/hierarchy_string.rb +113 -25
  51. data/lib/input_sequencer.rb +16 -10
  52. data/lib/instance_method_wrapper.rb +2 -1
  53. data/lib/layered_hash.rb +143 -0
  54. data/lib/link_history.rb +22 -8
  55. data/lib/markdown_exec/version.rb +1 -1
  56. data/lib/markdown_exec.rb +413 -165
  57. data/lib/mdoc.rb +27 -34
  58. data/lib/menu.src.yml +825 -710
  59. data/lib/menu.yml +799 -703
  60. data/lib/namer.rb +6 -12
  61. data/lib/object_present.rb +1 -1
  62. data/lib/option_value.rb +7 -3
  63. data/lib/poly.rb +33 -14
  64. data/lib/resize_terminal.rb +60 -52
  65. data/lib/saved_assets.rb +45 -34
  66. data/lib/saved_files_matcher.rb +6 -3
  67. data/lib/streams_out.rb +7 -1
  68. data/lib/table_extractor.rb +166 -0
  69. data/lib/tap.rb +5 -6
  70. data/lib/text_analyzer.rb +144 -8
  71. metadata +26 -3
  72. data/lib/std_out_err_logger.rb +0 -119
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40813cfbaca2f9b2e8b865e2f574ab71211c56120d5706d2f8ebc4fbb103d254
4
- data.tar.gz: 880d121d18747d2370dff0caa90f84da9fca51633ec6e00919f690ea4821d1f0
3
+ metadata.gz: c2578ee1f8b5967a2c9467ddf616133c3896f1928d0ca4b17d856ce78316e75c
4
+ data.tar.gz: 35fcea4c4a78f74269e96fdf06315a924ba00ff267a5fac2bf77a76909aeaeda
5
5
  SHA512:
6
- metadata.gz: df8c99ddc62b271b1fa74036ffcb485411a1461195d68c2e1825ae3ba606e4b20de456636d0094606c4579548d4532dd46287c5c486b4ab613217ab708144709
7
- data.tar.gz: 4b812fa4808161beaa06c3de9b0639a031446294bb8a171d599e5baa4db157660233701c1068a130c93dfbd4cd0469853867cf4c751dfda4197ffb13ee81899a
6
+ metadata.gz: 19bef54c4148b8c3b2861e1193367b19d55d4e5e2132ff3d132cdc69c2ae5082ec391a0eeeec42d729e40d5bed27348d64a4dc72cc2f781e0dc3c46545cec582
7
+ data.tar.gz: 609d69e5a3c36e2c4864887d6d7677f48529f7f77509e4414245feec182c85aa7e8d35199efc9c479a5380cc420853849720ec1eb290d39cbb12db220673d7d0
data/.rubocop.yml CHANGED
@@ -13,7 +13,7 @@ Layout/LeadingCommentSpace:
13
13
  Layout/LineContinuationLeadingSpace:
14
14
  Enabled: false
15
15
 
16
- Layout/LineLength: # 2024-01-21 temp disable
16
+ Layout/LineLength:
17
17
  # Enabled: false
18
18
  Max: 80
19
19
  # Max: 96
@@ -22,6 +22,12 @@ Layout/LineLength: # 2024-01-21 temp disable
22
22
  Lint/Debugger:
23
23
  Enabled: false
24
24
 
25
+ Lint/LiteralAsCondition:
26
+ Enabled: false
27
+
28
+ Lint/RedundantSplatExpansion:
29
+ Enabled: false
30
+
25
31
  Lint/SafeNavigationChain:
26
32
  Enabled: false
27
33
 
@@ -73,7 +79,7 @@ Style/ClassVars:
73
79
  Style/CommentedKeyword:
74
80
  Enabled: false
75
81
 
76
- Style/Documentation: # 2024-01-21 temp disable
82
+ Style/Documentation:
77
83
  Enabled: false
78
84
 
79
85
  Style/DoubleNegation:
@@ -100,6 +106,9 @@ Style/MixinUsage:
100
106
  Style/MultilineBlockChain:
101
107
  Enabled: false
102
108
 
109
+ Style/MultilineIfModifier:
110
+ Enabled: false
111
+
103
112
  Style/OpenStructUse:
104
113
  Enabled: false
105
114
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.0] - 2024-09-12
4
+
5
+ ### Added
6
+
7
+ - Commands to list, search, and view saved asset history.
8
+ - BATS tests for basic and common options.
9
+ - Options to format lists in report output.
10
+ - Options to format tables over multiple lines by role and order.
11
+ - Options for automatic menu entry to edit inherited code when none exists.
12
+ - Example documents for wrapped blocks, text and table formatting.
13
+
14
+ ### Changed
15
+
16
+ - Rework argument processing.
17
+ - Update default line decorations. Avoid patterns likely to exist in code.
18
+ - Refactor block selection to default to all.
19
+ - Use AnsiString over String to decorate output.
20
+ - Handle Ctrl-C at menu.
21
+
3
22
  ## [2.3.0] - 2024-08-05
4
23
 
5
24
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- markdown_exec (2.3.0)
4
+ markdown_exec (2.4.0)
5
5
  clipboard (~> 1.3.6)
6
6
  open3 (~> 0.1.1)
7
7
  optparse (~> 0.1.1)
data/Rakefile CHANGED
@@ -74,16 +74,30 @@ task :clean do
74
74
  system 'rm *.gem'
75
75
  end
76
76
 
77
+ desc 'bats'
78
+ task :bats do
79
+ FileList['bats/**/*.bats'].each do |file|
80
+ next if %w[bats/bats.bats bats/fail.bats].include?(file)
81
+
82
+ system "bats #{file}"
83
+ end
84
+ end
85
+
77
86
  desc 'minitest'
78
87
  task :minitest do
79
88
  commands = [
89
+ './lib/argument_processor.rb',
80
90
  './lib/block_label.rb',
81
91
  './lib/cached_nested_file_reader.rb',
92
+ './lib/dev/process_template.rb --test',
82
93
  './lib/directory_searcher.rb',
83
94
  './lib/fcb.rb',
84
95
  './lib/filter.rb',
85
96
  './lib/find_files.rb',
97
+ './lib/format_table.rb',
86
98
  './lib/hash_delegator.rb',
99
+ './lib/hierarchy_string.rb',
100
+ './lib/link_history.rb',
87
101
  './lib/markdown_exec.rb',
88
102
  './lib/mdoc.rb',
89
103
  './lib/object_present.rb',
@@ -91,14 +105,19 @@ task :minitest do
91
105
  './lib/regexp.rb',
92
106
  './lib/resize_terminal.rb',
93
107
  './lib/saved_assets.rb',
94
- './lib/saved_files_matcher.rb'
108
+ './lib/saved_files_matcher.rb',
109
+ './lib/table_extractor.rb',
110
+ './lib/text_analyzer.rb'
95
111
  ]
96
112
 
97
113
  commands.each do |command|
98
- raise "Failed: #{command}" unless system("bundle exec ruby #{command}")
99
- rescue StandardError => err
100
- puts "Error: #{err.message}"
101
- exit 1
114
+ result = system("bundle exec ruby #{command}")
115
+ error_level = $?.exitstatus
116
+
117
+ if error_level != 0
118
+ puts "Error: Command '#{command}' failed with exit status #{error_level}."
119
+ exit error_level
120
+ end
102
121
  end
103
122
  end
104
123
 
@@ -109,8 +128,9 @@ end
109
128
 
110
129
  desc 'test'
111
130
  task :test do
112
- Rake::Task['minitest'].execute
113
131
  system 'bundle exec rspec'
132
+ Rake::Task['minitest'].invoke
133
+ Rake::Task['bats'].invoke
114
134
  end
115
135
 
116
136
  private
@@ -134,14 +154,17 @@ task :update_menu_yml do
134
154
  }
135
155
  )
136
156
 
157
+ ### sort keys
137
158
  File.write(MENU_YML, menu_options.to_yaml)
138
159
  puts `stat #{MENU_YML}`
139
160
  end
161
+ task :menu => 'update_menu_yml'
140
162
 
141
163
  # write tab_completion.sh with erb
142
164
  #
143
165
  def update_tab_completion(target)
144
- words = `#{File.join BF, MarkdownExec::BIN_NAME} --tab-completions`.split("\n")
166
+ words = `#{File.join BF,
167
+ MarkdownExec::BIN_NAME} --tab-completions`.split("\n")
145
168
  mde_tab_completions = "(#{words_list(words)})"
146
169
  mde_help = `#{File.join BF, MarkdownExec::BIN_NAME} --help`.split("\n")
147
170
 
@@ -164,7 +187,8 @@ end
164
187
 
165
188
  desc 'update installed tab_completion.sh'
166
189
  task :update_installed_tab_completion do
167
- update_tab_completion(fs = File.join(`mde --pwd`.chomp, BF, 'tab_completion.sh'))
190
+ update_tab_completion(fs = File.join(`mde --pwd`.chomp, BF,
191
+ 'tab_completion.sh'))
168
192
 
169
193
  puts `cat #{fs}` ###
170
194
  end
data/bats/bats.bats ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bats
2
+
3
+ greet () {
4
+ echo "Hello, $1"'!'
5
+ sleep 9
6
+ }
7
+
8
+ @test 'Export function, variables to BATS; exit a running job' {
9
+ name='World'
10
+ export name
11
+ export -f greet
12
+ run bash -c "
13
+ greet \"$(echo '$name')\" &"'
14
+ pid="$!"
15
+
16
+ # Wait for 1 second, to show it is not stopping
17
+ sleep 1
18
+
19
+ if kill -0 $pid 2>/dev/null; then
20
+ kill $pid
21
+ wait $pid 2>/dev/null
22
+ exit_status=$?
23
+ else
24
+ wait $pid 2>/dev/null
25
+ exit_status=$?
26
+ fi
27
+ echo -n "$exit_status" > /tmp/exit_status
28
+ '
29
+ # app exits with an error code
30
+ [ "$(cat /tmp/exit_status)" = 143 ]
31
+ [ "$status" = 0 ]
32
+ [ "$output" = "Hello, World!" ]
33
+ }
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ # Type: Bash
6
+
7
+ # Type: Link
8
+
9
+ @test 'Link blocks - set variable in link block; call hidden block' {
10
+ run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '__Exit' ' VARIABLE1: 1'
11
+ run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '(echo-VARIABLE1)' ' VARIABLE1: 1 VARIABLE1: 1'
12
+ }
13
+
14
+ # Type: Opts
15
+
16
+ @test 'Opts block - before' {
17
+ BATS_OUTPUT_FILTER=A
18
+ spec_mde_args_expect docs/dev/block-type-opts.md --list-blocks-message dname --list-blocks-type 3 --list-blocks \
19
+ 'BEFORE Species menu_note_format: "AFTER %{line}" '
20
+ }
21
+
22
+ @test 'Opts block - after' {
23
+ skip 'Fails because command executes before the block is processed'
24
+ spec_mde_args_expect docs/dev/block-type-opts.md --list-blocks-message dname --list-blocks-type 3 '[decorate-note]' --list-blocks \
25
+ 'AFTER Species'
26
+ }
27
+
28
+ @test 'Opts block - show that menu has changed' {
29
+ skip 'Unable to show that menu has changed'
30
+ spec_mde_args_expect docs/dev/block-type-opts.md '[decorate-note]' \
31
+ 'AFTER Species'
32
+ }
33
+
34
+ # Type: Port
35
+
36
+ # includes output from assignment and from shell block
37
+ @test 'Port block - export variable' {
38
+ BATS_OUTPUT_FILTER=A
39
+ spec_mde_args_expect docs/dev/block-type-port.md '[set_vault_1]' show \
40
+ 'VAULT = 1 VAULT: 1'
41
+ }
42
+
43
+ @test 'Port block - export variable - not set' {
44
+ BATS_OUTPUT_FILTER=A
45
+ spec_mde_args_expect docs/dev/block-type-port.md VAULT-is-export show \
46
+ ' VAULT: This variable has not been set.'
47
+ }
48
+
49
+ # Type: Vars
50
+
51
+ # includes output from assignment and from shell block
52
+ @test 'Vars block - set variable' {
53
+ BATS_OUTPUT_FILTER=A
54
+ spec_mde_args_expect docs/dev/block-type-vars.md '[set_vault_1]' show \
55
+ 'VAULT = 1 VAULT: 1'
56
+ }
data/bats/cli.bats ADDED
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ @test 'pass-through arguments to scripts' {
6
+ BATS_OUTPUT_FILTER=A
7
+ spec_mde_args_expect docs/dev/pass-through-arguments.md output_arguments -- 1 23 \
8
+ ' ARGS: 1 23'
9
+ }
10
+
11
+ @test 'Position 0 File Name - file does not exist; string not found; select a file from the current directory' {
12
+ skip 'algorithm to exit waiting MDE is not ready'
13
+ BATS_SLEEP=3
14
+ spec_mde_args_expect NotFoundAnywhere \
15
+ 'Searching in: . Choose a file: (Press ↑/↓ arrow to move, Enter to select and letters to filter) ‣ ./CHANGELOG.md ./CODE_OF_CONDUCT.md ./README.md ./TODO.md'
16
+ }
17
+
18
+ @test 'Position 1 Block Name - block does not exist' {
19
+ BATS_OUTPUT_FILTER=A
20
+ BATS_STATUS=1
21
+ spec_mde_args_expect docs/dev/pass-through-arguments.md NonExistentBlock \
22
+ ' Error: Block not found -- name: NonExistentBlock'
23
+ }
24
+
25
+ @test 'block named in link does not exist' {
26
+ BATS_STATUS=1
27
+ spec_mde_args_expect docs/dev/requiring-blocks.md '[link-missing-local-block]' \
28
+ 'Block missing'
29
+ }
30
+
31
+ # Requiring blocks
32
+
33
+ @test 'bash block setting an environment variable requires a bash block' {
34
+ BATS_OUTPUT_FILTER=A
35
+ spec_mde_args_expect docs/dev/requiring-blocks.md '[set-env]' \
36
+ ' ARG1: 37'
37
+ }
38
+
39
+ # the last block is a link block, so menu is displayed
40
+ @test 'link block setting an environment variable requires a bash block' {
41
+ BATS_OUTPUT_FILTER=A
42
+ spec_mde_args_expect docs/dev/requiring-blocks.md '[link-local-block-with-vars]' __Exit \
43
+ ' ARG1: 37'
44
+ }
45
+
46
+ # the last block is a link block, so menu is displayed
47
+ @test 'link block setting an environment variable calls a bash block in a file' {
48
+ BATS_OUTPUT_FILTER=A
49
+ spec_mde_args_expect docs/dev/requiring-blocks.md '[link-file-block-with-vars]' __Exit \
50
+ ' ARG1: arg1-from-link-file'
51
+ }
52
+
53
+ @test 'history' {
54
+ file_name="$(most_recent_history_file_name)"
55
+ BATS_OUTPUT_GREP="$file_name"
56
+ spec_mde_args_expect examples/save.md --history \
57
+ "$file_name"
58
+ }
59
+
60
+ @test 'sift - format text' {
61
+ file_name="$(most_recent_history_file_name)"
62
+ date="$(date_from_history_file_name "$file_name")"
63
+ BATS_OUTPUT_GREP="$file_name"
64
+ spec_mde_args_expect examples/save.md --sift "$date" --history \
65
+ "$file_name"
66
+ }
67
+
68
+ @test 'sift - format yaml' {
69
+ file_name="$(most_recent_history_file_name)"
70
+ date="$(date_from_history_file_name "$file_name")"
71
+ BATS_OUTPUT_GREP="$file_name"
72
+ spec_mde_args_expect examples/save.md --format yaml --sift "$date" --history \
73
+ "- $file_name"
74
+ }
data/bats/fail.bats ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ @test 'FAIL' {
6
+ run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '__Exit' ' VARIABLE1: FAIL'
7
+ }
8
+
9
+ @test 'OK' {
10
+ run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '__Exit' ' VARIABLE1: 1'
11
+ }
data/bats/history.bats ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ @test 'Options - history' {
6
+ local log_files="$(ls -1 logs/*examples_save_md*)"
7
+ spec_mde_args_expect examples/save.md --history \
8
+ "$log_files"
9
+ }
10
+
11
+ @test 'Options - history, dig' {
12
+ skip 'test hangs on menu'
13
+ local log_files="$(ls -1 logs/*)"
14
+ spec_mde_args_expect --history --dig \
15
+ "$log_files"
16
+ }
17
+
18
+ @test 'Options - history, probe' {
19
+ local log_files="$(grep --files-with-matches '04:31' logs/* 2>/dev/null)"
20
+ spec_mde_args_expect examples/save.md --probe '04:31' --history \
21
+ "$log_files"
22
+ }
23
+
24
+ @test 'Options - history, sift' {
25
+ local log_files="$(ls -1 logs/*-31-*examples_save_md*)"
26
+ spec_mde_args_expect examples/save.md --sift -31- --history \
27
+ "$log_files"
28
+ }
29
+
30
+ @test 'Options - history, sift and probe' {
31
+ local log_files="$(grep --files-with-matches 'e' logs/*-31-*examples_save_md* 2>/dev/null)"
32
+ spec_mde_args_expect examples/save.md --sift -31- --probe e --history \
33
+ "$log_files"
34
+ }
data/bats/markup.bats ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ # Text Decoration
6
+
7
+ @test 'Options - list blocks - 1 plain' {
8
+ BATS_OUTPUT_FILTER=A \
9
+ spec_mde_args_expect \
10
+ docs/dev/text-decoration.md \
11
+ --list-blocks-message oname \
12
+ --list-blocks-type 3 \
13
+ --list-blocks \
14
+ '-:= =:- * Exit - **_Bold-Underline_** - **Bold** - **~Bold-Italic~** - __Underline__ - _~Underline-Italic~_ - `Italic` - ~~Strikethrough~~ -:= ~~~ =:-'
15
+ }
16
+
17
+ @test 'Options - list blocks - 2 extracts markup' {
18
+ BATS_OUTPUT_FILTER=A \
19
+ spec_mde_args_expect \
20
+ docs/dev/text-decoration.md \
21
+ --list-blocks-message dname \
22
+ --list-blocks-type 3 \
23
+ --list-blocks \
24
+ '-:= =:- * Exit - Bold-Underline - Bold - Bold-Italic - Underline - Underline-Italic - Italic - Strikethrough -:= ~~~ =:-'
25
+ }
26
+
27
+ @test 'Options - list blocks - 3 decorates' {
28
+ spec_mde_args_expect docs/dev/text-decoration.md --list-blocks-message dname --list-blocks-type 3 --list-blocks \
29
+ $'\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x32\x38\x3b\x32\x30\x38\x3b\x31\x39\x32\x6d\x2d\x3a\x3d\x20\x20\x20\x20\x20\x20\x3d\x3a\x2d\x1b\x5b\x30\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x36\x34\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2a\x20\x45\x78\x69\x74\x1b\x5b\x30\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x31\x6d\x1b\x5b\x34\x6d\x42\x6f\x6c\x64\x2d\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x1b\x5b\x32\x32\x6d\x1b\x5b\x32\x34\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x31\x6d\x42\x6f\x6c\x64\x1b\x5b\x32\x32\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x31\x6d\x1b\x5b\x33\x6d\x42\x6f\x6c\x64\x2d\x49\x74\x61\x6c\x69\x63\x1b\x5b\x32\x32\x6d\x1b\x5b\x32\x33\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x34\x6d\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x1b\x5b\x32\x34\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x34\x6d\x1b\x5b\x33\x6d\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x2d\x49\x74\x61\x6c\x69\x63\x1b\x5b\x32\x33\x6d\x1b\x5b\x32\x34\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x33\x6d\x49\x74\x61\x6c\x69\x63\x1b\x5b\x32\x33\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x3b\x31\x39\x32\x6d\x2d\x20\x1b\x5b\x30\x6d\x1b\x5b\x39\x6d\x53\x74\x72\x69\x6b\x65\x74\x68\x72\x6f\x75\x67\x68\x1b\x5b\x32\x39\x6d\x0a\x1b\x5b\x33\x38\x3b\x32\x3b\x31\x32\x38\x3b\x32\x30\x38\x3b\x31\x39\x32\x6d\x2d\x3a\x3d\x20\x20\x20\x7e\x7e\x7e\x20\x20\x20\x3d\x3a\x2d\x1b\x5b\x30\x6d'
30
+ }
31
+
32
+ # Raw comparison test
33
+ #@test "raw comparison" {
34
+ # expect_equal_raw "Hello, World!" "Hello, World!"
35
+ #}
36
+ # remove_ansi_escape_sequences2() {
37
+ # # printf '%s' "$1" | sed -E 's/\x1b\[[0-9;]*[a-zA-Z]//g' | tr '\n\t\r\v\f' ' '
38
+ # # printf '%s' "$1" | sed -E 's/\x1b\[[0-9;]*[a-zA-Z]//g'
39
+ # # printf '%s' "$1" | sed -E 's/e/E/g' | tr '\n\t\r\v\f' ' '
40
+ # printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
41
+ # }
42
+
43
+ # test ANSI escape sequence removal within BATS
44
+ @test "comparison with ANSI removal" {
45
+ actual="Hello, \e[31mWorld\e[0m!"
46
+ echo 'actual'
47
+ echo -en "$actual" | hexdump -C
48
+
49
+ echo 'converted'
50
+ converted="$(remove_ansi_escape_sequences "$actual")"
51
+ echo -en "$converted" | hexdump -C
52
+
53
+ [[ "Hello, World!" == "$converted" ]]
54
+ echo "converision passed"
55
+ # (( 0 == 1 )) # force output
56
+ }
57
+
58
+ #@test 'Defaults' {
59
+ # run_mde_args_expect_raw \
60
+ # docs/dev/specs.md bash1 \
61
+ # '\nbash1!'
62
+ #}
63
+
64
+ # @test 'OK' {
65
+ # run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '__Exit' ' VARIABLE1: 1'
66
+ # }
data/bats/mde.bats ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ # Directives
6
+
7
+ @test 'Directives - Import' {
8
+ # this shell block is in the import, not the primary document
9
+ run_mde_specs_md_args_expect_xansi 'shell-block-in-import' ' shell-block-in-import'
10
+ }
11
+
12
+ # Blocks, Wrapped
13
+
14
+ @test 'Shell blocks - wrapped block; nested; inverted' {
15
+ run_mde_specs_md_args_expect_xansi '[single]' ' outer-before single-body outer-after'
16
+ run_mde_specs_md_args_expect_xansi '[nested]' ' outer-before inner-before nested-body inner-after outer-after'
17
+ run_mde_specs_md_args_expect_xansi '[inverted-nesting]' ' inner-before outer-before inverted-nesting outer-after inner-after'
18
+ }
19
+
20
+ # Blocks, Wrapped, Imported
21
+
22
+ @test 'Shell blocks - wrapped block; imported' {
23
+ # the wrap blocks are in the import, not the primary document
24
+ run_mde_specs_md_args_expect_xansi '[test-wrap-from-import]' ' wrap-from-import-before test-wrap-from-import wrap-from-import-after'
25
+ }
26
+
27
+ @test 'Shell blocks - required; wrapped block' {
28
+ run_mde_specs_md_args_expect_xansi '[test-require-wrapped-block]' ' outer-before single-body outer-after test-require-wrapped-block'
29
+ }
data/bats/options.bats ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load 'test_helper'
4
+
5
+ # Defaults
6
+
7
+ @test 'Options - document and block name' {
8
+ run_mde_specs_md_args_expect_xansi bash1 \
9
+ ' bash1!'
10
+ }
11
+
12
+ # Options
13
+
14
+ @test 'Options - block-name' {
15
+ BATS_OUTPUT_FILTER=A
16
+ spec_mde_args_expect --block-name bash1 docs/dev/specs.md \
17
+ ' bash1!'
18
+ }
19
+
20
+ @test 'Options - find' {
21
+ run_mde_specs_md_args_expect_xansi --find search \
22
+ 'Searching in: . In directory names ./docs/research In file names ./examples/search.md'
23
+ }
24
+
25
+ @test 'Options - list blocks' {
26
+ BATS_OUTPUT_FILTER=A
27
+ spec_mde_args_expect --list-blocks-message oname --list-blocks-type 0 examples/colors.md --list-blocks \
28
+ '(document_options) load_colors load_colors2 Bash1 Link1 Opts1 Port1 Vars1'
29
+ }
30
+
31
+ @test 'Options - list blocks, eval' {
32
+ BATS_OUTPUT_FILTER=A
33
+ spec_mde_args_expect --list-blocks-eval block.oname examples/colors.md --list-blocks \
34
+ '(document_options) load_colors load_colors2 Bash1 Link1 Opts1 Port1 Vars1'
35
+ }
36
+
37
+ @test 'Options - how' {
38
+ spec_mde_args_expect --how how \
39
+ "prompt_show_expr_format: 'Expr: %{expr}' # prompt_show_expr_format"
40
+ }
41
+
42
+ @test 'Options - list-default-env' {
43
+ BATS_OUTPUT_GREP=SHEBANG
44
+ spec_mde_args_expect --list-default-env \
45
+ "MDE_SHEBANG=\#\!/usr/bin/env # Shebang for saved scripts"
46
+ }
47
+
48
+ @test 'Options - list-default-yaml' {
49
+ BATS_OUTPUT_GREP=shebang
50
+ spec_mde_args_expect --list-default-yaml \
51
+ "shebang: '#!/usr/bin/env' # Shebang for saved scripts"
52
+ }
53
+
54
+ @test 'Options - list-docs, path' {
55
+ BATS_OUTPUT_FILTER=A
56
+ BATS_OUTPUT_GREP=specs
57
+ spec_mde_args_expect --path docs/dev --list-docs \
58
+ 'docs/dev/specs-import.md docs/dev/specs.md'
59
+ }
60
+
61
+ # @test 'Options - list-recent-output' {
62
+ # BATS_OUTPUT_FILTER=A \
63
+ # spec_mde_args_expect \
64
+ # --path docs/dev \
65
+ # --list-recent-output \
66
+ # "?"
67
+ # }
68
+
69
+ @test 'Options - load-code' {
70
+ BATS_OUTPUT_FILTER=A
71
+ BATS_OUTPUT_GREP=var1
72
+ spec_mde_args_expect examples/load_code.md --load-code examples/load1.sh display_variables \
73
+ 'var1: line2'
74
+ }
75
+
76
+ @test 'Options - pwd' {
77
+ spec_mde_args_expect --pwd \
78
+ $(pwd)
79
+ }
80
+
81
+ @test 'Options - tab-completions' {
82
+ BATS_OUTPUT_FILTER=A
83
+ BATS_OUTPUT_GREP=find
84
+ spec_mde_args_expect --tab-completions \
85
+ '--find --find-path'
86
+ }
87
+
88
+ @test 'Options - version' {
89
+ version=$(grep VERSION "$PROJECT_ROOT/lib/markdown_exec/version.rb" | cut -d "'" -f 2)
90
+ spec_mde_args_expect --version \
91
+ "$version"
92
+ }