browser-1.0.1/0000755000004100000410000000000012572742323013233 5ustar www-datawww-databrowser-1.0.1/Rakefile0000644000004100000410000000101712572742323014677 0ustar www-datawww-datarequire "bundler" require "bundler/setup" Bundler::GemHelper.install_tasks require "rake/testtask" Rake::TestTask.new(:spec) do |t| t.libs << "lib" t.libs << "test" t.test_files = FileList["test/**/*_spec.rb"] t.verbose = true t.ruby_opts = %w[-rubygems] end desc "Run specs against all gemfiles" task "spec:all" do %w[ Gemfile gemfiles/rails3.gemfile ].each do |gemfile| puts "=> Running with Gemfile: #{gemfile}" system "BUNDLE_GEMFILE=#{gemfile} rake spec" end end task :default => "spec" browser-1.0.1/Gemfile0000644000004100000410000000004512572742323014525 0ustar www-datawww-datasource "http://rubygems.org" gemspec browser-1.0.1/languages.yml0000644000004100000410000000470212572742323015727 0ustar www-datawww-data"af": "Afrikaans" "sq": "Albanian" "eu": "Basque" "bg": "Bulgarian" "be": "Byelorussian" "ca": "Catalan" "zh": "Chinese" "zh-cn": "Chinese/China" "zh-tw": "Chinese/Taiwan" "zh-hk": "Chinese/Hong Kong" "zh-sg": "Chinese/singapore" "hr": "Croatian" "cs": "Czech" "da": "Danish" "nl": "Dutch" "nl-nl": "Dutch/Netherlands" "nl-be": "Dutch/Belgium" "en": "English" "en-gb": "English/United Kingdom" "en-us": "English/United States" "en-au": "English/Australian" "en-ca": "English/Canada" "en-nz": "English/New Zealand" "en-ie": "English/Ireland" "en-za": "English/South Africa" "en-jm": "English/Jamaica" "en-bz": "English/Belize" "en-tt": "English/Trinidad" "et": "Estonian" "fo": "Faeroese" "fa": "Farsi" "fi": "Finnish" "fr": "French" "fr-be": "French/Belgium" "fr-fr": "French/France" "fr-ch": "French/Switzerland" "fr-ca": "French/Canada" "fr-lu": "French/Luxembourg" "gd": "Gaelic" "gl": "Galician" "de": "German" "de-at": "German/Austria" "de-de": "German/Germany" "de-ch": "German/Switzerland" "de-lu": "German/Luxembourg" "de-li": "German/Liechtenstein" "el": "Greek" "he": "Hebrew" "he-il": "Hebrew/Israel" "hi": "Hindi" "hu": "Hungarian" "ie-ee": "Internet Explorer/Easter Egg" "is": "Icelandic" "id": "Indonesian" "in": "Indonesian" "ga": "Irish" "it": "Italian" "it-ch": "Italian/ Switzerland" "ja": "Japanese" "km": "Khmer" "km-kh": "Khmer/Cambodia" "ko": "Korean" "lv": "Latvian" "lt": "Lithuanian" "mk": "Macedonian" "ms": "Malaysian" "mt": "Maltese" "no": "Norwegian" "pl": "Polish" "pt": "Portuguese" "pt-br": "Portuguese/Brazil" "rm": "Rhaeto-Romanic" "ro": "Romanian" "ro-mo": "Romanian/Moldavia" "ru": "Russian" "ru-mo": "Russian /Moldavia" "gd": "Scots Gaelic" "sr": "Serbian" "sk": "Slovack" "sl": "Slovenian" "sb": "Sorbian" "es": "Spanish" "es-do": "Spanish" "es-ar": "Spanish/Argentina" "es-co": "Spanish/Colombia" "es-mx": "Spanish/Mexico" "es-es": "Spanish/Spain" "es-gt": "Spanish/Guatemala" "es-cr": "Spanish/Costa Rica" "es-pa": "Spanish/Panama" "es-ve": "Spanish/Venezuela" "es-pe": "Spanish/Peru" "es-ec": "Spanish/Ecuador" "es-cl": "Spanish/Chile" "es-uy": "Spanish/Uruguay" "es-py": "Spanish/Paraguay" "es-bo": "Spanish/Bolivia" "es-sv": "Spanish/El salvador" "es-hn": "Spanish/Honduras" "es-ni": "Spanish/Nicaragua" "es-pr": "Spanish/Puerto Rico" "sx": "Sutu" "sv": "Swedish" "sv-se": "Swedish/Sweden" "sv-fi": "Swedish/Finland" "ts": "Thai" "tn": "Tswana" "tr": "Turkish" "uk": "Ukrainian" "ur": "Urdu" "vi": "Vietnamese" "xh": "Xshosa" "ji": "Yiddish" "zu": "Zulu" browser-1.0.1/.hound.yml0000644000004100000410000000224412572742323015153 0ustar www-datawww-dataClassLength: Enabled: false CyclomaticComplexity: Enabled: false Documentation: Enabled: false Encoding: Enabled: false FileName: Enabled: false IfUnlessModifier: Enabled: false MethodLength: Enabled: false ModuleFunction: Enabled: false OneLineConditional: Enabled: false ParameterLists: Enabled: false Proc: Enabled: false SingleLineBlockParams: Enabled: false VariableInterpolation: Enabled: false TrailingComma: Enabled: false WhileUntilModifier: Enabled: false PredicateName: NamePrefixBlacklist: - is_ StringLiterals: EnforcedStyle: double_quotes SupportedStyles: - single_quotes - double_quotes DotPosition: EnforcedStyle: leading SpaceBeforeBlockBraces: EnforcedStyle: space SpaceInsideBlockBraces: EnforcedStyle: no_space DoubleNegation: Enabled: false SpaceInsideBlockBraces: SpaceBeforeBlockParameters: false LineLength: Max: 130 RegexpLiteral: MaxSlashes: 0 SpaceInsideHashLiteralBraces: Enabled: false PercentLiteralDelimiters: PreferredDelimiters: '%': '[]' '%i': '[]' '%q': '[]' '%Q': '[]' '%r': '[]' '%s': '[]' '%w': '[]' '%W': '[]' '%x': '[]' browser-1.0.1/.travis.yml0000644000004100000410000000027412572742323015347 0ustar www-datawww-datalanguage: ruby sudo: false cache: bundler rvm: - '2.2' - '2.1' - '2.0' gemfile: - Gemfile - gemfiles/rails3.gemfile script: "bundle exec rake spec" notifications: email: false browser-1.0.1/lib/0000755000004100000410000000000012572742323014001 5ustar www-datawww-databrowser-1.0.1/lib/browser.rb0000644000004100000410000001217212572742323016014 0ustar www-datawww-datarequire "set" require "yaml" require "pathname" require "browser/middleware" require "browser/middleware/context" require "browser/rails" if defined?(::Rails) require "browser/methods/ie" require "browser/methods/platform" require "browser/methods/mobile" require "browser/methods/devices" require "browser/methods/consoles" require "browser/methods/language" require "browser/methods/bots" require "browser/methods/tv" require "browser/meta/base" require "browser/meta/generic_browser" require "browser/meta/id" require "browser/meta/ie" require "browser/meta/ios" require "browser/meta/mobile" require "browser/meta/modern" require "browser/meta/platform" require "browser/meta/safari" require "browser/meta/webkit" class Browser include IE include Platform include Mobile include Devices include Consoles include Language include Bots include Tv # Set browser's UA string. attr_accessor :user_agent alias_method :ua, :user_agent alias_method :ua=, :user_agent= NAMES = { edge: "Microsoft Edge", # Must come before everything ie: "Internet Explorer", # Must come before android chrome: "Chrome", # Must come before android firefox: "Firefox", # Must come before android android: "Android", blackberry: "BlackBerry", core_media: "Apple CoreMedia", ipad: "iPad", iphone: "iPhone", ipod: "iPod Touch", nintendo: "Nintendo", opera: "Opera", phantom_js: "PhantomJS", psp: "PlayStation Portable", playstation: "PlayStation", quicktime: "QuickTime", safari: "Safari", xbox: "Xbox", # This must be last item, since Ruby 1.9+ has ordered keys. other: "Other", } VERSIONS = { edge: %r[Edge/([\d.]+)], chrome: %r[(?:Chrome|CriOS)/([\d.]+)], default: %r[(?:Version|MSIE|Firefox|QuickTime|BlackBerry[^/]+|CoreMedia v|PhantomJS|AdobeAIR)[/ ]?([a-z0-9.]+)]i, opera: %r[(?:Opera/.*? Version/([\d.]+)|Chrome/.*?OPR/([\d.]+))], ie: %r[(?:MSIE |Trident/.*?; rv:)([\d.]+)] } # Define the rules which define a modern browser. # A rule must be a proc/lambda or any object that implements the method # === and accepts the browser object. # # To redefine all rules, clear the existing rules before adding your own. # # # Only Chrome Canary is considered modern. # Browser.modern_rules.clear # Browser.modern_rules << -> b { b.chrome? && b.version >= '37' } # def self.modern_rules @modern_rules ||= [] end self.modern_rules.tap do |rules| rules << -> b { b.webkit? } rules << -> b { b.firefox? && b.version.to_i >= 17 } rules << -> b { b.ie? && b.version.to_i >= 9 && !b.compatibility_view? } rules << -> b { b.edge? && !b.compatibility_view? } rules << -> b { b.opera? && b.version.to_i >= 12 } rules << -> b { b.firefox? && b.tablet? && b.android? && b.version.to_i >= 14 } end # Create a new browser instance and set # the UA and Accept-Language headers. # # browser = Browser.new({ # :ua => "Safari", # :accept_language => "pt-br" # }) # def initialize(options = {}, &block) self.user_agent = (options[:user_agent] || options[:ua]).to_s self.accept_language = options[:accept_language].to_s yield self if block end # Get readable browser name. def name NAMES[id] end # Get the browser identifier. def id NAMES.keys .find {|id| respond_to?("#{id}?") ? public_send("#{id}?") : id } end # Return major version. def version if ie? ie_version else full_version.to_s.split(".").first end end # Return the full version. def full_version if ie? ie_full_version else _, *v = *ua.match(VERSIONS.fetch(id, VERSIONS[:default])) v.compact.first || "0.0" end end # Return true if browser is modern (Webkit, Firefox 17+, IE9+, Opera 12+). def modern? self.class.modern_rules.any? {|rule| rule === self } end # Detect if browser is WebKit-based. def webkit? ua =~ /AppleWebKit/i && !edge? end # Detect if browser is QuickTime def quicktime? !!(ua =~ /QuickTime/i) end # Detect if browser is Apple CoreMedia. def core_media? !!(ua =~ /CoreMedia/) end # Detect if browser is PhantomJS def phantom_js? !!(ua =~ /PhantomJS/) end # Detect if browser is Safari. def safari? (ua =~ /Safari/ || safari_webapp_mode?) && ua !~ /Android|Chrome|CriOS|PhantomJS/ end def safari_webapp_mode? (ipad? || iphone?) && ua =~ /AppleWebKit/ end # Detect if browser is Firefox. def firefox? !!(ua =~ /Firefox/) end # Detect if browser is Chrome. def chrome? ua =~ /Chrome|CriOS/ && !opera? && !edge? end # Detect if browser is Opera. def opera? !!(ua =~ /(Opera|OPR)/) end # Detect if browser is Silk. def silk? !!(ua =~ /Silk/) end def known? id != :other end # Return a meta info about this browser. def meta Meta.constants.each_with_object(Set.new) do |meta_name, meta| meta_class = Meta.const_get(meta_name) meta.merge(meta_class.new(self).to_a) end.to_a end alias_method :to_a, :meta # Return meta representation as string. def to_s meta.to_a.join(" ") end end browser-1.0.1/lib/browser/0000755000004100000410000000000012572742323015464 5ustar www-datawww-databrowser-1.0.1/lib/browser/middleware/0000755000004100000410000000000012572742323017601 5ustar www-datawww-databrowser-1.0.1/lib/browser/middleware/context/0000755000004100000410000000000012572742323021265 5ustar www-datawww-databrowser-1.0.1/lib/browser/middleware/context/additions.rb0000644000004100000410000000046312572742323023573 0ustar www-datawww-datarequire "browser/middleware/context/url_methods" class Browser class Middleware class Context module Additions extend ActiveSupport::Concern included do include Rails.application.routes.url_helpers include UrlMethods end end end end end browser-1.0.1/lib/browser/middleware/context/url_methods.rb0000644000004100000410000000044012572742323024135 0ustar www-datawww-dataclass Browser class Middleware class Context module UrlMethods def default_url_options Rails.configuration.browser.default_url_options || Rails.configuration.action_mailer.default_url_options || {} end end end end end browser-1.0.1/lib/browser/middleware/context.rb0000644000004100000410000000060612572742323021614 0ustar www-datawww-dataclass Browser class Middleware class Context attr_reader :browser, :request def initialize(request) @request = request @browser = Browser.new( ua: request.user_agent, accept_language: request.env["HTTP_ACCEPT_LANGUAGE"] ) end def redirect_to(path) throw :redirected, path.to_s end end end end browser-1.0.1/lib/browser/meta/0000755000004100000410000000000012572742323016412 5ustar www-datawww-databrowser-1.0.1/lib/browser/meta/webkit.rb0000644000004100000410000000020312572742323020217 0ustar www-datawww-dataclass Browser module Meta class Webkit < Base def meta "webkit" if browser.webkit? end end end end browser-1.0.1/lib/browser/meta/id.rb0000644000004100000410000000015612572742323017335 0ustar www-datawww-dataclass Browser module Meta class Id < Base def meta browser.id end end end end browser-1.0.1/lib/browser/meta/modern.rb0000644000004100000410000000020312572742323020216 0ustar www-datawww-dataclass Browser module Meta class Modern < Base def meta "modern" if browser.modern? end end end end browser-1.0.1/lib/browser/meta/generic_browser.rb0000644000004100000410000000040512572742323022115 0ustar www-datawww-dataclass Browser module Meta class GenericBrowser < Base def meta "#{browser.id} #{browser.id}#{browser.version}" if generic? end private def generic? !browser.safari? && !browser.chrome? end end end end browser-1.0.1/lib/browser/meta/ios.rb0000644000004100000410000000017212572742323017531 0ustar www-datawww-dataclass Browser module Meta class IOS < Base def meta "ios" if browser.ios? end end end end browser-1.0.1/lib/browser/meta/ie.rb0000644000004100000410000000050212572742323017331 0ustar www-datawww-dataclass Browser module Meta class IE < Base def version @version ||= browser.version.to_i end def meta return unless browser.ie? meta = "" meta << "oldie lt-ie8 lt-ie9" if version < 8 meta << "lt-ie9" if version == 8 meta end end end end browser-1.0.1/lib/browser/meta/platform.rb0000644000004100000410000000017212572742323020563 0ustar www-datawww-dataclass Browser module Meta class Platform < Base def meta browser.platform end end end end browser-1.0.1/lib/browser/meta/safari.rb0000644000004100000410000000023412572742323020203 0ustar www-datawww-dataclass Browser module Meta class Safari < Base def meta "safari safari#{browser.version}" if browser.safari? end end end end browser-1.0.1/lib/browser/meta/base.rb0000644000004100000410000000045012572742323017650 0ustar www-datawww-dataclass Browser module Meta class Base # Set the browser instance. attr_reader :browser def initialize(browser) @browser = browser end def meta nil end def to_a meta.to_s.squeeze(" ").split(" ") end end end end browser-1.0.1/lib/browser/meta/mobile.rb0000644000004100000410000000020312572742323020201 0ustar www-datawww-dataclass Browser module Meta class Mobile < Base def meta "mobile" if browser.mobile? end end end end browser-1.0.1/lib/browser/methods/0000755000004100000410000000000012572742323017127 5ustar www-datawww-databrowser-1.0.1/lib/browser/methods/devices.rb0000644000004100000410000000150512572742323021077 0ustar www-datawww-dataclass Browser module Devices # Detect if browser is iPhone. def iphone? !!(ua =~ /iPhone/) end # Detect if browser is iPad. def ipad? !!(ua =~ /iPad/) end # Detect if browser is iPod. def ipod? !!(ua =~ /iPod/) end def surface? windows_rt? && !!(ua =~ /Touch/) end # Detect if browser is tablet (currently iPad, Android, Surface or Playbook). def tablet? !!(ipad? || (android? && !detect_mobile?) || surface? || playbook?) end # Detect if browser is Kindle. def kindle? !!(ua =~ /Kindle/ || silk?) end # Detect if browser if a Blackberry Playbook tablet def playbook? !!(ua =~ /PlayBook/ && ua =~ /RIM Tablet/) end def windows_touchscreen_desktop? windows? && !!(ua =~ /Touch/) end end end browser-1.0.1/lib/browser/methods/bots.rb0000644000004100000410000000142312572742323020423 0ustar www-datawww-dataclass Browser module Bots root = Pathname.new(File.expand_path("../../../..", __FILE__)) BOTS = YAML.load_file(root.join("bots.yml")) SEARCH_ENGINES = YAML.load_file(root.join("search_engines.yml")) def self.detect_empty_ua! @detect_empty_ua = true end def self.detect_empty_ua? !!@detect_empty_ua end def bot? bot_with_empty_ua? || BOTS.any? {|key, _| ua.include?(key) } end def bot_name return unless bot? return "Generic Bot" if bot_with_empty_ua? BOTS.find {|key, _| ua.include?(key) }.first end def search_engine? SEARCH_ENGINES.any? {|key, _| ua.include?(key) } end private def bot_with_empty_ua? Browser::Bots.detect_empty_ua? && ua.strip == "" end end end browser-1.0.1/lib/browser/methods/ie.rb0000644000004100000410000000360112572742323020051 0ustar www-datawww-dataclass Browser module IE TRIDENT_VERSION_REGEX = %r[Trident/([0-9.]+)] MODERN_IE = %r[Trident/.*?; rv:(.*?)] MSIE = %r{MSIE ([\d.]+)|Trident/.*?; rv:([\d.]+)} EDGE = %r{(Edge/[\d.]+|Trident/8)} # https://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx#TriToken TRIDENT_MAPPING = { "4.0" => "8", "5.0" => "9", "6.0" => "10", "7.0" => "11", "8.0" => "12" } def ie_version TRIDENT_MAPPING[trident_version] || msie_version end def ie_full_version "#{ie_version}.0" end def msie_full_version (ua.match(MSIE) && ($1 || $2)) || "0.0" end def msie_version msie_full_version.to_s.split(".").first || "0" end # Return the trident version. def trident_version ua.match(TRIDENT_VERSION_REGEX) && $1 end # Detect if browser is Internet Explorer. def ie? msie? || modern_ie? end # Detect if browser is Internet Explorer 6. def ie6? ie? && version == "6" end # Detect if browser is Internet Explorer 7. def ie7? ie? && version == "7" end # Detect if browser is Internet Explorer 8. def ie8? ie? && version == "8" end # Detect if browser is Internet Explorer 9. def ie9? ie? && version == "9" end # Detect if browser is Internet Explorer 10. def ie10? ie? && version == "10" end # Detect if browser is Internet Explorer 11. def ie11? ie? && version == "11" end # Detect if browser is Microsoft Edge. def edge? !!(ua =~ EDGE) end # Detect if IE is running in compatibility mode. def compatibility_view? ie? && trident_version && msie_version.to_i < (trident_version.to_i + 4) end private def msie? !!(ua =~ /MSIE/ && ua !~ /Opera/) end def modern_ie? !!(ua =~ MODERN_IE) end end end browser-1.0.1/lib/browser/methods/platform.rb0000644000004100000410000000550412572742323021304 0ustar www-datawww-dataclass Browser module Platform # Detect if browser is Android. def android? !!(ua =~ /Android/ && !opera?) end # Detect if browser is ios?. def ios? ipod? || ipad? || iphone? end # Detect if is iOS4. def ios4? ios? && !!(ua =~ /OS 4/) end # Detect if is iOS5. def ios5? ios? && !!(ua =~ /OS 5/) end # Detect if is iOS6. def ios6? ios? && !!(ua =~ /OS 6/) end # Detect if is iOS7. def ios7? ios? && !!(ua =~ /OS 7/) end # Detect if is iOS8. def ios8? ios? && !!(ua =~ /OS 8/) end # Detect if is BlackBerry 4. def blackberry4? blackberry? && !!(ua =~ %r[BlackBerry\d+/4]) end # Detect if is BlackBerry 5. def blackberry5? blackberry? && !!(ua =~ %r[BlackBerry\d+/5]) end # Detect if is BlackBerry 6. def blackberry6? blackberry? && !!(ua =~ %r[Version/6]) end # Detect if is BlackBerry 7. def blackberry7? blackberry? && !!(ua =~ %r[Version/7]) end # Detect if is BlackBerry 10. def blackberry10? !!(ua =~ /BB10/) end # Detect if current platform is Macintosh. def mac? !!(ua =~ /Mac OS X/ && !ios?) end # Detect if current platform is Windows. def windows? !!(ua =~ /Windows/) end ## More info here => http://msdn.microsoft.com/fr-FR/library/ms537503.aspx#PltToken def windows_xp? windows? && !!(ua =~ /Windows NT 5.1/) end def windows_vista? windows? && !!(ua =~ /Windows NT 6.0/) end def windows7? windows? && !!(ua =~ /Windows NT 6.1/) end def windows8? windows? && !!(ua =~ /Windows NT 6.[2-3]/) end def windows8_1? windows? && !!(ua =~ /Windows NT 6\.3/) end def windows10? windows? && !!(ua =~ /Windows NT 10/) end def windows_rt? windows8? && !!(ua =~ /ARM/) end # Detect if current platform is Windows Mobile. def windows_mobile? !!(ua =~ /Windows CE/) end # Detect if current platform is Windows Phone. def windows_phone? !!(ua =~ /Windows Phone/) end # Detect if current platform is Windows in 64-bit architecture. def windows_x64? windows? && !!(ua =~ /(Win64|x64)/) && !!(ua =~ /x64/) end def windows_wow64? windows? && !!(ua =~ /WOW64/i) end def windows_x64_inclusive? windows_x64? || windows_wow64? end # Detect if current platform is Linux flavor. def linux? !!(ua =~ /Linux/) end # Detect if current platform is ChromeOS def chrome_os? !!(ua =~ /CrOS/) end # Return the platform. def platform case when linux? then :linux when mac? then :mac when windows? then :windows else :other end end end end browser-1.0.1/lib/browser/methods/consoles.rb0000644000004100000410000000164212572742323021304 0ustar www-datawww-dataclass Browser module Consoles # Detect if browser is running under Xbox. def xbox? !!(ua =~ /xbox/i) end # Detect if browser is running under Xbox One. def xbox_one? !!(ua =~ /xbox one/i) end # Detect if browser is running under PlayStation. def playstation? !!(ua =~ /playstation/i) end # Detect if browser is running under PlayStation 4. def playstation4? !!(ua =~ /playstation 4/i) end # Detect if browser is Nintendo. def nintendo? !!(ua =~ /nintendo/i) end # Detect if browser is console (currently Xbox, PlayStation, or Nintendo). def console? xbox? || playstation? || nintendo? end # Detect if browser is running from PSP. def psp? !!(ua =~ /(PSP)/ || psp_vita?) end # Detect if browser is running from PSP Vita. def psp_vita? !!(ua =~ /Playstation Vita/) end end end browser-1.0.1/lib/browser/methods/tv.rb0000644000004100000410000000016412572742323020106 0ustar www-datawww-dataclass Browser module Tv # Detect if browser is Television def tv? !!(ua =~ /tv/i) end end end browser-1.0.1/lib/browser/methods/language.rb0000644000004100000410000000066312572742323021244 0ustar www-datawww-dataclass Browser module Language LANGUAGES = YAML.load_file(File.expand_path("../../../../languages.yml", __FILE__)) # Set browser's preferred language attr_writer :accept_language # Return an array with all preferred languages that this browser accepts. def accept_language @accept_language .gsub(/;q=[\d.]+/, "") .split(",") .map {|l| l.downcase.gsub(/\s/m, "") } end end end browser-1.0.1/lib/browser/methods/mobile.rb0000644000004100000410000000477512572742323020740 0ustar www-datawww-dataclass Browser module Mobile # Detect if browser is mobile. def mobile? detect_mobile? && !tablet? end # Detect if browser is Opera Mini. def opera_mini? !!(ua =~ /Opera Mini/) end # Detect if browser is BlackBerry def blackberry? !!(ua =~ /(BlackBerry)/) end # Detect if browser is Adobe AIR. def adobe_air? !!(ua =~ /adobeair/i) end private # Regex taken from http://detectmobilebrowsers.com def detect_mobile? !!( psp? || /zunewp7/i.match(ua) || /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.match(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.match(ua[0..3]) ) end end end browser-1.0.1/lib/browser/version.rb0000644000004100000410000000017512572742323017501 0ustar www-datawww-dataclass Browser module Version MAJOR = 1 MINOR = 0 PATCH = 1 STRING = "#{MAJOR}.#{MINOR}.#{PATCH}" end end browser-1.0.1/lib/browser/middleware.rb0000644000004100000410000000266712572742323020141 0ustar www-datawww-datarequire "uri" class Browser class Middleware # Detect the most common assets. ASSETS_REGEX = /\.(css|png|jpe?g|gif|js|svg|ico|flv|mov|m4v|ogg|swf)\z/i # Detect the ACCEPT header. IE8 send */*. ACCEPT_REGEX = %r[(text/html|\*/\*)] def initialize(app, &block) fail ArgumentError, "Browser::Middleware requires a block" unless block @app = app @block = block end def call(env) request = Rack::Request.new(env) # Only apply verification on HTML requests. # This ensures that images, CSS and JavaScript # will be rendered. return run_app(env) unless process?(request) path = catch(:redirected) do Context.new(request).instance_eval(&@block) end # No path, no match. return run_app(env) unless path resolve_redirection(env, request.path, path) end def resolve_redirection(env, current_path, path) uri = URI.parse(path) if uri.path == current_path run_app(env) else redirect(path) end end def redirect(path) [302, {"Content-Type" => "text/html", "Location" => path}, []] end def run_app(env) @app.call(env) end def process?(request) html?(request) && !assets?(request) end def html?(request) request.env["HTTP_ACCEPT"].to_s.match(ACCEPT_REGEX) end def assets?(request) request.path.match(ASSETS_REGEX) end end end browser-1.0.1/lib/browser/action_controller.rb0000644000004100000410000000054412572742323021534 0ustar www-datawww-datarequire "action_controller/railtie" class Browser module ActionController extend ActiveSupport::Concern included do helper_method :browser end private def browser @browser ||= Browser.new( accept_language: request.headers["Accept-Language"], ua: request.headers["User-Agent"] ) end end end browser-1.0.1/lib/browser/rails.rb0000644000004100000410000000064412572742323017127 0ustar www-datawww-datarequire "rails/railtie" require "browser/action_controller" require "browser/middleware/context/additions" class Browser class Railtie < Rails::Railtie config.browser = ActiveSupport::OrderedOptions.new initializer "browser" do ::ActionController::Base.send :include, Browser::ActionController Browser::Middleware::Context.send :include, Browser::Middleware::Context::Additions end end end browser-1.0.1/gemfiles/0000755000004100000410000000000012572742323015026 5ustar www-datawww-databrowser-1.0.1/gemfiles/rails3.gemfile0000644000004100000410000000011312572742323017550 0ustar www-datawww-datasource "https://rubygems.org" gemspec path: ".." gem "rails", "~> 3.2.13" browser-1.0.1/.rubocop.yml0000644000004100000410000000224412572742323015507 0ustar www-datawww-dataClassLength: Enabled: false CyclomaticComplexity: Enabled: false Documentation: Enabled: false Encoding: Enabled: false FileName: Enabled: false IfUnlessModifier: Enabled: false MethodLength: Enabled: false ModuleFunction: Enabled: false OneLineConditional: Enabled: false ParameterLists: Enabled: false Proc: Enabled: false SingleLineBlockParams: Enabled: false VariableInterpolation: Enabled: false TrailingComma: Enabled: false WhileUntilModifier: Enabled: false PredicateName: NamePrefixBlacklist: - is_ StringLiterals: EnforcedStyle: double_quotes SupportedStyles: - single_quotes - double_quotes DotPosition: EnforcedStyle: leading SpaceBeforeBlockBraces: EnforcedStyle: space SpaceInsideBlockBraces: EnforcedStyle: no_space DoubleNegation: Enabled: false SpaceInsideBlockBraces: SpaceBeforeBlockParameters: false LineLength: Max: 130 RegexpLiteral: MaxSlashes: 0 SpaceInsideHashLiteralBraces: Enabled: false PercentLiteralDelimiters: PreferredDelimiters: '%': '[]' '%i': '[]' '%q': '[]' '%Q': '[]' '%r': '[]' '%s': '[]' '%w': '[]' '%W': '[]' '%x': '[]' browser-1.0.1/metadata.yml0000644000004100000410000001123012572742323015533 0ustar www-datawww-data--- !ruby/object:Gem::Specification name: browser version: !ruby/object:Gem::Version version: 1.0.1 platform: ruby authors: - Nando Vieira autorequire: bindir: bin cert_chain: [] date: 2015-08-25 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: bundler requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rails requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rack-test requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: minitest requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: minitest-utils requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' description: Do some browser detection with Ruby. email: - fnando.vieira@gmail.com executables: [] extensions: [] extra_rdoc_files: [] files: - ".gitignore" - ".hound.yml" - ".rubocop.yml" - ".travis.yml" - CONTRIBUTING.md - Gemfile - README.md - Rakefile - bots.yml - browser.gemspec - config.ru - gemfiles/rails3.gemfile - languages.yml - lib/browser.rb - lib/browser/action_controller.rb - lib/browser/meta/base.rb - lib/browser/meta/generic_browser.rb - lib/browser/meta/id.rb - lib/browser/meta/ie.rb - lib/browser/meta/ios.rb - lib/browser/meta/mobile.rb - lib/browser/meta/modern.rb - lib/browser/meta/platform.rb - lib/browser/meta/safari.rb - lib/browser/meta/webkit.rb - lib/browser/methods/bots.rb - lib/browser/methods/consoles.rb - lib/browser/methods/devices.rb - lib/browser/methods/ie.rb - lib/browser/methods/language.rb - lib/browser/methods/mobile.rb - lib/browser/methods/platform.rb - lib/browser/methods/tv.rb - lib/browser/middleware.rb - lib/browser/middleware/context.rb - lib/browser/middleware/context/additions.rb - lib/browser/middleware/context/url_methods.rb - lib/browser/rails.rb - lib/browser/version.rb - search_engines.yml - test/browser_spec.rb - test/middleware_spec.rb - test/sample_app.rb - test/spec_helper.rb - test/ua.yml homepage: http://github.com/fnando/browser licenses: - MIT metadata: {} post_install_message: |2+ #################### WARNING ############################## # # # Internet Explorer detection has changed on v1.0.0+. # # If this is important for you, please read # # https://github.com/fnando/browser#internet-explorer # # # ########################################################### rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: rubygems_version: 2.4.5 signing_key: specification_version: 4 summary: Do some browser detection with Ruby. test_files: - test/browser_spec.rb - test/middleware_spec.rb - test/sample_app.rb - test/spec_helper.rb - test/ua.yml browser-1.0.1/test/0000755000004100000410000000000012572742323014212 5ustar www-datawww-databrowser-1.0.1/test/browser_spec.rb0000644000004100000410000006764512572742323017256 0ustar www-datawww-data# -*- encoding: utf-8 -*- require "spec_helper" describe Browser do before do @browser = Browser.new Browser::Bots.instance_variable_set("@detect_empty_ua", false) end it "yields self when block is given" do browser = nil Browser.new {|b| browser = b } assert_kind_of Browser, browser end it "responds to ua methods" do assert @browser.respond_to?(:ua) assert @browser.respond_to?(:ua=) end it "delegates ua methods" do @browser.user_agent = "Safari" assert_equal "Safari", @browser.ua @browser.ua = "Mozilla" assert_equal "Mozilla", @browser.user_agent end it "sets accept language while instantiating object" do @browser = Browser.new(:accept_language => "pt-br") assert_equal ["pt-br"], @browser.accept_language end it "sets user agent while instantianting object" do @browser = Browser.new(:ua => "Safari") assert_equal "Safari", @browser.ua @browser = Browser.new(:user_agent => "Chrome") assert_equal "Chrome", @browser.ua end it "detects iphone" do @browser.ua = $ua["IPHONE"] assert_equal "iPhone", @browser.name assert @browser.iphone? assert @browser.safari? assert @browser.webkit? assert @browser.mobile? assert @browser.modern? assert @browser.ios? refute @browser.tablet? refute @browser.mac? assert_equal "3.0", @browser.full_version assert_equal "3", @browser.version end it "detects safari" do @browser.ua = $ua["SAFARI"] assert_equal "Safari", @browser.name assert @browser.safari? assert @browser.webkit? assert @browser.modern? assert_equal "5.0.1", @browser.full_version assert_equal "5", @browser.version end it "detects safari in webapp mode" do @browser.ua = $ua["SAFARI_IPAD_WEBAPP_MODE"] assert @browser.safari? @browser.ua = $ua["SAFARI_IPHONE_WEBAPP_MODE"] assert @browser.safari? end it "detects ipod" do @browser.ua = $ua["IPOD"] assert_equal "iPod Touch", @browser.name assert @browser.ipod? assert @browser.safari? assert @browser.webkit? assert @browser.mobile? assert @browser.modern? assert @browser.ios? refute @browser.tablet? refute @browser.mac? assert_equal "3.0", @browser.full_version assert_equal "3", @browser.version end it "detects ipad" do @browser.ua = $ua["IPAD"] assert_equal "iPad", @browser.name assert @browser.ipad? assert @browser.safari? assert @browser.webkit? assert @browser.modern? assert @browser.ios? assert @browser.tablet? refute @browser.mobile? refute @browser.mac? assert_equal "4.0.4", @browser.full_version assert_equal "4", @browser.version end it "detects ios4" do @browser.ua = $ua["IOS4"] assert @browser.ios? assert @browser.ios4? refute @browser.mac? end it "detects ios5" do @browser.ua = $ua["IOS5"] assert @browser.ios? assert @browser.ios5? refute @browser.mac? end it "detects ios6" do @browser.ua = $ua["IOS6"] assert @browser.ios? assert @browser.ios6? refute @browser.mac? end it "detects ios7" do @browser.ua = $ua["IOS7"] assert @browser.ios? assert @browser.ios7? refute @browser.mac? end it "detects ios8" do @browser.ua = $ua["IOS8"] assert @browser.ios? assert @browser.ios8? refute @browser.mac? end it "detects ie6" do @browser.ua = $ua["IE6"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie6? refute @browser.modern? assert_equal "6.0", @browser.full_version assert_equal "6", @browser.version end it "detects ie7" do @browser.ua = $ua["IE7"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie7? refute @browser.modern? assert_equal "7.0", @browser.full_version assert_equal "7", @browser.version end it "detects ie8" do @browser.ua = $ua["IE8"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie8? refute @browser.modern? refute @browser.compatibility_view? assert_equal "8.0", @browser.full_version assert_equal "8", @browser.version end it "detects ie8 in compatibility view" do @browser.ua = $ua["IE8_COMPAT"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie8? refute @browser.modern? assert @browser.compatibility_view? assert_equal "8.0", @browser.full_version assert_equal "8", @browser.version assert_equal "7.0", @browser.msie_full_version assert_equal "7", @browser.msie_version end it "detects ie9" do @browser.ua = $ua["IE9"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie9? assert @browser.modern? refute @browser.compatibility_view? assert_equal "9.0", @browser.full_version assert_equal "9", @browser.version end it "detects ie9 in compatibility view" do @browser.ua = $ua["IE9_COMPAT"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie9? refute @browser.modern? assert @browser.compatibility_view? assert_equal "9.0", @browser.full_version assert_equal "9", @browser.version assert_equal "7.0", @browser.msie_full_version assert_equal "7", @browser.msie_version end it "detects ie10" do @browser.ua = $ua["IE10"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie10? assert @browser.modern? refute @browser.compatibility_view? assert_equal "10.0", @browser.full_version assert_equal "10", @browser.version end it "detects ie10 in compatibility view" do @browser.ua = $ua["IE10_COMPAT"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie10? refute @browser.modern? assert @browser.compatibility_view? assert_equal "10.0", @browser.full_version assert_equal "10", @browser.version assert_equal "7.0", @browser.msie_full_version assert_equal "7", @browser.msie_version end it "detects ie11" do @browser.ua = $ua["IE11"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie11? assert @browser.modern? refute @browser.compatibility_view? assert_equal "11.0", @browser.full_version assert_equal "11", @browser.version end it "detects ie11 in compatibility view" do @browser.ua = $ua["IE11_COMPAT"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie11? refute @browser.modern? assert @browser.compatibility_view? assert_equal "11.0", @browser.full_version assert_equal "11", @browser.version assert_equal "7.0", @browser.msie_full_version assert_equal "7", @browser.msie_version end it "detects Lumia 800" do @browser.ua = $ua["LUMIA800"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie9? assert_equal "9.0", @browser.full_version assert_equal "9", @browser.version refute @browser.tablet? assert @browser.mobile? end it "detects opera" do @browser.ua = $ua["OPERA"] assert_equal "Opera", @browser.name assert @browser.opera? refute @browser.modern? assert_equal "11.64", @browser.full_version assert_equal "11", @browser.version end it "detects opera next" do @browser.ua = $ua["OPERA_NEXT"] assert_equal "Opera", @browser.name assert_equal :opera, @browser.id assert @browser.opera? assert @browser.webkit? assert @browser.modern? refute @browser.chrome? assert_equal "15.0.1147.44", @browser.full_version assert_equal "15", @browser.version end it "detects firefox" do @browser.ua = $ua["FIREFOX"] assert_equal "Firefox", @browser.name assert @browser.firefox? refute @browser.modern? assert_equal "3.8", @browser.full_version assert_equal "3", @browser.version end it "detects modern firefox" do @browser.ua = $ua["FIREFOX_MODERN"] assert_equal :firefox, @browser.id assert_equal "Firefox", @browser.name assert @browser.firefox? assert @browser.modern? assert_equal "17.0", @browser.full_version assert_equal "17", @browser.version end it "detects firefox android tablet" do @browser.ua = $ua["FIREFOX_TABLET"] assert_equal :firefox, @browser.id assert_equal "Firefox", @browser.name assert @browser.firefox? assert @browser.modern? assert @browser.tablet? assert @browser.android? assert_equal "14.0", @browser.full_version assert_equal "14", @browser.version end it "detects chrome" do @browser.ua = $ua["CHROME"] assert_equal "Chrome", @browser.name assert @browser.chrome? refute @browser.safari? assert @browser.webkit? assert @browser.modern? assert_equal "5.0.375.99", @browser.full_version assert_equal "5", @browser.version end it "detects mobile chrome" do @browser.ua = $ua["MOBILE_CHROME"] assert_equal "Chrome", @browser.name assert @browser.chrome? refute @browser.safari? assert @browser.webkit? assert @browser.modern? assert_equal "19.0.1084.60", @browser.full_version assert_equal "19", @browser.version end it "detects samsung chrome" do @browser.ua = $ua["SAMSUNG_CHROME"] assert_equal "Chrome", @browser.name assert @browser.chrome? assert @browser.android? refute @browser.safari? assert @browser.webkit? assert @browser.modern? assert_equal "28.0.1500.94", @browser.full_version assert_equal "28", @browser.version end it "detects android" do @browser.ua = $ua["ANDROID"] assert_equal "Android", @browser.name assert @browser.android? refute @browser.safari? assert @browser.webkit? assert @browser.mobile? refute @browser.tablet? assert @browser.modern? assert_equal "3.1.2", @browser.full_version assert_equal "3", @browser.version end it "detects android tablet" do @browser.ua = $ua["TABLOID"] assert_equal "Android", @browser.name assert @browser.android? refute @browser.safari? assert @browser.webkit? refute @browser.mobile? assert @browser.tablet? assert @browser.modern? assert_equal "4.0", @browser.full_version assert_equal "4", @browser.version end it "detects surface tablet" do @browser.ua = $ua["SURFACE"] assert_equal "Internet Explorer", @browser.name assert @browser.surface? assert @browser.ie? refute @browser.mobile? assert @browser.tablet? assert @browser.modern? assert_equal "10.0", @browser.full_version assert_equal "10", @browser.version end it "detects blackberry" do @browser.ua = $ua["BLACKBERRY"] assert_equal "BlackBerry", @browser.name assert @browser.blackberry? refute @browser.tablet? assert @browser.mobile? refute @browser.modern? assert_equal "4.1.0", @browser.full_version assert_equal "4", @browser.version end it "detects blackberry4" do @browser.ua = $ua["BLACKBERRY4"] assert_equal "BlackBerry", @browser.name assert @browser.blackberry4? refute @browser.tablet? assert @browser.mobile? refute @browser.modern? assert_equal "4.2.1", @browser.full_version assert_equal "4", @browser.version end it "detects blackberry5" do @browser.ua = $ua["BLACKBERRY5"] assert_equal "BlackBerry", @browser.name assert @browser.blackberry5? refute @browser.tablet? assert @browser.mobile? refute @browser.modern? assert_equal "5.0.0.93", @browser.full_version assert_equal "5", @browser.version end it "detects blackberry6" do @browser.ua = $ua["BLACKBERRY6"] assert_equal "BlackBerry", @browser.name assert @browser.blackberry6? refute @browser.tablet? assert @browser.mobile? assert @browser.modern? assert_equal "534.11", @browser.full_version assert_equal "534", @browser.version end it "detects blackberry7" do @browser.ua = $ua["BLACKBERRY7"] assert_equal "BlackBerry", @browser.name assert @browser.blackberry7? refute @browser.tablet? assert @browser.mobile? assert @browser.modern? assert_equal "534.11", @browser.full_version assert_equal "534", @browser.version end it "detects blackberry10" do @browser.ua = $ua["BLACKBERRY10"] assert_equal "Safari", @browser.name assert @browser.blackberry10? refute @browser.tablet? assert @browser.mobile? assert @browser.modern? assert_equal "10.0.9.1675", @browser.full_version assert_equal "10", @browser.version end it "detects quicktime" do @browser.ua = $ua["QUICKTIME"] assert_equal "QuickTime", @browser.name assert @browser.quicktime? assert_equal "7.6.8", @browser.full_version assert_equal "7", @browser.version end it "detects core media" do @browser.ua = $ua["COREMEDIA"] assert_equal "Apple CoreMedia", @browser.name assert @browser.core_media? assert_equal "1.0.0.10F569", @browser.full_version assert_equal "1", @browser.version end it "detects phantom.js" do @browser.ua = $ua["PHANTOM_JS"] assert_equal "PhantomJS", @browser.name assert @browser.phantom_js? refute @browser.tablet? refute @browser.mobile? assert @browser.modern? assert_equal "1.9.0", @browser.full_version assert_equal "1", @browser.version end it "detects psp" do @browser.ua = $ua["PSP"] assert_equal "PlayStation Portable", @browser.name assert @browser.psp? refute @browser.psp_vita? assert @browser.mobile? end it "detects psp vita" do @browser.ua = $ua["PSP_VITA"] assert_equal "PlayStation Portable", @browser.name assert @browser.psp? assert @browser.psp_vita? assert @browser.mobile? end it "detects other mobiles" do @browser.ua = "Symbian OS" assert @browser.mobile? refute @browser.tablet? @browser.ua = "MIDP-2.0" assert @browser.mobile? refute @browser.tablet? end it "detects windows mobile" do @browser.ua = $ua["WINDOWS_MOBILE"] assert @browser.mobile? assert @browser.windows? assert @browser.windows_mobile? refute @browser.windows_phone? refute @browser.tablet? end it "returns a zero version" do @browser.ua = "Bot" assert_equal "0.0", @browser.full_version assert_equal "0", @browser.version end it "sets meta" do @browser.ua = $ua["CHROME"] assert_kind_of Array, @browser.meta end it "returns string representation" do @browser.ua = $ua["CHROME"] meta = @browser.to_s assert meta.include?("chrome") assert meta.include?("webkit") assert meta.include?("mac") assert meta.include?("modern") end it "returns string representation for ios" do @browser.ua = $ua["IPHONE"] meta = @browser.to_s assert meta.include?("iphone") assert meta.include?("webkit") assert meta.include?("ios") assert meta.include?("safari") assert meta.include?("safari3") assert meta.include?("modern") assert meta.include?("mobile") end it "returns string representation for mobile" do @browser.ua = $ua["BLACKBERRY"] meta = @browser.to_s assert meta.include?("blackberry") assert meta.include?("blackberry4") assert meta.include?("other") assert meta.include?("mobile") end it "returns string representation for ie6" do @browser.ua = $ua["IE6"] meta = @browser.meta assert meta.include?("ie") assert meta.include?("ie6") assert meta.include?("oldie") assert meta.include?("lt-ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end it "returns string representation for ie7" do @browser.ua = $ua["IE7"] meta = @browser.meta assert meta.include?("ie") assert meta.include?("ie7") assert meta.include?("oldie") assert meta.include?("lt-ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end it "returns string representation for ie8" do @browser.ua = $ua["IE8"] meta = @browser.meta assert meta.include?("ie") assert meta.include?("ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end it "detects unknown id" do @browser.ua = "Unknown" assert_equal :other, @browser.id end it "detects unknown name" do @browser.ua = "Unknown" assert_equal "Other", @browser.name end it "detects mac platform" do @browser.ua = "Mac OS X" assert_equal :mac, @browser.platform assert @browser.mac? end it "detects windows platform" do @browser.ua = "Windows" assert_equal :windows, @browser.platform assert @browser.windows? end it "detects windows_xp" do @browser.ua = $ua["WINDOWS_XP"] assert @browser.windows? assert @browser.windows_xp? end it "detects windows_vista" do @browser.ua = $ua["WINDOWS_VISTA"] assert @browser.windows? assert @browser.windows_vista? end it "detects windows7" do @browser.ua = $ua["WINDOWS7"] assert @browser.windows? assert @browser.windows7? end it "detects windows8" do @browser.ua = $ua["WINDOWS8"] assert @browser.windows? assert @browser.windows8? refute @browser.windows8_1? end it "detects windows8.1" do @browser.ua = $ua["WINDOWS81"] assert @browser.windows? assert @browser.windows8? assert @browser.windows8_1? end it "detects linux platform" do @browser.ua = "Linux" assert_equal :linux, @browser.platform assert @browser.linux? end it "detects unknown platform" do @browser.ua = "Unknown" assert_equal :other, @browser.platform end it "returns all known languages" do @browser.accept_language = "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3" assert_equal ["en-us", "en", "pt-br", "pt"], @browser.accept_language end it "detects xoom" do @browser.ua = $ua["XOOM"] assert @browser.android? assert @browser.tablet? refute @browser.mobile? end it "detects nexus tablet" do @browser.ua = $ua["NEXUS_TABLET"] assert @browser.android? assert @browser.tablet? refute @browser.mobile? end it "detects blackberry playbook tablet" do @browser.ua = $ua["PLAYBOOK"] refute @browser.android? assert @browser.tablet? refute @browser.mobile? assert_equal "7.2.1.0", @browser.full_version assert_equal "7", @browser.version end it "detects opera mini" do @browser.ua = $ua["OPERA_MINI"] assert @browser.opera_mini? refute @browser.tablet? assert @browser.mobile? end it "detects opera mobi" do @browser.ua = $ua["OPERA_MOBI"] assert @browser.opera? refute @browser.tablet? assert @browser.mobile? end it "detects windows phone" do @browser.ua = $ua["WINDOWS_PHONE"] assert @browser.ie? assert_equal "7", @browser.version assert @browser.mobile? assert @browser.windows_phone? refute @browser.windows_mobile? refute @browser.tablet? end it "detects windows phone 8" do @browser.ua = $ua["WINDOWS_PHONE8"] assert @browser.ie? assert_equal "10", @browser.version assert @browser.mobile? assert @browser.windows_phone? refute @browser.windows_mobile? refute @browser.tablet? end it "detects windows phone 8.1" do @browser.ua = $ua["WINDOWS_PHONE_81"] assert @browser.ie? assert_equal "Internet Explorer", @browser.name assert_equal :ie, @browser.id assert_equal "11", @browser.version assert_equal "11.0", @browser.full_version assert @browser.mobile? assert @browser.windows_phone? refute @browser.windows_mobile? refute @browser.tablet? end it "detects windows mobile" do @browser.ua = $ua["WINDOWS_PHONE8"] assert @browser.ie? assert_equal "10", @browser.version assert @browser.mobile? assert @browser.windows_phone? refute @browser.windows_mobile? refute @browser.tablet? end it "detects windows x64" do @browser.ua = $ua["IE10_X64_WINX64"] assert @browser.windows_x64? refute @browser.windows_wow64? assert @browser.windows_x64_inclusive? end it "detects windows wow64" do @browser.ua = $ua["WINDOWS_WOW64"] refute @browser.windows_x64? assert @browser.windows_wow64? assert @browser.windows_x64_inclusive? end it "detects ie11 touch desktop pc" do @browser.ua = $ua["IE11_TOUCH_SCREEN"] assert_equal "Internet Explorer", @browser.name assert @browser.ie? assert @browser.ie11? assert @browser.modern? refute @browser.compatibility_view? refute @browser.windows_rt? assert @browser.windows_touchscreen_desktop? assert @browser.windows8? assert_equal "11.0", @browser.full_version assert_equal "11", @browser.version end it "detects Microsoft Edge" do @browser.ua = $ua["MS_EDGE"] assert_equal :edge, @browser.id assert_equal "Microsoft Edge", @browser.name assert_equal "12.0", @browser.full_version assert_equal "12", @browser.version assert @browser.windows10? assert @browser.edge? assert @browser.modern? refute @browser.webkit? refute @browser.chrome? refute @browser.safari? refute @browser.mobile? end it "detects Microsoft Edge in compatibility view" do @browser.ua = $ua["MS_EDGE_COMPAT"] assert_equal :edge, @browser.id assert_equal "Microsoft Edge", @browser.name assert_equal "12.0", @browser.full_version assert_equal "12", @browser.version assert_equal "7.0", @browser.msie_full_version assert_equal "7", @browser.msie_version assert @browser.edge? assert @browser.compatibility_view? refute @browser.modern? refute @browser.webkit? refute @browser.chrome? refute @browser.safari? refute @browser.mobile? end it "detects Microsoft Edge Mobile" do @browser.ua = $ua["MS_EDGE_MOBILE"] assert_equal :edge, @browser.id assert_equal "Microsoft Edge", @browser.name assert_equal "12.0", @browser.full_version assert_equal "12", @browser.version refute @browser.windows10? assert @browser.windows_phone? assert @browser.edge? assert @browser.modern? assert @browser.mobile? refute @browser.webkit? refute @browser.chrome? refute @browser.safari? end it "detects IE without Trident" do @browser.ua = $ua["IE_WITHOUT_TRIDENT"] assert_equal :ie, @browser.id assert_equal "Internet Explorer", @browser.name assert_equal "0.0", @browser.msie_full_version assert_equal "0", @browser.msie_version assert_equal "0.0", @browser.full_version assert_equal "0", @browser.version refute @browser.windows10? refute @browser.windows_phone? refute @browser.edge? refute @browser.modern? refute @browser.mobile? refute @browser.webkit? refute @browser.chrome? refute @browser.safari? end it "detects Daumoa" do @browser.ua = $ua["DAUMOA"] assert_equal :ie, @browser.id assert_equal "Internet Explorer", @browser.name assert_equal "0.0", @browser.msie_full_version assert_equal "0", @browser.msie_version assert_equal "0.0", @browser.full_version assert_equal "0", @browser.version assert @browser.ie? refute @browser.windows10? refute @browser.windows_phone? refute @browser.edge? refute @browser.modern? refute @browser.mobile? refute @browser.webkit? refute @browser.chrome? refute @browser.safari? end it "detects kindle monochrome" do @browser.ua = $ua["KINDLE"] assert @browser.kindle? assert @browser.webkit? end it "detects kindle fire" do @browser.ua = $ua["KINDLE_FIRE"] assert @browser.kindle? assert @browser.webkit? end it "detects kindle fire hd" do @browser.ua = $ua["KINDLE_FIRE_HD"] assert @browser.silk? assert @browser.kindle? assert @browser.webkit? assert @browser.modern? refute @browser.mobile? end it "detects kindle fire hd mobile" do @browser.ua = $ua["KINDLE_FIRE_HD_MOBILE"] assert @browser.silk? assert @browser.kindle? assert @browser.webkit? assert @browser.modern? assert @browser.mobile? end it "detects nook" do @browser.ua = $ua["NOOK"] assert @browser.tablet? refute @browser.mobile? end it "detects samsung" do @browser.ua = $ua["SAMSUNG"] assert @browser.tablet? refute @browser.mobile? end it "detects nintendo wii" do @browser.ua = $ua["NINTENDO_WII"] assert @browser.console? assert @browser.nintendo? end it "detects nintendo wii u" do @browser.ua = $ua["NINTENDO_WIIU"] assert @browser.console? assert @browser.nintendo? end it "detects playstation 3" do @browser.ua = $ua["PLAYSTATION3"] assert @browser.console? assert @browser.playstation? refute @browser.playstation4? end it "detects playstation 4" do @browser.ua = $ua["PLAYSTATION4"] assert @browser.console? assert @browser.playstation? assert @browser.playstation4? end it "detects xbox 360" do @browser.ua = $ua["XBOX360"] assert @browser.console? assert @browser.xbox? refute @browser.xbox_one? end it "detects xbox one" do @browser.ua = $ua["XBOXONE"] assert @browser.console? assert @browser.xbox? assert @browser.xbox_one? end it "removes duplicate items" do @browser.ua = $ua["SAFARI"] assert_equal ["safari"], @browser.meta.select {|item| item == "safari" } end it "detects meta aliased as to_a" do @browser.ua = $ua["SAFARI"] assert_equal @browser.meta, @browser.to_a end it "detects bots" do %w[ APPLE_BOT DOT_BOT FACEBOOK_BOT GOOGLE_BOT LINKDEXBOT LOAD_TIME_BOT MAIL_RU MEGAINDEX_RU MSN_BOT QUERYSEEKER SCRAPY YANDEX_DIRECT YANDEX_METRIKA ].each do |key| @browser.ua = $ua[key] assert @browser.bot?, "#{$ua[key]} should be a bot" end @browser.ua = $ua["CHROME"] refute @browser.bot? end it "detects Google Page Speed as a bot" do @browser.ua = $ua["GOOGLE_PAGE_SPEED_INSIGHTS"] assert @browser.bot? end it "doesn't consider empty UA as bot" do @browser.ua = "" refute @browser.bot? end it "allows setting empty string as bots" do Browser::Bots.detect_empty_ua! @browser.ua = "" assert @browser.bot? end it "doesn't detect mozilla as a bot when considering empty UA" do Browser::Bots.detect_empty_ua! @browser.ua = "Mozilla" refute @browser.bot? end it "returns bot name" do @browser.ua = $ua["GOOGLE_BOT"] assert_equal @browser.bot_name, "Googlebot" @browser.ua = $ua["FACEBOOK_BOT"] assert_equal @browser.bot_name, "facebookexternalhit" end it "returns bot name (empty string ua detection enabled)" do Browser::Bots.detect_empty_ua! @browser.ua = "" assert_equal @browser.bot_name, "Generic Bot" end it "returns nil for non-bots" do @browser.ua = $ua["CHROME"] assert_equal @browser.bot_name, nil end it "detects chrome os" do @browser.ua = $ua["CHROME_OS"] assert @browser.chrome_os? end it "detects tv" do @browser.ua = $ua["SMART_TV"] assert @browser.tv? end it "detects as search engines" do %w[ ASK BAIDU BINGBOT DUCKDUCKGO GOOGLE_BOT YAHOO_SLURP ].each do |key| @browser.ua = $ua[key] assert @browser.search_engine?, "#{$ua[key]} should be a search engine" end end it "detects Google Structured Data Testing Tool as a bot" do @browser.ua = $ua["GOOGLE_STRUCTURED_DATA_TESTING_TOOL"] assert @browser.bot?, "Google Structured Data Testing Tool should be a bot" end it "knows a supported browser" do @browser.ua = "Chrome" assert @browser.known? end it "does not know an unsupported browser" do @browser.ua = "Fancy new browser" refute @browser.known? end it "detects adobe air" do @browser.ua = $ua["ADOBE_AIR"] assert @browser.adobe_air? assert @browser.webkit? assert_equal @browser.version, "13" assert_equal @browser.full_version, "13.0" assert_equal @browser.name, "Other" end end browser-1.0.1/test/spec_helper.rb0000644000004100000410000000033212572742323017026 0ustar www-datawww-dataENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__) require "bundler/setup" require "minitest/autorun" require "minitest/utils" require "browser" require "yaml" $ua = YAML.load_file("./test/ua.yml") browser-1.0.1/test/sample_app.rb0000644000004100000410000000157612572742323016671 0ustar www-datawww-datarequire "rails" require "browser" class SampleApp < Rails::Application config.secret_token = "99f19f08db7a37bdcb9d6701f54dca" config.secret_key_base = "99f19f08db7a37bdcb9d6701f54dca" config.eager_load = true config.active_support.deprecation = :log routes.append do default_headers = {"Content-Type" => "text/html"} root to: -> env { [200, default_headers, ["ROOT"]] } get "upgrade", to: -> env { browser = Rack::Request.new(env).params["browser"] [200, default_headers, ["UPGRADE: #{browser}"]] }, as: "upgrade" get "/asset", to: -> env { [200, {"Content-Type" => "image/png"}, []] } end config.middleware.use Browser::Middleware do redirect_to upgrade_path(browser: "ie6") if browser.ie6? redirect_to upgrade_path(browser: "ie7") if browser.ie7? redirect_to "/invalid" if browser.ie8? end end SampleApp.initialize! browser-1.0.1/test/ua.yml0000644000004100000410000002733512572742323015354 0ustar www-datawww-dataADOBE_AIR: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/13.0' ANDROID: 'Android SDK 1.5r3: Mozilla/5.0 (Linux; U; Android 1.5; de-; sdk Build/CUPCAKE) AppleWebkit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' ANDROID_WITH_SAFARI: 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SCH-I535 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' 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)' ASK: 'Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)' BAIDU: 'Baiduspider+(+http://www.baidu.com/search/spider.htm)' BINGBOT: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)' BLACKBERRY10: 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.1675 Mobile Safari/537.10+' BLACKBERRY4: 'BlackBerry8100/4.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103' BLACKBERRY5: 'BlackBerry9000/5.0.0.93 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/179' BLACKBERRY6: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/6.0.0.141 Mobile Safari/534.11+' BLACKBERRY7: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.1 Mobile Safari/534.11+' BLACKBERRY: 'BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103' CHROME: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4' CHROME_OS: 'Mozilla/5.0 (X11; CrOS x86_64 3701.81.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31.' COREMEDIA: 'Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569' DOT_BOT: 'Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)' DUCKDUCKGO: 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)' FACEBOOK_BOT: 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)' FIREFOX: 'Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8' FIREFOX_MODERN: 'Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0' FIREFOX_TABLET: 'Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0' GOOGLE_BOT: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' 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' GOOGLE_STRUCTURED_DATA_TESTING_TOOL: 'Mozilla/5.0 (compatible; X11; Linux x86_64; Google-StructuredDataTestingTool; +http://www.google.com/webmasters/tools/richsnippets)' DAUMOA: Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa 4.0 IE_WITHOUT_TRIDENT: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.0) .NET CLR 2.0.50727) IE10: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)' IE10_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; EIE10;ENUSMSN)' IE10_X64_WINX64: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)' IE11: 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko' IE11_TOUCH_SCREEN: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; Touch; rv:11.0) like Gecko' IE11_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)' IE6: 'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)' IE7: 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)' IE8: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)' IE8_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC1; Media Center PC 5.0; .NET CLR 3.5.21022)' IE9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' IE9_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)' MS_EDGE: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0' MS_EDGE_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; Microsoft Outlook 15.0.4433; ms-office; MSOffice 15)' MS_EDGE_MOBILE: 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0' IOS4: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7' IOS5: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' IOS6: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25' IOS7: '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' IOS8: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4' IPAD: 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10' IPHONE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3' IPOD: 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3' KINDLE: 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600×800; rotate)' KINDLE_FIRE: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' KINDLE_FIRE_HD: 'Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Safari/535.19 Silk-Accelerated=true' KINDLE_FIRE_HD_MOBILE: 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true' LINKDEXBOT: 'Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)' LOAD_TIME_BOT: 'Mozilla/5.0 (compatible; LoadTimeBot/0.9; +http://www.loadtime.net/bot.html)' LUMIA800: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7' MAIL_RU: 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)' MEGAINDEX_RU: 'Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)' MOBILE_CHROME: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3' MSN_BOT: 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)' NEXUS_TABLET: 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' NINTENDO_WII: 'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)' NINTENDO_WIIU: 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU' NOOK: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; NOOK BNTV250A Build/GINGERBREAD 1.4.3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1' OPERA: 'Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64' OPERA_MINI: 'Opera/9.80 (Android; Opera Mini/7.029952/28.2359;u; fr) Presto/2.8.119 Version/11.10' OPERA_MOBI: 'Opera/9.8 (Android 2.3.5; Linux; Opera Mobi/ADR-1205181138; U; en) Presto/2.10.254 Version/12.00' OPERA_NEXT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36 OPR/15.0.1147.44 (Edition Next)' PHANTOM_JS: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 Safari/534.34' PLAYBOOK: 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+' PLAYSTATION3: 'Mozilla/5.0 (PLAYSTATION 3; 3.55)' PLAYSTATION4: 'Mozilla/5.0 (PlayStation 4 1.020) AppleWebKit/536.26 (KHTML, like Gecko)' PSP: 'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' PSP_VITA: 'Mozilla/5.0 (Playstation Vita 1.61) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' QUICKTIME: 'QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)' QUERYSEEKER: 'QuerySeekerSpider ( http://queryseeker.com/bot.html )' SAFARI: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8' SAFARI_IPAD_WEBAPP_MODE: 'Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405' SAFARI_IPHONE_WEBAPP_MODE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g' SAMSUNG: 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' SAMSUNG_CHROME: 'Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36' SCRAPY: 'Scrapy/0.18.4 (+http://scrapy.org)' SMART_TV: 'Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+' SURFACE: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' TABLOID: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' WINDOWS_XP: 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; FDM; .NET CLR 1.1.4322)' WINDOWS_VISTA: 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)' WINDOWS7: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205' WINDOWS81: 'Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko' WINDOWS8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' WINDOWS_WOW64: "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko" WINDOWS_MOBILE: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12)' WINDOWS_PHONE8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)' WINDOWS_PHONE: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)' WINDOWS_PHONE_81: 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 929) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' XBOX360: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox), or Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' XBOXONE: 'Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.2; Trident /6.0; Xbox; Xbox One)' XOOM: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' YAHOO_SLURP: 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)' YANDEX_DIRECT: 'Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)' YANDEX_METRIKA: 'Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots)' browser-1.0.1/test/middleware_spec.rb0000644000004100000410000000240312572742323017665 0ustar www-datawww-datarequire "spec_helper" require "browser/rails" require "sample_app" describe Browser::Middleware do include Rack::Test::Methods def app Rails.application end it "redirects with 302" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html"} assert_equal 302, last_response.status end it "redirects ie6 to upgrade path" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html"} follow_redirect! assert_equal "UPGRADE: ie6", last_response.body end it "redirects ie7 to upgrade path" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 7", "HTTP_ACCEPT" => "text/html"} follow_redirect! assert_equal "UPGRADE: ie7", last_response.body end it "redirects ie8 and returns 404" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "text/html"} follow_redirect! assert_equal 404, last_response.status end it "redirects ie8 with wildcard http accept" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "*/*"} follow_redirect! assert_equal 404, last_response.status end it "ignores non-html requests" do get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "image/png"} assert_equal 200, last_response.status end end browser-1.0.1/bots.yml0000644000004100000410000001260412572742323014730 0ustar www-datawww-data360Spider: "360Spider" AddThis: "AddThis" ADmantX: "ADmantX Platform Semantic Analyzer" AdsBot-Google: "Google Adwords" AhrefsBot: "Ahrefs backlinks research tool" alexa: "Alexa Crawler" Apache-HttpClient: "Java http library" ApacheBench: "ApacheBench (ab)" AppEngine-Google: "Google App Engine" Applebot: "Apple Bot" Ask Jeeves: "Ask Jeeves" AsyncHttpClient: "Java http and WebSocket client library" awe.sm: "Awe.sm URL expander" Baidu: "baidu" Baiduspider: "Chinese search engine" bingbot: "Microsoft bing bot" bitlybot: "bit.ly bot" BLEXBot: "webmeup-crawler.com" bot@linkfluence.net: "Linkfluence bot" BuiBui-CheckBot: "email: buibui[at]dadapro[dot]com" Butterfly: "Topsy Labs" buzztalk: "buzztalk" check_http: "Nagios monitor" CMRadar/0.1: "CMRadar/0.1" ColdFusion: "ColdFusion http library" Crowsnest: "Crowsnest" Crowsnest: "crowsnest.tv news portal bot" curl: "curl unix CLI http client" DAP/NetHTTP: "DAP/NetHTTP" developers.google.com/+/web/snippet/: "Google Plus" DigitalPersona Fingerprint Software: "HP Fingerprint scanner" DotBot: "Dot Bot" DuckDuckBot: "Duck Duck Go" Embedly: "Embedly" EOAAgent: "EOAAgent" EventMachine HttpClient: "Ruby http library" EvriNid: "Evri bot" Exabot: "Exalead's bot" ExaleadCloudView: "ExaleadCloudView" facebookexternalhit: "Facebook Bot" Facebot: "Facebook Bot" FeedBurner: "RSS bot" Feedfetcher-Google: "Google Feedfetcher" FlipboardProxy: "FlipboardProxy" Genieo: "Genieo Web filter bot" getprismatic.com: "getprismatic.com" Gigabot: "Gigabot spider" Go http package: "Go http library" Google Web Preview: "Google Instant Previews crawler" Google Page Speed Insights: "Google Page Speed Insights" Googlebot: "Google spider" Hatena::Bookmark: "Hatena::Bookmark" heritrix: "heritrix" HTMLParser: "HTMLParser" HTTPClient: "HTTPClient" https://developers.google.com/+/web/snippet: "Google+ Snippet Fetcher" HTTP_Request2: "HTTP_Request2" HubSpot Connect: "HubSpot Connect" ia_archiver(OS-Wayback): "ia_archiver(OS-Wayback)" iCoreService: "iCoreService" InAGist: "URL resolver" Insieve Bot: "Insieve Bot" InsieveBot: "InsieveBot" Instapaper: "Instapaper" Insitesbot: "Insitesbot" IstellaBot: "IstellaBot" jack: "jack" Jakarta Commons-HttpClient: "Jakarta Commons-HttpClient" Jakarta Commons: "Jakarta Commons HttpClient" Java: "Generic Java http library" Jetslide: "Jetslide" JS-Kit: "URL resolver" Kimengi/nineconnections.com: "Kimengi/nineconnections.com" Kimengi: "nineconnections.com bot" knows.is: "knows.is" kraken: "kraken" Laconica: "Laconica" libwww-perl: "Perl client-server library loved by script kids" linkdexbot: "Linkdex Bot" LinkedInBot: "LinkedIn" LinksCrawler: "LinksCrawler" Linode: "Linode Longview" Lipperhey: "Lipperhey" Livelapbot: "Livelapbot" LoadTimeBot: "Load Time Bot" LongURL: "URL expander service" Lumibot: "Lumibot" lwp-trivial: "Another Perl library loved by script kids" magpie-crawler: "magpie-crawler" Mail.RU_Bot: "Mail.ru Bot" Mediapartners-Google: "Google Adsense bot" MegaIndex.ru: "Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)" MetaURI: "MetaURI" MetaURI: "URI meta information extractor bot" MFE_expand: "Mcafee spider" MJ12bot: "Majestic-12 spider" MojeekBot: "Mojeek UK search crawler" msnbot: "Microsoft bot" netState: "netEstate NE Crawler" Netvibes: "Personalized dashboard bot" NewRelicPinger: "NewRelic monitor" newsme: "Link analyzer" newsme: "newsme" NING: "NING - Yet Another Twitter Swarmer" Nutch: "Apache search spider" Panopta: "Monitoring service" PaperLiBot: "PaperLi content curation service" PaperLiBot: "PaperLi is another content curation service" peerindex: "peerindex" PercolateCrawler: "PercolateCrawler" PhantomJS: "PhantomJS" Pingdom: "Pingdom monitoring" Pinterest: "Pinterest" publiclibraryarchive.org: "publiclibraryarchive.org" PycURL: "Python http library" Python-httplib2: "Python-httplib2" python-requests: "Python http library" python-requests: "python-requests" Python-urllib: "Python http library" QuerySeeker: "QuerySeekerSpider ( http://queryseeker.com/bot.html )" QuickLook: "QuickLook" Readability: "Readability" RebelMouse: "RebelMouse" redditbot: "Reddit Bot" RelateIQ: "RelateIQ" Riddler: "Riddler Bot" rogerbot: "SeoMoz spider" Ruby/1.9.3: "Ruby/1.9.3" Ruby: "Ruby" Scrapy: "Scrapy" SemrushBot: "SEO analysis bot" SeznamBot: "SeznamBot" ShopWiki: "ShopWiki" ShortLinkTranslate: "Link shortener" ShowyouBot: "Showyou iOS app spider" Siege: "Joe Dog Siege" SiteUptime: "Site monitoring services" Slack: "Slackbot-LinkExpanding" Slurp: "Yahoo spider" Sogou: "Chinese search engine" spider: "generic web spider" Spinn3r: "Spinn3r aggregator" StatusCake: "StatusCake" Test Certificate Info: "C http library?" trendictionbot: "trendiction search" TurnitinBot: "TurnitinBot" TweetmemeBot: "TweetMeMe Crawler" Twikle: "Social web search bot" TwitJobSearch: "TwitJobSearch" Twitmunin: "Twitmunin" Twitterbot: "Twitter URL expander" Twurly: "Twurly" Typhoeus: "Typhoeus" UnwindFetch: "Gnip URL expander" UnwindFetchor: "Gnip crawler" Vagabondo: "Vagabondo" VB Project: "Visual Basic" vkShare: "VKontake Sharer" VoilaBot: "VoilaBot" Webscout: "Webscout" Wget: "wget unix CLI http client" WordPress: "WordPress spider" Wormly: "WormlyBot" Xenu Link Sleuth: "Xenu Link Sleuth" XoviBot: "XoviBot" YandexBot: "Yandex spider" YandexDirect: "Yandex Direct spider" YandexMetrika: "Yandex Metrika spider" YOURLS: "YOURLS" zelist.ro: "feed parser" ZIBB: "ZIBB spider" ZyBorg: "Zyborg? Hmmm...." StructuredDataTestingTool: 'Google-StructuredDataTestingTool' browser-1.0.1/.gitignore0000644000004100000410000000003412572742323015220 0ustar www-datawww-datapkg coverage doc log *.lock browser-1.0.1/browser.gemspec0000644000004100000410000000300712572742323016263 0ustar www-datawww-data# -*- encoding: utf-8 -*- $:.push File.expand_path("../lib", __FILE__) require "browser/version" Gem::Specification.new do |s| s.name = "browser" s.version = Browser::Version::STRING s.platform = Gem::Platform::RUBY s.authors = ["Nando Vieira"] s.email = ["fnando.vieira@gmail.com"] s.homepage = "http://github.com/fnando/browser" s.summary = "Do some browser detection with Ruby." s.description = s.summary s.license = 'MIT' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = ["lib"] s.post_install_message = [ "", "#################### WARNING ##############################" , "# #" , "# Internet Explorer detection has changed on v1.0.0+. #" , "# If this is important for you, please read #" , "# https://github.com/fnando/browser#internet-explorer #" , "# #" , "###########################################################" , "\n" ].join("\n") s.add_development_dependency "bundler", ">= 0" s.add_development_dependency "rake" s.add_development_dependency "rails" s.add_development_dependency "rack-test" s.add_development_dependency "minitest" s.add_development_dependency "minitest-utils" end browser-1.0.1/CONTRIBUTING.md0000644000004100000410000000171212572742323015465 0ustar www-datawww-data# Contributing ## Issues If you want to request a feature or report a bug, please use the following template. ```markdown ## Description [Add feature/bug description here] ## How to reproduce [Add steps on how to reproduce this issue] ## What do you expect [Describe what do you expect to happen] ## What happened instead [Describe the actual results] ## Gem version: Browser version: [Add browser gem version here] ## Report Visit and paste the URL here. ``` ## Writing code Once you've made your great commits (include tests, please): 1. [Fork](http://help.github.com/forking/) browser 2. Create a topic branch - `git checkout -b my_branch` 3. Push to your branch - `git push origin my_branch` 4. [Create an Issue](http://github.com/fnando/browser/issues) with a link to your branch 5. That's it! Please respect the indentation rules and code style. And use 2 spaces, not tabs. And don't touch the versioning thing. browser-1.0.1/search_engines.yml0000644000004100000410000000024312572742323016732 0ustar www-datawww-dataBaidu: "Chinese search engine" bingbot: "Microsoft bing bot" Googlebot: "Google spider" Slurp: "Yahoo spider" DuckDuckBot: "Duck Duck Go" Ask Jeeves: "Ask Jeeves" browser-1.0.1/README.md0000644000004100000410000001300612572742323014512 0ustar www-datawww-data# Browser [![Travis-CI](https://travis-ci.org/fnando/browser.png)](https://travis-ci.org/fnando/browser) [![CodeClimate](https://codeclimate.com/github/fnando/browser.png)](https://codeclimate.com/github/fnando/browser) [![Gem Version](https://badge.fury.io/rb/browser.svg)](http://badge.fury.io/rb/browser) Do some browser detection with Ruby. Includes ActionController integration. ## Installation ```bash gem install browser ``` ## Usage ```ruby require "rubygems" require "browser" browser = Browser.new(:ua => "some string", :accept_language => "en-us") browser.name # readable browser name browser.version # major version number browser.full_version browser.safari? browser.opera? browser.chrome? browser.chrome_os? browser.mobile? browser.tablet? browser.console? browser.firefox? browser.ie? browser.ie6? # this goes up to 11 browser.edge? # Newest MS browser browser.modern? # Webkit, Firefox 17+, IE 9+ and Opera 12+ browser.platform # return :mac, :windows, :linux or :other browser.mac? browser.windows? browser.windows_x64? browser.linux? browser.blackberry? browser.bot? browser.search_engine? browser.phantom_js? browser.quicktime? browser.core_media? browser.silk? browser.known? # has the browser been successfully detected? browser.meta # an array with several attributes browser.to_s # the meta info joined by space ``` See the [tests](https://github.com/fnando/browser/blob/master/test/browser_spec.rb) and [implementation](https://github.com/fnando/browser/blob/master/lib/browser.rb) for more examples. ### What defines a modern browser? The current rules that define a modern browser are pretty loose: * Webkit * IE9+ * Firefox 17+ * Firefox Tablet 14+ * Opera 12+ You can define your own rules. A rule must be a proc/lambda or any object that implements the method === and accepts the browser object. To redefine all rules, clear the existing rules before adding your own. ```ruby # Only Chrome Canary is considered modern. Browser.modern_rules.clear Browser.modern_rules << -> b { b.chrome? && b.version >= '37' } ``` ### Rails integration Just add it to the Gemfile. ```ruby gem "browser" ``` This adds a helper method called `browser`, that inspects your current user agent. ```erb <% if browser.ie6? %>

