markdown_exec 1.8.7 → 1.8.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83a04f06ad7f74d2557e1967ae424a8b5f8b08e9ddbbad10091ab6612f94c106
4
- data.tar.gz: 54a9b79333781bb540ce1e37f686bf132d437c2ab5475c6cd64c40b3f821935e
3
+ metadata.gz: 9fb4c6a799eb433c1df5b2a5b9969757bc7073bcd8ce410a341f8714dc4dd5dd
4
+ data.tar.gz: 385a8fe67c4cb460b43ae1263c7643d819fe5c236e572e3d3a6c04f26fb64666
5
5
  SHA512:
6
- metadata.gz: 4106f3dc27781398aee563bba15355b05f67a118170da36e9c1c51b776ec7549576ee162b090a33a3da278694438a66746d2f4c31384315929eca57558c5ca7a
7
- data.tar.gz: d46fa757bcfbee2fbfdebee46050ff579d4cd050a3203c887db47a5de4cc275986308cd056ef264947f1d7f239b717a8617b2a51218594f85cd10b27d14156bf
6
+ metadata.gz: 658083cad39ed6e9e2caf0243b9aa2d33d9c8b881ed370938cee3f062ba4d9f2fa4f940de7d1dfe2066c0afe285c562f1caefef367d18eacfa4a9d295061f0fb
7
+ data.tar.gz: 244c774edf797545ad63326caa39014b23cf3ed53622cdffcd2d37d37012be972ae3f538b619f6895c3ae72fcd80cafd0b9e9428bbd20788bb267307e5168a8d
data/.rubocop.yml CHANGED
@@ -104,3 +104,6 @@ Style/StringLiterals:
104
104
  Style/StringLiteralsInInterpolation:
105
105
  Enabled: true
106
106
  EnforcedStyle: single_quotes
107
+
108
+ Style/UnlessElse:
109
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,7 +1,36 @@
1
- ## [1.8.7] - 2023-12-31
2
-
3
1
  # Changelog
4
2
 
3
+ ## [1.8.8] - 2024-01-15
4
+
5
+ ### Added
6
+
7
+ - Debounce/Control repeated launching of the same block via the menu.
8
+
9
+ - Option to match block nicknames.
10
+ Nicknames are used for scripting and are not displayed in the menu -- the block body is shown the menu.
11
+
12
+ - Option to execute script to launch Terminal window.
13
+ Provide batch variables to use in the execute_command_format script.
14
+ Limit iTerm window position to visible area.
15
+ Store output of executed script.
16
+ Menu to replay, review, and exit.
17
+
18
+ - Report line in document importing a missing file.
19
+
20
+ - Option to search for import files within each of the specified paths (recursion optional).
21
+
22
+ - Eval block loads (appends) local file to inherited lines.
23
+
24
+ - Eval block executes script and appends filtered output to inherited lines.
25
+ Select output using begin and end matching lines.
26
+ Transform selected output with per-line match and print specifications.
27
+
28
+ ### Changed
29
+
30
+ - Sanitize block names in formatted lines above and below inherited code.
31
+
32
+ ## [1.8.7] - 2023-12-31
33
+
5
34
  ### Added
6
35
 
7
36
  - Option for block name that presents the menu.
@@ -26,7 +55,8 @@
26
55
 
27
56
  ### Added
28
57
 
29
- - "eval" key for link block type to compute lines to append to the inherited state.
58
+ - "eval" boolean value for Link blocks to compute lines to append to the inherited state.
59
+ - "return" boolean value for Link blocks to return to the original page.
30
60
  - Options for dumping data associated with the menu or state.
31
61
  - Debug and irb gems.
32
62
 
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ gemspec
9
9
  gem 'clipboard'
10
10
  gem 'debug'
11
11
  gem 'erb'
12
+ gem 'httparty' # 2024-01-01 for ChatGPI API
12
13
  gem 'irb', '>= 1.8.0'
13
14
  gem 'mocha', require: false
14
15
  gem 'minitest', require: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- markdown_exec (1.8.7)
4
+ markdown_exec (1.8.8)
5
5
  clipboard (~> 1.3.6)
