rack-smartphone_detector 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog.md CHANGED
@@ -1,8 +1,14 @@
1
+ # 0.0.3
2
+
3
+ ## Features
4
+
5
+ - Add check methods for each devices
6
+
1
7
  # 0.0.2
2
8
 
3
9
  ## Features
4
10
 
5
- - Add Android tablet detection
11
+ - Support Android tablet detection
6
12
 
7
13
  # 0.0.1
8
14
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Rack::SmartphoneDetector [![Build Status](https://secure.travis-ci.org/ihara2525/rack-smartphone_detector.png?branch=master)](http://travis-ci.org/ihara2525/rack-smartphone_detector)
2
2
 
3
- It's a very simple Rack middleware which detect the request comes from smartphones (iPhone/iPad/Android/Windows Phone).
3
+ It's a very simple Rack middleware which detect the request comes from smartphones (iPhone/iPad/Android/Android Tablet/Windows Phone).
4
4
 
5
5
  You can use #from_smartphone? to detect the request.
6
6
 
@@ -8,6 +8,16 @@ You can use #from_smartphone? to detect the request.
8
8
  request.from_smartphone? # true if it comes from such devices
9
9
  ```
10
10
 
11
+ or, use methods for each devices.
12
+
13
+ ```ruby
14
+ request.from_iphone? # true if it comes from iphone
15
+ request.from_ipad? # true if it comes from ipad
16
+ request.from_android? # true if it comes from android mobile
17
+ request.from_android_tablet? # true if it comes from android tablet
18
+ request.from_windows_phone? # true if it comes from windows phone
19
+ ```
20
+
11
21
  What this middleware does is just matching HTTP_USER_AGENT with identifier of smartphones.
12
22
 
13
23
  ## Installation
@@ -6,6 +6,11 @@ module Rack
6
6
  def from_smartphone?
7
7
  !env['rack.smartphone_detector.device'].nil?
8
8
  end
9
+
10
+ SMARTPHONE_IDENTIFIERS.each do |info|
11
+ name = %Q{from_#{info[:identifier].downcase.gsub(' ', '_')}?}
12
+ define_method(name) { env['rack.smartphone_detector.device'] == info[:identifier] }
13
+ end
9
14
  end
10
15
  end
11
16
  end
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
  module Rack
3
3
  class SmartphoneDetector
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
6
6
  end
@@ -6,15 +6,24 @@ require 'rack/smartphone_detector/railtie' if defined?(Rails::Railtie)
6
6
 
7
7
  module Rack
8
8
  class SmartphoneDetector
9
- SMARTPHONES_REGEXP = /(iPhone|iPad|Android|Windows Phone)/
9
+ SMARTPHONE_IDENTIFIERS = [
10
+ { identifier: 'iPhone', regexp: /iPhone/ },
11
+ { identifier: 'iPad', regexp: /iPad/ },
12
+ { identifier: 'Android', regexp: /Android.+Mobile/ },
13
+ { identifier: 'Android Tablet', regexp: /Android/ },
14
+ { identifier: 'Windows Phone', regexp: /Windows Phone/ },
15
+ ]
10
16
 
11
17
  def initialize(app, options = {})
12
18
  @app = app
13
19
  end
14
20
 
15
21
  def call(env)
16
- if env['HTTP_USER_AGENT'] =~ SMARTPHONES_REGEXP
17
- env['rack.smartphone_detector.device'] = $1
22
+ SMARTPHONE_IDENTIFIERS.each do |i|
23
+ if env['HTTP_USER_AGENT'] =~ i[:regexp]
24
+ env['rack.smartphone_detector.device'] = i[:identifier]
25
+ break
26
+ end
18
27
  end
19
28
  @app.call(env)
20
29
  end
@@ -7,10 +7,11 @@ describe 'Rack::SmartphoneDetector' do
7
7
  include Rack::Test::Methods
8
8
 
9
9
  SMARTPHONES = [
10
- { device: 'iPhone', user_agent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' },
11
- { device: 'iPad', user_agent: 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' },
12
- { device: 'Android', user_agent: 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' },
13
- { device: 'Windows Phone', user_agent: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; FujitsuToshibaMobileCommun; IS12T; KDDI)' }
10
+ { name: 'iPhone', user_agent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' },
11
+ { name: 'iPad', user_agent: 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' },
12
+ { name: 'Android', user_agent: 'Mozilla/5.0 (Linux; U; Android 4.0.1; ja-jp; Galaxy Nexus Build/ITL41D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' },
13
+ { name: 'Android Tablet', user_agent: 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' },
14
+ { name: 'Windows Phone', user_agent: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; FujitsuToshibaMobileCommun; IS12T; KDDI)' }
14
15
  ]
15
16
 
16
17
  let(:app) do
@@ -19,18 +20,20 @@ describe 'Rack::SmartphoneDetector' do
19
20
  end
20
21
 
21
22
  it 'sets environment variable if the request comes from smartphone' do
22
- SMARTPHONES.each do |smartphone|
23
- header 'User-Agent', smartphone[:user_agent]
23
+ SMARTPHONES.each do |info|
24
+ header 'User-Agent', info[:user_agent]
24
25
  get '/'
25
- last_request.env['rack.smartphone_detector.device'].must_equal smartphone[:device]
26
+ last_request.env['rack.smartphone_detector.device'].must_equal info[:name]
26
27
  end
27
28
  end
28
29
 
29
30
  describe '#from_smartphone?' do
30
31
  it 'returns true if the request comes from smartphone' do
31
- header 'User-Agent', SMARTPHONES.first[:device]
32
- get '/'
33
- last_request.from_smartphone?.must_equal true
32
+ SMARTPHONES.each do |info|
33
+ header 'User-Agent', info[:user_agent]
34
+ get '/'
35
+ last_request.from_smartphone?.must_equal true
36
+ end
34
37
  end
35
38
 
36
39
  it 'returns false if the request does not come from smartphone' do
@@ -39,9 +42,53 @@ describe 'Rack::SmartphoneDetector' do
39
42
  last_request.from_smartphone?.must_equal false
40
43
  end
41
44
 
42
- it 'returns false if the request comes from unknown device' do
45
+ it 'returns false if the request comes from device without user-agent' do
43
46
  get '/'
44
47
  last_request.from_smartphone?.must_equal false
45
48
  end
46
49
  end
50
+
51
+ describe '#from_iphone?' do
52
+ it 'returns true if the request comes from iphone' do
53
+ header 'User-Agent', user_agent('iPhone')
54
+ get '/'
55
+ last_request.from_iphone?.must_equal true
56
+ end
57
+ end
58
+
59
+ describe '#from_ipad?' do
60
+ it 'returns true if the request comes from ipad' do
61
+ header 'User-Agent', user_agent('iPad')
62
+ get '/'
63
+ last_request.from_ipad?.must_equal true
64
+ end
65
+ end
66
+
67
+ describe '#from_android?' do
68
+ it 'returns true if the request comes from android mobile' do
69
+ header 'User-Agent', user_agent('Android')
70
+ get '/'
71
+ last_request.from_android?.must_equal true
72
+ end
73
+ end
74
+
75
+ describe '#from_android_tablet?' do
76
+ it 'returns true if the request comes from android tablet' do
77
+ header 'User-Agent', user_agent('Android Tablet')
78
+ get '/'
79
+ last_request.from_android_tablet?.must_equal true
80
+ end
81
+ end
82
+
83
+ describe '#from_windows_phone?' do
84
+ it 'returns true if the request comes from windows phone' do
85
+ header 'User-Agent', user_agent('Windows Phone')
86
+ get '/'
87
+ last_request.from_windows_phone?.must_equal true
88
+ end
89
+ end
90
+
91
+ def user_agent(name)
92
+ SMARTPHONES.find { |info| info[:name] == name }[:user_agent]
93
+ end
47
94
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-smartphone_detector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-14 00:00:00.000000000 Z
12
+ date: 2012-12-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -110,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
110
  version: '0'
111
111
  segments:
112
112
  - 0
113
- hash: 2045937695078653710
113
+ hash: 4226079495124680780
114
114
  required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  none: false
116
116
  requirements:
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  segments:
121
121
  - 0
122
- hash: 2045937695078653710
122
+ hash: 4226079495124680780
123
123
  requirements: []
124
124
  rubyforge_project:
125
125
  rubygems_version: 1.8.23