lib/fcb.rb in markdown_exec-2.4.0 vs lib/fcb.rb in markdown_exec-2.5.0
- old
+ new
@@ -17,28 +17,26 @@
class FCB
def initialize(options = {})
@attrs = {
body: nil,
call: nil,
- headings: [],
dname: nil,
+ headings: [],
indent: '',
name: nil,
nickname: nil,
oname: nil,
+ random: Random.new.rand,
reqs: [],
shell: '',
+ start_line: nil,
+ text: nil, # displayable in menu
title: '',
- random: Random.new.rand,
- text: nil # displayable in menu
+ type: ''
}.merge(options)
end
- def title=(value)
- @attrs[:title] = value
- end
-
# Derives a title from the body of an FCB object.
# @param fcb [Object] The FCB object whose title is to be derived.
# @return [String] The derived title.
def derive_title_from_body
unless (body_content = @attrs[:body])
@@ -49,98 +47,192 @@
# body -> title
@attrs[:title] = if body_content.count == 1
body_content.first
else
- format_multiline_body_as_title(body_content)
+ FCB::format_multiline_body_as_title(body_content)
end
end
+ # Processes a block to generate its summary, modifying its attributes
+ # based on various matching criteria.
+ # It handles special formatting for bash blocks, extracting and setting
+ # properties like call, stdin, stdout, and dname.
+ #
+ # @param fcb [Object] An object representing a functional code block.
+ # @return [Object] The modified functional code block with updated
+ # summary attributes.
+ def for_menu!(
+ block_calls_scan: @delegate_object[:block_calls_scan],
+ block_name_match: @delegate_object[:block_name_match],
+ block_name_nick_match: @delegate_object[:block_name_nick_match]
+ )
+ call = @attrs[:call] = @attrs[:start_line]&.match(
+ Regexp.new(block_calls_scan)
+ )&.fetch(1, nil)
+ titlexcall = call ? @attrs[:title].sub("%#{call}", '') : @attrs[:title]
+
+ oname = if block_name_nick_match.present? &&
+ @attrs[:oname] =~ Regexp.new(block_name_nick_match)
+ @attrs[:nickname] = $~[0]
+ derive_title_from_body
+ else
+ bm = NamedCaptureExtractor::extract_named_groups(
+ titlexcall,
+ block_name_match
+ )
+ bm && bm[1] ? bm[:title] : titlexcall
+ end
+ @attrs[:title] = @attrs[:oname] = oname
+
+ @attrs[:dname] = HashDelegator.indent_all_lines(
+ (yield oname, BLOCK_TYPE_COLOR_OPTIONS[@attrs[:type]]),
+ @attrs[:indent]
+ )
+ end
+
private
# Formats multiline body content as a title string.
- # indents all but first line with two spaces so it displays correctly in menu
+ # indents all but first line with two spaces
+ # so it displays correctly in menu.
# @param body_lines [Array<String>] The lines of body content.
# @return [String] Formatted title.
- def format_multiline_body_as_title(body_lines)
+ def self.format_multiline_body_as_title(body_lines)
body_lines.map.with_index do |line, index|
index.zero? ? line : " #{line}"
end.join("\n") << "\n"
end
# :reek:ManualDispatch
def method_missing(method, *args, &block)
method_name = method.to_s
if @attrs.respond_to?(method_name)
+if method_name == 'fetch'
+ ww args[0]
+end
@attrs.send(method_name, *args, &block)
elsif method_name[-1] == '='
+# ww caller.take(3) if method_name == 'label='
+ww method_name
@attrs[method_name.chop.to_sym] = args[0]
else
+# ww caller.take(3) if method_name == 'label'
+ww method_name
@attrs[method_name.to_sym]
end
rescue StandardError => err
warn("ERROR ** FCB.method_missing(method: #{method_name}," \
" *args: #{args.inspect}, &block)")
warn err.inspect
warn(caller[0..4])
- # raise StandardError, error
- raise err # Here, we simply propagate the original error instead of wrapping it in a StandardError.
+ raise err
end
public
def respond_to_missing?(method_name, include_private = false)
@attrs.key?(method_name.to_sym) || super
end
+ def shell
+ @attrs[:shell]
+ end
+
+ def shell=(value)
+ @attrs[:shell] = value
+ end
+
+ def type
+ @attrs[:type]
+ end
+
+ def type=(value)
+ @attrs[:type] = value
+ end
+
def to_h
@attrs.to_h
end
def to_yaml
@attrs.to_yaml
end
+
+ # Expand in body and dname
+ def variable_expansion!(pattern, replacement_dictionary)
+ ### update name, nickname, title, label ???
+ @attrs[:dname] = @attrs[:dname].gsub(pattern) { |match|
+ replacement_dictionary[match]
+ }
+ if @attrs[:body]
+ @attrs[:body] = @attrs[:body].map do |line|
+ if line.empty?
+ line
+ else
+ line.gsub(pattern) do |match|
+ replacement_dictionary[match]
+ end
+ end
+ end
+ end
+ end
end
end
if $PROGRAM_NAME == __FILE__
require 'bundler/setup'
Bundler.require(:default)
require 'minitest/autorun'
require 'yaml'
+ def assert_equal_hash(expected, actual, message = nil)
+ sorted_expected = sort_hash_recursively(expected)
+ sorted_actual = sort_hash_recursively(actual)
+ assert_equal sorted_expected, sorted_actual, message
+ end
+
+ def sort_hash_recursively(hash)
+ hash.each_with_object({}) do |(k, v), new_hash|
+ new_hash[k] = v.is_a?(Hash) ? sort_hash_recursively(v) : v
+ end.sort.to_h
+ end
+
class FCBTest < Minitest::Test
def setup
@fcb_data = {
body: 'Sample body',
call: 'Sample call',
- headings: %w[Header1 Header2],
dname: 'Sample name',
+ headings: %w[Header1 Header2],
indent: '',
- nickname: nil,
name: 'Sample name',
+ nickname: nil,
oname: 'Sample name',
reqs: %w[req1 req2],
- shell: 'bash',
+ shell: ShellType::BASH,
+ start_line: nil,
text: 'Sample Text',
- title: 'Sample Title'
+ title: 'Sample Title',
+ type: 'shell'
}
@fcb = MarkdownExec::FCB.new(@fcb_data)
end
def test_initialization_with_correct_data
assert_equal 'Sample body', @fcb.body
assert_equal %w[Header1 Header2], @fcb.headings
end
def test_to_h_method
- assert_equal @fcb_data.merge({ random: @fcb.random }), @fcb.to_h
+ assert_equal_hash @fcb_data.merge({ random: @fcb.random }), @fcb.to_h
end
def test_to_yaml_method
- assert_equal YAML.load(@fcb_data.merge({ random: @fcb.random }).to_yaml),
- YAML.load(@fcb.to_yaml)
+ assert_equal_hash YAML.load(@fcb_data.merge({ random: @fcb.random })
+ .to_yaml),
+ YAML.load(@fcb.to_yaml)
end
def test_method_missing_getter
assert_equal 'Sample Title', @fcb.title
end