6
6
  open3 (~> 0.1.1)
7
7
  optparse (~> 0.1.1)
@@ -47,6 +47,9 @@ GEM
47
47
  erb (4.0.3)
48
48
  cgi (>= 0.3.3)
49
49
  erubi (1.12.0)
50
+ httparty (0.21.0)
51
+ mini_mime (>= 1.0.0)
52
+ multi_xml (>= 0.5.2)
50
53
  i18n (1.14.1)
51
54
  concurrent-ruby (~> 1.0)
52
55
  io-console (0.7.1)
@@ -60,9 +63,11 @@ GEM
60
63
  crass (~> 1.0.2)
61
64
  nokogiri (>= 1.12.0)
62
65
  method_source (1.0.0)
66
+ mini_mime (1.1.5)
63
67
  minitest (5.20.0)
64
68
  mocha (2.1.0)
65
69
  ruby2_keywords (>= 0.0.5)
70
+ multi_xml (0.6.0)
66
71
  nokogiri (1.15.4-arm64-darwin)
67
72
  racc (~> 1.4)
68
73
  open3 (0.1.2)
@@ -182,6 +187,7 @@ DEPENDENCIES
182
187
  clipboard
183
188
  debug
184
189
  erb
190
+ httparty
185
191
  irb (>= 1.8.0)
186
192
  markdown_exec!
187
193
  minitest
data/Rakefile CHANGED
@@ -82,6 +82,7 @@ task :minitest do
82
82
  './lib/directory_searcher.rb',
83
83
  './lib/fcb.rb',
84
84
  './lib/filter.rb',
85
+ './lib/find_files.rb',
85
86
  './lib/hash_delegator.rb',
86
87
  './lib/markdown_exec.rb',
87
88
  './lib/mdoc.rb',
data/bin/bmde CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env bundle exec ruby
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # encoding=utf-8
@@ -13,7 +13,7 @@ __filedirs_all()
13
13
  }
14
14
 
15
15
  _mde_echo_version() {
16
- echo "1.8.7"
16
+ echo "1.8.8"
17
17
  }
18
18
 
19
19
  _mde() {
@@ -80,9 +80,9 @@ _mde() {
80
80
 
81
81
  --saved-stdout-folder) COMPREPLY="logs"; return 0 ;;
82
82
 
83
- --user-must-approve) COMPREPLY="1"; return 0 ;;
83
+ --user-must-approve) COMPREPLY="0"; return 0 ;;
84
84
 
85
- -q) COMPREPLY="1"; return 0 ;;
85
+ -q) COMPREPLY="0"; return 0 ;;
86
86
 
87
87
  --display-level) COMPREPLY="1"; return 0 ;;
88
88
 
