Sha256: e440112b37386c1002c39880f1263e64c802e6431032416647ce7a0e2e720a3e

Contents?: true

Size: 2 KB

Versions: 2

Compression:

Stored size: 2 KB

Contents

require "listen"

module Nyara
  # listen to fs events and reload code / views
  module Reload

    extend self

    # NOTE file should end with '.rb'<br>
    # returns last error
    def load_file file
      verbose = $VERBOSE
      $VERBOSE = nil
      begin
        load file
        @last_error = nil
      rescue Exception
        @last_error = $!
      ensure
        $VERBOSE = verbose
      end
      if l = Nyara.logger
        if @last_error
          l.error @last_error
        end
      end
    end
    attr_reader :last_error

    # start listening
    def listen
      @port = Config['port']
      app_path = Config['root']
      views_path = Config.views_path('/', false)
      if l = Nyara.logger
        l.info "watching app and view changes under #{app_path}"
        unless views_path.start_with?(app_path)
          l.warn "views not under project dir, changes not watched"
        end
      end
      @app_listener = hook_app_reload app_path
      @views_listener = hook_views_reload views_path
    end

    # cleanup workers
    def stop
      if @app_listener.adapter.worker
        @app_listener.adapter.worker.stop
      end
      if @views_listener.adapter.worker
        @views_listener.adapter.worker.stop
      end
    end

    # ---
    # private
    # +++

    def hook_app_reload app_path
      l = Listen.to(app_path).relative_paths(false).filter(/\.rb$/).change do |modified, added, removed|
        notify 'app-modified', (added + modified).uniq
      end
      l.start
      l
    end

    def hook_views_reload views_path
      l = Listen.to(views_path).relative_paths(true).change do |modified, added, removed|
        notify 'views-modified', (added + modified).uniq
        notify 'views-removed', removed
      end
      l.start
      l
    end

    def notify leader, files
      return if files.empty?
      data = files.to_query('files')
      s = TCPSocket.new 'localhost', @port
      s << "POST /reload:#{leader}\r\nContent-Length: #{data.bytesize}\r\n\r\n" << data
      s.close
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
nyara-0.1.pre.2 lib/nyara/reload.rb
nyara-0.1.pre.1 lib/nyara/reload.rb