rack-livereload 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard 'rspec', :version => 2 do
4
+ guard 'rspec', :version => 2, :cli => '-c' do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { "spec" }
@@ -10,3 +10,8 @@ end
10
10
  guard 'livereload' do
11
11
  watch('index.html')
12
12
  end
13
+
14
+ guard 'cucumber' do
15
+ watch(%r{^features/.+\.feature$})
16
+ watch(%r{^features/support/.+$}) { 'features' }
17
+ end
data/Rakefile CHANGED
@@ -24,5 +24,9 @@ require 'rspec/core/rake_task'
24
24
 
25
25
  RSpec::Core::RakeTask.new(:spec)
26
26
 
27
- task :default => :spec
27
+ require 'cucumber/rake/task'
28
+
29
+ Cucumber::Rake::Task.new(:cucumber)
30
+
31
+ task :default => [ :spec, :cucumber ]
28
32
 
@@ -0,0 +1,11 @@
1
+ Feature: Skip Certain Browsers
2
+ Scenario Outline:
3
+ Given I have a Rack app with Rack::LiveReload
4
+ When I make a request to "/" with the following headers:
5
+ | HTTP_USER_AGENT | <user agent> |
6
+ Then I should not have any Rack::LiveReload code
7
+
8
+ Scenarios: Browsers to check for
9
+ | user agent |
10
+ | MSIE |
11
+
@@ -0,0 +1,7 @@
1
+ Given /^I have a Rack app with Rack::LiveReload$/ do
2
+ @app = Rack::Builder.new do
3
+ use Rack::LiveReload
4
+
5
+ run lambda { |env| [ 200, { 'Content-Type' => 'text/html' }, [ "<html><head></head><body></body></html>" ] ] }
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ Then /^I should not have any Rack::LiveReload code$/ do
2
+ @response.body.should_not include("rack/livereload.js")
3
+ end
4
+
@@ -0,0 +1,6 @@
1
+ When /^I make a request to "([^"]*)" with the following headers:$/ do |uri, table|
2
+ @request = Rack::MockRequest.new(@app)
3
+
4
+ @response = @request.get(uri, table.rows_hash)
5
+ end
6
+
@@ -0,0 +1,3 @@
1
+ require 'rack'
2
+ require 'rack-livereload'
3
+
data/index.html CHANGED
@@ -1,2 +1,2 @@
1
1
  <html>
2
- <head><title>Hi</title></head><body>Lats</body></html>
2
+ <head><title>Hi</title></head><body>Rats</body></html>
@@ -1,6 +1,6 @@
1
1
  require "rack/livereload"
2
2
 
3
3
  class Rack::LiveReload
4
- VERSION = '0.3.3'
4
+ VERSION = '0.3.4'
5
5
  end
6
6
 
@@ -5,11 +5,12 @@ module Rack
5
5
  LIVERELOAD_JS_PATH = '/__rack/livereload.js'
6
6
  LIVERELOAD_LOCAL_URI = 'http://localhost:35729/livereload.js'
7
7
 
8
+ BAD_USER_AGENTS = [ %r{MSIE} ]
9
+
8
10
  attr_reader :app
9
11
 
10
12
  def initialize(app, options = {})
11
- @app = app
12
- @options = options
13
+ @app, @options = app, options
13
14
  end
14
15
 
15
16
  def use_vendored?
@@ -48,9 +49,8 @@ module Rack
48
49
  else
49
50
  status, headers, body = @app.call(env)
50
51
 
51
- if !@options[:ignore] || !@options[:ignore].any? { |filter| env['PATH_INFO'][filter] }
52
- case headers['Content-Type']
53
- when %r{text/html}
52
+ if !ignored?(env['PATH_INFO']) && !bad_browser?(env['HTTP_USER_AGENT'])
53
+ if headers['Content-Type'] && headers['Content-Type'][%r{text/html}]
54
54
  content_length = 0
55
55
 
56
56
  body.each do |line|
@@ -74,7 +74,7 @@ module Rack
74
74
  headers["X-Rack-LiveReload"] = '1'
75
75
  end
76
76
 
77
- content_length += line.length
77
+ content_length += line.bytesize
78
78
  end
79
79
 
80
80
  headers['Content-Length'] = content_length.to_s
@@ -85,6 +85,14 @@ module Rack
85
85
  end
86
86
  end
87
87
 
88
+ def ignored?(path_info)
89
+ @options[:ignore] and @options[:ignore].any? { |filter| path_info[filter] }
90
+ end
91
+
92
+ def bad_browser?(user_agent)
93
+ BAD_USER_AGENTS.any? { |pattern| (user_agent || '')[pattern] }
94
+ end
95
+
88
96
  private
89
97
  def deliver_file(file)
90
98
  type = case ::File.extname(file)
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
 
21
21
  # specify any dependencies here; for example:
22
22
  s.add_development_dependency "rspec"
23
+ s.add_development_dependency "cucumber"
23
24
  s.add_development_dependency "httparty"
24
25
  s.add_development_dependency "sinatra"
25
26
  s.add_development_dependency "shotgun"
@@ -28,6 +29,7 @@ Gem::Specification.new do |s|
28
29
  s.add_development_dependency "mocha"
29
30
  s.add_development_dependency "guard"
30
31
  s.add_development_dependency "guard-rspec"
32
+ s.add_development_dependency "guard-cucumber"
31
33
  s.add_development_dependency "guard-livereload"
32
34
  s.add_development_dependency "webmock"
33
35
 
@@ -53,6 +53,18 @@ describe Rack::LiveReload do
53
53
  end
54
54
  end
55
55
 
56
+ context 'unknown Content-Type' do
57
+ let(:ret) { [ 200, {}, [ 'hey ho' ] ] }
58
+
59
+ before do
60
+ app.stubs(:call).with(env).returns(ret)
61
+ end
62
+
63
+ it 'should not break' do
64
+ middleware.call(env).should_not raise_error(NoMethodError, /You have a nil object/)
65
+ end
66
+ end
67
+
56
68
  context 'text/html' do
57
69
  before do
58
70
  app.stubs(:call).with(env).returns([ 200, { 'Content-Type' => 'text/html', 'Content-Length' => 0 }, [ '<head></head>' ] ])
@@ -165,5 +177,25 @@ describe Rack::LiveReload do
165
177
  middleware.call(env).should be_true
166
178
  end
167
179
  end
180
+
181
+ describe '#ignored?' do
182
+ let(:path_info) { 'path info' }
183
+
184
+ context 'no ignore set' do
185
+ it { should_not be_ignored(path_info) }
186
+ end
187
+
188
+ context 'ignore set' do
189
+ let(:options) { { :ignore => [ %r{#{path_info}} ] } }
190
+
191
+ it { should be_ignored(path_info) }
192
+ end
193
+ end
194
+
195
+ describe '#bad_browser?' do
196
+ let(:user_agent) { described_class::BAD_USER_AGENTS.first.source }
197
+
198
+ it { should be_bad_browser(user_agent) }
199
+ end
168
200
  end
169
201
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-livereload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-02 00:00:00.000000000Z
12
+ date: 2012-01-24 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2165312940 !ruby/object:Gem::Requirement
16
+ requirement: &2159654600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2165312940
24
+ version_requirements: *2159654600
25
+ - !ruby/object:Gem::Dependency
26
+ name: cucumber
27
+ requirement: &2159654080 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2159654080
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: httparty
27
- requirement: &2165312500 !ruby/object:Gem::Requirement
38
+ requirement: &2159653540 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: '0'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *2165312500
46
+ version_requirements: *2159653540
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: sinatra
38
- requirement: &2165312080 !ruby/object:Gem::Requirement
49
+ requirement: &2159652960 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2165312080
57
+ version_requirements: *2159652960
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: shotgun
49
- requirement: &2165311640 !ruby/object:Gem::Requirement
60
+ requirement: &2159651760 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2165311640
68
+ version_requirements: *2159651760
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: thin
60
- requirement: &2165311120 !ruby/object:Gem::Requirement
71
+ requirement: &2159650780 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2165311120
79
+ version_requirements: *2159650780
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rake
71
- requirement: &2165310680 !ruby/object:Gem::Requirement
82
+ requirement: &2159650360 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *2165310680
90
+ version_requirements: *2159650360
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: mocha
82
- requirement: &2165310180 !ruby/object:Gem::Requirement
93
+ requirement: &2159649820 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *2165310180
101
+ version_requirements: *2159649820
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: guard
93
- requirement: &2165309580 !ruby/object:Gem::Requirement
104
+ requirement: &2159649400 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ! '>='
@@ -98,10 +109,21 @@ dependencies:
98
109
  version: '0'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *2165309580
112
+ version_requirements: *2159649400
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: guard-rspec
104
- requirement: &2165309020 !ruby/object:Gem::Requirement
115
+ requirement: &2159648980 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *2159648980
124
+ - !ruby/object:Gem::Dependency
125
+ name: guard-cucumber
126
+ requirement: &2159648540 !ruby/object:Gem::Requirement
105
127
  none: false
106
128
  requirements:
107
129
  - - ! '>='
@@ -109,10 +131,10 @@ dependencies:
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *2165309020
134
+ version_requirements: *2159648540
113
135
  - !ruby/object:Gem::Dependency
114
136
  name: guard-livereload
115
- requirement: &2165308460 !ruby/object:Gem::Requirement
137
+ requirement: &2159647940 !ruby/object:Gem::Requirement
116
138
  none: false
117
139
  requirements:
118
140
  - - ! '>='
@@ -120,10 +142,10 @@ dependencies:
120
142
  version: '0'
121
143
  type: :development
122
144
  prerelease: false
123
- version_requirements: *2165308460
145
+ version_requirements: *2159647940
124
146
  - !ruby/object:Gem::Dependency
125
147
  name: webmock
126
- requirement: &2165307920 !ruby/object:Gem::Requirement
148
+ requirement: &2159647400 !ruby/object:Gem::Requirement
127
149
  none: false
128
150
  requirements:
129
151
  - - ! '>='
@@ -131,10 +153,10 @@ dependencies:
131
153
  version: '0'
132
154
  type: :development
133
155
  prerelease: false
134
- version_requirements: *2165307920
156
+ version_requirements: *2159647400
135
157
  - !ruby/object:Gem::Dependency
136
158
  name: rack
137
- requirement: &2165307300 !ruby/object:Gem::Requirement
159
+ requirement: &2159646740 !ruby/object:Gem::Requirement
138
160
  none: false
139
161
  requirements:
140
162
  - - ! '>='
@@ -142,7 +164,7 @@ dependencies:
142
164
  version: '0'
143
165
  type: :runtime
144
166
  prerelease: false
145
- version_requirements: *2165307300
167
+ version_requirements: *2159646740
146
168
  description: Insert LiveReload into your app easily as Rack middleware
147
169
  email:
148
170
  - john@coswellproductions.com
@@ -156,6 +178,11 @@ files:
156
178
  - README.md
157
179
  - Rakefile
158
180
  - config.ru
181
+ - features/skip_certain_browsers.feature
182
+ - features/step_definitions/given/i_have_a_rack_app_with_live_reload.rb
183
+ - features/step_definitions/then/i_should_not_have_livereload_code.rb
184
+ - features/step_definitions/when/i_make_a_request_with_headers.rb
185
+ - features/support/env.rb
159
186
  - index.html
160
187
  - js/WebSocketMain.swf
161
188
  - js/livereload.js
@@ -181,7 +208,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
208
  version: '0'
182
209
  segments:
183
210
  - 0
184
- hash: 1628985309489539439
211
+ hash: 1893206504661372736
185
212
  required_rubygems_version: !ruby/object:Gem::Requirement
186
213
  none: false
187
214
  requirements:
@@ -190,13 +217,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
217
  version: '0'
191
218
  segments:
192
219
  - 0
193
- hash: 1628985309489539439
220
+ hash: 1893206504661372736
194
221
  requirements: []
195
222
  rubyforge_project: rack-livereload
196
- rubygems_version: 1.8.11
223
+ rubygems_version: 1.8.15
197
224
  signing_key:
198
225
  specification_version: 3
199
226
  summary: Insert LiveReload into your app easily as Rack middleware
200
227
  test_files:
228
+ - features/skip_certain_browsers.feature
229
+ - features/step_definitions/given/i_have_a_rack_app_with_live_reload.rb
230
+ - features/step_definitions/then/i_should_not_have_livereload_code.rb
231
+ - features/step_definitions/when/i_make_a_request_with_headers.rb
232
+ - features/support/env.rb
201
233
  - spec/rack/livereload_spec.rb
202
234
  - spec/spec_helper.rb