markdown_exec 3.0.1 → 3.0.3

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: 6105f345e0f4e3b856fc2209f92872c3ab08aa1f7dadab2e3dba4fa686a8d20c
4
- data.tar.gz: 3463e2cf4f292621d34007a55953744769047747c62fb20408e9a3c7070dc617
3
+ metadata.gz: aca4576a97f3d528e52f331941144d91970a5dd6477d60a6270de464e47475cb
4
+ data.tar.gz: 2c16498793d375c37d4b07c55500e76b63f1ab9dd37cdbbc83dedbeced288d5c
5
5
  SHA512:
6
- metadata.gz: dd25c39ccfefc8d5db5dd8ec985a4c7537824f631e916b18a17236504ea077eac24bc45eed13bd13756dad18ab045422c583b8479d32e9379219dc7f58682f7b
7
- data.tar.gz: '084bc0518c1b016c738361f2dcc076cf0f51e5cb56b91b54f21880be09198b2d2176a5428ae2f2dfcedd09de34e73f45c278c13c705db04cc83b3bda8a8f5cb5'
6
+ metadata.gz: d90b01f7fa224697dc393a70fea22cd3083a200e32f52d9bead14e08d83a45d86d2ed00d5a90995c14401a28b850fb92ca0fb2682e91977671cd393924635ce5
7
+ data.tar.gz: 7272c814fe69625754c7e6c0dcddd2bd21d602636eb089593080f4f26ae0863cbe2915fcfa470058677420781a8d57f13a7e5f52348bcf280738779238871197
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.0.3] - 2025-05-23
4
+
5
+ ### Changed
6
+
7
+ - Collect all required blocks when multiple blocks have the same name.
8
+
9
+ ## [3.0.2] - 2025-05-21
10
+
11
+ ### Added
12
+
13
+ - Options to permit the archiving of ad-hoc shell scripts.
14
+
15
+ ### Changed
16
+
17
+ - Force use of Bash shell for ad-hoc shell scripts.
18
+
3
19
  ## [3.0.1] - 2025-05-21
4
20
 
5
21
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- markdown_exec (3.0.1)
4
+ markdown_exec (3.0.3)
5
5
  clipboard (~> 1.3.6)
6
6
  open3 (~> 0.1.1)
7
7
  optparse (~> 0.1.1)
@@ -8,7 +8,7 @@ name: SPECIES
8
8
  / automatic block loads first line in output of exec
9
9
  ```ux :[document_ux_GENUS]
10
10
  allowed: :exec
11
- exec: echo "Pongo\nHistiophryne psychedelica"
11
+ exec: printf "Pongo\nHistiophryne psychedelica"
12
12
  name: GENUS
13
13
  ```
14
14
  / executed block presents a menu of the allowed list
@@ -3014,7 +3014,7 @@ module MarkdownExec
3014
3014
  )
3015
3015
 
3016
3016
  else
3017
- output_lines = `#{cmd}`.split("\n")
3017
+ output_lines = `bash #{file.path}`.split("\n")
3018
3018
  end
3019
3019
  end
3020
3020
 
@@ -3138,7 +3138,10 @@ module MarkdownExec
3138
3138
  opts_block_name)
3139
3139
  return if selected_blocks.empty?
3140
3140
 
3141
- dependency_map = {}
3141
+ dependency_map = selected_blocks.map do |block|
3142
+ [block.id, block.reqs]
3143
+ end.to_h
3144
+
3142
3145
  selected_blocks.each do |block|
3143
3146
  mdoc.collect_dependencies(memo: dependency_map, block: block)
3144
3147
  end
@@ -3568,11 +3571,24 @@ module MarkdownExec
3568
3571
 
3569
3572
  def output_from_adhoc_bash_script_file(bash_script_lines)
3570
3573
  Tempfile.create('script_exec') do |temp_file|
3571
- temp_file.write(HashDelegator.join_code_lines(bash_script_lines))
3572
- temp_file.flush
3574
+ temp_file.write(
3575
+ HashDelegator.join_code_lines(
3576
+ bash_script_lines
3577
+ )
3578
+ )
3579
+ temp_file.close # Close the file before chmod and execution
3573
3580
  File.chmod(0o755, temp_file.path)
