browser_sniffer 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/browser_sniffer.gemspec +2 -0
- data/lib/browser_sniffer/patterns.rb +6 -3
- data/lib/browser_sniffer/version.rb +1 -1
- data/lib/browser_sniffer.rb +9 -0
- data/test/browser_sniffer_test.rb +52 -1
- data/test/shopify_agents_test.rb +38 -5
- metadata +5 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: beb896967f13a26304b23513f7e2a6e334854afc3187795a7d98698a4b8a2299
         | 
| 4 | 
            +
              data.tar.gz: b3be5e1a5068b56d87685129404b8ed369644af58adbd815c6634a8500a23221
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b0f851fc4026c1f35e905daf515f68cd4755261fe6c1424825170dcaefa207605bdd825b821f865cecad5bcc4d99394b783f6078c29eb37a41d96ee41ccaff07
         | 
| 7 | 
            +
              data.tar.gz: bad8fe19eb686b1d4e698805a87790cf4e48f4b0654504c5f6d761d2b7cbc97a82746eacade1cbacd210b2459b3e3065f212315b5045bd4bcbe40be09418535f
         | 
    
        data/browser_sniffer.gemspec
    CHANGED
    
    | @@ -17,6 +17,8 @@ Gem::Specification.new do |spec| | |
| 17 17 |  | 
| 18 18 | 
             
              spec.required_ruby_version = ">= 1.9.3"
         | 
| 19 19 |  | 
| 20 | 
            +
              spec.metadata['allowed_push_host'] = 'https://rubygems.org'
         | 
| 21 | 
            +
             | 
| 20 22 | 
             
              spec.add_development_dependency "bundler"
         | 
| 21 23 | 
             
              spec.add_development_dependency "minitest"
         | 
| 22 24 | 
             
              spec.add_development_dependency "rake"
         | 
