Skip to content

Instantly share code, notes, and snippets.

@michaeljklein
Created April 12, 2017 17:54
Show Gist options
  • Save michaeljklein/79aec0be971b5d59860ef3e6b3e7682a to your computer and use it in GitHub Desktop.
Save michaeljklein/79aec0be971b5d59860ef3e6b3e7682a to your computer and use it in GitHub Desktop.
class Mock
attr_accessor :mock_original_name, :mock_call_stack
def self.on(x)
x.instance_eval do
def method_missing(symbol, *args)
puts "mocking #{self}.${symbol}(#{args.inspect})"
@mock_call_stack ||= []
@mock_call_stack << [symbol, args]
self
end
end
end
def initialize(name)
self.mock_original_name = name
self.mock_call_stack = []
end
def method_missing(symbol, *args)
self.mock_call_stack << [symbol, args]
self
end
def name
self.to_s
end
def to_s
# puts " stringified call stack: #{self.mock_original_name}:#{self.mock_call_stack.inspect}"
"#{self.mock_original_name}:#{self.mock_call_stack.inspect}"
end
def to_str
self.to_s
end
end
class ERB
def mock_result(a_binding=new_toplevel)
while true
begin
return self.result(a_binding)
rescue NoMethodError => e
if /undefined method `(?<undefined_nil_method>[^']+)' for nil:NilClass/ =~ e.message
# puts " defining singleton method: #{undefined_nil_method} on nil"
a_binding.eval "nil.define_singleton_method('#{undefined_nil_method}', Proc.new{ Mock.new('nil') })"
elsif /undefined method `(?<undefined_main_method>[^']+)' for main:Object/ =~ e.message
# puts " mocking method #{undefined_main_method}"
a_binding.eval "def #{undefined_main_method}(*args) Mock.new('#{undefined_main_method}').call(args) end"
else
# puts " unhandled NoMethodError"
raise e
end
rescue NameError => e
if /undefined local variable or method `(?<undefined_name>[^']+)' for main:Object/ =~ e.message
# puts " mocking #{undefined_name}"
a_binding.local_variable_set undefined_name, Mock.new(undefined_name)
else
# puts " unhandled NameError"
raise e
end
end
end
end
end
Dir["#{Rails.root}/app/views/**/*.html.erb"].each do |file_name|
# puts "beginning: #{file_name}"
erb = ERB.new File.read(file_name)
# puts " loaded file"
begin
result = erb.mock_result
errors = Open3.popen3("tidy") do |i,o,e,t|
i.write result
i.close
errs = e.read
t.value
errs.lines.map do |line|
line.chomp!
if /^line (?<line_num>\d+) column (?<col_num>\d+) - (?<err_type>[^:]+): (?<err>.*)$/ =~ line
[line_num.to_i, col_num.to_i, err_type, err]
end
end.compact
end
puts "in: #{file_name}"
errors.each do |x|
puts " #{x.inspect}"
end
rescue TypeError => e
if /gollum_monkey_patches/ === e.backtrace_locations.first.to_s
puts "in: #{file_name}"
puts " I can't even"
else
raise e
end
rescue ArgumentError, SyntaxError, ActiveRecord::RecordNotFound, URI::InvalidURIError, LocalJumpError => e
puts "in: #{file_name}"
puts " no idea what to do with a #{e.class}" #: #{e.message.lines.map{|x| " " + x}.join}"
end
# puts "finished with: #{file_name}"
# puts "----------------------------------------------------------------------------------------"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment