schmobile 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -19,6 +19,10 @@ require session access.
19
19
 
20
20
  Finally the middleware provides Rack::Request#is_mobile?
21
21
 
22
+ == Rolling out
23
+
24
+ use Rack::Schmobile, :redirect_to => "/mobile", :if => Proc.new { |request| request.host =~ /staging/ }
25
+
22
26
  == User agent detection
23
27
 
24
28
  You can add/remove user agents like so:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -36,8 +36,10 @@ module Rack
36
36
  end
37
37
 
38
38
  def call(env)
39
- if is_mobile_session?(env) && redirect?(env)
40
- return [ 301, { "Location" => redirect(env) }, [] ]
39
+ request = Rack::Request.new(env)
40
+
41
+ if is_mobile_session?(env, request) && redirect?(request)
42
+ return [ 301, { "Location" => redirect(request) }, [] ]
41
43
  end
42
44
 
43
45
  @app.call(env)
@@ -45,10 +47,9 @@ module Rack
45
47
 
46
48
  # Checks if this session has been forced into mobile mode and returns that if that is the case. Otherwise
47
49
  # checks the user agent via request.is_mobile?
48
- def is_mobile_session?(env)
50
+ def is_mobile_session?(env, request)
49
51
  session = env['rack.session'] ||= {}
50
52
 
51
- request = Rack::Request.new(env)
52
53
  if request.params[SCHMOBILE_MODE]
53
54
  session[SCHMOBILE_MODE] = request.params[SCHMOBILE_MODE]
54
55
  end
@@ -62,13 +63,16 @@ module Rack
62
63
 
63
64
  # Returns true if this middleware has been configured with a redirect_to and the requested path is not already
64
65
  # below the configured redirect_to
65
- def redirect?(env)
66
- !redirect(env).empty? && Rack::Utils.unescape(env["PATH_INFO"]) !~ /^#{redirect(env)}/
66
+ def redirect?(request)
67
+ if @options[:if].is_a?(Proc)
68
+ return false unless @options[:if].call(request)
69
+ end
70
+
71
+ !redirect(request).empty? && request.path !~ /^#{redirect(request)}/
67
72
  end
68
73
 
69
- def redirect(env)
74
+ def redirect(request)
70
75
  destination = @options[:redirect_to].to_s
71
- request = Rack::Request.new(env)
72
76
  build_path(destination, request)
73
77
  end
74
78
 
@@ -76,12 +80,12 @@ module Rack
76
80
 
77
81
  def build_path(destination, request)
78
82
  final_destination = destination.dup