3574
3581
 
3575
- output = `#{temp_file.path}`
3582
+ if @delegate_object[:archive_ad_hoc_scripts]
3583
+ archive_filename = format(
3584
+ @delegate_object[:archive_path_format],
3585
+ time: Time.now.strftime(@delegate_object[:archive_time_format])
3586
+ )
3587
+ `cp #{temp_file.path} #{archive_filename}`
3588
+ end
3589
+
3590
+ output = `bash #{temp_file.path}`
3591
+ #### use shell per configuration
3576
3592
 
3577
3593
  CommandResult.new(stdout: output, exit_status: $?.exitstatus)
3578
3594
  end
@@ -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 = '3.0.1'
10
+ VERSION = '3.0.3'
11
11
  end
data/lib/mdoc.rb CHANGED
@@ -121,7 +121,7 @@ module MarkdownExec
121
121
 
122
122
  nickname = name_block.pub_name
123
123
 
124
- dependencies = collect_dependencies(source: nickname)
124
+ dependencies = collect_dependencies(pubname: nickname)
125
125
  # !!t dependencies.count
126
126
  all_dependency_names =
127
127
  collect_unique_names(dependencies).push(nickname).uniq
@@ -372,6 +372,18 @@ module MarkdownExec
372
372
  end.fetch(0, default)
373
373
  end
374
374
 
375
+ # Retrieves code blocks by a name.
376
+ #
377
+ # @param name [String] The name of the code block to retrieve.
378
+ # @param default [Hash] The default value to return if the code block is not found.
379
+ # @return [Hash] The code block as a hash or the default value if not found.
380
+ #
381
+ def get_blocks_by_anyname(name)
382
+ table_not_split.select do |fcb|
383
+ fcb.is_named?(name)
384
+ end
385
+ end
386
+
375
387
  # Checks if a code block should be hidden based on the given options.
376
388
  #
377
389
  # @param opts [Hash] The options used for hiding code blocks.
@@ -426,13 +438,12 @@ module MarkdownExec
426
438
  return memo unless source
427
439
  return memo if memo.keys.include? source
428
440
 
429
- block = get_block_by_anyname(source)
430
- # if block.nil? || block.keys.nil? || block.keys.empty?
431
- if block.nil?
441
+ blocks = get_blocks_by_anyname(source)
442
+ if blocks.empty?
432
443
  raise "Named code block `#{source}` not found. (@#{__LINE__})"
433
444
  end
434
445
 
435
- memo[source] = block.reqs
446
+ memo[source] = blocks.map(&:reqs).flatten(1)
436
447
  return memo unless memo[source]&.count&.positive?
437
448
 
438
449
  memo[source].each do |req|
@@ -447,21 +458,28 @@ module MarkdownExec
447
458
  # @param source [String] The name of the initial source block.
448
459
  # @param memo [Hash] A memoization hash to store resolved dependencies.
449
460
  # @return [Hash] A hash mapping sources to their respective dependencies.
450
- def collect_dependencies(block: nil, memo: {}, source: nil)
461
+ def collect_dependencies(block: nil, memo: {}, pubname: nil)
451
462
  if block.nil?
452
- return memo unless source
463
+ return memo unless pubname
453
464
 
454
- block = get_block_by_anyname(source)
455
- if block.nil? || block.instance_of?(Hash)
456
- raise "Named code block `#{source}` not found. (@#{__LINE__})"
465
+ blocks = get_blocks_by_anyname(pubname)
466
+ if blocks.empty?
467
+ raise "Named code block `#{pubname}` not found. (@#{__LINE__})"
457
468
  end
469
+ else
470
+ blocks = [block]
458
471
  end
459
- return memo unless block.reqs
472
+ return memo unless blocks.count.positive?
473
+
474
+ required_blocks = blocks.map(&:reqs).flatten(1)
475
+ return memo unless required_blocks.count.positive?
460
476
 
461
- memo[block.id] = block.reqs
477
+ blocks.each do |block|
478
+ memo[block.id] = required_blocks
479
+ end
462
480
 
