rails-browser_detector 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.rspec +5 -0
- data/Appraisals +13 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +3 -0
- data/Makefile +18 -0
- data/README.md +43 -0
- data/Rakefile +5 -0
- data/app/controllers/concerns/rails/browser_detector/browser_compatible.rb +28 -0
- data/config/regexes.yml +59 -0
- data/lib/rails/browser_detector.rb +33 -0
- data/lib/rails/browser_detector/engine.rb +11 -0
- data/lib/rails/browser_detector/version.rb +5 -0
- data/rails-browser_detector.gemspec +35 -0
- data/spec/concerns/browser_compatible_spec.rb +230 -0
- data/spec/internal/config/environments/test.rb +2 -0
- data/spec/internal/config/hosts.rb +0 -0
- data/spec/internal/config/routes.rb +4 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/spec_helper.rb +26 -0
- metadata +231 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: acaf6eb2758cb3e8e2802e900973be558fb6dc56
|
4
|
+
data.tar.gz: 9ba80b2d4a37efa6daa8590b8e4c5efb1cfe3d23
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6ef58855a997be05b085647936b231dbf9049ea317e78d7a75af28558fded6a2a69aceee30eb5d86846081921ad523e549ea8b27d41c4c268c681c2975fcb1fa
|
7
|
+
data.tar.gz: 2a273f9f4db3171b36ea61d24c78bbb4d5893524b785679645ca4d917f6e43b78b9b75c3326496496bf2564520ecf7316bbe1a2db376055ff0e763debd23f8cf
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Appraisals
ADDED
data/CHANGELOG.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/Makefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
BUNDLE = bundle
|
2
|
+
BUNDLE_OPTIONS = --jobs=2
|
3
|
+
RSPEC = rspec
|
4
|
+
APPRAISAL = appraisal
|
5
|
+
|
6
|
+
all: test
|
7
|
+
|
8
|
+
test: bundler appraisal
|
9
|
+
${BUNDLE} exec ${APPRAISAL} ${RSPEC} spec 2>&1
|
10
|
+
|
11
|
+
bundler:
|
12
|
+
if ! gem list bundler -i > /dev/null; then \
|
13
|
+
gem install bundler; \
|
14
|
+
fi
|
15
|
+
${BUNDLE} install ${BUNDLE_OPTIONS}
|
16
|
+
|
17
|
+
appraisal:
|
18
|
+
${BUNDLE} exec ${APPRAISAL} install
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Rails::BrowserDetector
|
2
|
+
|
3
|
+
<a href="http://dolly.railsc.ru/projects/146/builds/latest/?ref=master"><img src="http://dolly.railsc.ru/badges/abak-press/rails-browser_detector/master" height="18"></a>
|
4
|
+
|
5
|
+
Identification of outdated browsers.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'rails-browser_detector'
|
13
|
+
```
|
14
|
+
|
15
|
+
Add `congig/initializers/rails-browser_detector.rb` and include BrowserCompatible into needed controllers:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
::ApplicationController.send :include, ::Rails::BrowserDetector::BrowserCompatible
|
19
|
+
|
20
|
+
Rails.application.config.compatible_browsers = {
|
21
|
+
'Chrome' => 45,
|
22
|
+
'Yandex Browser' => 13,
|
23
|
+
'Opera' => 32,
|
24
|
+
'Firefox' => 42,
|
25
|
+
'IE' => 10,
|
26
|
+
'Safari' => 8
|
27
|
+
}
|
28
|
+
```
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
Use controller/helper methods:
|
33
|
+
```ruby
|
34
|
+
browser_old? #=> true
|
35
|
+
```
|
36
|
+
|
37
|
+
## Contributing
|
38
|
+
|
39
|
+
1. Fork it ( https://github.com/abak-press/rails-browser_detector/fork )
|
40
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
41
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
42
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
43
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Rails
|
2
|
+
module BrowserDetector
|
3
|
+
module BrowserCompatible
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
helper_method :browser_old?
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def browser_old?
|
13
|
+
return @browser_old if defined? @browser_old
|
14
|
+
|
15
|
+
@browser_old =
|
16
|
+
Rails.application.config.compatible_browsers.any? do |browser, version|
|
17
|
+
current_browser.family == browser && current_browser.version && current_browser.version.major.to_i < version
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_browser
|
22
|
+
return @current_browser if defined? @current_browser
|
23
|
+
|
24
|
+
@current_browser = ::Rails::BrowserDetector.detect(request.user_agent)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/config/regexes.yml
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# This file is light version of regexes.yaml from https://github.com/ua-parser/uap-core
|
2
|
+
|
3
|
+
user_agent_parsers:
|
4
|
+
#### SPECIAL CASES TOP ####
|
5
|
+
|
6
|
+
# Opera will stop at 9.80 and hide the real version in the Version string.
|
7
|
+
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
|
8
|
+
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
|
9
|
+
|
10
|
+
# Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
|
11
|
+
- regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
|
12
|
+
family_replacement: 'Opera'
|
13
|
+
|
14
|
+
# Yandex Browser
|
15
|
+
- regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
|
16
|
+
family_replacement: 'Yandex Browser'
|
17
|
+
#### END SPECIAL CASES TOP ####
|
18
|
+
|
19
|
+
#### MAIN CASES - this catches > 50% of all browsers ####
|
20
|
+
|
21
|
+
# Edge/major_version.minor_version
|
22
|
+
- regex: '(Edge)/(\d+)\.(\d+)'
|
23
|
+
|
24
|
+
# Chrome/Chromium/major_version.minor_version.beta_version
|
25
|
+
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'
|
26
|
+
|
27
|
+
# Browser/major_version.minor_version
|
28
|
+
- regex: '(Chrome|Opera)/(\d+)\.(\d+)\.?(\d+)?'
|
29
|
+
|
30
|
+
# Chrome/Chromium/major_version.minor_version
|
31
|
+
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)'
|
32
|
+
|
33
|
+
# Browser major_version.minor_version (space instead of slash)
|
34
|
+
- regex: '(Opera) (\d+)\.(\d+)\.?(\d+)?'
|
35
|
+
|
36
|
+
#### END MAIN CASES ####
|
37
|
+
|
38
|
+
#### SPECIAL CASES ####
|
39
|
+
# Safari
|
40
|
+
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
41
|
+
family_replacement: 'Safari'
|
42
|
+
# Safari didn't provide "Version/d.d.d" prior to 3.0
|
43
|
+
- regex: '(Safari)/\d+'
|
44
|
+
|
45
|
+
# AFTER THE EDGE CASES ABOVE!
|
46
|
+
# AFTER IE11
|
47
|
+
# BEFORE all other IE
|
48
|
+
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
|
49
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
|
50
|
+
|
51
|
+
- regex: '([MS]?IE) (\d+)\.(\d+)'
|
52
|
+
family_replacement: 'IE'
|
53
|
+
|
54
|
+
os_parsers:
|
55
|
+
- regex: 'Must be at least one regular expression'
|
56
|
+
|
57
|
+
device_parsers:
|
58
|
+
- regex: 'Must be at least one regular expression'
|
59
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rails/browser_detector/version'
|
2
|
+
require 'rails/browser_detector/engine'
|
3
|
+
|
4
|
+
require 'user_agent_parser'
|
5
|
+
|
6
|
+
module Rails
|
7
|
+
module BrowserDetector
|
8
|
+
class << self
|
9
|
+
def detect(user_agent)
|
10
|
+
user_agent_parser.parse(user_agent)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# Internal: Возвращает экземпляр парсера, использующий кастомный файл с регулярками.
|
16
|
+
# Дефолтный файл не используется, потому что в нем содержится много правил.
|
17
|
+
# Кастомный файл - это дефолтный, из которого вырезаны ненужные для нас правила.
|
18
|
+
#
|
19
|
+
# Examples
|
20
|
+
# browser = Rails::BrowserDetector.user_agent_parser.parse(request.user_agent)
|
21
|
+
# browser.family #=> 'IE'
|
22
|
+
# browser.version.major #=> 10
|
23
|
+
#
|
24
|
+
# Returns an instance of UserAgentParser::Parser.
|
25
|
+
def user_agent_parser
|
26
|
+
return @user_agent_parser if defined? @user_agent_parser
|
27
|
+
|
28
|
+
patterns_path = "#{Gem.loaded_specs['rails-browser_detector'].gem_dir}/config/regexes.yml"
|
29
|
+
@user_agent_parser = ::UserAgentParser::Parser.new(patterns_path: patterns_path)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'rails'
|
3
|
+
|
4
|
+
module Rails
|
5
|
+
module BrowserDetector
|
6
|
+
class Engine < ::Rails::Engine
|
7
|
+
config.autoload_paths << "#{config.root}/lib"
|
8
|
+
config.autoload_paths << "#{config.root}/app/controllers/concerns" if Rails.version.to_i < 4
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'rails/browser_detector/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
9
|
+
|
10
|
+
spec.name = 'rails-browser_detector'
|
11
|
+
spec.version = ::Rails::BrowserDetector::VERSION
|
12
|
+
spec.authors = %w(Fyodor Parmanchukov)
|
13
|
+
spec.email = %w(rezerbit@gmail.com)
|
14
|
+
spec.summary = %q{Browser detector}
|
15
|
+
spec.description = %q{Browser compatibility definition}
|
16
|
+
spec.homepage = 'https://github.com/abak-press/rails-browser_detector'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = %w(lib)
|
22
|
+
|
23
|
+
spec.add_runtime_dependency 'rails', '>= 3.1.12', '< 4.1'
|
24
|
+
spec.add_runtime_dependency 'user_agent_parser', '~> 2.3'
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '>= 1.7'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
spec.add_development_dependency 'rspec', '>= 3.1'
|
29
|
+
spec.add_development_dependency 'rspec-rails', '>= 2.14.0'
|
30
|
+
spec.add_development_dependency 'appraisal', '>= 1.0.2'
|
31
|
+
spec.add_development_dependency 'combustion'
|
32
|
+
spec.add_development_dependency 'factory_girl_rails'
|
33
|
+
spec.add_development_dependency 'pry-debugger'
|
34
|
+
spec.add_development_dependency 'simplecov', '>= 0.10.0'
|
35
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Rails::BrowserDetector::BrowserCompatible do
|
4
|
+
let(:controller) { Object.new }
|
5
|
+
|
6
|
+
before do
|
7
|
+
Rails.application.config.compatible_browsers = {
|
8
|
+
'Chrome' => 45,
|
9
|
+
'Yandex Browser' => 13,
|
10
|
+
'Opera' => 32,
|
11
|
+
'Firefox' => 42,
|
12
|
+
'IE' => 10,
|
13
|
+
'Safari' => 7
|
14
|
+
}
|
15
|
+
|
16
|
+
controller.extend(Rails::BrowserDetector::BrowserCompatible)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#browser_old?' do
|
20
|
+
shared_examples_for 'not old browser' do |user_agent|
|
21
|
+
before { allow(controller).to receive_message_chain(:request, :user_agent).and_return user_agent }
|
22
|
+
|
23
|
+
it { expect(controller.send(:browser_old?)).to eq false }
|
24
|
+
end
|
25
|
+
|
26
|
+
shared_examples_for 'old browser' do |user_agent|
|
27
|
+
before { allow(controller).to receive_message_chain(:request, :user_agent).and_return user_agent }
|
28
|
+
|
29
|
+
it { expect(controller.send(:browser_old?)).to eq true }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when used default compatible browsers' do
|
33
|
+
context 'when browser is Chrome' do
|
34
|
+
context 'when browser has old version' do
|
35
|
+
user_agents = [
|
36
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64)
|
37
|
+
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36',
|
38
|
+
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36',
|
39
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0)
|
40
|
+
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36',
|
41
|
+
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36',
|
42
|
+
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F',
|
43
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
|
44
|
+
]
|
45
|
+
|
46
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when browser has minimal compatible version' do
|
50
|
+
it_behaves_like 'not old browser',
|
51
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)
|
52
|
+
Chrome/45.0.2228.0 Safari/537.36'
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when browser has compatible version' do
|
56
|
+
it_behaves_like 'not old browser',
|
57
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)
|
58
|
+
Chrome/45.0.2228.0 Safari/537.36'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when browser is Firefox' do
|
63
|
+
context 'when browser has old version' do
|
64
|
+
user_agents = [
|
65
|
+
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040614 Firefox/0.9',
|
66
|
+
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-AU; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14',
|
67
|
+
'Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8',
|
68
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
|
69
|
+
'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0',
|
70
|
+
'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0',
|
71
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
|
72
|
+
]
|
73
|
+
|
74
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when browser has minimal compatible version' do
|
78
|
+
it_behaves_like 'not old browser',
|
79
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/42.3'
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when browser has compatible version' do
|
83
|
+
it_behaves_like 'not old browser',
|
84
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/44.1'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when browser is Yandex Browser' do
|
89
|
+
context 'when browser has old version' do
|
90
|
+
user_agents = [
|
91
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko)
|
92
|
+
YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5',
|
93
|
+
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko)
|
94
|
+
YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5',
|
95
|
+
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko)
|
96
|
+
YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5',
|
97
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12785
|
98
|
+
YaBrowser/12.12.1599.12785 Safari/537.36',
|
99
|
+
'Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95
|
100
|
+
YaBrowser/12.7.1916.15705 Safari/537.36'
|
101
|
+
]
|
102
|
+
|
103
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when browser has minimal compatible version' do
|
107
|
+
it_behaves_like 'not old browser',
|
108
|
+
'Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
|
109
|
+
Chrome/39.0.2171.95 YaBrowser/13.7.1916.15705 Safari/537.36'
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'when browser has compatible version' do
|
113
|
+
it_behaves_like 'not old browser',
|
114
|
+
'Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
|
115
|
+
Chrome/39.0.2171.95 YaBrowser/14.7.1916.15705 Safari/537.36'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when browser is Opera' do
|
120
|
+
context 'when browser has old version' do
|
121
|
+
user_agents = [
|
122
|
+
'Opera/7.03 (Windows NT 5.0; U) [en]',
|
123
|
+
'Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10',
|
124
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko)
|
125
|
+
Chrome/44.0.2376.0 Safari/537.36 OPR/31.0.1857.0',
|
126
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
|
127
|
+
Chrome/45.0.2454.85 Safari/537.36 OPR/31.0.1948.25'
|
128
|
+
]
|
129
|
+
|
130
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when browser has minimal compatible version' do
|
134
|
+
it_behaves_like 'not old browser',
|
135
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
|
136
|
+
Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25'
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'when browser has compatible version' do
|
140
|
+
it_behaves_like 'not old browser',
|
141
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
|
142
|
+
Chrome/45.0.2454.85 Safari/537.36 OPR/33.0.1948.25'
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'when browser is IE' do
|
147
|
+
context 'when browser has old version' do
|
148
|
+
user_agents = [
|
149
|
+
'Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)',
|
150
|
+
'Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)',
|
151
|
+
'Mozilla/4.0 WebTV/2.6 (compatible; MSIE 4.0)',
|
152
|
+
'Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC)',
|
153
|
+
'Mozilla/4.08 (compatible; MSIE 6.0; Windows NT 5.1)',
|
154
|
+
'Mozilla/5.0 (MSIE 7.0; Macintosh; U; SunOS; X11; gu; SV1; InfoPath.2;
|
155
|
+
.NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)',
|
156
|
+
'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4;
|
157
|
+
InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)',
|
158
|
+
'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'
|
159
|
+
]
|
160
|
+
|
161
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
162
|
+
end
|
163
|
+
|
164
|
+
context 'when browser has minimal compatible version' do
|
165
|
+
it_behaves_like 'not old browser',
|
166
|
+
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'when browser has compatible version' do
|
170
|
+
it_behaves_like 'not old browser',
|
171
|
+
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko'
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'when browser is Safari' do
|
176
|
+
context 'when browser has old version' do
|
177
|
+
user_agents = [
|
178
|
+
'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU)
|
179
|
+
AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16',
|
180
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)
|
181
|
+
AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
|
182
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5)
|
183
|
+
AppleWebKit/537.75.14 (KHTML, like Gecko) Version/6.1.3 Safari/537.75.14'
|
184
|
+
]
|
185
|
+
|
186
|
+
user_agents.each { |user_agent| it_behaves_like 'old browser', user_agent }
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'when browser has minimal compatible version' do
|
190
|
+
it_behaves_like 'not old browser',
|
191
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)
|
192
|
+
AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A'
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'when browser has compatible version' do
|
196
|
+
it_behaves_like 'not old browser',
|
197
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11)
|
198
|
+
AppleWebKit/601.1.39 (KHTML, like Gecko) Version/9.0 Safari/601.1.39'
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context 'when browser or version is not identified' do
|
203
|
+
it_behaves_like 'not old browser', 'blabla'
|
204
|
+
it_behaves_like 'not old browser', 'Links (2.7; Linux 3.7.9-2-ARCH x86_64; GNU C 4.7.1; text)'
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'when browser is Firefox Alfa with not compatible version' do
|
208
|
+
it_behaves_like 'old browser', 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1'
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
describe '#current_browser' do
|
214
|
+
let(:user_agent) do
|
215
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2228.0 Safari/537.36'
|
216
|
+
end
|
217
|
+
|
218
|
+
before { allow(controller).to receive_message_chain(:request, :user_agent).and_return user_agent }
|
219
|
+
|
220
|
+
it { expect(controller.send(:current_browser).family).to eq 'Chrome' }
|
221
|
+
it { expect(controller.send(:current_browser).version.major).to eq '47' }
|
222
|
+
|
223
|
+
context 'when browser is not identified' do
|
224
|
+
let(:user_agent) { 'blabla' }
|
225
|
+
|
226
|
+
it { expect(controller.send(:current_browser).family).to eq 'Other' }
|
227
|
+
it { expect(controller.send(:current_browser).version).to be_nil }
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
*.log
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rails/browser_detector'
|
4
|
+
|
5
|
+
require 'simplecov'
|
6
|
+
SimpleCov.start do
|
7
|
+
minimum_coverage 85
|
8
|
+
|
9
|
+
add_filter '/spec/'
|
10
|
+
add_filter 'lib/rails-browser_detector/engine.rb'
|
11
|
+
add_filter 'lib/rails-browser_detector/version.rb'
|
12
|
+
add_filter 'lib/rails-browser_detector.rb'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'factory_girl_rails'
|
16
|
+
|
17
|
+
require 'combustion'
|
18
|
+
Combustion.initialize! :action_controller
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
config.include FactoryGirl::Syntax::Methods
|
22
|
+
|
23
|
+
config.backtrace_exclusion_patterns = [%r{lib/rspec/(core|expectations|matchers|mocks)}]
|
24
|
+
config.color = true
|
25
|
+
config.order = 'random'
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-browser_detector
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fyodor
|
8
|
+
- Parmanchukov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
prerelease: false
|
16
|
+
name: rails
|
17
|
+
version_requirements: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.1.12
|
22
|
+
- - <
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '4.1'
|
25
|
+
requirement: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.1.12
|
30
|
+
- - <
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '4.1'
|
33
|
+
type: :runtime
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
prerelease: false
|
36
|
+
name: user_agent_parser
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '2.3'
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.3'
|
47
|
+
type: :runtime
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
prerelease: false
|
50
|
+
name: bundler
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.7'
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.7'
|
61
|
+
type: :development
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
prerelease: false
|
64
|
+
name: rake
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
type: :development
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
prerelease: false
|
78
|
+
name: rspec
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '3.1'
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '3.1'
|
89
|
+
type: :development
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
prerelease: false
|
92
|
+
name: rspec-rails
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 2.14.0
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.14.0
|
103
|
+
type: :development
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
prerelease: false
|
106
|
+
name: appraisal
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 1.0.2
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.0.2
|
117
|
+
type: :development
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
prerelease: false
|
120
|
+
name: combustion
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
type: :development
|
132
|
+
- !ruby/object:Gem::Dependency
|
133
|
+
prerelease: false
|
134
|
+
name: factory_girl_rails
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirement: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - '>='
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
type: :development
|
146
|
+
- !ruby/object:Gem::Dependency
|
147
|
+
prerelease: false
|
148
|
+
name: pry-debugger
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
requirement: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
type: :development
|
160
|
+
- !ruby/object:Gem::Dependency
|
161
|
+
prerelease: false
|
162
|
+
name: simplecov
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 0.10.0
|
168
|
+
requirement: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 0.10.0
|
173
|
+
type: :development
|
174
|
+
description: Browser compatibility definition
|
175
|
+
email:
|
176
|
+
- rezerbit@gmail.com
|
177
|
+
executables: []
|
178
|
+
extensions: []
|
179
|
+
extra_rdoc_files: []
|
180
|
+
files:
|
181
|
+
- .gitignore
|
182
|
+
- .rspec
|
183
|
+
- Appraisals
|
184
|
+
- CHANGELOG.md
|
185
|
+
- Gemfile
|
186
|
+
- Makefile
|
187
|
+
- README.md
|
188
|
+
- Rakefile
|
189
|
+
- app/controllers/concerns/rails/browser_detector/browser_compatible.rb
|
190
|
+
- config/regexes.yml
|
191
|
+
- lib/rails/browser_detector.rb
|
192
|
+
- lib/rails/browser_detector/engine.rb
|
193
|
+
- lib/rails/browser_detector/version.rb
|
194
|
+
- rails-browser_detector.gemspec
|
195
|
+
- spec/concerns/browser_compatible_spec.rb
|
196
|
+
- spec/internal/config/environments/test.rb
|
197
|
+
- spec/internal/config/hosts.rb
|
198
|
+
- spec/internal/config/routes.rb
|
199
|
+
- spec/internal/log/.gitignore
|
200
|
+
- spec/spec_helper.rb
|
201
|
+
homepage: https://github.com/abak-press/rails-browser_detector
|
202
|
+
licenses: []
|
203
|
+
metadata:
|
204
|
+
allowed_push_host: https://rubygems.org
|
205
|
+
post_install_message:
|
206
|
+
rdoc_options: []
|
207
|
+
require_paths:
|
208
|
+
- lib
|
209
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
210
|
+
requirements:
|
211
|
+
- - '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
|
+
requirements:
|
216
|
+
- - '>='
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
version: '0'
|
219
|
+
requirements: []
|
220
|
+
rubyforge_project:
|
221
|
+
rubygems_version: 2.2.2
|
222
|
+
signing_key:
|
223
|
+
specification_version: 4
|
224
|
+
summary: Browser detector
|
225
|
+
test_files:
|
226
|
+
- spec/concerns/browser_compatible_spec.rb
|
227
|
+
- spec/internal/config/environments/test.rb
|
228
|
+
- spec/internal/config/hosts.rb
|
229
|
+
- spec/internal/config/routes.rb
|
230
|
+
- spec/internal/log/.gitignore
|
231
|
+
- spec/spec_helper.rb
|