Sha256: 70605db8ed5060efb1a1ff4675dfef44c1b625cbd029cad19957b74380e0e2aa

Contents?: true

Size: 1.76 KB

Versions: 116

Compression:

Stored size: 1.76 KB

Contents

#!/usr/bin/env ruby
require 'open3'

class String
  unless method_defined?(:lines)
    def lines
      self
    end
  end
end

MARKER = "!XMP#{Time.new.to_i}_#{rand(1000000)}!"
XMPRE = Regexp.new("^" + Regexp.escape(MARKER) + '\[([0-9]+)\] => (.*)')
VAR = "_xmp_#{Time.new.to_i}_#{rand(1000000)}"
WARNING_RE = /-:([0-9]+): warning: (.*)/
interpreter = ARGV
interpreter << 'ruby' << '-w' if interpreter.empty?

IO.popen(interpreter.first, 'w') do |script|
  script.write <<-TEST
    begin
      require 'rubygems'
    rescue LoadError
      exit 1
    end
    exit 0
  TEST
end
if $?.exitstatus == 1
  ENV['RUBYOPT'] = ENV['RUBYOPT'].gsub(/-rr?ubygems/i, '')
end
code = STDIN.read

idx = 0
newcode = code.gsub(/^(.*) # =>.*/) do |l|
  expr = $1
  (/^\s*#/ =~ l) ? l :
  %!((#{VAR} = (#{expr}); $stderr.puts("#{MARKER}[#{idx+=1}] => " + #{VAR}.inspect) || #{VAR}))!
end
stdin, stdout, stderr = Open3::popen3(*interpreter)
stdin.puts newcode
stdin.close
output = stderr.readlines

results = Hash.new{|h,k| h[k] = []}
output.grep(XMPRE).each do |line|
  result_id, result = XMPRE.match(line).captures
  results[result_id.to_i] << result
end

idx = 0
annotated = code.gsub(/^(.*) # =>.*/) do |l|
  expr = $1
  (/^\s*#/ =~ l) ? l : "#{expr} # => " + (results[idx+=1] || []).join(", ")
end.gsub(/ # !>.*/, '').gsub(/# (>>|~>)[^\n]*\n/m, "");

warnings = {}
output.join.lines.grep(WARNING_RE).map do |x|
  md = WARNING_RE.match(x)
  warnings[md[1].to_i] = md[2]
end
idx = 0
annotated = annotated.lines.map do |line|
  w = warnings[idx+=1]
  w ? (line.chomp + " # !> #{w}") : line
end
puts annotated
output.reject!{|x| /^-:[0-9]+: warning/.match(x)}
if exception = /^-:[0-9]+:.*/m.match(output.join)
  puts exception[0].map{|line| "# ~> " + line }
end
if (s = stdout.read) != ""
  puts "# >> #{s.inspect}"
end

Version data entries

116 entries across 116 versions & 1 rubygems

Version Path
utils-0.22.1 bin/xmp
utils-0.22.0 bin/xmp
utils-0.21.2 bin/xmp
utils-0.21.1 bin/xmp
utils-0.21.0 bin/xmp
utils-0.20.0 bin/xmp
utils-0.19.0 bin/xmp
utils-0.18.1 bin/xmp
utils-0.18.0 bin/xmp
utils-0.17.0 bin/xmp
utils-0.16.0 bin/xmp
utils-0.15.1 bin/xmp
utils-0.15.0 bin/xmp
utils-0.14.0 bin/xmp
utils-0.13.0 bin/xmp
utils-0.12.0 bin/xmp
utils-0.11.0 bin/xmp
utils-0.10.1 bin/xmp
utils-0.10.0 bin/xmp
utils-0.9.0 bin/xmp