browser 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +14 -1
- data/.travis.yml +10 -5
- data/CHANGELOG.md +11 -0
- data/README.md +10 -0
- data/Rakefile +7 -1
- data/bin/rake +1 -0
- data/bots.yml +12 -1
- data/browser.gemspec +1 -0
- data/gemfiles/rails4.gemfile +4 -0
- data/lib/browser.rb +1 -87
- data/lib/browser/alipay.rb +20 -0
- data/lib/browser/base.rb +4 -0
- data/lib/browser/browser.rb +90 -0
- data/lib/browser/detect_version.rb +2 -2
- data/lib/browser/device.rb +2 -2
- data/lib/browser/generic.rb +1 -1
- data/lib/browser/internet_explorer.rb +1 -1
- data/lib/browser/micro_messenger.rb +1 -1
- data/lib/browser/middleware.rb +1 -1
- data/lib/browser/platform.rb +2 -2
- data/lib/browser/platform/mac.rb +1 -1
- data/lib/browser/testing.rb +3 -1
- data/lib/browser/version.rb +1 -1
- data/test/browser_test.rb +5 -2
- data/test/sample_app.rb +1 -1
- data/test/ua.yml +2 -0
- data/test/ua_bots.yml +13 -2
- data/test/unit/accept_language_test.rb +6 -3
- data/test/unit/alipay_test.rb +22 -0
- data/test/unit/generic_test.rb +1 -0
- data/test/unit/meta_test.rb +1 -0
- metadata +21 -3
- data/.hound.yml +0 -110
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72b5d1c89680820ed248d00b2dcded4666971ab0
|
4
|
+
data.tar.gz: 4b86b3e6f15c553d1e969693983ca1db9c7528fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82c72769220e2ce3ceebfb88c501992626919c2b67e09a4d76e1e07cda3d77a40c003157e479e6b97cbca68b7673a2f9f213989e0c04fc265515e6ebaf165ac6
|
7
|
+
data.tar.gz: 13ce0ee867206cbf455a63c9cdc42466ad33e2654d315784913e5b3fc0e70946bda5fc8b59409dd45917cdc7ac219f54fc82b35f249b9fe819d3a504e89ebcba
|
data/.rubocop.yml
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- "bin/**/*"
|
4
|
+
- "gemfiles/**/*"
|
5
|
+
- "vendor/**/*"
|
6
|
+
- "Gemfile"
|
7
|
+
- "Rakefile"
|
8
|
+
- "*.gemspec"
|
9
|
+
- "config.ru"
|
10
|
+
|
11
|
+
Style/Alias:
|
12
|
+
EnforcedStyle: prefer_alias_method
|
13
|
+
|
1
14
|
Style/FrozenStringLiteralComment:
|
2
15
|
EnforcedStyle: always
|
3
16
|
|
@@ -58,7 +71,7 @@ SingleLineBlockParams:
|
|
58
71
|
VariableInterpolation:
|
59
72
|
Enabled: false
|
60
73
|
|
61
|
-
|
74
|
+
Style/TrailingCommaInLiteral:
|
62
75
|
Enabled: false
|
63
76
|
|
64
77
|
WhileUntilModifier:
|
data/.travis.yml
CHANGED
@@ -2,12 +2,17 @@ language: ruby
|
|
2
2
|
sudo: false
|
3
3
|
cache: bundler
|
4
4
|
rvm:
|
5
|
-
- '2.3.1'
|
6
|
-
- '2.2'
|
7
|
-
- '2.1'
|
5
|
+
- '2.3.1'
|
6
|
+
- '2.2.2'
|
7
|
+
- '2.1'
|
8
8
|
gemfile:
|
9
|
-
- Gemfile
|
10
|
-
- gemfiles/rails3.gemfile
|
9
|
+
- Gemfile
|
10
|
+
- gemfiles/rails3.gemfile
|
11
|
+
- gemfiles/rails4.gemfile
|
12
|
+
matrix:
|
13
|
+
exclude:
|
14
|
+
- rvm: '2.1'
|
15
|
+
gemfile: Gemfile
|
11
16
|
script: bundle exec rake
|
12
17
|
notifications:
|
13
18
|
email: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v2.3.0
|
4
|
+
|
5
|
+
- Add AWS ELB bot.
|
6
|
+
- Add CommonCrawl and Yahoo Ad Monitoring bots.
|
7
|
+
- Add Google Stackdriver Uptime Check bot.
|
8
|
+
- Add Microsoft Bing bots (adldxbot, bingpreview, and msnbot-media).
|
9
|
+
- Add Stripe and Netcraft bots.
|
10
|
+
- Add support for loading browser without extending Rails' helpers.
|
11
|
+
- Add Watchsumo bot.
|
12
|
+
- Match Alipay.
|
13
|
+
|
3
14
|
## v2.2.0
|
4
15
|
|
5
16
|
- `Browser::Platform#windows?` can now compare versions.
|
data/README.md
CHANGED
@@ -162,6 +162,12 @@ This adds a helper method called `browser`, that inspects your current user agen
|
|
162
162
|
<% end %>
|
163
163
|
```
|
164
164
|
|
165
|
+
If you want to use Browser on your Rails app but don't want to taint your controller, use the following line on your Gemfile:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
gem "browser", require: "browser/browser"
|
169
|
+
```
|
170
|
+
|
165
171
|
### Accept Language
|
166
172
|
|
167
173
|
Parses the accept-language header from an HTTP request and produces an array of language objects sorted by quality.
|
@@ -302,6 +308,10 @@ The class constructor now has a different signature. Change the instantiation fr
|
|
302
308
|
|
303
309
|
## Development
|
304
310
|
|
311
|
+
### Versioning
|
312
|
+
|
313
|
+
This library follows http://semver.org.
|
314
|
+
|
305
315
|
### Writing code
|
306
316
|
|
307
317
|
Once you've made your great commits (include tests, please):
|
data/Rakefile
CHANGED
@@ -12,6 +12,12 @@ Rake::TestTask.new(:test) do |t|
|
|
12
12
|
t.ruby_opts = %w[-rubygems]
|
13
13
|
end
|
14
14
|
|
15
|
+
require "rubocop/rake_task"
|
16
|
+
desc "Run rubocop"
|
17
|
+
task :rubocop do
|
18
|
+
RuboCop::RakeTask.new
|
19
|
+
end
|
20
|
+
|
15
21
|
desc "Run specs against all gemfiles"
|
16
22
|
task "test:all" do
|
17
23
|
%w[
|
@@ -23,4 +29,4 @@ task "test:all" do
|
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
26
|
-
task default:
|
32
|
+
task default: [:test, :rubocop]
|
data/bin/rake
CHANGED
data/bots.yml
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
360spider: "360Spider"
|
3
3
|
abot: "CrawlDaddy, abot"
|
4
4
|
addthis: "AddThis"
|
5
|
+
adldxbot: "Microsoft Bing Ads"
|
5
6
|
admantx: "ADmantX Platform Semantic Analyzer"
|
6
7
|
adsbot-google: "Google Adwords"
|
7
8
|
advbot: "AdvBot"
|
@@ -17,7 +18,8 @@ asynchttpclient: "Java http and WebSocket client library"
|
|
17
18
|
awe.sm: "Awe.sm URL expander"
|
18
19
|
baidu: "Baidu"
|
19
20
|
bdcbot: "Big Data Corp"
|
20
|
-
bingbot: "Microsoft
|
21
|
+
bingbot: "Microsoft Bing"
|
22
|
+
bingpreview: "Microsoft Bing preview"
|
21
23
|
bitlybot: "bit.ly bot"
|
22
24
|
blekkobot: "Blekkobot"
|
23
25
|
blexbot: "BLEXBot (webmeup)"
|
@@ -32,6 +34,7 @@ cliqzbot: "Cliqzbot"
|
|
32
34
|
cmradar/0.1: "CMRadar/0.1"
|
33
35
|
coldfusion: "ColdFusion http library"
|
34
36
|
comodo-webinspector-crawler: "Comodo"
|
37
|
+
commoncrawl: "CCBot"
|
35
38
|
crowsnest: "Crowsnest"
|
36
39
|
curabot: "cura.yt"
|
37
40
|
curl: "curl unix CLI http client"
|
@@ -46,6 +49,7 @@ domainsbot: "DomainsBot"
|
|
46
49
|
domaintunocrawler: "DomainTuno"
|
47
50
|
dotbot: "Dot Bot"
|
48
51
|
duckduck: "Duck Duck Go"
|
52
|
+
elb-healthchecker: "AWS ELB HealthChecker"
|
49
53
|
embedly: "Embedly"
|
50
54
|
eoaagent: "EOAAgent"
|
51
55
|
eventmachine httpclient: "Ruby http library"
|
@@ -71,6 +75,7 @@ google Web Preview: "Google Instant Previews crawler"
|
|
71
75
|
google-structured-data-testing-tool: "Google-StructuredDataTestingTool"
|
72
76
|
google-structureddatatestingtool: "Google-StructuredDataTestingTool"
|
73
77
|
googlebot: "Google Bot"
|
78
|
+
googlestackdrivermonitoring-uptimechecks: "GoogleStackdriverMonitoring-UptimeChecks"
|
74
79
|
grapeshotcrawler: "GrapeshotCrawler"
|
75
80
|
gravitybot: "Gravity Bot"
|
76
81
|
hatena::bookmark: "Hatena::Bookmark"
|
@@ -126,8 +131,10 @@ mj12bot: "Majestic-12 spider"
|
|
126
131
|
mojeekbot: "Mojeek UK search crawler"
|
127
132
|
mrchrome: "MrChrome"
|
128
133
|
ms search 6.0 robot: "MS Search 6.0 Robot"
|
134
|
+
msnbot-media: "Microsoft media bot"
|
129
135
|
msnbot: "Microsoft bot"
|
130
136
|
nerdybot: "NerdyBot"
|
137
|
+
netcraft: "Netcraft"
|
131
138
|
netstate: "netEstate NE Crawler"
|
132
139
|
netvibes: "Personalized dashboard bot"
|
133
140
|
netzcheckbot: "netzcheck"
|
@@ -189,6 +196,7 @@ spinn3r: "Spinn3r aggregator"
|
|
189
196
|
sputnikbot: "SputnikBot"
|
190
197
|
squider: "Squider"
|
191
198
|
statuscake: "StatusCake"
|
199
|
+
stripe: "Stripe"
|
192
200
|
test certificate info: "C http library?"
|
193
201
|
tineye: "TinEye Bot"
|
194
202
|
traackr: "Traackr Bot"
|
@@ -212,6 +220,7 @@ vkshare: "VKontake Sharer"
|
|
212
220
|
voilabot: "VoilaBot"
|
213
221
|
vrcrawler: "Venture Radar"
|
214
222
|
wasalive-bot: "Wasalive Bots"
|
223
|
+
watchsumo: "WatchSumo"
|
215
224
|
wbsearchbot: "Ware Bay Best Buys"
|
216
225
|
webscout: "Webscout"
|
217
226
|
wesee: "WeSEE"
|
@@ -220,8 +229,10 @@ wordpress: "WordPress spider"
|
|
220
229
|
wormly: "WormlyBot"
|
221
230
|
wotbox: "Wotbox"
|
222
231
|
xenu link sleuth: "Xenu Link Sleuth"
|
232
|
+
xing-contenttabreceiver: "Xing bot"
|
223
233
|
xovibot: "XoviBot"
|
224
234
|
yacybot: "YaCy"
|
235
|
+
yahoo-ad-monitoring: "Yahoo Ad monitoring"
|
225
236
|
yandex: "Yandex"
|
226
237
|
yeti: "Naver Corp"
|
227
238
|
yourls: "YOURLS"
|
data/browser.gemspec
CHANGED
data/lib/browser.rb
CHANGED
@@ -1,89 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "
|
3
|
-
require "yaml"
|
4
|
-
require "pathname"
|
5
|
-
|
6
|
-
require "browser/version"
|
7
|
-
require "browser/detect_version"
|
8
|
-
require "browser/accept_language"
|
9
|
-
require "browser/base"
|
10
|
-
require "browser/safari"
|
11
|
-
require "browser/chrome"
|
12
|
-
require "browser/internet_explorer"
|
13
|
-
require "browser/firefox"
|
14
|
-
require "browser/edge"
|
15
|
-
require "browser/opera"
|
16
|
-
require "browser/blackberry"
|
17
|
-
require "browser/generic"
|
18
|
-
require "browser/phantom_js"
|
19
|
-
require "browser/uc_browser"
|
20
|
-
require "browser/nokia"
|
21
|
-
require "browser/micro_messenger"
|
22
|
-
require "browser/weibo"
|
23
|
-
require "browser/qq"
|
24
|
-
|
25
|
-
require "browser/bot"
|
26
|
-
require "browser/middleware"
|
2
|
+
require "browser/browser"
|
27
3
|
require "browser/rails" if defined?(::Rails)
|
28
|
-
|
29
|
-
require "browser/platform"
|
30
|
-
require "browser/device"
|
31
|
-
require "browser/meta"
|
32
|
-
|
33
|
-
module Browser
|
34
|
-
EMPTY_STRING = "".freeze
|
35
|
-
|
36
|
-
def self.root
|
37
|
-
@root ||= Pathname.new(File.expand_path("../..", __FILE__))
|
38
|
-
end
|
39
|
-
|
40
|
-
# Hold the list of browser matchers.
|
41
|
-
# Order is important.
|
42
|
-
def self.matchers
|
43
|
-
@matchers ||= [
|
44
|
-
Nokia,
|
45
|
-
UCBrowser,
|
46
|
-
PhantomJS,
|
47
|
-
BlackBerry,
|
48
|
-
Opera,
|
49
|
-
Edge,
|
50
|
-
InternetExplorer,
|
51
|
-
Firefox,
|
52
|
-
Weibo, # must be placed before Chrome and Safari
|
53
|
-
QQ, # must be placed before Chrome and Safari
|
54
|
-
Chrome,
|
55
|
-
Safari,
|
56
|
-
MicroMessenger,
|
57
|
-
Generic
|
58
|
-
]
|
59
|
-
end
|
60
|
-
|
61
|
-
# Define the rules which define a modern browser.
|
62
|
-
# A rule must be a proc/lambda or any object that implements the method
|
63
|
-
# === and accepts the browser object.
|
64
|
-
#
|
65
|
-
# To redefine all rules, clear the existing rules before adding your own.
|
66
|
-
#
|
67
|
-
# # Only Chrome Canary is considered modern.
|
68
|
-
# Browser.modern_rules.clear
|
69
|
-
# Browser.modern_rules << -> b { b.chrome? && b.version >= "37" }
|
70
|
-
#
|
71
|
-
def self.modern_rules
|
72
|
-
@modern_rules ||= []
|
73
|
-
end
|
74
|
-
|
75
|
-
modern_rules.tap do |rules|
|
76
|
-
rules << -> (b) { b.webkit? }
|
77
|
-
rules << -> (b) { b.firefox? && b.version.to_i >= 17 }
|
78
|
-
rules << -> (b) { b.ie? && b.version.to_i >= 9 && !b.compatibility_view? }
|
79
|
-
rules << -> (b) { b.edge? && !b.compatibility_view? }
|
80
|
-
rules << -> (b) { b.opera? && b.version.to_i >= 12 }
|
81
|
-
rules << -> (b) { b.firefox? && b.device.tablet? && b.platform.android? && b.version.to_i >= 14 } # rubocop:disable Metrics/LineLength
|
82
|
-
end
|
83
|
-
|
84
|
-
def self.new(user_agent, **kwargs)
|
85
|
-
matchers
|
86
|
-
.map {|klass| klass.new(user_agent || EMPTY_STRING, **kwargs) }
|
87
|
-
.find(&:match?)
|
88
|
-
end
|
89
|
-
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Browser
|
3
|
+
class Alipay < Base
|
4
|
+
def id
|
5
|
+
:alipay
|
6
|
+
end
|
7
|
+
|
8
|
+
def name
|
9
|
+
"Alipay"
|
10
|
+
end
|
11
|
+
|
12
|
+
def full_version
|
13
|
+
ua[%r[(?:AlipayClient)/([\d.]+)]i, 1] || "0.0"
|
14
|
+
end
|
15
|
+
|
16
|
+
def match?
|
17
|
+
ua =~ /AlipayClient/i
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/browser/base.rb
CHANGED
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "set"
|
3
|
+
require "yaml"
|
4
|
+
require "pathname"
|
5
|
+
|
6
|
+
require "browser/version"
|
7
|
+
require "browser/detect_version"
|
8
|
+
require "browser/accept_language"
|
9
|
+
require "browser/base"
|
10
|
+
require "browser/safari"
|
11
|
+
require "browser/chrome"
|
12
|
+
require "browser/internet_explorer"
|
13
|
+
require "browser/firefox"
|
14
|
+
require "browser/edge"
|
15
|
+
require "browser/opera"
|
16
|
+
require "browser/blackberry"
|
17
|
+
require "browser/generic"
|
18
|
+
require "browser/phantom_js"
|
19
|
+
require "browser/uc_browser"
|
20
|
+
require "browser/nokia"
|
21
|
+
require "browser/micro_messenger"
|
22
|
+
require "browser/weibo"
|
23
|
+
require "browser/qq"
|
24
|
+
require "browser/alipay"
|
25
|
+
|
26
|
+
require "browser/bot"
|
27
|
+
require "browser/middleware"
|
28
|
+
|
29
|
+
require "browser/platform"
|
30
|
+
require "browser/device"
|
31
|
+
require "browser/meta"
|
32
|
+
|
33
|
+
module Browser
|
34
|
+
EMPTY_STRING = "".freeze
|
35
|
+
|
36
|
+
def self.root
|
37
|
+
@root ||= Pathname.new(File.expand_path("../../..", __FILE__))
|
38
|
+
end
|
39
|
+
|
40
|
+
# Hold the list of browser matchers.
|
41
|
+
# Order is important.
|
42
|
+
def self.matchers
|
43
|
+
@matchers ||= [
|
44
|
+
Nokia,
|
45
|
+
UCBrowser,
|
46
|
+
PhantomJS,
|
47
|
+
BlackBerry,
|
48
|
+
Opera,
|
49
|
+
Edge,
|
50
|
+
InternetExplorer,
|
51
|
+
Firefox,
|
52
|
+
Weibo, # must be placed before Chrome and Safari
|
53
|
+
QQ, # must be placed before Chrome and Safari
|
54
|
+
Alipay, # must be placed before Chrome and Safari
|
55
|
+
Chrome,
|
56
|
+
Safari,
|
57
|
+
MicroMessenger,
|
58
|
+
Generic
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
# Define the rules which define a modern browser.
|
63
|
+
# A rule must be a proc/lambda or any object that implements the method
|
64
|
+
# === and accepts the browser object.
|
65
|
+
#
|
66
|
+
# To redefine all rules, clear the existing rules before adding your own.
|
67
|
+
#
|
68
|
+
# # Only Chrome Canary is considered modern.
|
69
|
+
# Browser.modern_rules.clear
|
70
|
+
# Browser.modern_rules << -> b { b.chrome? && b.version >= "37" }
|
71
|
+
#
|
72
|
+
def self.modern_rules
|
73
|
+
@modern_rules ||= []
|
74
|
+
end
|
75
|
+
|
76
|
+
modern_rules.tap do |rules|
|
77
|
+
rules << ->(b) { b.webkit? }
|
78
|
+
rules << ->(b) { b.firefox? && b.version.to_i >= 17 }
|
79
|
+
rules << ->(b) { b.ie? && b.version.to_i >= 9 && !b.compatibility_view? }
|
80
|
+
rules << ->(b) { b.edge? && !b.compatibility_view? }
|
81
|
+
rules << ->(b) { b.opera? && b.version.to_i >= 12 }
|
82
|
+
rules << ->(b) { b.firefox? && b.device.tablet? && b.platform.android? && b.version.to_i >= 14 } # rubocop:disable Metrics/LineLength
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.new(user_agent, **kwargs)
|
86
|
+
matchers
|
87
|
+
.map {|klass| klass.new(user_agent || EMPTY_STRING, **kwargs) }
|
88
|
+
.find(&:match?)
|
89
|
+
end
|
90
|
+
end
|
@@ -11,11 +11,11 @@ module Browser
|
|
11
11
|
actual_version = parse_version(actual_version)
|
12
12
|
|
13
13
|
Gem::Requirement.create(expected_version)
|
14
|
-
|
14
|
+
.satisfied_by?(Gem::Version.create(actual_version))
|
15
15
|
end
|
16
16
|
|
17
17
|
def parse_version(version)
|
18
|
-
version.kind_of?(Numeric) ?
|
18
|
+
version.kind_of?(Numeric) ? version.to_s : version
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/browser/device.rb
CHANGED
data/lib/browser/generic.rb
CHANGED
data/lib/browser/middleware.rb
CHANGED
@@ -11,7 +11,7 @@ module Browser
|
|
11
11
|
ACCEPT_REGEX = %r[(text/html|\*/\*)]
|
12
12
|
|
13
13
|
def initialize(app, &block)
|
14
|
-
|
14
|
+
raise ArgumentError, "Browser::Middleware requires a block" unless block
|
15
15
|
|
16
16
|
@app = app
|
17
17
|
@block = block
|
data/lib/browser/platform.rb
CHANGED
data/lib/browser/platform/mac.rb
CHANGED
data/lib/browser/testing.rb
CHANGED
@@ -15,7 +15,9 @@ module Browser
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.search_engine_user_agents
|
18
|
-
@search_engine_user_agents ||=
|
18
|
+
@search_engine_user_agents ||= begin
|
19
|
+
YAML.load_file(Browser.root.join("test/ua_search_engines.yml"))
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def self.[](key)
|
data/lib/browser/version.rb
CHANGED
data/test/browser_test.rb
CHANGED
@@ -124,8 +124,11 @@ class BrowserTest < Minitest::Test
|
|
124
124
|
end
|
125
125
|
|
126
126
|
test "returns all known languages" do
|
127
|
-
|
128
|
-
|
127
|
+
accept_language = "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3"
|
128
|
+
browser = Browser.new("", accept_language: accept_language)
|
129
|
+
languages = browser.accept_language.map(&:full)
|
130
|
+
|
131
|
+
assert_equal ["en-US", "en", "pt-BR", "pt"], languages
|
129
132
|
end
|
130
133
|
|
131
134
|
test "removes duplicate items" do
|
data/test/sample_app.rb
CHANGED
@@ -17,7 +17,7 @@ class SampleApp < Rails::Application
|
|
17
17
|
routes.append do
|
18
18
|
default_headers = {"Content-Type" => "text/html"}
|
19
19
|
|
20
|
-
root to: ->
|
20
|
+
root to: ->(_env) { [200, default_headers, ["ROOT"]] }
|
21
21
|
get "upgrade", to: lambda {|env|
|
22
22
|
browser = Rack::Request.new(env).params["browser"]
|
23
23
|
[200, default_headers, ["UPGRADE: #{browser}"]]
|
data/test/ua.yml
CHANGED
@@ -124,3 +124,5 @@ WEIBO_IOS: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/60
|
|
124
124
|
WEIBO_ANDROID: 'Mozilla/5.0 (Linux; Android 5.0.2; vivo X5M Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 Weibo (vivo-vivo X5M__weibo__5.7.1__android__android5.0.2)'
|
125
125
|
QQ_BROWSER_IOS: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 QQ/6.3.3.432 V1_IPH_SQ_6.3.3_1_APP_A Pixel/640 Core/UIWebView NetType/WIFI Mem/47'
|
126
126
|
QQ_BROWSER_ANDROID: 'Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036222 Safari/537.36 V1_AND_SQ_6.2.0_320_YYB_D QQ/6.2.0.2655 NetType/WIFI WebP/0.3.0 Pixel/1440'
|
127
|
+
ALIPAY_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 AliApp(AP/2.3.4) AlipayClient/2.3.4"
|
128
|
+
ALIPAY_ANDROID: "Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; HUAWEI G610-T00 Build/HuaweiG610-T00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 AlipayDefined(nt:WIFI,ws:360|640|1.5) AliApp(AP/9.0.1.073001) AlipayClient/9.0.1.073001 GCanvas/1.4.2.15"
|
data/test/ua_bots.yml
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
ADLXBOT: 'Mozilla/5.0 (compatible; adidxbot/2.0; +http://www.bing.com/bingbot.htm)'
|
1
2
|
APPLE_BOT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1)'
|
2
3
|
ASK: 'Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)'
|
4
|
+
AWS_ELB: ELB-HealthChecker/1.0
|
3
5
|
BAIDU: 'Baiduspider+(+http://www.baidu.com/search/spider.htm)'
|
4
6
|
BINGBOT: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)'
|
7
|
+
BINGPREVIEW: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b'
|
8
|
+
COMMONCRAWL: 'CCBot/2.0 (http://commoncrawl.org/faq/)'
|
5
9
|
DAUMOA: Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa 4.0
|
6
10
|
DOMAINAREANIMATOR: 'Domain Re-Animator Bot (http://domainreanimator.com) - support@domainreanimator.com'
|
7
11
|
DOT_BOT: 'Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)'
|
@@ -9,8 +13,9 @@ DUCKDUCKGO: 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)'
|
|
9
13
|
FACEBOOK_BOT: 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'
|
10
14
|
GOOGLE_BOT: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
|
11
15
|
GOOGLE_PAGE_SPEED_INSIGHTS: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Page Speed Insights) Chrome/22.0.1229 Safari/537.4'
|
12
|
-
|
16
|
+
GOOGLE_STACKDRIVER_UPTIME_CHECKS: 'GoogleStackdriverMonitoring-UptimeChecks'
|
13
17
|
GOOGLE_STRUCTURED_DATA_TESTING_TOOL2: 'Mozilla/5.0 (compatible; Google-Structured-Data-Testing-Tool +http://developers.google.com/structured-data/testing-tool/)'
|
18
|
+
GOOGLE_STRUCTURED_DATA_TESTING_TOOL: 'Mozilla/5.0 (compatible; X11; Linux x86_64; Google-StructuredDataTestingTool; +http://www.google.com/webmasters/tools/richsnippets)'
|
14
19
|
GRAPESHOT: 'Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)'
|
15
20
|
LINKDEXBOT: 'Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)'
|
16
21
|
LOAD_TIME_BOT: 'Mozilla/5.0 (compatible; LoadTimeBot/0.9; +http://www.loadtime.net/bot.html)'
|
@@ -18,15 +23,21 @@ LTX71: 'ltx71 - (http://ltx71.com/)'
|
|
18
23
|
MAIL_RU: 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)'
|
19
24
|
MEGAINDEX_RU: 'Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)'
|
20
25
|
MRCHROME: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.107 Amigo/45.0.2454.107 MRCHROME SOC Safari/537.36'
|
21
|
-
|
26
|
+
MSNBOT: 'msnbot/2.0b (+http://search.msn.com/msnbot.htm)'
|
27
|
+
MSNBOT_MEDIA: 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)'
|
28
|
+
NETCRAFT2: Netcraft SSL Server Survey - contact info@netcraft.com
|
29
|
+
NETCRAFT: Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; +info@netcraft.com)
|
22
30
|
PRIVACYAWAREBOT: 'Mozilla/5.0 (compatible; PrivacyAwareBot/1.1; +http://www.privacyaware.org)'
|
23
31
|
QUERYSEEKER: 'QuerySeekerSpider ( http://queryseeker.com/bot.html )'
|
24
32
|
SCRAPY: 'Scrapy/0.18.4 (+http://scrapy.org)'
|
25
33
|
SEOKICKS: 'Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)'
|
26
34
|
SISTRIX: 'Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)'
|
27
35
|
SQUIDER: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36 Squider/0.01'
|
36
|
+
STRIPE: 'Stripe/1.0 (+https://stripe.com/docs/webhooks)'
|
28
37
|
TINEYE: 'TinEye-bot/0.51 (see http://www.tineye.com/crawler.html)'
|
29
38
|
TRAACKR: 'Traackr.com'
|
39
|
+
WATCHSUMO: 'Mozilla/5.0 (compatible) WatchSumo/1.0.0 (http://www.watchsumo.com)'
|
40
|
+
YAHOO_AD_MONITORING: 'Mozilla/5.0 (compatible; Yahoo Ad monitoring; https://help.yahoo.com/kb/yahoo-ad-monitoring-SLN24857.html)'
|
30
41
|
YAHOO_SLURP: 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)'
|
31
42
|
YANDEX_DIRECT: 'Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)'
|
32
43
|
YANDEX_METRIKA: 'Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots)'
|
@@ -62,7 +62,8 @@ class AcceptLanguageTest < Minitest::Test
|
|
62
62
|
end
|
63
63
|
|
64
64
|
test "parses complex set" do
|
65
|
-
|
65
|
+
accept_language = "fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1"
|
66
|
+
result = Browser::AcceptLanguage.parse(accept_language)
|
66
67
|
|
67
68
|
assert_language result[0], code: "fr", region: "CA", quality: 1.0
|
68
69
|
assert_language result[1], code: "fr", region: nil, quality: 0.8
|
@@ -72,7 +73,8 @@ class AcceptLanguageTest < Minitest::Test
|
|
72
73
|
end
|
73
74
|
|
74
75
|
test "handles random white spaces" do
|
75
|
-
|
76
|
+
accept_language = "fr-CA, fr;q=0.8, en-US;q=0.6,en;q=0.4, *;q=0.1"
|
77
|
+
result = Browser::AcceptLanguage.parse(accept_language)
|
76
78
|
|
77
79
|
assert_language result[0], code: "fr", region: "CA", quality: 1.0
|
78
80
|
assert_language result[1], code: "fr", region: nil, quality: 0.8
|
@@ -82,7 +84,8 @@ class AcceptLanguageTest < Minitest::Test
|
|
82
84
|
end
|
83
85
|
|
84
86
|
test "sorts based on quality" do
|
85
|
-
|
87
|
+
accept_language = "fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5"
|
88
|
+
result = Browser::AcceptLanguage.parse(accept_language)
|
86
89
|
|
87
90
|
assert_language result[0], code: "fr", region: "CA", quality: 1.0
|
88
91
|
assert_language result[1], code: "en", region: "US", quality: 0.6
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class AlipayTest < Minitest::Test
|
5
|
+
test "detects alipay iOS" do
|
6
|
+
browser = Browser.new(Browser["ALIPAY_IOS"])
|
7
|
+
|
8
|
+
assert_equal :alipay, browser.id
|
9
|
+
assert browser.alipay?
|
10
|
+
assert_equal "Alipay", browser.name
|
11
|
+
assert_equal "2.3.4", browser.full_version
|
12
|
+
end
|
13
|
+
|
14
|
+
test "detects alipay Android" do
|
15
|
+
browser = Browser.new(Browser["ALIPAY_ANDROID"])
|
16
|
+
|
17
|
+
assert_equal :alipay, browser.id
|
18
|
+
assert browser.alipay?
|
19
|
+
assert_equal "Alipay", browser.name
|
20
|
+
assert_equal "9.0.1.073001", browser.full_version
|
21
|
+
end
|
22
|
+
end
|
data/test/unit/generic_test.rb
CHANGED
data/test/unit/meta_test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
description: Do some browser detection with Ruby.
|
140
154
|
email:
|
141
155
|
- fnando.vieira@gmail.com
|
@@ -146,7 +160,6 @@ files:
|
|
146
160
|
- ".bundle/config"
|
147
161
|
- ".github/ISSUE_TEMPLATE.md"
|
148
162
|
- ".gitignore"
|
149
|
-
- ".hound.yml"
|
150
163
|
- ".rubocop.yml"
|
151
164
|
- ".travis.yml"
|
152
165
|
- CHANGELOG.md
|
@@ -159,13 +172,16 @@ files:
|
|
159
172
|
- browser.gemspec
|
160
173
|
- config.ru
|
161
174
|
- gemfiles/rails3.gemfile
|
175
|
+
- gemfiles/rails4.gemfile
|
162
176
|
- languages.yml
|
163
177
|
- lib/browser.rb
|
164
178
|
- lib/browser/accept_language.rb
|
165
179
|
- lib/browser/action_controller.rb
|
180
|
+
- lib/browser/alipay.rb
|
166
181
|
- lib/browser/base.rb
|
167
182
|
- lib/browser/blackberry.rb
|
168
183
|
- lib/browser/bot.rb
|
184
|
+
- lib/browser/browser.rb
|
169
185
|
- lib/browser/chrome.rb
|
170
186
|
- lib/browser/detect_version.rb
|
171
187
|
- lib/browser/device.rb
|
@@ -245,6 +261,7 @@ files:
|
|
245
261
|
- test/ua_search_engines.yml
|
246
262
|
- test/unit/accept_language_test.rb
|
247
263
|
- test/unit/adobe_air_test.rb
|
264
|
+
- test/unit/alipay_test.rb
|
248
265
|
- test/unit/android_test.rb
|
249
266
|
- test/unit/blackberry_test.rb
|
250
267
|
- test/unit/bots_test.rb
|
@@ -304,6 +321,7 @@ test_files:
|
|
304
321
|
- test/ua_search_engines.yml
|
305
322
|
- test/unit/accept_language_test.rb
|
306
323
|
- test/unit/adobe_air_test.rb
|
324
|
+
- test/unit/alipay_test.rb
|
307
325
|
- test/unit/android_test.rb
|
308
326
|
- test/unit/blackberry_test.rb
|
309
327
|
- test/unit/bots_test.rb
|
data/.hound.yml
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
Style/ClassCheck:
|
2
|
-
EnforcedStyle: kind_of?
|
3
|
-
|
4
|
-
Metrics/LineLength:
|
5
|
-
Max: 80
|
6
|
-
|
7
|
-
Style/BlockDelimiters:
|
8
|
-
Enabled: false
|
9
|
-
|
10
|
-
Style/RegexpLiteral:
|
11
|
-
Enabled: false
|
12
|
-
|
13
|
-
Metrics/AbcSize:
|
14
|
-
Enabled: false
|
15
|
-
|
16
|
-
Style/PerlBackrefs:
|
17
|
-
Enabled: false
|
18
|
-
|
19
|
-
ClassLength:
|
20
|
-
Enabled: false
|
21
|
-
|
22
|
-
CyclomaticComplexity:
|
23
|
-
Enabled: false
|
24
|
-
|
25
|
-
Documentation:
|
26
|
-
Enabled: false
|
27
|
-
|
28
|
-
Encoding:
|
29
|
-
Enabled: false
|
30
|
-
|
31
|
-
FileName:
|
32
|
-
Enabled: false
|
33
|
-
|
34
|
-
IfUnlessModifier:
|
35
|
-
Enabled: false
|
36
|
-
|
37
|
-
MethodLength:
|
38
|
-
Enabled: false
|
39
|
-
|
40
|
-
ModuleFunction:
|
41
|
-
Enabled: false
|
42
|
-
|
43
|
-
OneLineConditional:
|
44
|
-
Enabled: false
|
45
|
-
|
46
|
-
ParameterLists:
|
47
|
-
Enabled: false
|
48
|
-
|
49
|
-
Proc:
|
50
|
-
Enabled: false
|
51
|
-
|
52
|
-
SingleLineBlockParams:
|
53
|
-
Enabled: false
|
54
|
-
|
55
|
-
VariableInterpolation:
|
56
|
-
Enabled: false
|
57
|
-
|
58
|
-
TrailingComma:
|
59
|
-
Enabled: false
|
60
|
-
|
61
|
-
WhileUntilModifier:
|
62
|
-
Enabled: false
|
63
|
-
|
64
|
-
PredicateName:
|
65
|
-
NamePrefixBlacklist:
|
66
|
-
- is_
|
67
|
-
|
68
|
-
StringLiterals:
|
69
|
-
EnforcedStyle: double_quotes
|
70
|
-
SupportedStyles:
|
71
|
-
- single_quotes
|
72
|
-
- double_quotes
|
73
|
-
|
74
|
-
DotPosition:
|
75
|
-
EnforcedStyle: leading
|
76
|
-
|
77
|
-
SpaceBeforeBlockBraces:
|
78
|
-
EnforcedStyle: space
|
79
|
-
|
80
|
-
SpaceInsideBlockBraces:
|
81
|
-
EnforcedStyle: no_space
|
82
|
-
|
83
|
-
DoubleNegation:
|
84
|
-
Enabled: false
|
85
|
-
|
86
|
-
SpaceInsideBlockBraces:
|
87
|
-
SpaceBeforeBlockParameters: false
|
88
|
-
|
89
|
-
SpaceInsideHashLiteralBraces:
|
90
|
-
Enabled: false
|
91
|
-
|
92
|
-
PercentLiteralDelimiters:
|
93
|
-
PreferredDelimiters:
|
94
|
-
'%': '[]'
|
95
|
-
'%i': '[]'
|
96
|
-
'%q': '[]'
|
97
|
-
'%Q': '[]'
|
98
|
-
'%r': '[]'
|
99
|
-
'%s': '[]'
|
100
|
-
'%w': '[]'
|
101
|
-
'%W': '[]'
|
102
|
-
'%x': '[]'
|
103
|
-
|
104
|
-
Style/CollectionMethods:
|
105
|
-
PreferredMethods:
|
106
|
-
collect: 'map'
|
107
|
-
collect!: 'map!'
|
108
|
-
inject: 'reduce'
|
109
|
-
detect: 'find'
|
110
|
-
find_all: 'select'
|