From 791c4233ca6be77b805c355742aba0fe708b2e69 Mon Sep 17 00:00:00 2001 From: Max Melentiev Date: Wed, 30 Dec 2020 18:04:32 +0300 Subject: [PATCH] Ruby 3.0 support, drop support for Ruby < 2.4 --- .travis.yml | 11 ++++++++--- CHANGELOG.md | 2 ++ Gemfile | 14 +++++++------- gemfiles/rails_42.gemfile | 14 +++++++------- gemfiles/rails_50.gemfile | 14 +++++++------- gemfiles/rails_51.gemfile | 14 +++++++------- gemfiles/rails_52.gemfile | 14 +++++++------- gemfiles/rails_60.gemfile | 14 +++++++------- gemfiles/rails_61.gemfile | 14 +++++++------- lib/telegram/bot/client_stub.rb | 4 ++-- spec/support/examples/async.rb | 9 ++++----- spec/telegram/bot/client_spec.rb | 16 +++++++++++----- spec/telegram/bot/client_stub_spec.rb | 14 ++++++++------ spec/telegram/bot/routes_helper_spec.rb | 2 +- telegram-bot.gemspec | 2 +- 15 files changed, 86 insertions(+), 72 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5b15040..6f88ed7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +os: linux +dist: xenial language: ruby cache: bundler rvm: @@ -7,8 +9,13 @@ gemfile: - gemfiles/rails_61.gemfile - gemfiles/rails_60.gemfile - gemfiles/rails_52.gemfile -matrix: +jobs: include: + # ruby 3.x + - rvm: 3.0 + gemfile: gemfiles/rails_61.gemfile + - rvm: 3.0 + gemfile: gemfiles/rails_60.gemfile # old rails - rvm: 2.5 gemfile: gemfiles/rails_51.gemfile @@ -19,7 +26,5 @@ matrix: # old rubies - rvm: 2.4 gemfile: gemfiles/rails_52.gemfile - - rvm: 2.3 - gemfile: gemfiles/rails_52.gemfile notifications: email: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a470df..293766a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- Ruby 3.0 support. Drop support for Ruby < 2.4. + # 0.15.1 - Rails 6.1 support. diff --git a/Gemfile b/Gemfile index c87d544..eceb37d 100644 --- a/Gemfile +++ b/Gemfile @@ -4,17 +4,17 @@ gemspec group :development do gem 'appraisal', '~> 2.2' - gem 'pry', '~> 0.10.1' - gem 'pry-byebug', '~> 3.2.0' - gem 'sdoc', '~> 0.4.1' + gem 'pry', '~> 0.13.1' + gem 'pry-byebug', '~> 3.9.0' + gem 'sdoc', '~> 2.0.3' gem 'telegram-bot-types', '~> 0.6.2' - gem 'rspec', '~> 3.5.0' - gem 'rspec-its', '~> 1.1.0' - gem 'rspec-rails', '~> 3.5.0' + gem 'rspec', '~> 3.10.0' + gem 'rspec-its', '~> 1.3.0' + gem 'rspec-rails', '~> 4.0.2' gem 'rubocop', '~> 0.52.1' - gem 'coveralls', '~> 0.8.2', require: false + gem 'coveralls', '~> 0.8.23', require: false end diff --git a/gemfiles/rails_42.gemfile b/gemfiles/rails_42.gemfile index 08dc582..af9d2e2 100644 --- a/gemfiles/rails_42.gemfile +++ b/gemfiles/rails_42.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 4.2.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/gemfiles/rails_50.gemfile b/gemfiles/rails_50.gemfile index 552b189..857b2af 100644 --- a/gemfiles/rails_50.gemfile +++ b/gemfiles/rails_50.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 5.0.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/gemfiles/rails_51.gemfile b/gemfiles/rails_51.gemfile index ad81dd6..2fe3d48 100644 --- a/gemfiles/rails_51.gemfile +++ b/gemfiles/rails_51.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 5.1.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/gemfiles/rails_52.gemfile b/gemfiles/rails_52.gemfile index a4a3603..bd6915f 100644 --- a/gemfiles/rails_52.gemfile +++ b/gemfiles/rails_52.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 5.2.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/gemfiles/rails_60.gemfile b/gemfiles/rails_60.gemfile index 2c49975..d387f8e 100644 --- a/gemfiles/rails_60.gemfile +++ b/gemfiles/rails_60.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 6.0.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/gemfiles/rails_61.gemfile b/gemfiles/rails_61.gemfile index 4e6c96c..4ac8b94 100644 --- a/gemfiles/rails_61.gemfile +++ b/gemfiles/rails_61.gemfile @@ -7,15 +7,15 @@ gem "railties", "~> 6.1.0" group :development do gem "appraisal", "~> 2.2" - gem "pry", "~> 0.10.1" - gem "pry-byebug", "~> 3.2.0" - gem "sdoc", "~> 0.4.1" + gem "pry", "~> 0.13.1" + gem "pry-byebug", "~> 3.9.0" + gem "sdoc", "~> 2.0.3" gem "telegram-bot-types", "~> 0.6.2" - gem "rspec", "~> 3.5.0" - gem "rspec-its", "~> 1.1.0" - gem "rspec-rails", "~> 3.5.0" + gem "rspec", "~> 3.10.0" + gem "rspec-its", "~> 1.3.0" + gem "rspec-rails", "~> 4.0.2" gem "rubocop", "~> 0.52.1" - gem "coveralls", "~> 0.8.2", require: false + gem "coveralls", "~> 0.8.23", require: false end gemspec path: "../" diff --git a/lib/telegram/bot/client_stub.rb b/lib/telegram/bot/client_stub.rb index 8235266..2491bb8 100644 --- a/lib/telegram/bot/client_stub.rb +++ b/lib/telegram/bot/client_stub.rb @@ -5,11 +5,11 @@ module Telegram attr_reader :requests module StubbedConstructor - def new(*args) + def new(*args, **kwargs) if self == ClientStub || !ClientStub.stub_all? super else - ClientStub.new(*args) + ClientStub.new(*args, **kwargs) end end end diff --git a/spec/support/examples/async.rb b/spec/support/examples/async.rb index cbf384b..683a01e 100644 --- a/spec/support/examples/async.rb +++ b/spec/support/examples/async.rb @@ -1,4 +1,4 @@ -RSpec.shared_examples 'async' do |request_args: -> {}| +RSpec.shared_examples 'async' do |request_args:| let(:instance) { described_class.new(token: token, id: id, async: async) } let(:id) { :default_bot } let(:async) { true } @@ -103,7 +103,7 @@ RSpec.shared_examples 'async' do |request_args: -> {}| end describe '#request' do - subject { ->(*args) { instance.request(*(args.empty? ? self.args : args)) } } + subject { ->(*args) { instance.request(*args) } } let(:args, &request_args) let(:result) { double(:result) } @@ -112,7 +112,7 @@ RSpec.shared_examples 'async' do |request_args: -> {}| expect(instance).to_not receive(:http_request) expect(described_class).to receive(:prepare_async_args).with(*args) { args } expect(instance.async).to receive(:perform_later).with(id.to_s, *args) { result } - expect(subject.call).to eq result + expect(subject.call(*args)).to eq result end end @@ -131,12 +131,11 @@ RSpec.shared_examples 'async' do |request_args: -> {}| context 'when async is disabled' do let(:async) { false } let(:result) { double(status: 200, body: '{"test":"ok"}') } - let(:args, &request_args) it 'performs request immediately' do expect(instance).to receive(:request).with(*args).and_call_original expect(instance).to receive(:http_request) { result } - expect(subject[]).to eq 'test' => 'ok' + expect(subject.call(*args)).to eq 'test' => 'ok' end end end diff --git a/spec/telegram/bot/client_spec.rb b/spec/telegram/bot/client_spec.rb index 5553a18..ab9983c 100644 --- a/spec/telegram/bot/client_spec.rb +++ b/spec/telegram/bot/client_spec.rb @@ -14,7 +14,10 @@ RSpec.describe Telegram::Bot::Client do let(:input) { token } it 'treats string as token' do - expect(described_class).to receive(:new).with(token, {}) { result } + expect(described_class).to receive(:new) do |*args, **kwargs| + expect([*args, kwargs]).to eq([token, {}]) # not using .with to support ruby 2.x and 3.x + result + end should eq result end @@ -94,7 +97,9 @@ RSpec.describe Telegram::Bot::Client do end describe '.new' do - subject { described_class.new(*args) } + subject { described_class.new(*args, **kwargs) } + let(:args) { [] } + let(:kwargs) { {} } let(:token) { 'secret' } let(:username) { 'superbot' } @@ -106,7 +111,7 @@ RSpec.describe Telegram::Bot::Client do end context 'when hash is given' do - let(:args) { [token: 'secret', username: 'superbot'] } + let(:kwargs) { {token: 'secret', username: 'superbot'} } its(:token) { should eq token } its(:username) { should eq username } its(:base_uri) { should eq "#{described_class::SERVER}/bot#{token}/" } @@ -114,11 +119,12 @@ RSpec.describe Telegram::Bot::Client do context 'with custom server' do let(:server) { 'http://my.server' } - let(:args) { [token, username, server: server] } + let(:args) { [token, username] } + let(:kwargs) { {server: server} } its(:base_uri) { should eq "#{server}/bot#{token}/" } context 'and hash options' do - let(:args) { [token: token, username: username, server: server] } + let(:kwargs) { {token: token, username: username, server: server} } its(:base_uri) { should eq "#{server}/bot#{token}/" } end end diff --git a/spec/telegram/bot/client_stub_spec.rb b/spec/telegram/bot/client_stub_spec.rb index bdfe47b..655ad08 100644 --- a/spec/telegram/bot/client_stub_spec.rb +++ b/spec/telegram/bot/client_stub_spec.rb @@ -37,11 +37,13 @@ RSpec.describe Telegram::Bot::ClientStub do end describe '#new' do - subject { described_class.new(*args) } + subject { described_class.new(*args, **kwargs) } + let(:args) { [] } + let(:kwargs) { {} } context 'when only username is given' do - let(:args) { 'superbot' } - its(:username) { should eq args } + let(:args) { ['superbot'] } + its(:username) { should eq args[0] } end context 'when username and token are given' do @@ -51,9 +53,9 @@ RSpec.describe Telegram::Bot::ClientStub do end context 'when hash config is given' do - let(:args) { [token: 'token', username: 'superbot'] } - its(:token) { should eq args[0][:token] } - its(:username) { should eq args[0][:username] } + let(:kwargs) { {token: 'token', username: 'superbot'} } + its(:token) { should eq kwargs[:token] } + its(:username) { should eq kwargs[:username] } end end end diff --git a/spec/telegram/bot/routes_helper_spec.rb b/spec/telegram/bot/routes_helper_spec.rb index 15a909b..ed9049b 100644 --- a/spec/telegram/bot/routes_helper_spec.rb +++ b/spec/telegram/bot/routes_helper_spec.rb @@ -41,7 +41,7 @@ RSpec.describe Telegram::Bot::RoutesHelper do end describe '#telegram_webhook' do - subject { ->(*args) { mapper.telegram_webhook(*args) } } + subject { ->(*args, **kwargs) { mapper.telegram_webhook(*args, **kwargs) } } let(:mapper) { double(:mapper).tap { |x| x.extend described_class } } let(:controller) { double(:controller, name: :controller) } before { allow(Telegram).to receive(:bots) { bots } } diff --git a/telegram-bot.gemspec b/telegram-bot.gemspec index e4c4999..f8c2457 100644 --- a/telegram-bot.gemspec +++ b/telegram-bot.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ['lib'] - spec.required_ruby_version = '~> 2.0' + spec.required_ruby_version = '>= 2.4' spec.add_dependency 'actionpack', '>= 4.0', '< 6.2' spec.add_dependency 'activesupport', '>= 4.0', '< 6.2'