@@ -178,4 +178,4 @@ _mde() {
178
178
 
179
179
  complete -o filenames -o nospace -F _mde mde
180
180
  # _mde_echo_version
181
- # echo "Updated: 2023-12-31 17:23:18 UTC"
181
+ # echo "Updated: 2024-01-18 17:32:47 UTC"
data/examples/colors.md CHANGED
@@ -43,7 +43,8 @@ warning_color: fg_rgbh_ff_7f_00
43
43
  ```
44
44
 
45
45
  ::: Example blocks
46
-
46
+ ```
47
+ ```
47
48
  ```bash :Bash1
48
49
  ```
49
50
  ```link :Link1
@@ -0,0 +1,66 @@
1
+ This is a concise guide for using Bash commands to find and list recent files in a Linux system. The commands are safe to use and can help you quickly locate recently modified or accessed files.
2
+
3
+ 1. **List Recently Modified Files**:
4
+ You can use the `ls` command with sorting options to list recently modified files in the current directory.
5
+
6
+ ```bash
7
+ ls -lt
8
+ ```
9
+
10
+ 2. **Using `stat` for File Details**:
11
+ To get detailed information about file modifications, access, and change, use the `stat` command.
12
+
13
+ Example for a specific file:
14
+ ```bash
15
+ stat .
16
+ ```
17
+
18
+ 3. **Find Files**:
19
+ A. **Find Files Modified in the Last N Days**:
20
+ The `find` command is useful for searching files modified within a specific number of days.
21
+
22
+ For example, to find files modified in the last 7 days:
23
+ ```bash
24
+ find . -type f -mtime -7
25
+ ```
26
+
27
+ B. **Display Files Accessed Recently**:
28
+ Similarly, you can list files that were accessed recently using the `find` command.
29
+
30
+ 1. To list files accessed in the last 3 days:
31
+ ```bash
32
+ find . -type f -atime -3
33
+ ```
34
+
35
+ 2. **Advanced Search with `find`**:
36
+ Combine `find` with other commands for advanced searching. For instance, to list and sort files by modification time:
37
+
38
+ ```bash
39
+ find . -type f -mtime -7 -exec ls -lt {} +
40
+ ```
41
+
42
+ These commands provide a basic way to manage and track file modifications and access on your system. They are particularly useful for system administration and file management tasks.
43
+
44
+ ```link :Link1
45
+ ```
46
+
47
+ ```link :Link2
48
+ ```
49
+
50
+ ```opts :Opts1
51
+ ```
52
+
53
+ ```opts :Opts2
54
+ ```
55
+
56
+ ```port :Port1
57
+ ```
58
+
59
+ ```port :Port2
60
+ ```
61
+
62
+ ```vars :Vars1
63
+ ```
64
+
65
+ ```vars :Vars2
66
+ ```
data/examples/linked.md CHANGED
@@ -1,7 +1,6 @@
1
1
  Demonstrate setting a variable interactively for use in generated scripts.
2
2
 
3
3
  ```opts :(document_options)
4
- dump_inherited_lines: true
5
4
  pause_after_script_execution: false
6
5
  user_must_approve: false
7
6
  ```
@@ -48,5 +47,25 @@ echo VARIABLE=B
48
47
 
49
48
  ```bash :display_variable
50
49
  source bin/colorize_env_vars.sh
50
+ echo The current value of environment variable VARIABLE is now:
51
51
  colorize_env_vars '' VARIABLE
52
52
  ```
53
+
54
+ ```bash :(set_timestamp)
55
+ echo 'yyyymmdd? (default: today UTC) '; read -r yyyymmdd; [[ -z $yyyymmdd ]] && yyyymmdd="$(date -u +%y%m%d)"
56
+ echo "EC2_STACK_TS='$yyyymmdd'"
57
+ ```
58
+ ```link :request_input_and_inherit_output +(set_timestamp)
59
+ exec: true
60
+ ```
61
+
62
+ ::: Load file into inherited lines
63
+ Load (do not evaluate) and append to inherited lines.
64
+ ```link :load1
65
+ load: examples/load1.sh
66
+ ```
67
+ Load, evaluate, and append output to inherited lines.
68
+ ```link :load2_eval
69
+ load: examples/load2.sh
70
+ eval: true
71
+ ```
data/examples/load1.sh ADDED
@@ -0,0 +1,5 @@
1
+ # line 1
2
+ var1=line2
3
+ # line 3
4
+ var2=line4
5
+ # line 5
data/examples/load2.sh ADDED
@@ -0,0 +1,5 @@
1
+ # line 1
2
+ echo "var1=line2"
3
+ # line 3
4
+ echo "var2=line4"
5
+ # line 5
@@ -0,0 +1,26 @@
1
+ # Demo block nicknames
2
+
3
+ ```opts :(document_options)
4
+ save_executed_script: true
5
+ ```
6
+
7
+ ::: This block has no name.
8
+ ::: The code block is displayed.
9
+
10
+ ```bash
11
+ echo Unnamed block
12
+ ```
13
+
14
+ ::: These blocks use nicknames.
15
+ ::: The code blocks are displayed.
16
+ ::: The nicknames can be used for requiring blocks.
17
+
18
+ ```bash :[A]
19
+ echo From the required block 2
20
+ ```
21
+
22
+ ::: Execute this block that requires the block above.
23
+
24
+ ```bash :[B] +[A]
25
+ echo From the parent block 1
26
+ ```
data/lib/array.rb CHANGED
@@ -4,6 +4,10 @@
4
4
  # encoding=utf-8
5
5
 
6
6
  class Array
7
+ def pluck(key)
8
+ map { |hash| hash[key] if hash.is_a?(Hash) }.compact
9
+ end
10
+
7
11
  # Processes each element of the array, yielding the previous, current, and next elements to the given block.
8
12
  # Deletes the current element if the block returns true.
9
13
  # @return [Array] The modified array after conditional deletions.
@@ -8,6 +8,7 @@
8
8
  require 'fileutils'
9
9
  require_relative 'constants'
10
10
  require_relative 'exceptions'
11
+ require_relative 'find_files'
11
12
 
12
13
  ##
13
14
  # The CachedNestedFileReader class provides functionality to read file lines with the ability
@@ -38,25 +39,28 @@ class CachedNestedFileReader
38
39
  )
39
40
  end
40
41
 
41
- def readlines(filename, depth = 0, &block)
42
+ def readlines(filename, depth = 0, context: '', import_paths: nil, &block)
42
43
  if @file_cache.key?(filename)
43
44
  @file_cache[filename].each(&block) if block
44
45
  return @file_cache[filename]
45
46
  end
46
47
 
47
48
  directory_path = File.dirname(filename)
48
- # lines = File.readlines(filename, chomp: true)
49
49
  processed_lines = []
50
-
51
- File.readlines(filename, chomp: true).each do |line|
50
+ File.readlines(filename, chomp: true).each.with_index do |line, ind|
52
51
  if Regexp.new(@import_pattern) =~ line
53
52
  name_strip = $~[:name].strip
54
53
  included_file_path = if name_strip =~ %r{^/}
55
54
  name_strip
55
+ elsif import_paths
56
+ find_files(name_strip, import_paths + [directory_path])&.first
56
57
  else
57
58
  File.join(directory_path, name_strip)
58
59
  end
60
+
59
61
  processed_lines += readlines(included_file_path, depth + 1,
62
+ context: "#{filename}:#{ind + 1}",
63
+ import_paths: import_paths,
60
64
  &block)
61
65
  else
62
66
  nested_line = NestedLine.new(line, depth)
@@ -68,58 +72,58 @@ class CachedNestedFileReader
68
72
  @file_cache[filename] = processed_lines
69
73
  rescue Errno::ENOENT
70
74
  # Exceptions.error_handler('readlines', { abort: true })
71
- warn_format('readlines', "No such file -- #{filename}", { abort: true })
75
+ warn_format('readlines', "No such file -- #{filename} @@ #{context}", { abort: true })
72
76
  end
73
77
  end
74
78
 
75
- if $PROGRAM_NAME == __FILE__
76
- require 'minitest/autorun'
77
- require 'tempfile'
79
+ return if $PROGRAM_NAME != __FILE__
78
80
 
79
- class CachedNestedFileReaderTest < Minitest::Test
80
- def setup
81
- @file2 = Tempfile.new('test2.txt')
82
- @file2.write("ImportedLine1\nImportedLine2")
83
- @file2.rewind
81
+ require 'minitest/autorun'
82
+ require 'tempfile'
84
83
 
