class Processing::Watcher

A sketch loader, observer, and reloader, to tighten the feedback between code and effect.

Constants

SLEEP_TIME

Public Class Methods

new() click to toggle source
# File lib/ruby-processing/runners/watch.rb, line 18
def initialize
  reload_files_to_watch
  @time = Time.now
  start_watching
end

Public Instance Methods

reload_files_to_watch() click to toggle source
# File lib/ruby-processing/runners/watch.rb, line 61
def reload_files_to_watch
  @files = Dir.glob(File.join(SKETCH_ROOT, '**/*.{rb,glsl}'))
  count = @files.length
  max_watch = RP_CONFIG.fetch('MAX_WATCH', 20)
  return unless count > max_watch
  warn format(WATCH_MESSAGE, max_watch, count)
  abort
end
report_errors() { || ... } click to toggle source

Convenience function to report errors when loading and running a sketch, instead of having them eaten by the thread they are loaded in.

# File lib/ruby-processing/runners/watch.rb, line 43
def report_errors
  yield
rescue Exception => e
  wformat = 'Exception occured while running sketch %s...'
  tformat = "Backtrace:\n\t%s"
  warn format(wformat, File.basename(SKETCH_PATH))
  puts format(tformat, e.backtrace.join("\n\t"))
end
start_runner() click to toggle source
# File lib/ruby-processing/runners/watch.rb, line 52
def start_runner
  @runner.kill if @runner && @runner.alive?
  @runner = Thread.start do
    report_errors do
      Processing.load_and_run_sketch
    end
  end
end
start_watching() click to toggle source

Kicks off a thread to watch the sketch, reloading Ruby-Processing and restarting the sketch whenever it changes.

# File lib/ruby-processing/runners/watch.rb, line 26
def start_watching
  start_runner
  Kernel.loop do
    if @files.find { |file| FileTest.exist?(file) && File.stat(file).mtime > @time }
      puts 'reloading sketch...'
      $app && $app.close
      @time = Time.now
      java.lang.System.gc
      start_runner
      reload_files_to_watch
    end
    sleep SLEEP_TIME
  end
end