guard-livereload 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,8 +3,10 @@ require 'guard/guard'
3
3
 
4
4
  module Guard
5
5
  class LiveReload < Guard
6
- attr_accessor :reactor
7
- autoload :Reactor, 'guard/livereload/reactor'
6
+ require 'guard/livereload/websocket'
7
+ require 'guard/livereload/reactor'
8
+
9
+ attr_accessor :reactor, :options
8
10
 
9
11
  # =================
10
12
  # = Guard methods =
@@ -13,17 +15,15 @@ module Guard
13
15
  def initialize(watchers = [], options = {})
14
16
  super
15
17
  @options = {
16
- :api_version => '1.6',
17
18
  :host => '0.0.0.0',
18
- :port => '35729',
19
- :apply_js_live => true,
20
19
  :apply_css_live => true,
20
+ :override_url => false,
21
21
  :grace_period => 0
22
22
  }.update(options)
23
23
  end
24
24
 
25
25
  def start
26
- @reactor = Reactor.new(@options)
26
+ @reactor = Reactor.new(options)
27
27
  end
28
28
 
29
29
  def stop
@@ -31,7 +31,7 @@ module Guard
31
31
  end
32
32
 
33
33
  def run_on_changes(paths)
34
- sleep @options[:grace_period]
34
+ sleep options[:grace_period]
35
35
  reactor.reload_browser(paths)
36
36
  end
37
37
 
@@ -1,11 +1,9 @@
1
- require 'em-websocket'
2
1
  require 'multi_json'
3
2
 
4
3
  module Guard
5
4
  class LiveReload
6
5
  class Reactor
7
-
8
- attr_reader :thread, :web_sockets
6
+ attr_reader :web_sockets, :thread, :options
9
7
 
10
8
  def initialize(options)
11
9
  @web_sockets = []
@@ -20,13 +18,16 @@ module Guard
20
18
  def reload_browser(paths = [])
21
19
  UI.info "Reloading browser: #{paths.join(' ')}"
22
20
  paths.each do |path|
23
- data = MultiJson.encode(['refresh', {
24
- :path => "#{Dir.pwd}/#{path}",
25
- :apply_js_live => @options[:apply_js_live],
26
- :apply_css_live => @options[:apply_css_live]
27
- }])
21
+ data = {
22
+ :command => 'reload',
23
+ :path => "#{Dir.pwd}/#{path}",
24
+ :liveCSS => @options[:apply_css_live]
25
+ }
26
+ if options[:override_url] && File.exist?(path)
27
+ data[:overrideURL] = '/' + path
28
+ end
28
29
  UI.debug data
29
- @web_sockets.each { |ws| ws.send(data) }
30
+ web_sockets.each { |ws| ws.send(MultiJson.encode(data)) }
30
31
  end
31
32
  end
32
33
 
@@ -35,12 +36,16 @@ module Guard
35
36
  def start_threaded_reactor(options)
36
37
  Thread.new do
37
38
  EventMachine.run do
38
- UI.info "LiveReload #{options[:api_version]} is waiting for a browser to connect."
39
- EventMachine.start_server(options[:host], options[:port], EventMachine::WebSocket::Connection, {}) do |ws|
39
+ UI.info "LiveReload is waiting for a browser to connect."
40
+ EventMachine.start_server(options[:host], 35729, WebSocket, {}) do |ws|
40
41
  ws.onopen do
41
42
  begin
42
43
  UI.info "Browser connected."
43
- ws.send "!!ver:#{options[:api_version]}"
44
+ ws.send MultiJson.encode({
45
+ :command => 'hello',
46
+ :protocols => ['http://livereload.com/protocols/official-7'],
47
+ :serverName => 'guard-livereload'
48
+ })
44
49
  @web_sockets << ws
45
50
  rescue
46
51
  UI.errror $!
@@ -49,11 +54,14 @@ module Guard
49
54
  end
50
55
 
51
56
  ws.onmessage do |msg|
52
- UI.info "Browser URL: #{msg}" if msg =~ /^(https?|file):/
57
+ msg = MultiJson.decode(msg)
58
+ if msg['command'] == 'url'
59
+ UI.info "Browser URL: #{msg['url']}"
60
+ end
53
61
  end