85
- @file1 = Tempfile.new('test1.txt')
86
- @file1.write("Line1\nLine2\n #insert #{@file2.path}\nLine3")
87
- @file1.rewind
88
- @reader = CachedNestedFileReader.new(import_pattern: /^ *#insert (?'name'.+)$/)
89
- end
84
+ class CachedNestedFileReaderTest < Minitest::Test
85
+ def setup
86
+ @file2 = Tempfile.new('test2.txt')
87
+ @file2.write("ImportedLine1\nImportedLine2")
88
+ @file2.rewind
90
89
 
91
- def teardown
92
- @file1.close
93
- @file1.unlink
90
+ @file1 = Tempfile.new('test1.txt')
91
+ @file1.write("Line1\nLine2\n #insert #{@file2.path}\nLine3")
92
+ @file1.rewind
93
+ @reader = CachedNestedFileReader.new(import_pattern: /^ *#insert (?'name'.+)$/)
94
+ end
94
95
 
95
- @file2.close
96
- @file2.unlink
97
- end
96
+ def teardown
97
+ @file1.close
98
+ @file1.unlink
98
99
 
99
- def test_readlines_without_imports
100
- result = @reader.readlines(@file2.path).map(&:to_s)
101
- assert_equal %w[ImportedLine1 ImportedLine2], result
102
- end
100
+ @file2.close
101
+ @file2.unlink
102
+ end
103
103
 
104
- def test_readlines_with_imports
105
- result = @reader.readlines(@file1.path).map(&:to_s)
106
- assert_equal %w[Line1 Line2 ImportedLine1 ImportedLine2 Line3],
107
- result
108
- end
104
+ def test_readlines_without_imports
105
+ result = @reader.readlines(@file2.path).map(&:to_s)
106
+ assert_equal %w[ImportedLine1 ImportedLine2], result
107
+ end
109
108
 
110
- def test_caching_functionality
111
- # First read
109
+ def test_readlines_with_imports
110
+ result = @reader.readlines(@file1.path).map(&:to_s)
111
+ assert_equal %w[Line1 Line2 ImportedLine1 ImportedLine2 Line3],
112
+ result
113
+ end
112
114
 
113
- result1 = @reader.readlines(@file2.path).map(&:to_s)
115
+ def test_caching_functionality
116
+ # First read
114
117
 
115
- # Simulate file content change
116
- @file2.reopen(@file2.path, 'w') { |f| f.write('ChangedLine') }
118
+ result1 = @reader.readlines(@file2.path).map(&:to_s)
117
119
 
118
- # Second read (should read from cache, not the changed file)
119
- result2 = @reader.readlines(@file2.path).map(&:to_s)
120
+ # Simulate file content change
121
+ @file2.reopen(@file2.path, 'w') { |f| f.write('ChangedLine') }
120
122
 
121
- assert_equal result1, result2
122
- assert_equal %w[ImportedLine1 ImportedLine2], result2
123
- end
123
+ # Second read (should read from cache, not the changed file)
124
+ result2 = @reader.readlines(@file2.path).map(&:to_s)
125
+
126
+ assert_equal result1, result2
127
+ assert_equal %w[ImportedLine1 ImportedLine2], result2
124
128
  end
125
129
  end
@@ -0,0 +1,22 @@
1
+ require 'yaml'
2
+ require 'terminal-table'
3
+
4
+ cmd = 'aws ce get-cost-and-usage --time-period Start=2023-12-01,End=2023-12-31 --granularity MONTHLY --metrics "UnblendedCost" "UsageQuantity" --group-by Type=DIMENSION,Key=SERVICE'
5
+
6
+ # Parse the YAML content
7
+ text = system(cmd)
8
+ data = YAML.load(text)
9
+
10
+ # Extracting the relevant information
11
+ services = data["ResultsByTime"][0]["Groups"].map do |group|
12
+ service_name = group["Keys"][0]
13
+ unblended_cost = "#{group['Metrics']['UnblendedCost']['Amount']} #{group['Metrics']['UnblendedCost']['Unit']}"
14
+ usage_quantity = "#{group['Metrics']['UsageQuantity']['Amount']} #{group['Metrics']['UsageQuantity']['Unit']}"
15
+ [service_name, unblended_cost, usage_quantity]
16
+ end
17
+
18
+ # Create a table
19
+ table = Terminal::Table.new :headings => ['Service', 'Unblended Cost', 'Usage Quantity'], :rows => services
20
+
21
+ # Output the table
22
+ puts table
data/lib/constants.rb CHANGED
@@ -17,6 +17,13 @@ IndexedLine = Struct.new(:index, :line) do
17
17
  end
18
18
  end
19
19
 
20
+ class LinkDataKeys
21
+ Eval = 'eval'
22
+ Exec = 'exec'
23
+ Load = 'load'
24
+ Return = 'return'
25
+ end
26
+
20
27
  class LoadFile
21
28
  Load = true
22
29
  Reuse = false
data/lib/exceptions.rb CHANGED
@@ -4,12 +4,14 @@
4
4
  # encoding=utf-8
5
5
 
6
6
  module Exceptions
7
- def self.error_handler(name = '', opts = {}, format_string: "\nError: %{name} -- %{message}", color_symbol: :red, take_count: 16)
7
+ def self.error_handler(name = '', opts = {}, backtrace: $@, format_string: "\nError: %{name} -- %{message}", color_symbol: :red, take_count: 16)
8
8
  warn(error = format(format_string,
9
9
  { name: name, message: $! }).send(color_symbol))
10
- warn($@.select do |s|
11
- s.include? 'markdown_exec'
12
- end.reject { |s| s.include? 'vendor' }.take(take_count).map.with_index { |line, ind| " * #{ind}: #{line}" })
10
+ if backtrace
11
+ warn(backtrace.select do |s|
12
+ s.include? 'markdown_exec'
13
+ end.reject { |s| s.include? 'vendor' }.take(take_count).map.with_index { |line, ind| " * #{ind}: #{line}" })
14
+ end
13
15
 
14
16
  binding.pry if $tap_enable
15
17
  raise ArgumentError, error unless opts.fetch(:abort, true)
data/lib/fcb.rb CHANGED
@@ -21,6 +21,7 @@ module MarkdownExec
21
21
  dname: nil,
22
22
  indent: '',
23
23
  name: nil,
24
+ nickname: nil,
24
25
  oname: nil,
25
26
  reqs: [],
26
27
  shell: '',
@@ -38,12 +39,13 @@ module MarkdownExec
38
39
  # @param fcb [Object] The FCB object whose title is to be derived.
39
40
  # @return [String] The derived title.
40
41
  def derive_title_from_body
41
- body_content = @attrs[:body]
42
- unless body_content
42
+ unless (body_content = @attrs[:body])
43
+ # empty body -> empty title
43
44
  @attrs[:title] = ''
44
45
  return
45
46
  end
46
47
 
48
+ # body -> title
47
49
  @attrs[:title] = if body_content.count == 1
48
50
  body_content.first
49
51
  else
@@ -113,6 +115,7 @@ if $PROGRAM_NAME == __FILE__
113
115
  headings: %w[Header1 Header2],
114
116
  dname: 'Sample name',
115
117
  indent: '',
118
+ nickname: nil,
116
119
  name: 'Sample name',
117
120
  oname: 'Sample name',
118
121
  reqs: %w[req1 req2],
data/lib/filter.rb CHANGED
@@ -38,10 +38,6 @@ module MarkdownExec
38
38
  name = fcb.oname
39
39
  shell = fcb.fetch(:shell, '')
40
40
 
41
- ### filter in menu, not in source code
42
- filters[:depth] =
43
- fcb.fetch(:depth,
44
- 0).positive? && !options[:menu_include_imported_blocks]
45
41
  apply_name_filters(options, filters, name)
46
42
  apply_shell_filters(options, filters, shell)
47
43
  apply_other_filters(options, filters, fcb)
@@ -88,6 +84,11 @@ module MarkdownExec
88
84
  def self.apply_shell_filters(options, filters, shell)
89
85
  filters[:shell_expect] = shell == 'expect'
90
86
 
87
+ if shell.empty? && options[:bash_only]
88
+ filters[:shell_exclude] = true
89
+ return
90
+ end
91
+
91
92
  if shell.present? && options[:select_by_shell_regex].present?
92
93
  filters[:shell_select] =
93
94
  !!(shell =~ /#{options[:select_by_shell_regex]}/)
@@ -95,8 +96,7 @@ module MarkdownExec
95
96
 
96
97
  return unless shell.present? && options[:exclude_by_shell_regex].present?
97
98
 
98
- filters[:shell_exclude] =
99
- !!(shell =~ /#{options[:exclude_by_shell_regex]}/)
99
+ filters[:shell_exclude] = !!(shell =~ /#{options[:exclude_by_shell_regex]}/)
100
100
  end
101
101
 
102
102
  # Applies additional filters to determine whether to include or
@@ -124,8 +124,6 @@ module MarkdownExec
124
124
  !!(options[:block_name_wrapper_match].present? &&
125
125
  name =~ /#{options[:block_name_wrapper_match]}/)
126
126
 
127
- return unless options[:bash_only]
128
-
129
127
  filters[:shell_default] = (shell == BlockType::BASH)
130
128
  end
131
129