79
- destination.scan(/\{\{\w+\}\}/) { |call|
83
+ destination.scan(/\{\{\w+\}\}/) do |call|
80
84
  func = call.scan(/\w+/).to_s
81
85
  if request.respond_to?(func)
82
86
  final_destination.sub!(/\{\{#{func}\}\}/, request.send(func))
83
87
  end
84
- }
88
+ end
85
89
  final_destination
86
90
  end
87
91
 
data/schmobile.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{schmobile}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Morten Primdahl"]
@@ -53,40 +53,40 @@ class TestSchmobile < Test::Unit::TestCase
53
53
  context "#is_mobile_session?" do
54
54
  should "return false for regular browsers" do
55
55
  Rack::Request.any_instance.expects(:params).returns({})
56
- assert !@rack.is_mobile_session?(environment)
56
+ assert !@rack.is_mobile_session?(environment, request)
57
57
  end
58
58
 
59
59
  should "return true for a mobile browser" do
60
60
  Rack::Request.any_instance.expects(:params).returns({})
61
- assert @rack.is_mobile_session?(environment("HTTP_USER_AGENT" => iphone))
61
+ assert @rack.is_mobile_session?(environment, request("HTTP_USER_AGENT" => iphone))
62
62
  end
63
63
 
64
64
  should "return false when forced in the session" do
65
- Rack::Request.any_instance.expects(:params).returns({})
65
+ Rack::Request.any_instance.stubs(:params).returns({})
66
66
  Rack::Request.any_instance.expects(:is_mobile?).never
67
67
 
68
- assert !@rack.is_mobile_session?(environment("HTTP_USER_AGENT" => iphone, "rack.session" => { Rack::Schmobile::SCHMOBILE_MODE => "disabled" }))
68
+ assert !@rack.is_mobile_session?(environment("HTTP_USER_AGENT" => iphone, "rack.session" => { Rack::Schmobile::SCHMOBILE_MODE => "disabled" }), request)
69
69
  end
70
70
 
71
71
  should "return true when forced in the session" do
72
72
  Rack::Request.any_instance.expects(:params).returns({})
73
73
  Rack::Request.any_instance.expects(:is_mobile?).never
74
74
 
75
- assert @rack.is_mobile_session?(environment("rack.session" => { Rack::Schmobile::SCHMOBILE_MODE => "enabled" }))
75
+ assert @rack.is_mobile_session?(environment("rack.session" => { Rack::Schmobile::SCHMOBILE_MODE => "enabled" }), request)
76
76
  end
77
77
 
78
78
  should "return false when forced via a request parameter" do
79
79
  Rack::Request.any_instance.stubs(:params).returns({ Rack::Schmobile::SCHMOBILE_MODE => "disabled" })
80
80
  Rack::Request.any_instance.expects(:is_mobile?).never
81
81
 
82
- assert !@rack.is_mobile_session?(environment("HTTP_USER_AGENT" => iphone))
82
+ assert !@rack.is_mobile_session?(environment, request("HTTP_USER_AGENT" => iphone))
83
83
  end
84
84
 
85
85
  should "return true when forced via a request parameter" do
86
86
  Rack::Request.any_instance.stubs(:params).returns({ Rack::Schmobile::SCHMOBILE_MODE => "enabled" })
87
87
  Rack::Request.any_instance.expects(:is_mobile?).never
88
88
 
89
- assert @rack.is_mobile_session?(environment)
89
+ assert @rack.is_mobile_session?(environment, request)
90
90
  end
91
91
  end
92
92
 
@@ -113,26 +113,33 @@ class TestSchmobile < Test::Unit::TestCase
113
113
 
114
114
  context "#redirect?" do
115
115
  should "return true when not on mobile path" do
116
- assert @rack.redirect?(environment("PATH_INFO" => "/somewhere"))
116
+ assert @rack.redirect?(request("PATH_INFO" => "/somewhere"))
117
117
  end
118
118
 
119
119
  should "return true on base path" do
120
- assert @rack.redirect?(environment("PATH_INFO" => "/"))
120
+ assert @rack.redirect?(request("PATH_INFO" => "/"))
121
121
  end
122
122
 
123
123
  should "return false when already on path" do
124
- assert !@rack.redirect?(environment("PATH_INFO" => "/wonderland"))
124
+ assert !@rack.redirect?(request("PATH_INFO" => "/wonderland"))
125
+ assert !@rack.redirect?(request("PATH_INFO" => "/wonderland/more/stuff"))
126
+ end
127
+
128
+ should "return false when :if resolves to false" do
129
+ @rack = Rack::Schmobile.new(@app, :if => Proc.new { |request| false })
130
+ assert !@rack.redirect?(request("PATH_INFO" => "/somewhere"))
125
131
  end
126
132
  end
127
133
 
128
134
  context "#redirect" do
129
135
  should "interpolate the argument string" do
130
136
  @rack = Rack::Schmobile.new(@app, :redirect_to => "/wonderland/{{path}}")
131
- assert_equal "/wonderland/wiffle", @rack.redirect(environment("PATH_INFO" => "wiffle"))
137
+ assert_equal "/wonderland/wiffle", @rack.redirect(request("PATH_INFO" => "wiffle"))
132
138
  end
139
+
133
140
  should "interpolate a multipart argument string" do
134
141
  @rack = Rack::Schmobile.new(@app, :redirect_to => "/wonderland/{{path}}/lemurs/{{path}}")
135
- assert_equal "/wonderland/wiffle/lemurs/wiffle", @rack.redirect(environment("PATH_INFO" => "wiffle"))
142
+ assert_equal "/wonderland/wiffle/lemurs/wiffle", @rack.redirect(request("PATH_INFO" => "wiffle"))
136
143
  end
137
144
  end
138
145
  end
@@ -160,6 +167,10 @@ class TestSchmobile < Test::Unit::TestCase
160
167
  'Mozilla/4.0 (compatible; MSIE 6.0; BREW 3.1.5; en )/800x480 Samsung SCH-U960'
161
168
  end
162
169
 
170
+ def request(overwrite = {})
171
+ Rack::Request.new(environment(overwrite))
172
+ end
173
+
163
174
  def environment(overwrite = {})
164
175
  {
165
176
  'GATEWAY_INTERFACE'=> 'CGI/1.2',
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schmobile
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Morten Primdahl