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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc44c2633f9e5ef71751d4dcc64143b13b69e21a
4
- data.tar.gz: 825edef676789f295746227c52962c6af234295c
3
+ metadata.gz: 72b5d1c89680820ed248d00b2dcded4666971ab0
4
+ data.tar.gz: 4b86b3e6f15c553d1e969693983ca1db9c7528fe
5
5
  SHA512:
6
- metadata.gz: 5086cdd5c553f0daaa49eb8e7aa70050fcb57dc7ed27406658278bf7b845658495c7ebe685e155ea15e1a1aa9baf9edb430a404d6c6119e395521c56d5aef7a2
7
- data.tar.gz: 98a3c39a62ad4b09630944d0927fec468478361516187fbb8cd1f75d377f62bf65313de5f8679e5f2f1d7bd8ed0a2ae672778f17ec49b21a2c1f1f23e0fb28af
6
+ metadata.gz: 82c72769220e2ce3ceebfb88c501992626919c2b67e09a4d76e1e07cda3d77a40c003157e479e6b97cbca68b7673a2f9f213989e0c04fc265515e6ebaf165ac6
7
+ data.tar.gz: 13ce0ee867206cbf455a63c9cdc42466ad33e2654d315784913e5b3fc0e70946bda5fc8b59409dd45917cdc7ac219f54fc82b35f249b9fe819d3a504e89ebcba
@@ -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
- TrailingComma:
74
+ Style/TrailingCommaInLiteral:
62
75
  Enabled: false
63
76
 
64
77
  WhileUntilModifier:
@@ -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
@@ -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: "test"
32
+ task default: [:test, :rubocop]
data/bin/rake CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # This file was generated by Bundler.
4
5
  #
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 bing bot"
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"
@@ -28,4 +28,5 @@ Gem::Specification.new do |s|
28
28
  s.add_development_dependency "pry-meta"
29
29
  s.add_development_dependency "minitest-autotest"
30
30
  s.add_development_dependency "codeclimate-test-reporter"
31
+ s.add_development_dependency "rubocop"
31
32
  end
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+ gemspec path: ".."
3
+
4
+ gem "rails", '~> 4.0'
@@ -1,89 +1,3 @@
1
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
-
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
@@ -147,6 +147,10 @@ module Browser
147
147
  Weibo.new(ua).match?
148
148
  end
149
149
 
150
+ def alipay?
151
+ Alipay.new(ua).match?
152
+ end
153
+
150
154
  # Detect if browser is Opera Mini.
151
155
  def opera_mini?
152
156
  ua =~ /Opera Mini/
@@ -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
- .satisfied_by?(Gem::Version.create(actual_version))
14
+ .satisfied_by?(Gem::Version.create(actual_version))
15
15
  end
16
16
 
17
17
  def parse_version(version)
18
- version.kind_of?(Numeric) ? "#{version}" : version
18
+ version.kind_of?(Numeric) ? version.to_s : version
19
19
  end
20
20
  end
21
21
  end
@@ -52,8 +52,8 @@ module Browser
52
52
 
53
53
  def subject
54
54
  @subject ||= self.class.matchers
55
- .map {|matcher| matcher.new(ua) }
56
- .find(&:match?)
55
+ .map {|matcher| matcher.new(ua) }
56
+ .find(&:match?)
57
57
  end
58
58
 
59
59
  def id
@@ -4,7 +4,7 @@ module Browser
4
4
  NAMES = {
5
5
  "QuickTime" => "QuickTime",
6
6
  "CoreMedia" => "Apple CoreMedia"
7
- }
7
+ }.freeze
8
8
 
9
9
  def id
10
10
  :generic
@@ -8,7 +8,7 @@ module Browser
8
8
  "6.0" => "10",
9
9
  "7.0" => "11",
10
10
  "8.0" => "12"
11
- }
11
+ }.freeze
12
12
 
13
13
  def id
14
14
  :ie
@@ -17,4 +17,4 @@ module Browser
17
17
  ua =~ /MicroMessenger/i
18
18
  end
19
19
  end
20
- end
20
+ end
@@ -11,7 +11,7 @@ module Browser
11
11
  ACCEPT_REGEX = %r[(text/html|\*/\*)]
12
12
 
13
13
  def initialize(app, &block)
14
- fail ArgumentError, "Browser::Middleware requires a block" unless block
14
+ raise ArgumentError, "Browser::Middleware requires a block" unless block
15
15
 
16
16
  @app = app
17
17
  @block = block
@@ -44,8 +44,8 @@ module Browser
44
44
 
45
45
  def subject
46
46
  @subject ||= self.class.matchers
47
- .map {|matcher| matcher.new(ua) }
48
- .find(&:match?)
47
+ .map {|matcher| matcher.new(ua) }
48
+ .find(&:match?)
49
49
  end
50
50
 
51
51
  def adobe_air?
@@ -3,7 +3,7 @@ module Browser
3
3
  class Platform
4
4
  class Mac < Base
5
5
  def version
6
- (ua[/Mac OS X\s*([0-9_\.]+)?/, 1] || "0").gsub("_", ".")
6
+ (ua[/Mac OS X\s*([0-9_\.]+)?/, 1] || "0").tr("_", ".")
7
7
  end
8
8
 
9
9
  def name
@@ -15,7 +15,9 @@ module Browser
15
15
  end
16
16
 
17
17
  def self.search_engine_user_agents
18
- @search_engine_user_agents ||= YAML.load_file(Browser.root.join("test/ua_search_engines.yml"))
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)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Browser
3
- VERSION = "2.2.0"
3
+ VERSION = "2.3.0".freeze
4
4
  end
@@ -124,8 +124,11 @@ class BrowserTest < Minitest::Test
124
124
  end
125
125
 
126
126
  test "returns all known languages" do
127
- browser = Browser.new("", accept_language: "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3")
128
- assert_equal ["en-US", "en", "pt-BR", "pt"], browser.accept_language.map(&:full)
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
@@ -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: -> (_env) { [200, default_headers, ["ROOT"]] }
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}"]]
@@ -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"
@@ -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
- GOOGLE_STRUCTURED_DATA_TESTING_TOOL: 'Mozilla/5.0 (compatible; X11; Linux x86_64; Google-StructuredDataTestingTool; +http://www.google.com/webmasters/tools/richsnippets)'
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
- MSN_BOT: 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)'
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
- result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1")
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
- result = Browser::AcceptLanguage.parse("fr-CA, fr;q=0.8, en-US;q=0.6,en;q=0.4, *;q=0.1")
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
- result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5")
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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "test_helper"
2
3
 
3
4
  class GenericTest < Minitest::Test
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "test_helper"
2
3
 
3
4
  class MetaTest < Minitest::Test
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.2.0
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-06-20 00:00:00.000000000 Z
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'