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
- .capture_ruby_output(content) ⇒ Object
- .ruby_buffer_with_output(content, output, exit_status) ⇒ Object
- .ruby_end_separator(content) ⇒ Object
- .run(language, content) ⇒ Object
- .run_ruby(content) ⇒ Object
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 |