agentry 3.0.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.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +93 -0
  3. data/LICENSE.md +21 -0
  4. data/README.md +552 -0
  5. data/data/bot_categories.json +1 -0
  6. data/data/bot_exceptions.json +1 -0
  7. data/data/bot_ip_ranges.json +1 -0
  8. data/data/bots.json +1 -0
  9. data/data/languages.json +1 -0
  10. data/data/samsung.json +1 -0
  11. data/data/search_engines.json +1 -0
  12. data/lib/agentry.rb +3 -0
  13. data/lib/browser/accept_language.rb +55 -0
  14. data/lib/browser/action_controller.rb +21 -0
  15. data/lib/browser/aliases.rb +33 -0
  16. data/lib/browser/alipay.rb +21 -0
  17. data/lib/browser/base.rb +307 -0
  18. data/lib/browser/blackberry.rb +23 -0
  19. data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
  20. data/lib/browser/bot/ip_ranges.rb +194 -0
  21. data/lib/browser/bot/keyword_matcher.rb +11 -0
  22. data/lib/browser/bot/known_bots_matcher.rb +11 -0
  23. data/lib/browser/bot.rb +221 -0
  24. data/lib/browser/browser.rb +200 -0
  25. data/lib/browser/cache.rb +92 -0
  26. data/lib/browser/chrome.rb +43 -0
  27. data/lib/browser/client_hints.rb +73 -0
  28. data/lib/browser/cloudflare.rb +65 -0
  29. data/lib/browser/detect_version.rb +22 -0
  30. data/lib/browser/detection.rb +25 -0
  31. data/lib/browser/device/android.rb +20 -0
  32. data/lib/browser/device/base.rb +13 -0
  33. data/lib/browser/device/blackberry_playbook.rb +19 -0
  34. data/lib/browser/device/ipad.rb +19 -0
  35. data/lib/browser/device/iphone.rb +19 -0
  36. data/lib/browser/device/ipod_touch.rb +19 -0
  37. data/lib/browser/device/kindle.rb +19 -0
  38. data/lib/browser/device/kindle_fire.rb +19 -0
  39. data/lib/browser/device/playstation3.rb +19 -0
  40. data/lib/browser/device/playstation4.rb +19 -0
  41. data/lib/browser/device/psp.rb +19 -0
  42. data/lib/browser/device/psvita.rb +19 -0
  43. data/lib/browser/device/samsung.rb +33 -0
  44. data/lib/browser/device/surface.rb +23 -0
  45. data/lib/browser/device/switch.rb +19 -0
  46. data/lib/browser/device/tv.rb +19 -0
  47. data/lib/browser/device/unknown.rb +19 -0
  48. data/lib/browser/device/wii.rb +19 -0
  49. data/lib/browser/device/wiiu.rb +19 -0
  50. data/lib/browser/device/xbox_360.rb +19 -0
  51. data/lib/browser/device/xbox_one.rb +19 -0
  52. data/lib/browser/device.rb +246 -0
  53. data/lib/browser/duck_duck_go.rb +22 -0
  54. data/lib/browser/edge.rb +25 -0
  55. data/lib/browser/electron.rb +22 -0
  56. data/lib/browser/epiphany.rb +21 -0
  57. data/lib/browser/facebook.rb +23 -0
  58. data/lib/browser/firefox.rb +21 -0
  59. data/lib/browser/google_search_app.rb +21 -0
  60. data/lib/browser/huawei_browser.rb +21 -0
  61. data/lib/browser/instagram.rb +21 -0
  62. data/lib/browser/internet_explorer.rb +63 -0
  63. data/lib/browser/maxthon.rb +21 -0
  64. data/lib/browser/meta/base.rb +42 -0
  65. data/lib/browser/meta/device.rb +11 -0
  66. data/lib/browser/meta/generic_browser.rb +15 -0
  67. data/lib/browser/meta/id.rb +11 -0
  68. data/lib/browser/meta/ie.rb +20 -0
  69. data/lib/browser/meta/ios.rb +11 -0
  70. data/lib/browser/meta/mobile.rb +11 -0
  71. data/lib/browser/meta/platform.rb +11 -0
  72. data/lib/browser/meta/proxy.rb +11 -0
  73. data/lib/browser/meta/safari.rb +11 -0
  74. data/lib/browser/meta/tablet.rb +11 -0
  75. data/lib/browser/meta/webkit.rb +11 -0
  76. data/lib/browser/meta.rb +14 -0
  77. data/lib/browser/micro_messenger.rb +21 -0
  78. data/lib/browser/middleware/context/additions.rb +18 -0
  79. data/lib/browser/middleware/context/url_methods.rb +15 -0
  80. data/lib/browser/middleware/context.rb +23 -0
  81. data/lib/browser/middleware.rb +70 -0
  82. data/lib/browser/miui_browser.rb +21 -0
  83. data/lib/browser/nokia.rb +21 -0
  84. data/lib/browser/opera.rb +21 -0
  85. data/lib/browser/otter.rb +21 -0
  86. data/lib/browser/phantom_js.rb +21 -0
  87. data/lib/browser/platform/adobe_air.rb +23 -0
  88. data/lib/browser/platform/android.rb +23 -0
  89. data/lib/browser/platform/base.rb +18 -0
  90. data/lib/browser/platform/blackberry.rb +23 -0
  91. data/lib/browser/platform/chrome_os.rb +23 -0
  92. data/lib/browser/platform/firefox_os.rb +23 -0
  93. data/lib/browser/platform/ios.rb +36 -0
  94. data/lib/browser/platform/kai_os.rb +23 -0
  95. data/lib/browser/platform/linux.rb +23 -0
  96. data/lib/browser/platform/mac.rb +25 -0
  97. data/lib/browser/platform/unknown.rb +23 -0
  98. data/lib/browser/platform/windows.rb +23 -0
  99. data/lib/browser/platform/windows_mobile.rb +23 -0
  100. data/lib/browser/platform/windows_phone.rb +23 -0
  101. data/lib/browser/platform.rb +220 -0
  102. data/lib/browser/qq.rb +25 -0
  103. data/lib/browser/rails.rb +24 -0
  104. data/lib/browser/safari.rb +40 -0
  105. data/lib/browser/samsung_browser.rb +21 -0
  106. data/lib/browser/snapchat.rb +21 -0
  107. data/lib/browser/sougou_browser.rb +24 -0
  108. data/lib/browser/sputnik.rb +21 -0
  109. data/lib/browser/testing.rb +29 -0
  110. data/lib/browser/uc_browser.rb +21 -0
  111. data/lib/browser/unknown.rb +32 -0
  112. data/lib/browser/version.rb +5 -0
  113. data/lib/browser/weibo.rb +21 -0
  114. data/lib/browser/yandex.rb +21 -0
  115. data/lib/browser.rb +4 -0
  116. data/test/ua.yml +181 -0
  117. data/test/ua_bots.yml +121 -0
  118. data/test/ua_search_engines.yml +7 -0
  119. metadata +274 -0
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ module DetectVersion
5
+ private def detect_version?(actual_version, expected_version)
6
+ return true unless expected_version
7
+ return false unless actual_version
8
+
9
+ expected_version = parse_version(expected_version)
10
+ actual_version = parse_version(actual_version)
11
+
12
+ Gem::Requirement.create(expected_version)
13
+ .satisfied_by?(Gem::Version.create(actual_version))
14
+ rescue ArgumentError
15
+ false
16
+ end
17
+
18
+ private def parse_version(version)
19
+ version.is_a?(Numeric) ? version.to_s : version
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ # What a user agent is detected as, shared by every browser built from it
5
+ # while it stays in the cache. Each answer is computed on first use.
6
+ class Detection
7
+ attr_accessor :browser_class
8
+
9
+ def initialize(ua)
10
+ @ua = ua
11
+ end
12
+
13
+ def platform
14
+ @platform ||= Platform.new(@ua)
15
+ end
16
+
17
+ def device
18
+ @device ||= Device.new(@ua, platform:)
19
+ end
20
+
21
+ def bot
22
+ @bot ||= Bot.new(@ua)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Android < Base
6
+ def id
7
+ :unknown
8
+ end
9
+
10
+ def name
11
+ ua[/\(Linux.*?; Android.*?; ([-_a-z0-9 ]+) Build[^)]+\)/i, 1] ||
12
+ "Unknown"
13
+ end
14
+
15
+ def match?
16
+ ua.include?("Android")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Base
6
+ attr_reader :ua
7
+
8
+ def initialize(ua)
9
+ @ua = ua
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class BlackBerryPlaybook < Base
6
+ def id
7
+ :playbook
8
+ end
9
+
10
+ def name
11
+ "BlackBerry Playbook"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/PlayBook.*?RIM Tablet/)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Ipad < Base
6
+ def id
7
+ :ipad
8
+ end
9
+
10
+ def name
11
+ "iPad"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("iPad")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Iphone < Base
6
+ def id
7
+ :iphone
8
+ end
9
+
10
+ def name
11
+ "iPhone"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("iPhone")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class IpodTouch < Base
6
+ def id
7
+ :ipod_touch
8
+ end
9
+
10
+ def name
11
+ "iPod Touch"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("iPod")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Kindle < Base
6
+ def id
7
+ :kindle
8
+ end
9
+
10
+ def name
11
+ "Kindle"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("Kindle")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class KindleFire < Base
6
+ def id
7
+ :kindle_fire
8
+ end
9
+
10
+ def name
11
+ "Kindle Fire"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Kindle Fire|KFTT/)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class PlayStation3 < Base
6
+ def id
7
+ :ps3
8
+ end
9
+
10
+ def name
11
+ "PlayStation 3"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/PLAYSTATION 3/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class PlayStation4 < Base
6
+ def id
7
+ :ps4
8
+ end
9
+
10
+ def name
11
+ "PlayStation 4"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/PLAYSTATION 4/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class PSP < Base
6
+ def id
7
+ :psp
8
+ end
9
+
10
+ def name
11
+ "PlayStation Portable"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("PlayStation Portable")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class PSVita < Base
6
+ def id
7
+ :psvita
8
+ end
9
+
10
+ def name
11
+ "PlayStation Vita"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("Playstation Vita")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Samsung < Base
6
+ REGEX = /\(Linux.*?; Android.*?; (SAMSUNG )?(SM-[A-Z0-9]+).*?\)/i
7
+
8
+ def self.names
9
+ @names ||= Browser.load_data("samsung")
10
+ end
11
+
12
+ def id
13
+ :samsung
14
+ end
15
+
16
+ def name
17
+ "Samsung #{self.class.names[code] || code}"
18
+ end
19
+
20
+ def code
21
+ matches && matches[2]
22
+ end
23
+
24
+ def matches
25
+ @matches ||= ua.match(REGEX)
26
+ end
27
+
28
+ def match?
29
+ !!matches
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Surface < Base
6
+ def id
7
+ :surface
8
+ end
9
+
10
+ def name
11
+ "Microsoft Surface"
12
+ end
13
+
14
+ def match?
15
+ ua.include?("Touch") && platform.windows_rt?
16
+ end
17
+
18
+ private def platform
19
+ @platform ||= Platform.new(ua)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Switch < Base
6
+ def id
7
+ :switch
8
+ end
9
+
10
+ def name
11
+ "Nintendo Switch"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Nintendo Switch/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class TV < Base
6
+ def id
7
+ :tv
8
+ end
9
+
10
+ def name
11
+ "TV"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/(\btv|Android.*?ADT-1|Nexus Player)/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Unknown < Base
6
+ def id
7
+ :unknown_device
8
+ end
9
+
10
+ def name
11
+ "Unknown"
12
+ end
13
+
14
+ def match?
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Wii < Base
6
+ def id
7
+ :wii
8
+ end
9
+
10
+ def name
11
+ "Nintendo Wii"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Nintendo Wii/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class WiiU < Base
6
+ def id
7
+ :wiiu
8
+ end
9
+
10
+ def name
11
+ "Nintendo WiiU"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Nintendo WiiU/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class Xbox360 < Base
6
+ def id
7
+ :xbox_360
8
+ end
9
+
10
+ def name
11
+ "Xbox 360"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Xbox/i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Device
5
+ class XboxOne < Base
6
+ def id
7
+ :xbox_one
8
+ end
9
+
10
+ def name
11
+ "Xbox One"
12
+ end
13
+
14
+ def match?
15
+ ua.match?(/Xbox One/i)
16
+ end
17
+ end
18
+ end
19
+ end