463
- block.reqs.each do |req|
464
- collect_dependencies(source: req, memo: memo) unless memo.key?(req)
481
+ required_blocks.each do |req|
482
+ collect_dependencies(pubname: req, memo: memo)
465
483
  end
466
484
 
467
485
  memo
@@ -519,7 +537,7 @@ if $PROGRAM_NAME == __FILE__
519
537
  ### must raise error
520
538
  def test_collect_dependencies_with_nonexistent_source
521
539
  assert_raises(RuntimeError) do
522
- @mdoc.collect_dependencies(source: 'nonexistent')
540
+ @mdoc.collect_dependencies(pubname: 'nonexistent')
523
541
  end
524
542
  end if false
525
543
 
@@ -531,7 +549,7 @@ if $PROGRAM_NAME == __FILE__
531
549
  .with('source2').returns(OpenStruct.new(id: 'source2', reqs: []))
532
550
 
533
551
  expected = { 'source1' => ['source2'], 'source2' => [] }
534
- assert_equal expected, @mdoc.collect_dependencies(source: 'source1')
552
+ assert_equal expected, @mdoc.collect_dependencies(pubname: 'source1')
535
553
  end
536
554
  end
537
555
 
data/lib/menu.src.yml CHANGED
@@ -4,6 +4,25 @@
4
4
  :description: Show current configuration values
5
5
  :procname: show_config
6
6
 
7
+ - :opt_name: archive_ad_hoc_scripts
8
+ :env_var: MDE_ARCHIVE_AD_HOC_SCRIPTS
9
+ :description: Archive ad-hoc bash scripts
10
+ :arg_name: BOOL
11
+ :default: false
12
+ :procname: val_as_bool
13
+
14
+ - :opt_name: archive_time_format
15
+ :env_var: MDE_ARCHIVE_TIME_FORMAT
16
+ :description: Time format for archive filenames
17
+ :default: '%Y-%m-%d-%H-%M-%S-%N'
18
+ :procname: val_as_str
19
+
20
+ - :opt_name: archive_path_format
21
+ :env_var: MDE_ARCHIVE_PATH_FORMAT
22
+ :description: Format for archive file paths
23
+ :default: '/tmp/mde-ad-hoc-%{time}'
24
+ :procname: val_as_str
25
+
7
26
  - :opt_name: bash_only
8
27
  :env_var: MDE_BASH_ONLY
9
28
  :description: Execute only blocks of type "bash"
data/lib/menu.yml CHANGED
@@ -2,6 +2,22 @@
2
2
  - :short_name: '0'
3
3
  :description: Show current configuration values
4
4
  :procname: show_config
5
+ - :opt_name: archive_ad_hoc_scripts
6
+ :env_var: MDE_ARCHIVE_AD_HOC_SCRIPTS
7
+ :description: Archive ad-hoc bash scripts
8
+ :arg_name: BOOL
9
+ :default: false
10
+ :procname: val_as_bool
11
+ - :opt_name: archive_time_format
12
+ :env_var: MDE_ARCHIVE_TIME_FORMAT
13
+ :description: Time format for archive filenames
14
+ :default: "%Y-%m-%d-%H-%M-%S-%N"
15
+ :procname: val_as_str
16
+ - :opt_name: archive_path_format
17
+ :env_var: MDE_ARCHIVE_PATH_FORMAT
18
+ :description: Format for archive file paths
19
+ :default: "/tmp/mde-ad-hoc-%{time}"
20
+ :procname: val_as_str
5
21
  - :opt_name: bash_only
6
22
  :env_var: MDE_BASH_ONLY
7
23
  :description: Execute only blocks of type "bash"
data/lib/ww.rb CHANGED
@@ -77,6 +77,10 @@ def ww0(*objs,
77
77
  file.puts(formatted_message)
78
78
  end
79
79
 
80
+ def wwb
81
+ binding.irb if $debug
82
+ end
83
+
80
84
  # return the last item in the list, as the label is usually first
81
85
  objs.last
82
86
  end
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: 3.0.1
4
+ version: 3.0.3
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-05-22 00:00:00.000000000 Z
11
+ date: 2025-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard