mobvious 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # Mobvious
2
2
 
3
3
  Mobvious detects whether your app / website is being accessed by a phone, or by a tablet,
4
- or by a personal computer.
4
+ or by a personal computer. You can then use this information throughout your app. (E.g.
5
+ fork your front-end code with regard to device type. There is a
6
+ [plugin for Ruby on Rails](https://github.com/jistr/mobvious-rails) that helps you with this.)
5
7
 
6
8
  ## Key Features
7
9
 
@@ -19,15 +21,18 @@ or by a personal computer.
19
21
 
20
22
  ## Get Started
21
23
 
22
- 1. **Include Mobvious in your Gemfile**: `gem 'mobvious'`
24
+ 1. **Include Mobvious in your Gemfile**:
25
+
26
+ gem 'mobvious'
23
27
 
24
28
  2. **Tell your app to use Mobvious::Manager as Rack middleware.**
25
- If you use Rails, simply add `config.middleware.use Mobvious::Manager` into your
26
- `config/application.rb` file.
29
+ If you use Rails, simply add this into your `config/application.rb`:
30
+
31
+ config.middleware.use Mobvious::Manager
27
32
 
28
33
  3. **Tell Mobvious which strategies it should use.**
29
- A good place to put this code for Rails is an initializer – create a file
30
- `config/initializers/mobvious.rb` and put this in:
34
+ A good place for this code in Rails is an initializer – create
35
+ `config/initializers/mobvious.rb` and use this config to begin with:
31
36
 
32
37
  Mobvious.configure do
33
38
  strategies = [ Mobvious::Strategies::MobileESP.new ]
@@ -37,7 +42,9 @@ or by a personal computer.
37
42
  The information is
38
43
  in a Rack environment variable `env['mobvious.device_type']`, this variable will
39
44
  have a value of `:desktop` or `:mobile` depending on the device type that issued
40
- the request. In Rails, you can access it via `request.env['mobvious.device_type']`.
45
+ the request. In Rails, you can access it via `request.env['mobvious.device_type']`
46
+ or use [mobvious-rails](https://github.com/jistr/mobvious-rails)
47
+ and access it simply via `device_type`.
41
48
 
42
49
  *This is just a very basic way of setting up Mobvious. If you want to detect
43
50
  tablets separately, or let the user manually switch between interface versions of your
@@ -11,8 +11,22 @@ module Mobvious
11
11
  # A hash containing regular expressions mapped to symbols. The regular expression
12
12
  # is evaluated against the whole URL of the request (including `http://`). If matching,
13
13
  # the corresponding symbol is returned as the device type.
14
- def initialize(rules = MOBILE_PATH_RULES)
14
+ # @param options
15
+ # A hash with strategy options.
16
+ # `disable_if_referer_set: true` disables the strategy if HTTP Referer header is set
17
+ # `disable_if_referer_matches: /regex/` disables the strategy if HTTP Referer matches
18
+ # given regular expression
19
+ # `disable_unless_referer_matches: /regex/` disables the strategy if HTTP Referer
20
+ # doesn't match given regular expression
21
+ def initialize(rules = MOBILE_PATH_RULES, options = {})
15
22
  @rules = rules
23
+
24
+ default_options = {
25
+ disable_if_referer_set: false,
26
+ disable_if_referer_matches: nil,
27
+ disable_unless_referer_matches: nil
28
+ }
29
+ @options = default_options.merge(options)
16
30
  end
17
31
 
18
32
  # Gets device type using URL pattern matching. Returns nil if no match found.
@@ -20,11 +34,31 @@ module Mobvious
20
34
  # @param request [Rack::Request]
21
35
  # @return [Symbol] device type or nil
22
36
  def get_device_type(request)
37
+ return nil if disabled_by_referer_set?(request) ||
38
+ disabled_by_referer_matching?(request) ||
39
+ disabled_by_referer_not_matching?(request)
40
+
23
41
  @rules.each do |regex, device_type|
24
42
  return device_type if request.url =~ regex
25
43
  end
26
44
  nil
27
45
  end
46
+
47
+ private
48
+
49
+ def disabled_by_referer_set?(request)
50
+ @options[:disable_if_referer_set] && request.env['HTTP_REFERER']
51
+ end
52
+
53
+ def disabled_by_referer_matching?(request)
54
+ @options[:disable_if_referer_matches] &&
55
+ request.env['HTTP_REFERER'] =~ @options[:disable_if_referer_matches]
56
+ end
57
+
58
+ def disabled_by_referer_not_matching?(request)
59
+ @options[:disable_unless_referer_matches] &&
60
+ request.env['HTTP_REFERER'] !~ @options[:disable_unless_referer_matches]
61
+ end
28
62
  end
29
63
  end
30
64
  end
@@ -1,3 +1,3 @@
1
1
  module Mobvious
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -17,7 +17,6 @@ class URLSpec < MiniTest::Spec
17
17
  end
18
18
 
19
19
  it "returns the right device type when matching rule found" do
20
- puts @request.url
21
20
  @strategy.get_device_type(@request).must_equal :mobile
22
21
  end
23
22
 
@@ -25,6 +24,64 @@ class URLSpec < MiniTest::Spec
25
24
  @env['HTTP_HOST'] = 'www.foo.com'
26
25
  @strategy.get_device_type(@request).must_equal nil
27
26
  end
27
+
28
+ describe "disabled if referer is set" do
29
+ before do
30
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_if_referer_set: true)
31
+ @env.merge!({
32
+ 'HTTP_REFERER' => 'http://localhost'
33
+ })
34
+ end
35
+
36
+ it "returns nil even when matching rule found" do
37
+ @strategy.get_device_type(@request).must_equal nil
38
+ end
39
+ end
40
+
41
+ describe "disabled if referer is set" do
42
+ before do
43
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_if_referer_set: true)
44
+ @env.merge!({
45
+ 'HTTP_REFERER' => 'http://localhost'
46
+ })
47
+ end
48
+
49
+ it "returns nil even when matching rule found" do
50
+ @strategy.get_device_type(@request).must_equal nil
51
+ end
52
+ end
53
+
54
+ describe "disabled if referer matches" do
55
+ before do
56
+ @env.merge!({
57
+ 'HTTP_REFERER' => 'http://localhost'
58
+ })
59
+ end
60
+
61
+ it "returns nil even when matching rule found" do
62
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_if_referer_matches: /local/)
63
+ @strategy.get_device_type(@request).must_equal nil
64
+
65
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_if_referer_matches: /nothing/)
66
+ @strategy.get_device_type(@request).must_equal :mobile
67
+ end
68
+ end
69
+
70
+ describe "disabled unless referer matches" do
71
+ before do
72
+ @env.merge!({
73
+ 'HTTP_REFERER' => 'http://localhost'
74
+ })
75
+ end
76
+
77
+ it "returns nil even when matching rule found" do
78
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_unless_referer_matches: /nothing/)
79
+ @strategy.get_device_type(@request).must_equal nil
80
+
81
+ @strategy = URL.new(URL::MOBILE_PATH_RULES, disable_unless_referer_matches: /local/)
82
+ @strategy.get_device_type(@request).must_equal :mobile
83
+ end
84
+ end
28
85
  end
