schmobile 0.4.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +1 -12
- data/README.md +55 -0
- data/Rakefile +5 -39
- data/lib/schmobile/filters/is_mobile_param.rb +13 -0
- data/lib/schmobile/filters/mobile_session.rb +9 -0
- data/lib/schmobile/filters/mobile_user_agent.rb +11 -0
- data/lib/schmobile/filters.rb +30 -0
- data/lib/schmobile/middleware.rb +59 -0
- data/lib/schmobile/request_extension.rb +24 -0
- data/lib/schmobile/user_agents.rb +58 -0
- data/lib/schmobile.rb +10 -1
- data/schmobile.gemspec +19 -75
- data/test/helper.rb +2 -1
- data/test/test_filters.rb +20 -20
- data/test/test_middleware.rb +8 -8
- data/test/test_rack_request.rb +6 -6
- data/test/test_user_agents.rb +14 -14
- metadata +106 -127
- data/Gemfile.lock +0 -23
- data/LICENSE.txt +0 -20
- data/README.rdoc +0 -65
- data/VERSION +0 -1
- data/lib/rack/schmobile/filters/is_mobile_param.rb +0 -15
- data/lib/rack/schmobile/filters/mobile_session.rb +0 -11
- data/lib/rack/schmobile/filters/mobile_user_agent.rb +0 -13
- data/lib/rack/schmobile/filters.rb +0 -33
- data/lib/rack/schmobile/middleware.rb +0 -61
- data/lib/rack/schmobile/request_extension.rb +0 -26
- data/lib/rack/schmobile/user_agents.rb +0 -60
- data/lib/rack/schmobile.rb +0 -10
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,14 +1,3 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
5
2
|
|
6
|
-
|
7
|
-
# Include everything needed to run rake, tests, features, etc.
|
8
|
-
group :development do
|
9
|
-
gem "rack", "~> 1.1.0"
|
10
|
-
gem "mocha", "0.9.9"
|
11
|
-
gem "shoulda", ">= 0"
|
12
|
-
gem "bundler", "~> 1.0.0"
|
13
|
-
gem "jeweler", "~> 1.5.2"
|
14
|
-
end
|
3
|
+
gemspec
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Schmobile [](http://travis-ci.org/morten/schmobile)
|
2
|
+
|
3
|
+
A mobile user agent detection Rack middleware. It provides `Rack::Request#is_mobile?`
|
4
|
+
|
5
|
+
## Forcing mobile mode
|
6
|
+
|
7
|
+
You can force toggle mobile mode by sending +is_mobile#true+ and +is_mobile#false+ as
|
8
|
+
parameters in the request URL. This setting will be stored in the session for subsequent requests.
|
9
|
+
This entirely overrides the user agent detection.
|
10
|
+
|
11
|
+
## User agent detection
|
12
|
+
|
13
|
+
You can add/remove user agents like so:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
Schmobile::UserAgents.add_user_agent_pattern("wibble")
|
17
|
+
Schmobile::UserAgents.remove_user_agent_pattern("ipad")
|
18
|
+
```
|
19
|
+
|
20
|
+
## Filters
|
21
|
+
|
22
|
+
The outcome of the +request.is_mobile?+ call is the product of a series of filters getting evaluated
|
23
|
+
against the request. You can manipulate the Schmobile::Filters::CHAIN array to alter if a
|
24
|
+
request is deemed mobile or not. Add your own filter to bypass the check depending on e.g. location
|
25
|
+
or request format.
|
26
|
+
|
27
|
+
## Redirecting
|
28
|
+
|
29
|
+
It can be configured to return the user to an explicit destination:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
use Schmobile, :redirect_to => "/mobile"
|
33
|
+
```
|
34
|
+
|
35
|
+
It supports string interpolation for dynamic destinations:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
use Schmobile, :redirect_to => "/mobile/#!/{{path}}"
|
39
|
+
```
|
40
|
+
|
41
|
+
Finally the middleware provides a request level method to determine if the client is a mobile device
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
Rack::Request#is_mobile?
|
45
|
+
```
|
46
|
+
|
47
|
+
## Rolling out
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
use Schmobile, :redirect_to => "/mobile", :if => Proc.new { |request| request.host =~ /staging/ }
|
51
|
+
```
|
52
|
+
|
53
|
+
## License
|
54
|
+
|
55
|
+
Released under the Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html
|
data/Rakefile
CHANGED
@@ -1,46 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
require 'rake'
|
11
|
-
|
12
|
-
require 'jeweler'
|
13
|
-
Jeweler::Tasks.new do |gem|
|
14
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
-
gem.name = "schmobile"
|
16
|
-
gem.homepage = "http://github.com/morten/schmobile"
|
17
|
-
gem.license = "MIT"
|
18
|
-
gem.summary = %Q{A Rack middleware for detecting mobile user agents}
|
19
|
-
gem.description = %Q{Used to determine if a request is from a mobile client, and possibly redirect it if that's the case}
|
20
|
-
gem.email = "morten@zendesk.com"
|
21
|
-
gem.authors = ["Morten Primdahl"]
|
22
|
-
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
|
-
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
-
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
25
|
-
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
26
|
-
end
|
27
|
-
Jeweler::RubygemsDotOrgTasks.new
|
28
|
-
|
1
|
+
require 'bundler/gem_tasks'
|
29
2
|
require 'rake/testtask'
|
30
|
-
|
3
|
+
|
4
|
+
Rake::TestTask.new do |test|
|
31
5
|
test.libs << 'lib' << 'test'
|
32
6
|
test.pattern = 'test/**/test_*.rb'
|
33
7
|
test.verbose = true
|
34
8
|
end
|
35
9
|
|
36
|
-
task :default
|
37
|
-
|
38
|
-
require 'rake/rdoctask'
|
39
|
-
Rake::RDocTask.new do |rdoc|
|
40
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
41
|
-
|
42
|
-
rdoc.rdoc_dir = 'rdoc'
|
43
|
-
rdoc.title = "schmobile #{version}"
|
44
|
-
rdoc.rdoc_files.include('README*')
|
45
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
10
|
+
task :default do
|
11
|
+
sh "bundle exec rake test"
|
46
12
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Schmobile
|
2
|
+
module Filters
|
3
|
+
module IsMobileParam
|
4
|
+
def self.call(request)
|
5
|
+
if request.params.key?(Schmobile::IS_MOBILE)
|
6
|
+
request.session[Schmobile::IS_MOBILE] = (request.params[Schmobile::IS_MOBILE] == "true")
|
7
|
+
end
|
8
|
+
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'schmobile/filters/mobile_session'
|
2
|
+
require 'schmobile/filters/is_mobile_param'
|
3
|
+
require 'schmobile/filters/mobile_user_agent'
|
4
|
+
|
5
|
+
module Schmobile
|
6
|
+
# Filters are tests that get run against a request to determine if it's a mobile request or not.
|
7
|
+
# A filter can return true, false or nil. The first non-nil value of the filter chain is the
|
8
|
+
# one that gets used and this also gets used to mark the session as a "mobile session"
|
9
|
+
#
|
10
|
+
# You can manipulate the chain to add new conditions that check on e.g. request format.
|
11
|
+
module Filters
|
12
|
+
CHAIN = [
|
13
|
+
Schmobile::Filters::IsMobileParam, # Must come before session check
|
14
|
+
Schmobile::Filters::MobileSession,
|
15
|
+
Schmobile::Filters::MobileUserAgent # Always returns either true or false
|
16
|
+
]
|
17
|
+
|
18
|
+
def self.apply(request)
|
19
|
+
Schmobile::Filters::CHAIN.each do |filter|
|
20
|
+
result = filter.call(request)
|
21
|
+
unless result.nil?
|
22
|
+
request.session[Schmobile::IS_MOBILE] = result
|
23
|
+
break
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
request.session[Schmobile::IS_MOBILE] ||= false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Schmobile
|
2
|
+
class Middleware
|
3
|
+
|
4
|
+
def initialize(app, options = {})
|
5
|
+
@app = app
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
request = Rack::Request.new(env)
|
11
|
+
|
12
|
+
if request.is_mobile? && redirect?(request)
|
13
|
+
[ 301, { "Location" => redirect_location(request) }, [] ]
|
14
|
+
else
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns true if this middleware has been configured with a redirect_to and the requested path
|
20
|
+
# is not already below the configured redirect_to
|
21
|
+
def redirect?(request)
|
22
|
+
redirecting = true
|
23
|
+
|
24
|
+
if @options.key?(:redirect_if)
|
25
|
+
redirecting = @options[:redirect_if].call(request)
|
26
|
+
end
|
27
|
+
|
28
|
+
if @options.key?(:redirect_to)
|
29
|
+
redirecting &&= request.path !~ /^#{@options[:redirect_to]}/
|
30
|
+
else
|
31
|
+
redirecting = false
|
32
|
+
end
|
33
|
+
|
34
|
+
redirecting ? redirect_location(request) : nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def redirect_location(request)
|
38
|
+
"#{@options[:redirect_to]}#{redirect_with(request)}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def redirect_with(request)
|
42
|
+
build_path(@options[:redirect_with].to_s, request)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def build_path(destination, request)
|
48
|
+
final_destination = destination.dup
|
49
|
+
destination.scan(/\{\{\w+\}\}/) do |call|
|
50
|
+
func = call.scan(/\w+/).first.to_s
|
51
|
+
if request.respond_to?(func)
|
52
|
+
final_destination.sub!(/\{\{#{func}\}\}/, request.send(func))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
final_destination
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Schmobile
|
2
|
+
module Request
|
3
|
+
def is_mobile?
|
4
|
+
if @is_mobile.nil?
|
5
|
+
@is_mobile = Schmobile::Filters.apply(self)
|
6
|
+
end
|
7
|
+
|
8
|
+
@is_mobile
|
9
|
+
end
|
10
|
+
|
11
|
+
def toggle_mobile_session!
|
12
|
+
session[Schmobile::IS_MOBILE] = !is_mobile?
|
13
|
+
@is_mobile = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_device?(identifier)
|
17
|
+
user_agent =~ /#{identifier}/i
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Rack::Request.class_eval do
|
23
|
+
include Schmobile::Request
|
24
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Schmobile
|
2
|
+
class UserAgents
|
3
|
+
|
4
|
+
MOBILE_USER_AGENTS = %w(
|
5
|
+
alcatel amoi android astel audiovox blackberry cdm chtml danger docomo ericsson htc_touch
|
6
|
+
iphone ipod j2me kddi midp minimo mmp mobi mobile mobileexplorer mot- motorola netfront nokia
|
7
|
+
novarra palm pdxgw phone plucker pocket portable portalmmm sagem samsung sgh sie- softbank
|
8
|
+
sprint symbian telit ucweb up.b upg1 vodafone webos windows\ ce x240 x320 xiino
|
9
|
+
)
|
10
|
+
|
11
|
+
NON_MOBILE_USER_AGENTS = %w(
|
12
|
+
ipad
|
13
|
+
)
|
14
|
+
|
15
|
+
def self.remove_user_agent_pattern(pattern)
|
16
|
+
MOBILE_USER_AGENTS.delete(pattern)
|
17
|
+
@mobile_agent_matcher = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.add_user_agent_pattern(pattern)
|
21
|
+
MOBILE_USER_AGENTS.push(*pattern)
|
22
|
+
@mobile_agent_matcher = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.remove_non_mobile_user_agent_pattern(pattern)
|
26
|
+
NON_MOBILE_USER_AGENTS.delete(pattern)
|
27
|
+
@non_mobile_agent_matcher = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.add_non_mobile_user_agent_pattern(pattern)
|
31
|
+
NON_MOBILE_USER_AGENTS.push(*pattern)
|
32
|
+
@non_mobile_agent_matcher = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.is_mobile_agent?(user_agent)
|
36
|
+
agent = user_agent.to_s.downcase
|
37
|
+
mobile = !(agent =~ mobile_agent_matcher).nil?
|
38
|
+
mobile = mobile && agent !~ non_mobile_agent_matcher unless NON_MOBILE_USER_AGENTS.empty?
|
39
|
+
mobile
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.mobile_agent_matcher
|
43
|
+
@mobile_agent_matcher ||= Regexp.new(MOBILE_USER_AGENTS.uniq.compact.map { |v| Regexp.escape(v) }.join("|"))
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.non_mobile_agent_matcher
|
47
|
+
@non_mobile_agent_matcher ||= Regexp.new(NON_MOBILE_USER_AGENTS.uniq.compact.map { |v| Regexp.escape(v) }.join("|"))
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.matched_by?(user_agent)
|
51
|
+
MOBILE_USER_AGENTS.each do |agent|
|
52
|
+
return agent if user_agent =~ /#{agent}/
|
53
|
+
end
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
data/lib/schmobile.rb
CHANGED
data/schmobile.gemspec
CHANGED
@@ -1,80 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
Gem::Specification.new "Schmobile", "1.0.0" do |s|
|
2
|
+
s.name = 'schmobile'
|
3
|
+
s.date = '2012-06-14'
|
4
|
+
s.files = `git ls-files`.split("\n")
|
5
|
+
s.license = "Apache License Version 2.0"
|
5
6
|
|
6
|
-
|
7
|
-
s.
|
8
|
-
s.version = "0.4.1"
|
7
|
+
s.summary = "A mobile user agent detection Rack middleware."
|
8
|
+
s.description = "A mobile user agent detection Rack middleware. See the README."
|
9
9
|
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.description = %q{Used to determine if a request is from a mobile client, and possibly redirect it if that's the case}
|
14
|
-
s.email = %q{morten@zendesk.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE.txt",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
"Gemfile",
|
22
|
-
"Gemfile.lock",
|
23
|
-
"LICENSE.txt",
|
24
|
-
"README.rdoc",
|
25
|
-
"Rakefile",
|
26
|
-
"VERSION",
|
27
|
-
"lib/rack/schmobile.rb",
|
28
|
-
"lib/rack/schmobile/filters.rb",
|
29
|
-
"lib/rack/schmobile/filters/is_mobile_param.rb",
|
30
|
-
"lib/rack/schmobile/filters/mobile_session.rb",
|
31
|
-
"lib/rack/schmobile/filters/mobile_user_agent.rb",
|
32
|
-
"lib/rack/schmobile/middleware.rb",
|
33
|
-
"lib/rack/schmobile/request_extension.rb",
|
34
|
-
"lib/rack/schmobile/user_agents.rb",
|
35
|
-
"lib/schmobile.rb",
|
36
|
-
"schmobile.gemspec",
|
37
|
-
"test/helper.rb",
|
38
|
-
"test/test_filters.rb",
|
39
|
-
"test/test_middleware.rb",
|
40
|
-
"test/test_rack_request.rb",
|
41
|
-
"test/test_user_agents.rb"
|
42
|
-
]
|
43
|
-
s.homepage = %q{http://github.com/morten/schmobile}
|
44
|
-
s.licenses = ["MIT"]
|
45
|
-
s.require_paths = ["lib"]
|
46
|
-
s.rubygems_version = %q{1.5.3}
|
47
|
-
s.summary = %q{A Rack middleware for detecting mobile user agents}
|
48
|
-
s.test_files = [
|
49
|
-
"test/helper.rb",
|
50
|
-
"test/test_filters.rb",
|
51
|
-
"test/test_middleware.rb",
|
52
|
-
"test/test_rack_request.rb",
|
53
|
-
"test/test_user_agents.rb"
|
54
|
-
]
|
10
|
+
s.authors = ["Morten Primdahl"]
|
11
|
+
s.email = 'primdahl@me.com'
|
12
|
+
s.homepage = 'http://github.com/zendesk/schmobile'
|
55
13
|
|
56
|
-
|
57
|
-
s.specification_version = 3
|
14
|
+
s.require_paths = %w[lib]
|
58
15
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
else
|
66
|
-
s.add_dependency(%q<rack>, ["~> 1.1.0"])
|
67
|
-
s.add_dependency(%q<mocha>, ["= 0.9.9"])
|
68
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
69
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
71
|
-
end
|
72
|
-
else
|
73
|
-
s.add_dependency(%q<rack>, ["~> 1.1.0"])
|
74
|
-
s.add_dependency(%q<mocha>, ["= 0.9.9"])
|
75
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
76
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
77
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
78
|
-
end
|
79
|
-
end
|
16
|
+
s.add_runtime_dependency("rack")
|
17
|
+
|
18
|
+
s.add_development_dependency('rake')
|
19
|
+
s.add_development_dependency('bundler')
|
20
|
+
s.add_development_dependency('shoulda')
|
21
|
+
s.add_development_dependency('mocha')
|
80
22
|
|
23
|
+
s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
|
24
|
+
end
|
data/test/helper.rb
CHANGED
@@ -6,9 +6,10 @@ require 'mocha'
|
|
6
6
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
8
|
|
9
|
-
require '
|
9
|
+
require 'schmobile'
|
10
10
|
|
11
11
|
class Test::Unit::TestCase
|
12
|
+
|
12
13
|
def ipod
|
13
14
|
'Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5G77 Safari/525.20'
|
14
15
|
end
|
data/test/test_filters.rb
CHANGED
@@ -2,7 +2,7 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestFukters < Test::Unit::TestCase
|
4
4
|
|
5
|
-
context "
|
5
|
+
context "Schmobile::Filters" do
|
6
6
|
context "#apply" do
|
7
7
|
setup do
|
8
8
|
@request = stub(:user_agent => msie8)
|
@@ -13,48 +13,48 @@ class TestFukters < Test::Unit::TestCase
|
|
13
13
|
|
14
14
|
context "on a pristine request" do
|
15
15
|
should "return true if the session is already mobile" do
|
16
|
-
|
17
|
-
@session[
|
18
|
-
assert
|
16
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).never
|
17
|
+
@session[Schmobile::IS_MOBILE] = true
|
18
|
+
assert Schmobile::Filters.apply(@request)
|
19
19
|
end
|
20
20
|
|
21
21
|
should "return true if there's an is_mobile parameter with value true" do
|
22
|
-
|
22
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).never
|
23
23
|
@request.stubs(:params).returns({ "is_mobile" => "true" })
|
24
|
-
assert
|
24
|
+
assert Schmobile::Filters.apply(@request)
|
25
25
|
end
|
26
26
|
|
27
27
|
should "return false if there's an is_mobile parameter with value false" do
|
28
|
-
|
28
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).never
|
29
29
|
@request.stubs(:params).returns({ "is_mobile" => "false" })
|
30
|
-
assert !
|
30
|
+
assert !Schmobile::Filters.apply(@request)
|
31
31
|
end
|
32
32
|
|
33
33
|
should "defer to user agent check if there's no session or parameter" do
|
34
|
-
|
35
|
-
assert !
|
34
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).once
|
35
|
+
assert !Schmobile::Filters.apply(@request)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
context "on a request with mobile session set to false" do
|
40
40
|
should "allow to change the session value with a parameter" do
|
41
|
-
|
42
|
-
@request.session[
|
43
|
-
assert !
|
41
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).never
|
42
|
+
@request.session[Schmobile::IS_MOBILE] = false
|
43
|
+
assert !Schmobile::Filters.apply(@request)
|
44
44
|
@request.stubs(:params).returns({ "is_mobile" => "true" })
|
45
|
-
assert
|
46
|
-
assert @request.session[
|
45
|
+
assert Schmobile::Filters.apply(@request)
|
46
|
+
assert @request.session[Schmobile::IS_MOBILE]
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
context "on a request with mobile session set to true" do
|
51
51
|
should "allow to change the session value with a parameter" do
|
52
|
-
|
53
|
-
@request.session[
|
54
|
-
assert
|
52
|
+
Schmobile::UserAgents.expects(:is_mobile_agent?).never
|
53
|
+
@request.session[Schmobile::IS_MOBILE] = true
|
54
|
+
assert Schmobile::Filters.apply(@request)
|
55
55
|
@request.stubs(:params).returns({ "is_mobile" => "false" })
|
56
|
-
assert !
|
57
|
-
assert !@request.session[
|
56
|
+
assert !Schmobile::Filters.apply(@request)
|
57
|
+
assert !@request.session[Schmobile::IS_MOBILE]
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
data/test/test_middleware.rb
CHANGED
@@ -2,14 +2,14 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestMiddleware < Test::Unit::TestCase
|
4
4
|
|
5
|
-
context "
|
5
|
+
context "Schmobile::Middleware" do
|
6
6
|
setup do
|
7
7
|
@app = Class.new { def call(app); true; end }.new
|
8
|
-
@rack =
|
8
|
+
@rack = Schmobile::Middleware.new(@app)
|
9
9
|
end
|
10
10
|
|
11
11
|
should "return an HTTP permanent redirect when given a redirect path and used by a mobile client" do
|
12
|
-
@rack =
|
12
|
+
@rack = Schmobile::Middleware.new(@app, :redirect_to => "/hello")
|
13
13
|
Rack::Request.any_instance.expects(:is_mobile?).returns(true)
|
14
14
|
|
15
15
|
assert_equal [301, { "Location"=>"/hello" }, []], @rack.call(environment)
|
@@ -30,7 +30,7 @@ class TestMiddleware < Test::Unit::TestCase
|
|
30
30
|
|
31
31
|
context "with redirect_to" do
|
32
32
|
setup do
|
33
|
-
@rack =
|
33
|
+
@rack = Schmobile::Middleware.new(@app, :redirect_to => "/wonderland")
|
34
34
|
end
|
35
35
|
|
36
36
|
context "#redirect?" do
|
@@ -48,19 +48,19 @@ class TestMiddleware < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
|
50
50
|
should "return false when :if resolves to false" do
|
51
|
-
@rack =
|
51
|
+
@rack = Schmobile::Middleware.new(@app, :redirect_to => "/wonderland", :redirect_if => Proc.new { |request| false })
|
52
52
|
assert !@rack.redirect?(request("PATH_INFO" => "/somewhere"))
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
context "#redirect" do
|
57
|
-
should "interpolate the argument string" do
|
58
|
-
@rack =
|
57
|
+
should "interpolate the argument string xxxx" do
|
58
|
+
@rack = Schmobile::Middleware.new(@app, :redirect_to => "/wonderland", :redirect_with => "/{{path}}")
|
59
59
|
assert_equal "/wonderland/wiffle", @rack.redirect_location(request("PATH_INFO" => "wiffle"))
|
60
60
|
end
|
61
61
|
|
62
62
|
should "interpolate a multipart argument string" do
|
63
|
-
@rack =
|
63
|
+
@rack = Schmobile::Middleware.new(@app, :redirect_to => "/wonderland/", :redirect_with => "{{path}}/lemurs/{{path}}")
|
64
64
|
assert_equal "/wonderland/wiffle/lemurs/wiffle", @rack.redirect_location(request("PATH_INFO" => "wiffle"))
|
65
65
|
end
|
66
66
|
end
|
data/test/test_rack_request.rb
CHANGED
@@ -16,13 +16,13 @@ class TestRackRequest < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
context "#is_mobile?" do
|
18
18
|
should "only call the filter chain once" do
|
19
|
-
|
19
|
+
Schmobile::Filters.expects(:apply).once.returns(false)
|
20
20
|
one_request = request
|
21
21
|
3.times { one_request.is_mobile? }
|
22
22
|
end
|
23
23
|
|
24
24
|
should "re-call the filter chain once reset" do
|
25
|
-
|
25
|
+
Schmobile::Filters.expects(:apply).twice.returns(false)
|
26
26
|
one_request = request
|
27
27
|
3.times { one_request.is_mobile? }
|
28
28
|
one_request.toggle_mobile_session!
|
@@ -56,24 +56,24 @@ class TestRackRequest < Test::Unit::TestCase
|
|
56
56
|
end
|
57
57
|
|
58
58
|
should "return false when forced in the session" do
|
59
|
-
Rack::Request.any_instance.stubs(:session).returns({
|
59
|
+
Rack::Request.any_instance.stubs(:session).returns({ Schmobile::IS_MOBILE => false })
|
60
60
|
assert !request("HTTP_USER_AGENT" => iphone).is_mobile?
|
61
61
|
end
|
62
62
|
|
63
63
|
should "return true when forced in the session" do
|
64
|
-
Rack::Request.any_instance.stubs(:session).returns({
|
64
|
+
Rack::Request.any_instance.stubs(:session).returns({ Schmobile::IS_MOBILE => true })
|
65
65
|
assert request.is_mobile?
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
context "with params" do
|
70
70
|
should "return false when forced via a request parameter" do
|
71
|
-
Rack::Request.any_instance.stubs(:params).returns({
|
71
|
+
Rack::Request.any_instance.stubs(:params).returns({ Schmobile::IS_MOBILE => "false" })
|
72
72
|
assert !request("HTTP_USER_AGENT" => iphone).is_mobile?
|
73
73
|
end
|
74
74
|
|
75
75
|
should "return true when forced via a request parameter" do
|
76
|
-
Rack::Request.any_instance.stubs(:params).returns({
|
76
|
+
Rack::Request.any_instance.stubs(:params).returns({ Schmobile::IS_MOBILE => "true" })
|
77
77
|
assert request.is_mobile?
|
78
78
|
end
|
79
79
|
end
|