54
62
 
55
63
  ws.onclose do
56
- @web_sockets.delete ws
64
+ @web_sockets.delete(ws)
57
65
  UI.info "Browser disconnected."
58
66
  end
59
67
  end
@@ -1,5 +1,5 @@
1
1
  module Guard
2
2
  module LiveReloadVersion
3
- VERSION = "1.1.3"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,39 @@
1
+ require 'eventmachine'
2
+ require 'em-websocket'
3
+ require "http/parser"
4
+
5
+ module Guard
6
+ class LiveReload
7
+ class WebSocket < EventMachine::WebSocket::Connection
8
+ def dispatch data
9
+ parser = Http::Parser.new
10
+ parser << data
11
+ if parser.http_method != 'GET' || parser.upgrade?
12
+ super #pass the request to websocket
13
+ elsif parser.request_path == '/livereload.js'
14
+ serve_file File.expand_path("../../../../js/livereload.js", __FILE__)
15
+ elsif File.exist?(parser.request_path[1..-1])
16
+ serve_file parser.request_path[1..-1] # Strip leading slash
17
+ else
18
+ send_data "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\n404 Not Found"
19
+ close_connection_after_writing
20
+ end
21
+ end
22
+
23
+ def serve_file path
24
+ UI.debug "Serving file #{path}"
25
+ content_type = case File.extname(path)
26
+ when '.css' then 'text/css'
27
+ when '.js' then 'application/ecmascript'
28
+ when '.gif' then 'image/gif'
29
+ when '.jpeg', '.jpg' then 'image/jpeg'
30
+ when '.png' then 'image/png'
31
+ else; 'text/plain'
32
+ end
33
+ send_data "HTTP/1.1 200 OK\r\nContent-Type: #{content_type}\r\nContent-Length: #{File.size path}\r\n\r\n"
34
+ stream_file_data(path).callback { close_connection_after_writing }
35
+ end
36
+
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,52 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guard-livereload
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Thibaud Guillaume-Gentil
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-19 00:00:00.000000000 Z
11
+ date: 2013-04-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: guard
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.5.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.5.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: em-websocket
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: 0.2.0
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: 0.2.0
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: multi_json
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,51 +55,31 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: bundler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
- version: '1.1'
61
+ version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
- version: '1.1'
68
+ version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rspec
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
- version: '2.11'
75
+ version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: '2.11'
94
- - !ruby/object:Gem::Dependency
95
- name: guard-rspec
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ~>
80
+ - - '>='
100
81
  - !ruby/object:Gem::Version
101
- version: '1.0'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: '1.0'
82
+ version: '0'
110
83
  description: Guard::LiveReload automatically reloads your browser when 'view' files
111
84
  are modified.
112
85
  email:
@@ -118,31 +91,32 @@ files:
118
91
  - lib/guard/livereload/reactor.rb
119
92
  - lib/guard/livereload/templates/Guardfile
120
93
  - lib/guard/livereload/version.rb
94
+ - lib/guard/livereload/websocket.rb
121
95
  - lib/guard/livereload.rb
122
96
  - LICENSE
123
97
  - README.md
98
+ - js/livereload.js
124
99
  homepage: http://rubygems.org/gems/guard-livereload
125
100
  licenses: []
101
+ metadata: {}
126
102
  post_install_message:
127
103
  rdoc_options: []
128
104
  require_paths:
129
105
  - lib
130
106
  required_ruby_version: !ruby/object:Gem::Requirement
131
- none: false
132
107
  requirements:
133
- - - ! '>='
108
+ - - '>='
134
109
  - !ruby/object:Gem::Version
135
110
  version: '0'
136
111
  required_rubygems_version: !ruby/object:Gem::Requirement
137
- none: false
138
112
  requirements:
139
- - - ! '>='
113
+ - - '>='
140
114
  - !ruby/object:Gem::Version
141
115
  version: 1.3.6
142
116
  requirements: []
143
117
  rubyforge_project: guard-livereload
144
- rubygems_version: 1.8.23
118
+ rubygems_version: 2.0.3
145
119
  signing_key:
146
- specification_version: 3
120
+ specification_version: 4
147
121
  summary: Guard gem for livereload
148
122
  test_files: []