| @@ -59,6 +59,9 @@ class BrowserSniffer | |
| 59 59 | 
             
                  ], [:name, :version], [
         | 
| 60 60 | 
             
                    # Shopify POS for Android (Native App)
         | 
| 61 61 | 
             
                    %r{.*(\sPOS\s-).*\s([\d+\.]+)(\/\d*)*\s}i,
         | 
| 62 | 
            +
                  ], [[:name, 'Shopify POS'], :version], [
         | 
| 63 | 
            +
                    # Shopify POS for Android (Native App) New Format
         | 
| 64 | 
            +
                    %r{(Shopify POS)\/([\d\.]+)[^\/]*\/(Android)\/(\d+)}i,
         | 
| 62 65 | 
             
                  ], [[:name, 'Shopify POS'], :version], [
         | 
| 63 66 | 
             
                    # Shopify POS for Android (SmartWebView)
         | 
| 64 67 | 
             
                    %r{.*(Shopify\sPOS)\s.*Android.*\s([\d+\.]+)(\/\d*)*\s}i,
         | 
| @@ -73,8 +76,8 @@ class BrowserSniffer | |
| 73 76 | 
             
                    %r{.*(Shopify POS Next|Shopify POS)\/(?:iOS)\/([\d\.]+) \((iPhone|iPad|iPod)}i
         | 
| 74 77 | 
             
                  ], [[:name, 'Shopify POS'], :version], [
         | 
| 75 78 | 
             
                    # Shopify Mobile for Android
         | 
| 76 | 
            -
                    %r{.*(Shopify Mobile)\/Android\/([\d\.]+(?: \(debug(?:|-push)\))? | 
| 77 | 
            -
                  ], [[:name, 'Shopify Mobile'], :version, :build, :sdk_version], [
         | 
| 79 | 
            +
                    %r{.*(Shopify Mobile)\/Android\/([\d\.]+)(?: \((debug(?:|-push))\))? \(Build (\d+) with API (\d+)}i
         | 
| 80 | 
            +
                  ], [[:name, 'Shopify Mobile'], :version, :debug_mode, :build, :sdk_version], [
         | 
| 78 81 | 
             
                    # ShopifyFoundation shared library
         | 
| 79 82 | 
             
                    /^(ShopifyFoundation)/i,
         | 
| 80 83 | 
             
                  ], [:name], [
         | 
| @@ -332,7 +335,7 @@ class BrowserSniffer | |
| 332 335 | 
             
                    /(gnu)\s?([\w\.]+)*/i # GNU
         | 
| 333 336 | 
             
                  ], [:name, :version, [:type, :linux]], [
         | 
| 334 337 | 
             
                    /(cros)\s[\w]+\s([\w\.]+\w)/i # Chromium OS
         | 
| 335 | 
            -
                  ], [[:name, 'Chromium OS'], :version],[
         | 
| 338 | 
            +
                  ], [[:name, 'Chromium OS'], :version, [:type, :chromium_os]],[
         | 
| 336 339 | 
             
                    # Solaris
         | 
| 337 340 | 
             
                    /(sunos)\s?([\w\.]+\d)*/i # Solaris
         | 
| 338 341 | 
             
                  ], [[:name, 'Solaris'], :version], [
         | 
    
        data/lib/browser_sniffer.rb
    CHANGED
    
    | @@ -24,6 +24,15 @@ class BrowserSniffer | |
| 24 24 | 
             
                browser == :ie && major_browser_version == 11
         | 
| 25 25 | 
             
              end
         | 
| 26 26 |  | 
| 27 | 
            +
              # This method checks ie 11 mobile or ie11 rendering an older version in compatibility mode, in addition to `ie11?`.
         | 
| 28 | 
            +
              # The `ie11?` method would return false in both those scenarios.
         | 
| 29 | 
            +
              def ie11_actual?
         | 
| 30 | 
            +
                ie11_engine = major_engine_version == 7 && engine_name == 'Trident'
         | 
| 31 | 
            +
                ie_mobile11 = major_browser_version == 11 && browser_name == 'IEMobile'
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                ie11? || ie11_engine || ie_mobile11
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 27 36 | 
             
              def handheld?
         | 
| 28 37 | 
             
                form_factor == :handheld
         | 
| 29 38 | 
             
              end
         | 
| @@ -454,6 +454,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 454 454 | 
             
                  :android? => false,
         | 
| 455 455 | 
             
                  :desktop? => true,
         | 
| 456 456 | 
             
                  :ie11? => false,
         | 
| 457 | 
            +
                  :ie11_actual? => false,
         | 
| 457 458 | 
             
                  :engine => nil,
         | 
| 458 459 | 
             
                  :major_engine_version => nil,
         | 
| 459 460 | 
             
                  :os => :mac,
         | 
| @@ -467,6 +468,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 467 468 | 
             
                  :form_factor => :desktop,
         | 
| 468 469 | 
             
                  :ios? => false,
         | 
| 469 470 | 
             
                  :ie11? => true,
         | 
| 471 | 
            +
                  :ie11_actual? => true,
         | 
| 470 472 | 
             
                  :android? => false,
         | 
| 471 473 | 
             
                  :desktop? => true,
         | 
| 472 474 | 
             
                  :engine => :trident,
         | 
| @@ -481,6 +483,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 481 483 | 
             
                  :form_factor => :desktop,
         | 
| 482 484 | 
             
                  :ios? => false,
         | 
| 483 485 | 
             
                  :ie11? => true,
         | 
| 486 | 
            +
                  :ie11_actual? => true,
         | 
| 484 487 | 
             
                  :android? => false,
         | 
| 485 488 | 
             
                  :desktop? => true,
         | 
| 486 489 | 
             
                  :engine => :trident,
         | 
| @@ -495,6 +498,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 495 498 | 
             
                  :form_factor => :desktop,
         | 
| 496 499 | 
             
                  :ios? => false,
         | 
| 497 500 | 
             
                  :ie11? => true,
         | 
| 501 | 
            +
                  :ie11_actual? => true,
         | 
| 498 502 | 
             
                  :android? => false,
         | 
| 499 503 | 
             
                  :desktop? => true,
         | 
| 500 504 | 
             
                  :engine => :trident,
         | 
| @@ -509,6 +513,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 509 513 | 
             
                  :form_factor => :desktop,
         | 
| 510 514 | 
             
                  :ios? => false,
         | 
| 511 515 | 
             
                  :ie11? => true,
         | 
| 516 | 
            +
                  :ie11_actual? => true,
         | 
| 512 517 | 
             
                  :android? => false,
         | 
| 513 518 | 
             
                  :desktop? => true,
         | 
| 514 519 | 
             
                  :engine => :trident,
         | 
| @@ -523,6 +528,7 @@ class BrowserSnifferTest < Minitest::Test | |
| 523 528 | 
             
                  :form_factor => :desktop,
         | 
| 524 529 | 
             
                  :ios? => false,
         | 
| 525 530 | 
             
                  :ie11? => false,
         | 
| 531 | 
            +
                  :ie11_actual? => false,
         | 
| 526 532 | 
             
                  :android? => false,
         | 
| 527 533 | 
             
                  :desktop? => true,
         | 
| 528 534 | 
             
                  :engine => :webkit,
         | 
| @@ -544,7 +550,52 @@ class BrowserSnifferTest < Minitest::Test | |
| 544 550 | 
             
                  :os_version => nil,
         | 
| 545 551 | 
             
                  :browser => nil,
         | 
| 546 552 | 
             
                  :major_browser_version => nil
         | 
| 547 | 
            -
                }
         | 
| 553 | 
            +
                },
         | 
| 554 | 
            +
                :chromiumos_chrome => {
         | 
| 555 | 
            +
                  :user_agent => "Mozilla/5.0 (X11; CrOS x86_64 10066.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36",
         | 
| 556 | 
            +
                  :form_factor => :desktop,
         | 
| 557 | 
            +
                  :ios? => false,
         | 
| 558 | 
            +
                  :android? => false,
         | 
| 559 | 
            +
                  :desktop? => true,
         | 
| 560 | 
            +
                  :engine => :webkit,
         | 
| 561 | 
            +
                  :major_engine_version => 537,
         | 
| 562 | 
            +
                  :os => :chromium_os,
         | 
| 563 | 
            +
                  :os_version => '10066.0.0',
         | 
| 564 | 
            +
                  :browser => :chrome,
         | 
| 565 | 
            +
                  :major_browser_version => 81,
         | 
| 566 | 
            +
                },
         | 
| 567 | 
            +
                :windows_phone_8_1_ie11 => {
         | 
| 568 | 
            +
                  :user_agent => "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; " \
         | 
| 569 | 
            +
                   "Lumia 640 XL) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
         | 
| 570 | 
            +
                  :form_factor => :handheld,
         | 
| 571 | 
            +
                  :ios? => false,
         | 
| 572 | 
            +
                  :ie11? => false,
         | 
| 573 | 
            +
                  :ie11_actual? => true,
         | 
| 574 | 
            +
                  :android? => false,
         | 
| 575 | 
            +
                  :desktop? => false,
         | 
| 576 | 
            +
                  :engine => :webkit,
         | 
| 577 | 
            +
                  :major_engine_version => 53,
         | 
| 578 | 
            +
                  :os => :windows,
         | 
| 579 | 
            +
                  :os_version => "8.1",
         | 
| 580 | 
            +
                  :browser => nil,
         | 
| 581 | 
            +
                  :major_browser_version => 11
         | 
| 582 | 
            +
                },
         | 
| 583 | 
            +
                :win10_ie11_in_ie7_compatibility_mode => {
         | 
| 584 | 
            +
                  :user_agent => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; " \
         | 
| 585 | 
            +
                   ".NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; Tablet PC 2.0; Zoom 3.6.0)",
         | 
| 586 | 
            +
                  :form_factor => :desktop,
         | 
| 587 | 
            +
                  :ios? => false,
         | 
| 588 | 
            +
                  :ie11? => false,
         | 
| 589 | 
            +
                  :ie11_actual? => true,
         | 
| 590 | 
            +
                  :android? => false,
         | 
| 591 | 
            +
                  :desktop? => true,
         | 
| 592 | 
            +
                  :engine => :trident,
         | 
| 593 | 
            +
                  :major_engine_version => 7,
         | 
| 594 | 
            +
                  :os => :windows,
         | 
| 595 | 
            +
                  :os_version => "10",
         | 
| 596 | 
            +
                  :browser => :ie,
         | 
| 597 | 
            +
                  :major_browser_version => 7
         | 
| 598 | 
            +
                },
         | 
| 548 599 | 
             
              }
         | 
| 549 600 |  | 
| 550 601 | 
             
              AGENTS.each do |agent, attributes|
         | 
    
        data/test/shopify_agents_test.rb
    CHANGED
    
    | @@ -155,6 +155,7 @@ describe "Shopify agents" do | |
| 155 155 | 
             
                assert_equal ({
         | 
| 156 156 | 
             
                  name: 'Shopify Mobile',
         | 
| 157 157 | 
             
                  version: '5.4.4',
         | 
| 158 | 
            +
                  debug_mode: nil,
         | 
| 158 159 | 
             
                  build: '12005',
         | 
| 159 160 | 
             
                  sdk_version: '25',
         | 
| 160 161 | 
             
                }), sniffer.browser_info
         | 
| @@ -174,10 +175,11 @@ describe "Shopify agents" do | |
| 174 175 | 
             
                "MobileMiddlewareSupported Mozilla/5.0 (Linux; Android 9; Android SDK built for x86 Build/PSR1.180720.075; wv) "\
         | 
| 175 176 | 
             
                "AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Mobile Safari/537.36"
         | 
| 176 177 | 
             
                sniffer = BrowserSniffer.new(user_agent)
         | 
| 177 | 
            -
             | 
| 178 | 
            +
             | 
| 178 179 | 
             
                assert_equal ({
         | 
| 179 180 | 
             
                  name: 'Shopify Mobile',
         | 
| 180 181 | 
             
                  version: '8.12.0',
         | 
| 182 | 
            +
                  debug_mode: nil,
         | 
| 181 183 | 
             
                  build: '12005',
         | 
| 182 184 | 
             
                  sdk_version: '28',
         | 
| 183 185 | 
             
                }), sniffer.browser_info
         | 
| @@ -203,7 +205,8 @@ describe "Shopify agents" do | |
| 203 205 |  | 
| 204 206 | 
             
                assert_equal ({
         | 
| 205 207 | 
             
                  name: 'Shopify Mobile',
         | 
| 206 | 
            -
                  version: '6.2.0 | 
| 208 | 
            +
                  version: '6.2.0',
         | 
| 209 | 
            +
                  debug_mode: 'debug',
         | 
| 207 210 | 
             
                  build: '1',
         | 
| 208 211 | 
             
                  sdk_version: '25',
         | 
| 209 212 | 
             
                }), sniffer.browser_info
         | 
| @@ -551,13 +554,42 @@ describe "Shopify agents" do | |
| 551 554 | 
             
                assert_equal sniffer.os_info, sniffer_with_suffix.os_info
         | 
| 552 555 | 
             
              end
         | 
| 553 556 |  | 
| 557 | 
            +
              it "Shopify POS on Android can be sniffed (Native App) New Format" do
         | 
| 558 | 
            +
                user_agent = "com.jadedpixel.pos Shopify POS/4.23.0/Android/12/google/Pixel 5/production MobileMiddlewareSupported"
         | 
| 559 | 
            +
                sniffer = BrowserSniffer.new(user_agent)
         | 
| 560 | 
            +
             | 
| 561 | 
            +
                user_agent_with_mal = "com.jadedpixel.pos Shopify POS/4.23.0-mal+30112/Android/12/google/Android SDK built for " \
         | 
| 562 | 
            +
                "x86/development MobileMiddlewareSupported"
         | 
| 563 | 
            +
                sniffer_with_suffix = BrowserSniffer.new(user_agent_with_mal)
         | 
| 564 | 
            +
             | 
| 565 | 
            +
                assert_equal ({
         | 
| 566 | 
            +
                  name: 'Shopify POS',
         | 
| 567 | 
            +
                  version: '4.23.0',
         | 
| 568 | 
            +
                }), sniffer.browser_info
         | 
| 569 | 
            +
             | 
| 570 | 
            +
                assert_equal ({
         | 
| 571 | 
            +
                  type: :handheld,
         | 
| 572 | 
            +
                }), sniffer.device_info
         | 
| 573 | 
            +
             | 
| 574 | 
            +
                assert_equal ({
         | 
| 575 | 
            +
                  type: :android,
         | 
| 576 | 
            +
                  version: '12',
         | 
| 577 | 
            +
                  name: 'Android',
         | 
| 578 | 
            +
                }), sniffer.os_info
         | 
| 579 | 
            +
             | 
| 580 | 
            +
                assert_equal sniffer.browser_info, sniffer_with_suffix.browser_info
         | 
| 581 | 
            +
                assert_equal sniffer.device_info, sniffer_with_suffix.device_info
         | 
| 582 | 
            +
                assert_equal sniffer.os_info, sniffer_with_suffix.os_info
         | 
| 583 | 
            +
              end
         | 
| 584 | 
            +
             | 
| 554 585 | 
             
              it "Shopify Mobile in debug mode can be parsed" do
         | 
| 555 586 | 
             
                user_agent = "Shopify Mobile/Android/6.0.0 (debug) (Build 1 with API 25 on Unknown Android SDK built for x86)"
         | 
| 556 587 | 
             
                sniffer = BrowserSniffer.new(user_agent)
         | 
| 557 588 |  | 
| 558 589 | 
             
                assert_equal ({
         | 
| 559 590 | 
             
                  name: 'Shopify Mobile',
         | 
| 560 | 
            -
                  version: '6.0.0 | 
| 591 | 
            +
                  version: '6.0.0',
         | 
| 592 | 
            +
                  debug_mode: 'debug',
         | 
| 561 593 | 
             
                  build: '1',
         | 
| 562 594 | 
             
                  sdk_version: '25',
         | 
| 563 595 | 
             
                }), sniffer.browser_info
         | 
| @@ -580,7 +612,8 @@ describe "Shopify agents" do | |
| 580 612 |  | 
| 581 613 | 
             
                assert_equal ({
         | 
| 582 614 | 
             
                  name: 'Shopify Mobile',
         | 
| 583 | 
            -
                  version: '6.0.0 | 
| 615 | 
            +
                  version: '6.0.0',
         | 
| 616 | 
            +
                  debug_mode: 'debug-push',
         | 
| 584 617 | 
             
                  build: '1',
         | 
| 585 618 | 
             
                  sdk_version: '25',
         | 
| 586 619 | 
             
                }), sniffer.browser_info
         | 
| @@ -703,7 +736,7 @@ describe "Shopify agents" do | |
| 703 736 | 
             
              COMPATIBLE_USER_AGENTS.each do |user_agent|
         | 
| 704 737 | 
             
                it "user agent #{user_agent} is correctly marked as compatible" do
         | 
| 705 738 | 
             
                  sniffer = BrowserSniffer.new(user_agent)
         | 
| 706 | 
            -
             | 
| 739 | 
            +
             | 
| 707 740 | 
             
                  assert sniffer.same_site_none_compatible?
         | 
| 708 741 | 
             
                end
         | 
| 709 742 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: browser_sniffer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Shopify
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-11-04 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -79,7 +79,8 @@ homepage: https://github.com/Shopify/browser_sniffer | |
| 79 79 | 
             
            licenses:
         | 
| 80 80 | 
             
            - GPLv2
         | 
| 81 81 | 
             
            - MIT
         | 
| 82 | 
            -
            metadata: | 
| 82 | 
            +
            metadata:
         | 
| 83 | 
            +
              allowed_push_host: https://rubygems.org
         | 
| 83 84 | 
             
            post_install_message: 
         | 
| 84 85 | 
             
            rdoc_options: []
         | 
| 85 86 | 
             
            require_paths:
         | 
| @@ -95,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 95 96 | 
             
                - !ruby/object:Gem::Version
         | 
| 96 97 | 
             
                  version: '0'
         | 
| 97 98 | 
             
            requirements: []
         | 
| 98 | 
            -
            rubygems_version: 3. | 
| 99 | 
            +
            rubygems_version: 3.2.20
         | 
| 99 100 | 
             
            signing_key: 
         | 
| 100 101 | 
             
            specification_version: 4
         | 
| 101 102 | 
             
            summary: Parses user agent strings and boils it all down to a few simple classifications.
         |