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 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'