browser 2.2.0 → 2.3.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 +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'
|