markdown_exec 2.8.0 → 2.8.2
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 +4 -4
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +27 -0
- data/Gemfile.lock +1 -1
- data/bats/block-hide.bats +8 -0
- data/bats/block-type-ux-auto.bats +8 -0
- data/bats/block-type-ux-exec.bats +8 -0
- data/bats/block-type-ux-require.bats +8 -0
- data/bats/block-type-ux-row-format.bats +8 -0
- data/bats/block-type-ux-transform.bats +8 -0
- data/bin/tab_completion.sh +1 -1
- data/docs/dev/block-hide.md +18 -0
- data/docs/dev/block-type-ux-auto.md +43 -0
- data/docs/dev/block-type-ux-exec.md +42 -0
- data/docs/dev/block-type-ux-require.md +28 -0
- data/docs/dev/block-type-ux-row-format.md +47 -0
- data/docs/dev/block-type-ux-transform.md +41 -0
- data/lib/constants.rb +2 -0
- data/lib/fcb.rb +4 -33
- data/lib/hash_delegator.rb +349 -258
- data/lib/markdown_exec/version.rb +1 -1
- data/lib/markdown_exec.rb +11 -28
- data/lib/mdoc.rb +56 -27
- data/lib/menu.src.yml +1 -0
- data/lib/menu.yml +1 -0
- metadata +14 -2
data/lib/markdown_exec.rb
CHANGED
@@ -656,32 +656,6 @@ module MarkdownExec
|
|
656
656
|
@options.merge(@options.run_state.to_h)
|
657
657
|
end
|
658
658
|
|
659
|
-
def iter_source_blocks(source, &block)
|
660
|
-
case source
|
661
|
-
when 1
|
662
|
-
HashDelegator.new(@options).blocks_from_nested_files.each(&block)
|
663
|
-
when 2
|
664
|
-
blocks_in_file, menu_blocks, mdoc =
|
665
|
-
HashDelegator.new(@options)
|
666
|
-
.mdoc_menu_and_blocks_from_nested_files(LinkState.new)
|
667
|
-
blocks_in_file.each(&block)
|
668
|
-
when 3
|
669
|
-
blocks_in_file, menu_blocks, mdoc =
|
670
|
-
HashDelegator.new(@options)
|
671
|
-
.mdoc_menu_and_blocks_from_nested_files(LinkState.new)
|
672
|
-
menu_blocks.each(&block)
|
673
|
-
else
|
674
|
-
@options.iter_blocks_from_nested_files do |btype, fcb|
|
675
|
-
case btype
|
676
|
-
when :blocks
|
677
|
-
yield fcb
|
678
|
-
when :filter
|
679
|
-
%i[blocks]
|
680
|
-
end
|
681
|
-
end
|
682
|
-
end
|
683
|
-
end
|
684
|
-
|
685
659
|
##
|
686
660
|
# Returns a lambda expression based on the given procname.
|
687
661
|
# @param procname [String] The name of the process to generate a lambda for.
|
@@ -916,7 +890,7 @@ module MarkdownExec
|
|
916
890
|
# save value to options hash if option is named
|
917
891
|
#
|
918
892
|
lambda { |value|
|
919
|
-
name = item[:long_name]&.present? ?
|
893
|
+
name = item[:long_name]&.present? ? "--#{item[:long_name]}" : "-#{item[:short_name]}"
|
920
894
|
options_parsed << item.merge(name: name, value: value)
|
921
895
|
(item[:proccode] ? item[:proccode].call(value) : value).tap do |converted|
|
922
896
|
options[item[:opt_name]] = converted if item[:opt_name]
|
@@ -1013,7 +987,16 @@ module MarkdownExec
|
|
1013
987
|
# Presents a TTY prompt to select an option or exit, returns selected option or nil
|
1014
988
|
def select_option_or_exit(prompt_text, strings, opts = {})
|
1015
989
|
@options.select_option_with_metadata(
|
1016
|
-
prompt_text,
|
990
|
+
prompt_text,
|
991
|
+
strings,
|
992
|
+
opts,
|
993
|
+
menu_blocks: strings.map do |string|
|
994
|
+
FCB.new(
|
995
|
+
chrome: true,
|
996
|
+
dname: string,
|
997
|
+
id: string
|
998
|
+
)
|
999
|
+
end
|
1017
1000
|
)&.fetch(:selected)
|
1018
1001
|
end
|
1019
1002
|
|
data/lib/mdoc.rb
CHANGED
@@ -85,14 +85,17 @@ module MarkdownExec
|
|
85
85
|
|
86
86
|
dependencies = collect_dependencies(nickname)
|
87
87
|
# !!t dependencies.count
|
88
|
-
all_dependency_names =
|
88
|
+
all_dependency_names =
|
89
|
+
collect_unique_names(dependencies).push(nickname).uniq
|
89
90
|
# !!t all_dependency_names.count
|
90
91
|
|
91
92
|
# select blocks in order of appearance in source documents
|
92
93
|
#
|
93
94
|
blocks = @table.select do |fcb|
|
94
95
|
# 2024-08-04 match nickname
|
95
|
-
all_dependency_names.include?(fcb.pub_name) ||
|
96
|
+
all_dependency_names.include?(fcb.pub_name) ||
|
97
|
+
all_dependency_names.include?(fcb.nickname) ||
|
98
|
+
all_dependency_names.include?(fcb.oname)
|
96
99
|
end
|
97
100
|
# !!t blocks.count
|
98
101
|
|
@@ -102,7 +105,10 @@ module MarkdownExec
|
|
102
105
|
blocks = blocks.map do |fcb|
|
103
106
|
# 2024-08-04 match oname for long block names
|
104
107
|
# 2024-08-04 match nickname
|
105
|
-
|
108
|
+
# may not exist if block name is duplicated
|
109
|
+
unmet_dependencies.delete(fcb.pub_name) ||
|
110
|
+
unmet_dependencies.delete(fcb.nickname) ||
|
111
|
+
unmet_dependencies.delete(fcb.oname)
|
106
112
|
if (call = fcb.call)
|
107
113
|
fcb1 = get_block_by_anyname("[#{call.match(/^%\((\S+) |\)/)[1]}]")
|
108
114
|
fcb1.cann = call
|
@@ -124,8 +130,10 @@ module MarkdownExec
|
|
124
130
|
# @param name [String] The name of the code block to start the collection from.
|
125
131
|
# @return [Array<String>] An array of strings containing the collected code blocks.
|
126
132
|
#
|
127
|
-
def collect_recursively_required_code(
|
128
|
-
|
133
|
+
def collect_recursively_required_code(
|
134
|
+
anyname:, block_source:,
|
135
|
+
label_body: true, label_format_above: nil, label_format_below: nil
|
136
|
+
)
|
129
137
|
block_search = collect_block_dependencies(anyname: anyname)
|
130
138
|
if block_search[:blocks]
|
131
139
|
blocks = collect_wrapped_blocks(block_search[:blocks])
|
@@ -150,8 +158,10 @@ module MarkdownExec
|
|
150
158
|
elsif fcb.type == BlockType::PORT
|
151
159
|
generate_env_variable_shell_commands(fcb)
|
152
160
|
elsif label_body
|
153
|
-
generate_label_body_code(
|
154
|
-
|
161
|
+
generate_label_body_code(
|
162
|
+
fcb, block_source,
|
163
|
+
label_format_above, label_format_below
|
164
|
+
)
|
155
165
|
else # raw body
|
156
166
|
fcb.body
|
157
167
|
end
|
@@ -230,9 +240,14 @@ module MarkdownExec
|
|
230
240
|
initialize: opts[:compressed_ids].nil?
|
231
241
|
) do |fcb, _hide, _collapsed_level|
|
232
242
|
# update fcb per state
|
233
|
-
|
234
|
-
|
235
|
-
|
243
|
+
next unless fcb.collapsible
|
244
|
+
|
245
|
+
fcb.s1decorated = fcb.s1decorated + ' ' +
|
246
|
+
(if fcb.collapse
|
247
|
+
opts[:menu_collapsible_symbol_collapsed]
|
248
|
+
else
|
249
|
+
opts[:menu_collapsible_symbol_expanded]
|
250
|
+
end)
|
236
251
|
end
|
237
252
|
opts[:compressed_ids] = collapser.compress_ids
|
238
253
|
opts[:expanded_ids] = collapser.expand_ids
|
@@ -240,7 +255,9 @@ module MarkdownExec
|
|
240
255
|
# remove
|
241
256
|
# . empty chrome between code; edges are same as blanks
|
242
257
|
#
|
243
|
-
select_elements_with_neighbor_conditions(selrows) do |prev_element,
|
258
|
+
select_elements_with_neighbor_conditions(selrows) do |prev_element,
|
259
|
+
current,
|
260
|
+
next_element|
|
244
261
|
!(current[:chrome] && !current.oname.present?) ||
|
245
262
|
!(!prev_element.nil? &&
|
246
263
|
prev_element.shell.present? &&
|
@@ -291,13 +308,17 @@ module MarkdownExec
|
|
291
308
|
|
292
309
|
label_above = if label_format_above.present?
|
293
310
|
format(label_format_above,
|
294
|
-
block_source.merge(
|
311
|
+
block_source.merge(
|
312
|
+
{ block_name: block_name_for_bash_comment }
|
313
|
+
))
|
295
314
|
else
|
296
315
|
nil
|
297
316
|
end
|
298
317
|
label_below = if label_format_below.present?
|
299
318
|
format(label_format_below,
|
300
|
-
block_source.merge(
|
319
|
+
block_source.merge(
|
320
|
+
{ block_name: block_name_for_bash_comment }
|
321
|
+
))
|
301
322
|
else
|
302
323
|
nil
|
303
324
|
end
|
@@ -334,13 +355,12 @@ module MarkdownExec
|
|
334
355
|
else
|
335
356
|
opts[:hide_blocks_by_name] &&
|
336
357
|
((opts[:block_name_hidden_match]&.present? &&
|
337
|
-
block.
|
358
|
+
block.s2title&.match(Regexp.new(opts[:block_name_hidden_match]))) ||
|
338
359
|
(opts[:block_name_include_match]&.present? &&
|
339
|
-
block.
|
360
|
+
block.s2title&.match(Regexp.new(opts[:block_name_include_match]))) ||
|
340
361
|
(opts[:block_name_wrapper_match]&.present? &&
|
341
|
-
block.
|
342
|
-
(block.
|
343
|
-
|
362
|
+
block.s2title&.match(Regexp.new(opts[:block_name_wrapper_match])))) &&
|
363
|
+
(block.s2title&.present? || block[:label]&.present?)
|
344
364
|
end
|
345
365
|
end
|
346
366
|
|
@@ -415,8 +435,11 @@ module MarkdownExec
|
|
415
435
|
memo
|
416
436
|
end
|
417
437
|
|
418
|
-
def select_elements_with_neighbor_conditions(
|
419
|
-
|
438
|
+
def select_elements_with_neighbor_conditions(
|
439
|
+
array,
|
440
|
+
last_selected_placeholder = nil,
|
441
|
+
next_selected_placeholder = nil
|
442
|
+
)
|
420
443
|
selected_elements = []
|
421
444
|
last_selected = last_selected_placeholder
|
422
445
|
|
@@ -463,8 +486,10 @@ if $PROGRAM_NAME == __FILE__
|
|
463
486
|
end if false
|
464
487
|
|
465
488
|
def test_collect_dependencies_with_valid_source
|
466
|
-
@mdoc.stubs(:get_block_by_anyname)
|
467
|
-
|
489
|
+
@mdoc.stubs(:get_block_by_anyname)
|
490
|
+
.with('source1').returns(OpenStruct.new(reqs: ['source2']))
|
491
|
+
@mdoc.stubs(:get_block_by_anyname)
|
492
|
+
.with('source2').returns(OpenStruct.new(reqs: []))
|
468
493
|
|
469
494
|
expected = { 'source1' => ['source2'], 'source2' => [] }
|
470
495
|
assert_equal expected, @mdoc.collect_dependencies('source1')
|
@@ -529,20 +554,23 @@ if $PROGRAM_NAME == __FILE__
|
|
529
554
|
def test_hide_menu_block_on_name
|
530
555
|
opts = { hide_blocks_by_name: true,
|
531
556
|
block_name_hidden_match: 'block1' }
|
532
|
-
block = FCB.new(
|
557
|
+
block = FCB.new(s2title: 'block1')
|
533
558
|
result = @doc.hide_menu_block_on_name(opts, block)
|
534
559
|
assert result # this should be true based on the given logic
|
535
560
|
end
|
536
561
|
|
537
562
|
def test_fcbs_per_options
|
538
|
-
opts = { hide_blocks_by_name: true,
|
563
|
+
opts = { hide_blocks_by_name: true,
|
564
|
+
block_name_hidden_match: 'block1' }
|
539
565
|
result = @doc.fcbs_per_options(opts)
|
540
566
|
assert_equal [@table[1], @table[2]], result
|
541
567
|
end if false ### broken test
|
542
568
|
|
543
569
|
def test_recursively_required
|
544
570
|
result = @doc.recursively_required_hash('block3')
|
545
|
-
assert_equal ({ 'block3' => ['block1'],
|
571
|
+
assert_equal ({ 'block3' => ['block1'],
|
572
|
+
'block1' => ['block2'],
|
573
|
+
'block2' => nil }),
|
546
574
|
result
|
547
575
|
|
548
576
|
result_no_reqs = @doc.recursively_required_hash(nil)
|
@@ -585,8 +613,9 @@ if $PROGRAM_NAME == __FILE__
|
|
585
613
|
# Test case 3: blocks with missing wraps
|
586
614
|
assert_equal(
|
587
615
|
%w[block4],
|
588
|
-
@mdoc.collect_wrapped_blocks(
|
589
|
-
|
616
|
+
@mdoc.collect_wrapped_blocks(
|
617
|
+
[OpenStruct.new(oname: 'block4', wraps: ['wrap4'])]
|
618
|
+
).map(&:oname)
|
590
619
|
)
|
591
620
|
end
|
592
621
|
end
|
data/lib/menu.src.yml
CHANGED
data/lib/menu.yml
CHANGED
@@ -44,6 +44,7 @@
|
|
44
44
|
:procname: val_as_str
|
45
45
|
- :opt_name: block_name_match
|
46
46
|
:env_var: MDE_BLOCK_NAME_MATCH
|
47
|
+
:description: Pattern for the block name in the line defining the block
|
47
48
|
:default: ":(?<title>\\S+)( |$)"
|
48
49
|
:procname: val_as_str
|
49
50
|
- :opt_name: block_name_nick_match
|
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: 2.8.
|
4
|
+
version: 2.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fareed Stevenson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: clipboard
|
@@ -107,7 +107,13 @@ files:
|
|
107
107
|
- assets/select_a_block.png
|
108
108
|
- assets/select_a_file.png
|
109
109
|
- bats/bats.bats
|
110
|
+
- bats/block-hide.bats
|
110
111
|
- bats/block-type-opts.bats
|
112
|
+
- bats/block-type-ux-auto.bats
|
113
|
+
- bats/block-type-ux-exec.bats
|
114
|
+
- bats/block-type-ux-require.bats
|
115
|
+
- bats/block-type-ux-row-format.bats
|
116
|
+
- bats/block-type-ux-transform.bats
|
111
117
|
- bats/block-type-vars.bats
|
112
118
|
- bats/block-types.bats
|
113
119
|
- bats/border.bats
|
@@ -136,9 +142,15 @@ files:
|
|
136
142
|
- bin/tab_completion.sh
|
137
143
|
- bin/tab_completion.sh.erb
|
138
144
|
- docs/dev/bats-document-configuration.md
|
145
|
+
- docs/dev/block-hide.md
|
139
146
|
- docs/dev/block-type-bash.md
|
140
147
|
- docs/dev/block-type-opts.md
|
141
148
|
- docs/dev/block-type-port.md
|
149
|
+
- docs/dev/block-type-ux-auto.md
|
150
|
+
- docs/dev/block-type-ux-exec.md
|
151
|
+
- docs/dev/block-type-ux-require.md
|
152
|
+
- docs/dev/block-type-ux-row-format.md
|
153
|
+
- docs/dev/block-type-ux-transform.md
|
142
154
|
- docs/dev/block-type-vars.md
|
143
155
|
- docs/dev/border.md
|
144
156
|
- docs/dev/command-substitution.md
|