Class: Processing::Watcher

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby-processing/runners/watch.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initializeWatcher

Sic a new Processing::Watcher on the sketch



10
11
12
13
14
# File 'lib/ruby-processing/runners/watch.rb', line 10

def initialize
  reload_files_to_watch
  @time = Time.now
  start_watching
end

Instance Method Details

#reload_files_to_watchObject



53
54
55
# File 'lib/ruby-processing/runners/watch.rb', line 53

def reload_files_to_watch
  @files = ([SKETCH_PATH] + Dir.glob(File.dirname(SKETCH_PATH) + "/*.rb")).uniq
end

#report_errorsObject

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



36
37
38
39
40
41
42
# File 'lib/ruby-processing/runners/watch.rb', line 36

def report_errors
  yield
rescue Exception => e
  puts "Exception occured while running sketch #{File.basename SKETCH_PATH}:"
  puts e.to_s
  puts e.backtrace.join("\n")
end

#start_runnerObject



44
45
46
47
48
49
50
51
# File 'lib/ruby-processing/runners/watch.rb', line 44

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_watchingObject

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



19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ruby-processing/runners/watch.rb', line 19

def start_watching
  start_runner
  loop do
    if @files.detect { |file| File.exists?(file) && File.stat(file).mtime > @time }
      puts "reloading sketch..."
      $app && $app.close
      @time = Time.now
      GC.start
      start_runner
      reload_files_to_watch
    end
    sleep 0.33
  end
end