Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 9 additions & 29 deletions .github/workflows/ruby-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name: ruby-tests

on:
pull_request_target:
pull_request:
push:
branches:
- main
Expand All @@ -13,45 +13,25 @@ jobs:
build:
name: Tests with Ruby ${{ matrix.ruby }} and ${{ matrix.gemfile }}
runs-on: "ubuntu-latest"
if: |
github.actor == 'dependabot[bot]' && github.event_name == 'pull_request_target' ||
github.actor != 'dependabot[bot]'
strategy:
fail-fast: false
matrix:
ruby: ["3.3", "3.4"]
ruby: ["3.3", "3.4", "4.0"]
gemfile:
- Gemfile
- gemfiles/7_1.gemfile
- gemfiles/7_0.gemfile
- gemfiles/8_0.gemfile

steps:
- uses: actions/checkout@v4
env:
BUNDLE_GEMFILE: ${{ matrix.gemfile }}

- uses: actions/cache@v4
with:
path: vendor/bundle
key: >
${{ runner.os }}-${{ matrix.ruby }}-gems-${{
hashFiles(matrix.gemfile) }}
steps:
- uses: actions/checkout@v7

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}

- name: Install gem dependencies
env:
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
run: |
gem install bundler
bundle config path vendor/bundle
bundle update --jobs 4 --retry 3
bundler-cache: true

- name: Run Tests
env:
PGHOST: localhost
PGUSER: postgres
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
run: |
bundle exec rake
run: bundle exec rake
2 changes: 1 addition & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ inherit_gem:
rubocop-fnando: .rubocop.yml

AllCops:
TargetRubyVersion: 2.5
TargetRubyVersion: 3.3
NewCops: enable
Exclude:
- bin/**/*
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## Unreleased

- Bump up minimum required ruby version to 3.3.0.

## 6.2.0

- Add `Browser::Base#epiphany?`.
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ task :rubocop do
--display-style-guide
--display-cop-names
--extra-details
--auto-correct
--autocorrect
]
end
end
Expand Down
2 changes: 1 addition & 1 deletion browser.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Gem::Specification.new do |s|
s.summary = "Do some browser detection with Ruby."
s.description = s.summary
s.license = "MIT"
s.required_ruby_version = ">= 3.2.0"
s.required_ruby_version = ">= 3.3.0"

s.metadata["rubygems_mfa_required"] = "true"
s.metadata["changelog_uri"] = "https://github.com/fnando/browser/blob/main/CHANGELOG.md"
Expand Down
6 changes: 0 additions & 6 deletions gemfiles/7_0.gemfile

This file was deleted.

6 changes: 0 additions & 6 deletions gemfiles/7_1.gemfile

This file was deleted.

9 changes: 9 additions & 0 deletions gemfiles/8_0.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

source "https://rubygems.org"
gemspec path: ".."

gem "rails", "~> 8.0.0"

# json 3 dropped the quirks_mode option that Active Support < 8.1 passes
gem "json", "< 3"
1 change: 1 addition & 0 deletions lib/browser/aliases.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ module Aliases
def self.included(target)
target.class_eval do
extend Forwardable

def_delegators :platform, *PLATFORM_ALIASES
def_delegators :device, *DEVICE_ALIASES
end
Expand Down
1 change: 0 additions & 1 deletion lib/browser/browser.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# frozen_string_literal: true

require "set"
require "yaml"
require "pathname"

Expand Down
9 changes: 4 additions & 5 deletions lib/browser/device.rb
Original file line number Diff line number Diff line change
Expand Up @@ -199,14 +199,13 @@ def samsung?
end

# Regex taken from http://detectmobilebrowsers.com
# rubocop:disable Layout/LineLength
# rubocop:disable-next Layout/LineLength
private def detect_mobile?
psp? ||
/zunewp7|crios/i.match?(ua) ||
%r{(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) ||
%r{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])
/zunewp7|crios/i.match?(ua) ||
%r{(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) ||
%r{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
# rubocop:enable Layout/LineLength

private def platform
@platform ||= Platform.new(ua)
Expand Down
2 changes: 1 addition & 1 deletion lib/browser/device/samsung.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
module Browser
class Device
class Samsung < Base
REGEX = /\(Linux.*?; Android.*?; (SAMSUNG )?(SM-[A-Z0-9]+).*?\)/i.freeze
REGEX = /\(Linux.*?; Android.*?; (SAMSUNG )?(SM-[A-Z0-9]+).*?\)/i

def self.names
@names ||= YAML.load_file(Browser.root.join("samsung.yml").to_s)
Expand Down
4 changes: 2 additions & 2 deletions lib/browser/middleware.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ module 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.freeze
/\.(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|\*/\*)}.freeze
ACCEPT_REGEX = %r{(text/html|\*/\*)}

def initialize(app, &block)
raise ArgumentError, "Browser::Middleware requires a block" unless block
Expand Down
4 changes: 2 additions & 2 deletions lib/browser/platform/ios.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
module Browser
class Platform
class IOS < Base
MATCHER = /(iPhone|iPad|iPod|CriOS)/.freeze
MATCHER = /(iPhone|iPad|iPod|CriOS)/
VERSION_MATCHER =
/OS (?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?/.freeze
/OS (?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?/

def version
matches = VERSION_MATCHER.match(ua)
Expand Down
2 changes: 1 addition & 1 deletion lib/browser/rails.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# frozen_string_literal: true

require "rails/railtie"
require "rails"
require_relative "action_controller"
require_relative "middleware/context/additions"

Expand Down
2 changes: 1 addition & 1 deletion test/browser_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ class BrowserTest < Minitest::Test

test "removes duplicate items" do
browser = Browser.new(Browser["SAFARI"])
assert_equal ["safari"], (browser.meta.select {|item| item == "safari" })
assert_equal(["safari"], browser.meta.select {|item| item == "safari" })
end

test "detects meta aliased as to_a" do
Expand Down
4 changes: 2 additions & 2 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ class Test
Browser::Bot.instance_variable_set(:@detect_empty_ua, false)
end

def assert_deprecated(message, file, line, &block)
def assert_deprecated(message, file, line, &)
message = "#{message} (called from #{file}:#{line})"
_out, err = capture_io(&block)
_out, err = capture_io(&)
assert_includes err, message
end
end
Expand Down
Loading