Skip to content
Kward Search API index

Module: Kward::ScratchpadRunner

Defined in:
lib/kward/scratchpad_runner.rb

Overview

Executes scratchpad buffers and returns transformed buffer content.

Defined Under Namespace

Classes: Result

Constant Summary collapse

RUBY_END_MARKER_PATTERN =
/^__END__\n?/.freeze

Class Method Summary collapse

Class Method Details

.capture_ruby_output(content) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/kward/scratchpad_runner.rb', line 30

def capture_ruby_output(content)
  Tempfile.create(["kward-scratchpad", ".rb"]) do |file|
    file.write(content)
    file.flush
    Open3.capture2e(RbConfig.ruby, file.path)
  end
end

.ruby_buffer_with_output(content, output, exit_status) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/kward/scratchpad_runner.rb', line 38

def ruby_buffer_with_output(content, output, exit_status)
  output = output.to_s
  output += "\n" unless output.empty? || output.end_with?("\n")
  output += "[exit status: #{exit_status}]\n" unless exit_status.to_i.zero?

  if (match = content.match(RUBY_END_MARKER_PATTERN))
    "#{content[0...match.begin(0)]}__END__\n#{output}"
  else
    "#{content}#{ruby_end_separator(content)}__END__\n#{output}"
  end
end

.ruby_end_separator(content) ⇒ Object



50
51
52
53
54
# File 'lib/kward/scratchpad_runner.rb', line 50

def ruby_end_separator(content)
  return "" if content.empty?

  content.end_with?("\n") ? "\n" : "\n\n"
end

.run(language, content) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/kward/scratchpad_runner.rb', line 15

def run(language, content)
  case language&.to_sym
  when :ruby
    run_ruby(content)
  else
    raise ArgumentError, "Scratchpad language #{language.inspect} is not runnable"
  end
end

.run_ruby(content) ⇒ Object



24
25
26
27
28
# File 'lib/kward/scratchpad_runner.rb', line 24

def run_ruby(content)
  content = content.to_s
  output, status = capture_ruby_output(content)
  Result.new(buffer: ruby_buffer_with_output(content, output, status.exitstatus), exit_status: status.exitstatus)
end