You're running an older IE version. Please update it!

<% end %> ``` ### Internet Explorer Internet Explorer has a compatibility view mode that allows newer versions (IE8+) to run as an older version. Browser will always return the navigator version, ignoring the compatibility view version, when defined. If you need to get the engine's version, you have to use `Browser#msie_version` and `Browser#msie_full_version`. So, let's say an user activates compatibility view in a IE11 browser. This is what you'll get: ```ruby browser.version #=> 11 browser.full_version #=> 11.0 browser.msie_version #=> 7 browser.msie_full_version #=> 7.0 browser.compatibility_view? #=> true browser.modern? #=> false ``` This behavior changed in `v1.0.0`; previously there wasn't a way of getting the real browser version. ### Bots Browser used to detect empty user agents as bots, but this behaviour has changed. If you want to bring this detection back, you can activate it through the following call: ```ruby Browser::Bots.detect_empty_ua! ``` ### Middleware You can use the `Browser::Middleware` to redirect user agents. ```ruby use Browser::Middleware do redirect_to "/upgrade" unless browser.modern? end ``` If you're using Rails, you can use the route helper methods. Just add something like the following to a initializer file (`config/initializers/browser.rb`). ```ruby Rails.configuration.middleware.use Browser::Middleware do redirect_to upgrade_path unless browser.modern? end ``` Notice that you can have multiple conditionals. ```ruby Rails.configuration.middleware.use Browser::Middleware do next if browser.search_engine? redirect_to upgrade_path(browser: "oldie") if browser.ie? && !browser.modern? redirect_to upgrade_path(browser: "oldfx") if browser.firefox? && !browser.modern? end ``` If you need acccess to the `Rack::Request` object (e.g. to exclude a path), you can do so with `request`. ```ruby Rails.configuration.middleware.use Browser::Middleware do redirect_to upgrade_path unless browser.modern? || request.env['PATH_INFO'] == '/exclude_me' end ``` ## Maintainer * Nando Vieira - http://nandovieira.com.br ## Contributors * https://github.com/fnando/browser/contributors ## License (The MIT License) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. browser-1.0.1/config.ru0000644000004100000410000000006212572742323015046 0ustar www-datawww-datarequire "./test/sample_app" run Rails.application