29
86
  end
30
87
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobvious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
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: 2012-03-12 00:00:00.000000000 Z
12
+ date: 2012-04-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &16340920 !ruby/object:Gem::Requirement
16
+ requirement: &21675260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16340920
24
+ version_requirements: *21675260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mobileesp_converted
27
- requirement: &16340180 !ruby/object:Gem::Requirement
27
+ requirement: &21764500 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *16340180
35
+ version_requirements: *21764500
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pry
38
- requirement: &16339620 !ruby/object:Gem::Requirement
38
+ requirement: &21763900 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *16339620
46
+ version_requirements: *21763900
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: minitest
49
- requirement: &16338520 !ruby/object:Gem::Requirement
49
+ requirement: &21763120 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *16338520
57
+ version_requirements: *21763120
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mocha
60
- requirement: &16337520 !ruby/object:Gem::Requirement
60
+ requirement: &21762380 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *16337520
68
+ version_requirements: *21762380
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack-test
71
- requirement: &16336960 !ruby/object:Gem::Requirement
71
+ requirement: &21761700 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *16336960
79
+ version_requirements: *21761700
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard
82
- requirement: &16336240 !ruby/object:Gem::Requirement
82
+ requirement: &21761140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *16336240
90
+ version_requirements: *21761140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-minitest
93
- requirement: &16335020 !ruby/object:Gem::Requirement
93
+ requirement: &21760420 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *16335020
101
+ version_requirements: *21760420
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rb-inotify
104
- requirement: &16423360 !ruby/object:Gem::Requirement
104
+ requirement: &21759620 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *16423360
112
+ version_requirements: *21759620
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: libnotify
115
- requirement: &16422940 !ruby/object:Gem::Requirement
115
+ requirement: &21846540 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *16422940
123
+ version_requirements: *21846540
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: turn
126
- requirement: &16422460 !ruby/object:Gem::Requirement
126
+ requirement: &21846100 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,7 +131,7 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *16422460
134
+ version_requirements: *21846100
135
135
  description: Rack middleware for choosing a version of an interface to render for
136
136
  given request
137
137
  email:
@@ -175,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
175
  version: '0'
176
176
  segments:
177
177
  - 0
178
- hash: -1726316769951614505
178
+ hash: -439395585953181489
179
179
  required_rubygems_version: !ruby/object:Gem::Requirement
180
180
  none: false
181
181
  requirements:
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  version: '0'
185
185
  segments:
186
186
  - 0
187
- hash: -1726316769951614505
187
+ hash: -439395585953181489
188
188
  requirements: []
189
189
  rubyforge_project:
190
190
  rubygems_version: 1.8.11