-
-
Save micho/484917 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/ruby -rubygems | |
# This is a replacement for "livereload" gem for working with Rails. | |
# It watches the filesystem with OS X FSEvents rather than with EventMachine. | |
# This is better for large projects for wich EventMachine fails. | |
# | |
# Sass is supported; .sass files can also be stored in "app/styles/" directory. | |
# | |
# Command line options are "-D" to enable debug mode. All other parameters | |
# (if given) specify a list of directories to watch. | |
# | |
# Dependencies: | |
# $ sudo /usr/bin/gem install mislav-rspactor em-websocket json haml | |
require 'rspactor' | |
require 'em-websocket' | |
require 'json' | |
require 'sass/plugin' | |
API_VERSION = '1.3' | |
web_sockets = [] | |
debug = !!ARGV.delete('-D') | |
dirs = ARGV.empty?? [Dir.pwd] : ARGV | |
Sass::Plugin.add_template_location(Dir.pwd + '/app/styles') | |
listener = RSpactor::Listener.new(:extensions => %w[html erb haml rb sass yml css js], :relative_paths => false) { |files| | |
for file in files | |
case file | |
when %r{/app/.+\.(erb|haml)$}, %r{/app/helpers/.+\.rb$}, %r{/public/.+\.(css|js|html)$}, %r{/config/locales/.+\.yml$} | |
data = ['refresh', { :path => file, :apply_js_live => false, :apply_css_live => true }].to_json | |
puts data if debug | |
web_sockets.each do |ws| | |
ws.send data | |
end | |
when %r{\.sass$} | |
Sass::Plugin.update_stylesheets | |
end | |
end | |
} | |
Sass::Plugin.on_updating_stylesheet do |template, css| | |
listener.force_changed << File.expand_path(css, Dir.pwd) | |
end | |
EventMachine.run do | |
puts "LiveReload is waiting for a browser to connect." | |
EventMachine::WebSocket.start(:host => '0.0.0.0', :port => '10083', :debug => debug) do |ws| | |
ws.onopen do | |
begin | |
puts "Browser connected." | |
ws.send "!!ver:#{API_VERSION}" | |
web_sockets << ws | |
rescue | |
puts $! | |
puts $!.backtrace | |
end | |
end | |
ws.onmessage do |msg| | |
puts "Browser URL: #{msg}" | |
end | |
ws.onclose do | |
web_sockets.delete ws | |
puts "Browser disconnected." | |
end | |
end | |
puts "Starting file watcher for directories: #{dirs.inspect}" | |
listener.start(dirs) | |
# Disable the RubyCocoa thread hook as apparently Laurent did not apply the | |
# thread patches to the OS X system Ruby | |
ENV['RUBYCOCOA_THREAD_HOOK_DISABLE'] = 'kampai' | |
Thread.new { OSX.CFRunLoopRun } | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment