diff --git a/.codeclimate.yml b/.codeclimate.yml index 25fc0fd..63761a9 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -2,7 +2,3 @@ checks: method-complexity: config: threshold: 6 # should be just fine - -plugins: - rubocop: - enabled: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d9f39b0..f4084e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,15 +3,15 @@ name: Lint & Test on: [push, pull_request] jobs: - # lint: - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v3 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: '3.0' - # bundler-cache: true - # - run: bundle exec rubocop + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + - run: bundle exec rubocop test: runs-on: ubuntu-latest diff --git a/.rubocop.yml b/.rubocop.yml index 53ce884..4c21695 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,15 +1,18 @@ -# Rubocop does not support 2.0 -Gemspec/RequiredRubyVersion: {Enabled: false} +require: rubocop-rails -Rails: {Enabled: true} +AllCops: + TargetRubyVersion: 2.4 + NewCops: enable + SuggestExtensions: false + Exclude: + - gemfiles/* + - tmp/* + - vendor/**/* # for github actions -Layout/AlignParameters: - # Disable, till rubocop supports combination of styles. - # Use one of this styles where appropriate, keep it clean, compact and readable. - Enabled: false - # EnforcedStyle: - # - with_first_parameter - # - with_fixed_indentation +Gemspec/DevelopmentDependencies: {Enabled: false} + +Layout/ArgumentAlignment: {EnforcedStyle: with_fixed_indentation} +Layout/ParameterAlignment: {EnforcedStyle: with_fixed_indentation} # Breaks # @@ -19,7 +22,11 @@ Layout/AlignParameters: # ) Layout/ClosingParenthesisIndentation: {Enabled: false} Layout/DotPosition: {EnforcedStyle: trailing} +Layout/EmptyLineAfterGuardClause: {Enabled: false} Layout/FirstParameterIndentation: {EnforcedStyle: consistent} +Layout/LineContinuationLeadingSpace: {Enabled: false} +Layout/LineEndStringConcatenationIndentation: {EnforcedStyle: indented} +Layout/LineLength: {Max: 100} # Same as Layout/ClosingParenthesisIndentation Layout/MultilineMethodCallBraceLayout: {Enabled: false} Layout/MultilineMethodCallIndentation: {EnforcedStyle: indented} @@ -28,8 +35,16 @@ Layout/SpaceInsideHashLiteralBraces: {EnforcedStyle: no_space} # Offences named scopes and `expect {}.to change {}`. Lint/AmbiguousBlockAssociation: {Enabled: false} +Lint/EmptyBlock: + Exclude: + - spec/**/* +Naming/FileName: + Exclude: + - lib/tasks/telegram-bot.rake +Naming/MethodParameterName: {MinNameLength: 2} Naming/PredicateName: {Enabled: false} +Naming/RescuedExceptionsVariableName: {PreferredName: exception} Naming/VariableNumber: {EnforcedStyle: snake_case} Style/Alias: {Enabled: false} @@ -45,12 +60,16 @@ Style/ModuleFunction: {Enabled: false} Style/NestedParenthesizedCalls: {Enabled: false} Style/SignalException: {EnforcedStyle: only_raise} Style/TrailingCommaInArguments: {Enabled: false} -Style/TrailingCommaInLiteral: {EnforcedStyleForMultiline: comma} +Style/TrailingCommaInArrayLiteral: {EnforcedStyleForMultiline: comma} +Style/TrailingCommaInHashLiteral: {EnforcedStyleForMultiline: comma} Metrics/AbcSize: {Max: 21} # Other metrics are just enough. # This one offences all specs, routes and some initializers. Metrics/BlockLength: {Enabled: false} -Metrics/LineLength: {Max: 100} Metrics/MethodLength: {Max: 30} Metrics/CyclomaticComplexity: {Max: 8} + +Rails/IndexWith: {Enabled: false} +Rails/RakeEnvironment: {Enabled: false} +Rails/ShortI18n: {Enabled: false} diff --git a/Appraisals b/Appraisals index 019d01b..5ce8c11 100644 --- a/Appraisals +++ b/Appraisals @@ -1,3 +1,5 @@ +# frozen_string_literal: true + appraise 'rails-71' do gem 'actionpack', '~> 7.1.0' gem 'railties', '~> 7.1.0' diff --git a/CHANGELOG.md b/CHANGELOG.md index 48958dc..8a33d86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- Add `# frozen_string_literal: true` to all source files. + # 0.16.1 - Fix logger in poller mode in rails 7.1 diff --git a/Gemfile b/Gemfile index 7499052..b83e6bd 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + source 'https://rubygems.org' gemspec @@ -14,7 +16,8 @@ group :development do gem 'rspec-its', '~> 1.3.0' gem 'rspec-rails', '~> 4.0.2' - gem 'rubocop', '~> 0.52.1' + gem 'rubocop', '~> 1.59.0' + gem 'rubocop-rails', '~> 2.23.1' gem 'coveralls', '~> 0.8.23', require: false end diff --git a/Rakefile b/Rakefile index a000ffb..de9f76c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'bundler/gem_tasks' require 'rspec/core/rake_task' diff --git a/bin/console b/bin/console index 604f587..7d15701 100755 --- a/bin/console +++ b/bin/console @@ -1,4 +1,5 @@ #!/usr/bin/env ruby +# frozen_string_literal: true require 'bundler/setup' require 'telegram/bot' diff --git a/bin/fetch-telegram-methods b/bin/fetch-telegram-methods index 193d19a..097b94f 100755 --- a/bin/fetch-telegram-methods +++ b/bin/fetch-telegram-methods @@ -1,4 +1,6 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + # # Fetch list of methods from Telegram docs. # Use it to update client.rb. @@ -6,7 +8,7 @@ require 'net/http' require 'nokogiri' -DOCS_URL = 'https://core.telegram.org/bots/api'.freeze +DOCS_URL = 'https://core.telegram.org/bots/api' page_html = Net::HTTP.get(URI(DOCS_URL)) doc = Nokogiri::HTML(page_html) @@ -18,11 +20,11 @@ headers = doc.css('h3, h4'). map { |g| g.map(&:text) } # Method starts with lowercase and does not have spaces. -NOT_METHOD_REGEXP = /(\A[^a-z])|\s/ +NOT_METHOD_REGEXP = /(\A[^a-z])|\s/.freeze # Filter method names. method_list = headers. - map { |g| g.reject { |x| x.match?(NOT_METHOD_REGEXP) } }. + map { |g| g.grep_v(NOT_METHOD_REGEXP) }. reject(&:empty?) api_version = doc.text.match(/^(?:Introducing )?(Bot API ([\d\.]+))\.?$/) diff --git a/bin/install_git_hooks b/bin/install_git_hooks index 4b48122..67eca3b 100755 --- a/bin/install_git_hooks +++ b/bin/install_git_hooks @@ -1,6 +1,7 @@ #!/usr/bin/env ruby +# frozen_string_literal: true -root = File.expand_path('../../', __FILE__) +root = File.expand_path('..', __dir__) hooks_dir = "#{root}/bin/git-hooks" `ls -1 #{hooks_dir}`.each_line.map(&:strip).each do |file| diff --git a/lib/tasks/telegram-bot.rake b/lib/tasks/telegram-bot.rake index c62ed89..04422d6 100644 --- a/lib/tasks/telegram-bot.rake +++ b/lib/tasks/telegram-bot.rake @@ -1,3 +1,5 @@ +# frozen_string_literal: true + namespace :telegram do namespace :bot do desc 'Run poller. It broadcasts Rails.logger to STDOUT in dev like `rails s` do. ' \ @@ -6,14 +8,14 @@ namespace :telegram do ENV['BOT_POLLER_MODE'] = 'true' Rake::Task['environment'].invoke if ENV.fetch('LOG_TO_STDOUT') { Rails.env.development? }.present? - console = ActiveSupport::Logger.new(STDERR) - if ::Rails.logger.respond_to?(:broadcast_to) - ::Rails.logger.broadcast_to(console) + console = ActiveSupport::Logger.new($stderr) + if Rails.logger.respond_to?(:broadcast_to) + Rails.logger.broadcast_to(console) else Rails.logger.extend ActiveSupport::Logger.broadcast console end end - Telegram::Bot::UpdatesPoller.start(ENV['BOT'].try!(:to_sym) || :default) + Telegram::Bot::UpdatesPoller.start(ENV['BOT']&.to_sym || :default) end desc 'Set webhook urls for all bots' diff --git a/lib/telegram/bot.rb b/lib/telegram/bot.rb index 799cefe..393419f 100644 --- a/lib/telegram/bot.rb +++ b/lib/telegram/bot.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/config_methods' module Telegram @@ -12,15 +14,6 @@ module Telegram # Raised for valid telegram response with 404 status code. class NotFound < Error; end - module_function - - def deprecation_0_16 - @deprecation ||= begin - require 'active_support/deprecation' - ActiveSupport::Deprecation.new('0.16', 'Telegram::Bot') - end - end - autoload :Async, 'telegram/bot/async' autoload :Client, 'telegram/bot/client' autoload :ClientStub, 'telegram/bot/client_stub' @@ -30,6 +23,7 @@ module Telegram autoload :Tasks, 'telegram/bot/tasks' autoload :UpdatesController, 'telegram/bot/updates_controller' autoload :UpdatesPoller, 'telegram/bot/updates_poller' + autoload :VERSION, 'telegram/bot/version' end end diff --git a/lib/telegram/bot/async.rb b/lib/telegram/bot/async.rb index 268bf22..47de98d 100644 --- a/lib/telegram/bot/async.rb +++ b/lib/telegram/bot/async.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot # Telegram clients can perform requests in async way with @@ -128,7 +130,7 @@ module Telegram # # If no block is given returns previously set value or the global one, # set by #async=. - def async(val = true) + def async(val = true) # rubocop:disable Style/OptionalBooleanParameter thread_key = object_id thread_store = Async.thread_store return thread_store.fetch(thread_key) { @async } unless block_given? @@ -137,7 +139,7 @@ module Telegram thread_store[thread_key] = self.class.prepare_async_val(val) yield ensure - if MISSING_VALUE == old_val + if old_val == MISSING_VALUE thread_store.delete(thread_key) else thread_store[thread_key] = old_val diff --git a/lib/telegram/bot/client.rb b/lib/telegram/bot/client.rb index 79e018f..153975f 100644 --- a/lib/telegram/bot/client.rb +++ b/lib/telegram/bot/client.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + require 'active_support/core_ext/hash/keys' require 'httpclient' module Telegram module Bot class Client - SERVER = 'https://api.telegram.org'.freeze - URL_TEMPLATE = '%s/bot%s/'.freeze + SERVER = 'https://api.telegram.org' + URL_TEMPLATE = '%s/bot%s/' autoload :RequestBodyFormatter, 'telegram/bot/client/request_body_formatter' autoload :TypedResponse, 'telegram/bot/client/typed_response' @@ -41,7 +43,7 @@ module Telegram end def error_for_response(response) - result = JSON.parse(response.body) rescue nil # rubocop:disable RescueModifier + result = JSON.parse(response.body) rescue nil # rubocop:disable Style/RescueModifier return Error.new(response.reason) unless result message = result['description'] || '-' # This errors are raised only for valid responses from Telegram diff --git a/lib/telegram/bot/client/api_helper.rb b/lib/telegram/bot/client/api_helper.rb index ee33d8b..e4a7cda 100644 --- a/lib/telegram/bot/client/api_helper.rb +++ b/lib/telegram/bot/client/api_helper.rb @@ -1,10 +1,12 @@ +# frozen_string_literal: true + require 'active_support/core_ext/string/inflections' module Telegram module Bot class Client module ApiHelper - METHODS_LIST_FILE = File.expand_path('../api_methods.txt', __FILE__) + METHODS_LIST_FILE = File.expand_path('api_methods.txt', __dir__) class << self def methods_list(file = METHODS_LIST_FILE) diff --git a/lib/telegram/bot/client/request_body_formatter.rb b/lib/telegram/bot/client/request_body_formatter.rb index 385e1a1..bcae116 100644 --- a/lib/telegram/bot/client/request_body_formatter.rb +++ b/lib/telegram/bot/client/request_body_formatter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'json' module Telegram diff --git a/lib/telegram/bot/client/typed_response.rb b/lib/telegram/bot/client/typed_response.rb index b8ae24d..ad74319 100644 --- a/lib/telegram/bot/client/typed_response.rb +++ b/lib/telegram/bot/client/typed_response.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/client/api_helper' require 'active_support/core_ext/string/inflections' diff --git a/lib/telegram/bot/client_stub.rb b/lib/telegram/bot/client_stub.rb index 2491bb8..3e2cc6e 100644 --- a/lib/telegram/bot/client_stub.rb +++ b/lib/telegram/bot/client_stub.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot # Stubbed client for tests. Saves all requests into #requests hash. @@ -17,7 +19,7 @@ module Telegram class << self # Any call to Client.new will return ClientStub instance when `enabled` is true. # Can be used with a block. - def stub_all!(enabled = true) + def stub_all!(enabled = true) # rubocop:disable Style/OptionalBooleanParameter Client.extend(StubbedConstructor) unless Client < StubbedConstructor return @_stub_all = enabled unless block_given? begin @@ -34,7 +36,7 @@ module Telegram end end - def initialize(token = nil, username = nil, **options) + def initialize(token = nil, username = nil, **options) # rubocop:disable Lint/MissingSuper @token = token || options[:token] @username = username || options[:username] || token reset diff --git a/lib/telegram/bot/config_methods.rb b/lib/telegram/bot/config_methods.rb index 154371c..63a9c1f 100644 --- a/lib/telegram/bot/config_methods.rb +++ b/lib/telegram/bot/config_methods.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'active_support/core_ext/hash/keys' require 'active_support/core_ext/hash/indifferent_access' @@ -44,7 +46,7 @@ module Telegram # from `secrets.yml` merging `telegram['bot']` at `:default` key. # # Can be overwritten with .bots_config= - def bots_config + def bots_config # rubocop:disable Metrics/PerceivedComplexity @bots_config ||= if defined?(Rails.application) app = Rails.application diff --git a/lib/telegram/bot/debug_client.rb b/lib/telegram/bot/debug_client.rb index 4a8a733..244b7ff 100644 --- a/lib/telegram/bot/debug_client.rb +++ b/lib/telegram/bot/debug_client.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + module Telegram module Bot module DebugClient - def debug!(dev = STDOUT) + def debug!(dev = $stdout) if block_given? begin old_dev = client.debug_dev diff --git a/lib/telegram/bot/middleware.rb b/lib/telegram/bot/middleware.rb index fa86d74..411bc7b 100644 --- a/lib/telegram/bot/middleware.rb +++ b/lib/telegram/bot/middleware.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'active_support/concern' require 'active_support/core_ext/hash/indifferent_access' require 'active_support/json' @@ -21,7 +23,7 @@ module Telegram end def inspect - "#<#{self.class.name}(#{controller.try!(:name)})>" + "#<#{self.class.name}(#{controller&.name})>" end end end diff --git a/lib/telegram/bot/railtie.rb b/lib/telegram/bot/railtie.rb index cc6fee4..54fffd7 100644 --- a/lib/telegram/bot/railtie.rb +++ b/lib/telegram/bot/railtie.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/routes_helper' module Telegram @@ -10,7 +12,7 @@ module Telegram end config.before_initialize do - ::ActionDispatch::Routing::Mapper.send(:include, RoutesHelper) + ::ActionDispatch::Routing::Mapper.include RoutesHelper end initializer 'telegram.bot.updates_controller.set_config' do |app| diff --git a/lib/telegram/bot/routes_helper.rb b/lib/telegram/bot/routes_helper.rb index 8aca8af..bdace0b 100644 --- a/lib/telegram/bot/routes_helper.rb +++ b/lib/telegram/bot/routes_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'base64' require 'openssl' diff --git a/lib/telegram/bot/rspec.rb b/lib/telegram/bot/rspec.rb index aeba788..2186126 100644 --- a/lib/telegram/bot/rspec.rb +++ b/lib/telegram/bot/rspec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot module RSpec diff --git a/lib/telegram/bot/rspec/callback_query_helpers.rb b/lib/telegram/bot/rspec/callback_query_helpers.rb index 64a22fe..51d201d 100644 --- a/lib/telegram/bot/rspec/callback_query_helpers.rb +++ b/lib/telegram/bot/rspec/callback_query_helpers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec' require 'telegram/bot/rspec/message_helpers' diff --git a/lib/telegram/bot/rspec/client_matchers.rb b/lib/telegram/bot/rspec/client_matchers.rb index 3f805f9..76d4ca1 100644 --- a/lib/telegram/bot/rspec/client_matchers.rb +++ b/lib/telegram/bot/rspec/client_matchers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot module RSpec @@ -61,14 +63,14 @@ module Telegram attr_reader :performed_requests, :description - def initialize(bot, action, description: nil) + def initialize(bot, action, description: nil) # rubocop:disable Lint/MissingSuper @bot = bot @action = action @description = description || "make #{action} telegram request" exactly(1) end - def matches?(proc) # rubocop:disable AbcSize + def matches?(proc) # rubocop:disable Metrics/AbcSize raise ArgumentError, 'matcher only supports block expectations' unless proc.is_a?(Proc) original_requests_count = bot.requests[action].count proc.call diff --git a/lib/telegram/bot/rspec/integration/poller.rb b/lib/telegram/bot/rspec/integration/poller.rb index 54f7b8d..63c6526 100644 --- a/lib/telegram/bot/rspec/integration/poller.rb +++ b/lib/telegram/bot/rspec/integration/poller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/shared' RSpec.shared_context 'telegram/bot/integration/poller' do diff --git a/lib/telegram/bot/rspec/integration/rack.rb b/lib/telegram/bot/rspec/integration/rack.rb index 520d90c..55ea13f 100644 --- a/lib/telegram/bot/rspec/integration/rack.rb +++ b/lib/telegram/bot/rspec/integration/rack.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/shared' require 'rack/test' diff --git a/lib/telegram/bot/rspec/integration/rails.rb b/lib/telegram/bot/rspec/integration/rails.rb index 1e43e09..ad3aa7c 100644 --- a/lib/telegram/bot/rspec/integration/rails.rb +++ b/lib/telegram/bot/rspec/integration/rails.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/shared' RSpec.shared_context 'telegram/bot/integration/rails', type: :request do diff --git a/lib/telegram/bot/rspec/integration/shared.rb b/lib/telegram/bot/rspec/integration/shared.rb index 73f3087..a6dab6f 100644 --- a/lib/telegram/bot/rspec/integration/shared.rb +++ b/lib/telegram/bot/rspec/integration/shared.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'active_support/json' require 'telegram/bot' require 'telegram/bot/rspec/message_helpers' @@ -10,5 +12,5 @@ RSpec.shared_context 'telegram/bot/integration/shared' do let(:bot) { Telegram.bot } let(:clear_session?) { described_class.respond_to?(:session_store) } - before { described_class.session_store.try!(:clear) if clear_session? } + before { described_class.session_store&.clear if clear_session? } end diff --git a/lib/telegram/bot/rspec/message_helpers.rb b/lib/telegram/bot/rspec/message_helpers.rb index 6585f0c..f3c222f 100644 --- a/lib/telegram/bot/rspec/message_helpers.rb +++ b/lib/telegram/bot/rspec/message_helpers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Shared helpers for testing message updates. RSpec.shared_context 'telegram/bot/message_helpers' do let(:default_message_options) { {from: from, chat: chat} } diff --git a/lib/telegram/bot/tasks.rb b/lib/telegram/bot/tasks.rb index 2bd1787..a762757 100644 --- a/lib/telegram/bot/tasks.rb +++ b/lib/telegram/bot/tasks.rb @@ -7,7 +7,7 @@ module Telegram def set_webhook routes = Rails.application.routes.url_helpers - cert_file = ENV['CERT'] + cert_file = ENV.fetch('CERT', nil) cert = File.open(cert_file) if cert_file each_bot do |key, bot| route_name = RoutesHelper.route_name_for_bot(bot) @@ -16,7 +16,7 @@ module Telegram bot.set_webhook( url: url, certificate: cert, - ip_address: ENV['IP_ADDRESS'], + ip_address: ENV.fetch('IP_ADDRESS', nil), drop_pending_updates: drop_pending_updates, ) end @@ -50,13 +50,13 @@ module Telegram end def each_bot(&block) - id = ENV['BOT'].try!(:to_sym) + id = ENV['BOT']&.to_sym bots = id ? {id => Client.by_id(id)} : Telegram.bots bots.each { |key, bot| bot.async(false) { block[key, bot] } } end def drop_pending_updates - ENV['DROP_PENDING_UPDATES'].try!(:downcase) == 'true' + ENV['DROP_PENDING_UPDATES']&.downcase == 'true' end end end diff --git a/lib/telegram/bot/updates_controller.rb b/lib/telegram/bot/updates_controller.rb index ced8ed7..5520bc8 100644 --- a/lib/telegram/bot/updates_controller.rb +++ b/lib/telegram/bot/updates_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'abstract_controller' require 'active_support/core_ext/string/inflections' require 'active_support/callbacks' @@ -47,7 +49,7 @@ module Telegram # ControllerClass.new(bot, from: telegram_user, chat: telegram_chat). # process(:help, *args) # - class UpdatesController < AbstractController::Base # rubocop:disable ClassLength + class UpdatesController < AbstractController::Base # rubocop:disable Metrics/ClassLength abstract! %w[ @@ -69,12 +71,12 @@ module Telegram include AbstractController::Callbacks # Redefine callbacks with default terminator. if ActiveSupport::VERSION::MAJOR >= 5 - define_callbacks :process_action, - skip_after_callbacks_if_terminated: true + define_callbacks :process_action, + skip_after_callbacks_if_terminated: true else - define_callbacks :process_action, - terminator: ->(_, result) { result == false }, - skip_after_callbacks_if_terminated: true + define_callbacks :process_action, + terminator: ->(_, result) { result == false }, + skip_after_callbacks_if_terminated: true end include Commands @@ -126,14 +128,14 @@ module Telegram # that update is nil. # ActionDispatch::Request object is passed in `webhook_request` when bot running # in webhook mode. - def initialize(bot = nil, update = nil, webhook_request = nil) + def initialize(bot = nil, update = nil, webhook_request = nil) # rubocop:disable Lint/MissingSuper if update.is_a?(Hash) && (update.key?(:from) || update.key?(:chat)) options = update update = nil end @_bot = bot @_update = update - @_chat, @_from = options && options.values_at(:chat, :from) + @_chat, @_from = options&.values_at(:chat, :from) @_payload, @_payload_type = self.class.payload_from_update(update) @_webhook_request = webhook_request end @@ -142,13 +144,13 @@ module Telegram # when there is no such field in payload. # # Can be overriden with `chat` option for #initialize. - def chat - @_chat ||= + def chat # rubocop:disable Metrics/PerceivedComplexity + @_chat ||= # rubocop:disable Naming/MemoizedInstanceVariableName if payload if payload.is_a?(Hash) - payload['chat'] || payload['message'] && payload['message']['chat'] + payload['chat'] || (payload['message'] && payload['message']['chat']) else - payload.try(:chat) || payload.try(:message).try!(:chat) + payload.try(:chat) || payload.try(:message)&.chat end end end @@ -156,7 +158,8 @@ module Telegram # Accessor to `'from'` field of payload. Can be overriden with `from` option # for #initialize. def from - @_from ||= payload.is_a?(Hash) ? payload['from'] : payload.try(:from) + @_from ||= # rubocop:disable Naming/MemoizedInstanceVariableName + payload.is_a?(Hash) ? payload['from'] : payload.try(:from) end # Processes current update. @@ -221,7 +224,7 @@ module Telegram # Silently ignore unsupported messages to not fail when user crafts # an update with usupported command, callback query context, etc. def action_missing(action, *_args) - logger.debug { "The action '#{action}' is not defined in #{self.class.name}" } if logger + logger&.debug { "The action '#{action}' is not defined in #{self.class.name}" } nil end diff --git a/lib/telegram/bot/updates_controller/callback_query_context.rb b/lib/telegram/bot/updates_controller/callback_query_context.rb index 1dddff1..13dc3c5 100644 --- a/lib/telegram/bot/updates_controller/callback_query_context.rb +++ b/lib/telegram/bot/updates_controller/callback_query_context.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController diff --git a/lib/telegram/bot/updates_controller/commands.rb b/lib/telegram/bot/updates_controller/commands.rb index 7e26abf..88ae1fd 100644 --- a/lib/telegram/bot/updates_controller/commands.rb +++ b/lib/telegram/bot/updates_controller/commands.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController # Support for parsing commands module Commands - CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i + CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i.freeze class << self # Fetches command from text message. All subsequent words are returned @@ -34,7 +36,7 @@ module Telegram def action_for_message cmd, args = Commands.command_from_text(payload['text'], bot_username) return unless cmd - [[action_for_command(cmd), type: :command, command: cmd], args] + [[action_for_command(cmd), {type: :command, command: cmd}], args] end alias_method :action_for_channel_post, :action_for_message diff --git a/lib/telegram/bot/updates_controller/instrumentation.rb b/lib/telegram/bot/updates_controller/instrumentation.rb index 112a438..a73aeaf 100644 --- a/lib/telegram/bot/updates_controller/instrumentation.rb +++ b/lib/telegram/bot/updates_controller/instrumentation.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController @@ -23,8 +25,8 @@ module Telegram def process_action(*args) raw_payload = { controller: self.class.name, - action: action_name, - update: update, + action: action_name, + update: update, } Instrumentation.instrument(:start_processing, raw_payload.dup) Instrumentation.instrument(:process_action, raw_payload) do |payload| @@ -61,14 +63,14 @@ module Telegram # end # # :api: plugin - def cleanup_view_runtime #:nodoc: + def cleanup_view_runtime # :nodoc: yield end # Every time after an action is processed, this method is invoked # with the payload, so you can add more information. # :api: plugin - def append_info_to_payload(_payload) #:nodoc: + def append_info_to_payload(_payload) # :nodoc: end module ClassMethods @@ -76,7 +78,7 @@ module Telegram # controller process action. This method should return an array # with the messages to be added. # :api: plugin - def log_process_action(_payload) #:nodoc: + def log_process_action(_payload) # :nodoc: [] end end diff --git a/lib/telegram/bot/updates_controller/log_subscriber.rb b/lib/telegram/bot/updates_controller/log_subscriber.rb index 60fe07f..5c6493b 100644 --- a/lib/telegram/bot/updates_controller/log_subscriber.rb +++ b/lib/telegram/bot/updates_controller/log_subscriber.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'active_support/log_subscriber' module Telegram @@ -8,7 +10,7 @@ module Telegram info do payload = event.payload "Processing by #{payload[:controller]}##{payload[:action]}\n" \ - " Update: #{payload[:update].to_json}" + " Update: #{payload[:update].to_json}" end end diff --git a/lib/telegram/bot/updates_controller/message_context.rb b/lib/telegram/bot/updates_controller/message_context.rb index 34d5e31..72ccb35 100644 --- a/lib/telegram/bot/updates_controller/message_context.rb +++ b/lib/telegram/bot/updates_controller/message_context.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController @@ -48,12 +50,12 @@ module Telegram # it has higher priority than contextual action. def action_for_message val = message_context_session.delete(:context) - context = val && val.to_s - super || context && begin - args = payload['text'].try!(:split) || [] + context = val&.to_s + super || (context && begin + args = payload['text']&.split || [] action = action_for_message_context(context) - [[action, type: :message_context, context: context], args] - end + [[action, {type: :message_context, context: context}], args] + end) end # Save context for the next request. diff --git a/lib/telegram/bot/updates_controller/reply_helpers.rb b/lib/telegram/bot/updates_controller/reply_helpers.rb index 02a9371..fac4a46 100644 --- a/lib/telegram/bot/updates_controller/reply_helpers.rb +++ b/lib/telegram/bot/updates_controller/reply_helpers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController @@ -59,9 +61,9 @@ module Telegram # Edit message from callback query. def edit_message(type, params = {}) params = - if message_id = payload['inline_message_id'] # rubocop:disable AssignmentInCondition + if message_id = payload['inline_message_id'] # rubocop:disable Lint/AssignmentInCondition params.merge(inline_message_id: message_id) - elsif message = payload['message'] # rubocop:disable AssignmentInCondition + elsif message = payload['message'] # rubocop:disable Lint/AssignmentInCondition params.merge(chat_id: message['chat']['id'], message_id: message['message_id']) else raise 'Can not edit message without `inline_message_id` or `message`' diff --git a/lib/telegram/bot/updates_controller/rescue.rb b/lib/telegram/bot/updates_controller/rescue.rb index 3a13f8a..37b58b5 100644 --- a/lib/telegram/bot/updates_controller/rescue.rb +++ b/lib/telegram/bot/updates_controller/rescue.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'active_support/rescuable' module Telegram @@ -11,7 +13,7 @@ module Telegram def process_action(*) super - rescue Exception => exception # rubocop:disable RescueException + rescue Exception => exception # rubocop:disable Lint/RescueException rescue_with_handler(exception) || raise end end diff --git a/lib/telegram/bot/updates_controller/rspec_helpers.rb b/lib/telegram/bot/updates_controller/rspec_helpers.rb index 16f908d..2f2149a 100644 --- a/lib/telegram/bot/updates_controller/rspec_helpers.rb +++ b/lib/telegram/bot/updates_controller/rspec_helpers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/updates_controller/testing' require 'telegram/bot/rspec/message_helpers' require 'telegram/bot/rspec/callback_query_helpers' diff --git a/lib/telegram/bot/updates_controller/session.rb b/lib/telegram/bot/updates_controller/session.rb index c40313e..cd2dae5 100644 --- a/lib/telegram/bot/updates_controller/session.rb +++ b/lib/telegram/bot/updates_controller/session.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'rack/session/abstract/id' require 'active_support/cache' @@ -27,7 +29,8 @@ module Telegram protected def session - @_session ||= self.class.build_session(session_key) + @_session ||= # rubocop:disable Naming/MemoizedInstanceVariableName + self.class.build_session(session_key) end def session_key @@ -41,7 +44,7 @@ module Telegram class SessionHash < Rack::Session::Abstract::SessionHash attr_reader :id - def initialize(store, id) + def initialize(store, id) # rubocop:disable Lint/MissingSuper @store = store @id = id end @@ -65,13 +68,13 @@ module Telegram def commit return unless loaded? - data = to_hash.delete_if { |_, v| v.nil? } + data = to_hash.compact @store.write(id, data) end end class NullSessionHash < Session::SessionHash - def initialize + def initialize # rubocop:disable Lint/MissingSuper @data = {} @loaded = true @exists = true diff --git a/lib/telegram/bot/updates_controller/testing.rb b/lib/telegram/bot/updates_controller/testing.rb index e1c700b..57c8865 100644 --- a/lib/telegram/bot/updates_controller/testing.rb +++ b/lib/telegram/bot/updates_controller/testing.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController @@ -16,7 +18,7 @@ module Telegram # everything will be rewriten with #initialize. # # With `full` set to `true` it'll clear all cached instance variables. - def recycle!(full = false) + def recycle!(full = false) # rubocop:disable Style/OptionalBooleanParameter return unless full (instance_variables - IVARS_TO_KEEP).each do |ivar| remove_instance_variable(ivar) @@ -27,7 +29,8 @@ module Telegram # Stubs session. def session - @_session ||= Session::NullSessionHash.new + @_session ||= # rubocop:disable Naming/MemoizedInstanceVariableName + Session::NullSessionHash.new end end end diff --git a/lib/telegram/bot/updates_controller/translation.rb b/lib/telegram/bot/updates_controller/translation.rb index 179f76a..2b4fa84 100644 --- a/lib/telegram/bot/updates_controller/translation.rb +++ b/lib/telegram/bot/updates_controller/translation.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController diff --git a/lib/telegram/bot/updates_controller/typed_update.rb b/lib/telegram/bot/updates_controller/typed_update.rb index 78fd985..0cc1aa7 100644 --- a/lib/telegram/bot/updates_controller/typed_update.rb +++ b/lib/telegram/bot/updates_controller/typed_update.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Telegram module Bot class UpdatesController diff --git a/lib/telegram/bot/updates_poller.rb b/lib/telegram/bot/updates_poller.rb index c39088c..7b43e86 100644 --- a/lib/telegram/bot/updates_poller.rb +++ b/lib/telegram/bot/updates_poller.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + module Telegram module Bot # Supposed to be used in development environments only. class UpdatesPoller class << self - @@instances = {} # rubocop:disable ClassVars + @@instances = {} # rubocop:disable Style/ClassVars def instances @@instances @@ -36,7 +38,7 @@ module Telegram end def log(&block) - logger.info(&block) if logger + logger&.info(&block) end def start @@ -56,7 +58,7 @@ module Telegram def run while running updates = fetch_updates - process_updates(updates) if updates && updates.any? + process_updates(updates) if updates&.any? end end @@ -82,8 +84,8 @@ module Telegram process_update(update) end end - rescue StandardError => e - logger.error { ([e.message] + e.backtrace).join("\n") } if logger + rescue StandardError => exception + logger&.error { ([exception.message] + exception.backtrace).join("\n") } end # Override this method to setup custom error collector. @@ -102,10 +104,8 @@ module Telegram end if defined?(Rails.application) && Rails.application.respond_to?(:reloader) - def reloading_code - Rails.application.reloader.wrap do - yield - end + def reloading_code(&block) + Rails.application.reloader.wrap(&block) end else def reloading_code diff --git a/lib/telegram/bot/version.rb b/lib/telegram/bot/version.rb index d678e4f..48a9a2e 100644 --- a/lib/telegram/bot/version.rb +++ b/lib/telegram/bot/version.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + module Telegram module Bot - VERSION = '0.16.1'.freeze + VERSION = '0.16.1' def self.gem_version Gem::Version.new VERSION diff --git a/spec/integration/requests/default_bot_spec.rb b/spec/integration/requests/default_bot_spec.rb index 0f7feed..1ef5753 100644 --- a/spec/integration/requests/default_bot_spec.rb +++ b/spec/integration/requests/default_bot_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'integration_helper' RSpec.describe DefaultBotController, telegram_bot: :rails do diff --git a/spec/integration/requests/named_bot_spec.rb b/spec/integration/requests/named_bot_spec.rb index cccfbd4..0be5575 100644 --- a/spec/integration/requests/named_bot_spec.rb +++ b/spec/integration/requests/named_bot_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'integration_helper' RSpec.describe NamedBotController, telegram_bot: :rails do diff --git a/spec/integration/requests/other_bot_spec.rb b/spec/integration/requests/other_bot_spec.rb index 8ccb783..babd569 100644 --- a/spec/integration/requests/other_bot_spec.rb +++ b/spec/integration/requests/other_bot_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'integration_helper' RSpec.describe OtherBotController, telegram_bot: :rails do diff --git a/spec/integration_helper.rb b/spec/integration_helper.rb index e876124..2bb0796 100644 --- a/spec/integration_helper.rb +++ b/spec/integration_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/rails' require 'action_controller' require 'action_dispatch' diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1be5648..36471a5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'pathname' require 'pry' require 'rspec/its' @@ -10,7 +12,7 @@ elsif ENV.key?('COV') SimpleCov.start end -GEM_ROOT = Pathname.new File.expand_path('../..', __FILE__) +GEM_ROOT = Pathname.new File.expand_path('..', __dir__) $LOAD_PATH.unshift GEM_ROOT.join('lib') require 'telegram/bot' @@ -18,7 +20,7 @@ require 'telegram/bot/updates_controller/rspec_helpers' require 'telegram/bot/types' require 'active_support/json' -Dir[GEM_ROOT.join('spec/support/**/*.rb')].each { |f| require f } +Dir[GEM_ROOT.join('spec/support/**/*.rb')].sort.each { |f| require f } RSpec.configure do |config| config.expect_with :rspec do |expectations| diff --git a/spec/support/examples/async.rb b/spec/support/examples/async.rb index 683a01e..91fb1b3 100644 --- a/spec/support/examples/async.rb +++ b/spec/support/examples/async.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.shared_examples 'async' do |request_args:| let(:instance) { described_class.new(token: token, id: id, async: async) } let(:id) { :default_bot } diff --git a/spec/support/examples/integration.rb b/spec/support/examples/integration.rb index cb79400..0f78553 100644 --- a/spec/support/examples/integration.rb +++ b/spec/support/examples/integration.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.shared_examples 'shared integration examples' do let(:bot) { Telegram::Bot::ClientStub.new('token') } let(:controller_class) do diff --git a/spec/telegram/bot/async_spec.rb b/spec/telegram/bot/async_spec.rb index ce13e43..216aeec 100644 --- a/spec/telegram/bot/async_spec.rb +++ b/spec/telegram/bot/async_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::Async::Job do let(:job_class) do described_class = self.described_class diff --git a/spec/telegram/bot/client/request_body_formatter_spec.rb b/spec/telegram/bot/client/request_body_formatter_spec.rb index 35a1e6a..35f5134 100644 --- a/spec/telegram/bot/client/request_body_formatter_spec.rb +++ b/spec/telegram/bot/client/request_body_formatter_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::Client::RequestBodyFormatter do describe '.format' do subject { described_class.format(input, action) } diff --git a/spec/telegram/bot/client/typed_response_spec.rb b/spec/telegram/bot/client/typed_response_spec.rb index d8eb476..681d336 100644 --- a/spec/telegram/bot/client/typed_response_spec.rb +++ b/spec/telegram/bot/client/typed_response_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::Client::TypedResponse do let(:bot) { Telegram::Bot::Client.new('token').tap { |x| x.extend described_class } } diff --git a/spec/telegram/bot/client_spec.rb b/spec/telegram/bot/client_spec.rb index e787ba0..2b1e769 100644 --- a/spec/telegram/bot/client_spec.rb +++ b/spec/telegram/bot/client_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::Client do let(:instance) { described_class.new 'token' } let(:token) { 'token' } @@ -73,8 +75,8 @@ RSpec.describe Telegram::Bot::Client do describe '.prepare_async_args' do subject { described_class.prepare_async_args(*input) } - let(:input) { [:action, a: 1, b: :sym, c: [:other], 'd' => 'str'] } - it { should eq ['action', a: 1, b: 'sym', c: '["other"]', 'd' => 'str'] } + let(:input) { [:action, {a: 1, b: :sym, c: [:other], 'd' => 'str'}] } + it { should eq ['action', {a: 1, b: 'sym', c: '["other"]', 'd' => 'str'}] } end describe '.new' do diff --git a/spec/telegram/bot/client_stub_spec.rb b/spec/telegram/bot/client_stub_spec.rb index 655ad08..4d2dfdb 100644 --- a/spec/telegram/bot/client_stub_spec.rb +++ b/spec/telegram/bot/client_stub_spec.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::ClientStub do describe '#stub_all!' do let(:client) { Telegram::Bot::Client.new('token', 'bot_name') } - let(:clients) { ['token', token: 'token2'].map(&Telegram::Bot::Client.method(:wrap)) } + let(:clients) { ['token', {token: 'token2'}].map(&Telegram::Bot::Client.method(:wrap)) } shared_examples 'constructors' do |expected_class| it 'makes Client.new return ClientStub' do diff --git a/spec/telegram/bot/config_methods_spec.rb b/spec/telegram/bot/config_methods_spec.rb index e8acd96..e946378 100644 --- a/spec/telegram/bot/config_methods_spec.rb +++ b/spec/telegram/bot/config_methods_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::ConfigMethods do let(:registry) do Object.new.tap do |x| diff --git a/spec/telegram/bot/middleware_spec.rb b/spec/telegram/bot/middleware_spec.rb index 3a465bf..88704b8 100644 --- a/spec/telegram/bot/middleware_spec.rb +++ b/spec/telegram/bot/middleware_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'rack/mock' RSpec.describe Telegram::Bot::Middleware do @@ -11,7 +13,7 @@ RSpec.describe Telegram::Bot::Middleware do let(:env) do Rack::MockRequest.env_for('/', method: :post, - input: JSON.dump(update), + input: JSON.dump(update), 'CONTENT_TYPE' => 'application/json', ) end diff --git a/spec/telegram/bot/routes_helper_spec.rb b/spec/telegram/bot/routes_helper_spec.rb index ed9049b..55b8e4c 100644 --- a/spec/telegram/bot/routes_helper_spec.rb +++ b/spec/telegram/bot/routes_helper_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/routes_helper' RSpec.describe Telegram::Bot::RoutesHelper do @@ -46,7 +48,7 @@ RSpec.describe Telegram::Bot::RoutesHelper do let(:controller) { double(:controller, name: :controller) } before { allow(Telegram).to receive(:bots) { bots } } - def assert_route(bot, controller, path: nil, **expected_options) # rubocop:disable AbcSize + def assert_route(bot, controller, path: nil, **expected_options) # rubocop:disable Metrics/AbcSize path ||= "telegram/#{described_class.token_hash(bot.token)}" expect(mapper).to receive(:post) do |actual_path, actual_options| expect(actual_path).to eq(path) diff --git a/spec/telegram/bot/rspec/callback_query_helpers_spec.rb b/spec/telegram/bot/rspec/callback_query_helpers_spec.rb index f32397e..1820c2d 100644 --- a/spec/telegram/bot/rspec/callback_query_helpers_spec.rb +++ b/spec/telegram/bot/rspec/callback_query_helpers_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/poller' RSpec.describe 'Integration spec helpers', telegram_bot: :poller do diff --git a/spec/telegram/bot/rspec/client_matchers_spec.rb b/spec/telegram/bot/rspec/client_matchers_spec.rb index 9292190..c441877 100644 --- a/spec/telegram/bot/rspec/client_matchers_spec.rb +++ b/spec/telegram/bot/rspec/client_matchers_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::RSpec::ClientMatchers do let(:bot) { Telegram::Bot::ClientStub.new('TestBot') } let(:other_bot) { Telegram::Bot::ClientStub.new('OtherTestBot') } diff --git a/spec/telegram/bot/rspec/integration/poller_spec.rb b/spec/telegram/bot/rspec/integration/poller_spec.rb index c83723f..5e2d5a0 100644 --- a/spec/telegram/bot/rspec/integration/poller_spec.rb +++ b/spec/telegram/bot/rspec/integration/poller_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/poller' RSpec.describe 'Poller integration spec', telegram_bot: :poller do diff --git a/spec/telegram/bot/rspec/integration/rack_spec.rb b/spec/telegram/bot/rspec/integration/rack_spec.rb index 0dcfb53..19a48fa 100644 --- a/spec/telegram/bot/rspec/integration/rack_spec.rb +++ b/spec/telegram/bot/rspec/integration/rack_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/rack' RSpec.describe 'Rack integration spec', telegram_bot: :rack do diff --git a/spec/telegram/bot/rspec/integration/rails_spec.rb b/spec/telegram/bot/rspec/integration/rails_spec.rb index 05c498e..9796c07 100644 --- a/spec/telegram/bot/rspec/integration/rails_spec.rb +++ b/spec/telegram/bot/rspec/integration/rails_spec.rb @@ -1 +1,2 @@ +# frozen_string_literal: true # Tested in spec/integration diff --git a/spec/telegram/bot/rspec/message_helpers_spec.rb b/spec/telegram/bot/rspec/message_helpers_spec.rb index 63fb315..6781641 100644 --- a/spec/telegram/bot/rspec/message_helpers_spec.rb +++ b/spec/telegram/bot/rspec/message_helpers_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'telegram/bot/rspec/integration/poller' RSpec.describe 'Integration: message helpers', telegram_bot: :poller do @@ -108,7 +110,7 @@ RSpec.describe 'Integration: message helpers', telegram_bot: :poller do end context 'with options' do - let(:args) { ['asd', 'qwe', option: 1] } + let(:args) { ['asd', 'qwe', {option: 1}] } it { should respond_with_message "Start: #{args[0...-1].inspect}, option: 1" } end end diff --git a/spec/telegram/bot/updates_controller/callback_query_context_spec.rb b/spec/telegram/bot/updates_controller/callback_query_context_spec.rb index 757e939..3df25c1 100644 --- a/spec/telegram/bot/updates_controller/callback_query_context_spec.rb +++ b/spec/telegram/bot/updates_controller/callback_query_context_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do include_context 'telegram/bot/updates_controller' let(:controller_class) do @@ -6,7 +8,8 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do include described_class attr_accessor :filter_done - before_action only: :ctx2_callback_query do + + before_action only: :ctx_2_callback_query do self.filter_done = true end @@ -14,12 +17,12 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do [:no_context, data] end - def ctx1_callback_query(data) - [:ctx1, data] + def ctx_1_callback_query(data) + [:ctx_1, data] end - def ctx2_callback_query(data) - [:ctx2, data] + def ctx_2_callback_query(data) + [:ctx_2, data] end end end @@ -40,19 +43,19 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do let(:data) { "#{ctx}:#{text}" } context 'and valid' do - let(:ctx) { 'ctx1' } - its(:call) { should eq [:ctx1, text] } + let(:ctx) { 'ctx_1' } + its(:call) { should eq [:ctx_1, text] } it { should_not change(controller, :filter_done) } context 'and context has callback' do - let(:ctx) { 'ctx2' } - its(:call) { should eq [:ctx2, text] } + let(:ctx) { 'ctx_2' } + its(:call) { should eq [:ctx_2, text] } it { should change(controller, :filter_done) } end context 'and data has multiple colons' do let(:text) { super().tr(' ', ':') } - its(:call) { should eq [:ctx1, text] } + its(:call) { should eq [:ctx_1, text] } end end diff --git a/spec/telegram/bot/updates_controller/commands_spec.rb b/spec/telegram/bot/updates_controller/commands_spec.rb index 5dfb196..2416db3 100644 --- a/spec/telegram/bot/updates_controller/commands_spec.rb +++ b/spec/telegram/bot/updates_controller/commands_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::Commands do describe '#action_for_command' do subject { ->(*args) { object.action_for_command(*args) } } @@ -88,11 +90,11 @@ RSpec.describe Telegram::Bot::UpdatesController::Commands do context 'with command' do let(:text) { "/test#{"@#{mention}" if mention} arg 1 2" } let(:mention) {} - it { should eq [['test!', type: :command, command: 'test'], %w[arg 1 2]] } + it { should eq [['test!', {type: :command, command: 'test'}], %w[arg 1 2]] } context 'with mention' do let(:mention) { bot.username } - it { should eq [['test!', type: :command, command: 'test'], %w[arg 1 2]] } + it { should eq [['test!', {type: :command, command: 'test'}], %w[arg 1 2]] } end context 'with mention for other bot' do diff --git a/spec/telegram/bot/updates_controller/instrumentation_spec.rb b/spec/telegram/bot/updates_controller/instrumentation_spec.rb index cb0c190..8229bd9 100644 --- a/spec/telegram/bot/updates_controller/instrumentation_spec.rb +++ b/spec/telegram/bot/updates_controller/instrumentation_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::Instrumentation do include_context 'telegram/bot/updates_controller' diff --git a/spec/telegram/bot/updates_controller/message_context_spec.rb b/spec/telegram/bot/updates_controller/message_context_spec.rb index 9ab4952..2d233d0 100644 --- a/spec/telegram/bot/updates_controller/message_context_spec.rb +++ b/spec/telegram/bot/updates_controller/message_context_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::MessageContext do include_context 'telegram/bot/updates_controller' let(:controller_class) do @@ -6,11 +8,13 @@ RSpec.describe Telegram::Bot::UpdatesController::MessageContext do include described_class attr_accessor :filter_done + before_action only: :context_with_filter do self.filter_done = true end attr_reader :callbacks_runs + before_action { @callbacks_runs = (@callbacks_runs || 0) + 1 } def message(*args) diff --git a/spec/telegram/bot/updates_controller/reply_helpers_spec.rb b/spec/telegram/bot/updates_controller/reply_helpers_spec.rb index e5ad3b8..2577adc 100644 --- a/spec/telegram/bot/updates_controller/reply_helpers_spec.rb +++ b/spec/telegram/bot/updates_controller/reply_helpers_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController do include_context 'telegram/bot/updates_controller' let(:params) { {arg: 1, 'other_arg' => 2} } @@ -38,7 +40,7 @@ RSpec.describe Telegram::Bot::UpdatesController do end context 'when update is not set' do - let(:controller_args) { [bot, chat: deep_stringify(chat)] } + let(:controller_args) { [bot, {chat: deep_stringify(chat)}] } it 'sets chat_id' do expect(bot).to receive("send_#{respond_type}"). with(params.merge(chat_id: chat[:id])) { result } diff --git a/spec/telegram/bot/updates_controller/rescue_spec.rb b/spec/telegram/bot/updates_controller/rescue_spec.rb index d7dd275..8ff5a6e 100644 --- a/spec/telegram/bot/updates_controller/rescue_spec.rb +++ b/spec/telegram/bot/updates_controller/rescue_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::Rescue do include_context 'telegram/bot/updates_controller' diff --git a/spec/telegram/bot/updates_controller/session_spec.rb b/spec/telegram/bot/updates_controller/session_spec.rb index 8bb092a..ec2c804 100644 --- a/spec/telegram/bot/updates_controller/session_spec.rb +++ b/spec/telegram/bot/updates_controller/session_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::Session do include_context 'telegram/bot/updates_controller' let(:controller_class) do diff --git a/spec/telegram/bot/updates_controller/testing_spec.rb b/spec/telegram/bot/updates_controller/testing_spec.rb index fcc4fe1..398adc5 100644 --- a/spec/telegram/bot/updates_controller/testing_spec.rb +++ b/spec/telegram/bot/updates_controller/testing_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'action_dispatch' RSpec.describe Telegram::Bot::UpdatesController::Testing do @@ -43,7 +45,7 @@ RSpec.describe Telegram::Bot::UpdatesController::Testing do context 'when webhook_request is given' do it 'passes it to controller' do - webhook_request = ::ActionDispatch::Request.new({}) + webhook_request = ActionDispatch::Request.new({}) dispatch(update, bot, webhook_request) expect(controller.webhook_request).to eq webhook_request end diff --git a/spec/telegram/bot/updates_controller/translation_spec.rb b/spec/telegram/bot/updates_controller/translation_spec.rb index 3368527..991c11c 100644 --- a/spec/telegram/bot/updates_controller/translation_spec.rb +++ b/spec/telegram/bot/updates_controller/translation_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::Translation do def self.stub_translations(translations) around do |ex| diff --git a/spec/telegram/bot/updates_controller/typed_update_spec.rb b/spec/telegram/bot/updates_controller/typed_update_spec.rb index c74586c..877ce3b 100644 --- a/spec/telegram/bot/updates_controller/typed_update_spec.rb +++ b/spec/telegram/bot/updates_controller/typed_update_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do include_context 'telegram/bot/updates_controller' let(:controller_class) do diff --git a/spec/telegram/bot/updates_controller_spec.rb b/spec/telegram/bot/updates_controller_spec.rb index e7e3860..3007ac5 100644 --- a/spec/telegram/bot/updates_controller_spec.rb +++ b/spec/telegram/bot/updates_controller_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesController do include_context 'telegram/bot/updates_controller' @@ -5,7 +7,7 @@ RSpec.describe Telegram::Bot::UpdatesController do subject { controller.action_for_payload } def stub_payload(*fields) - Hash[fields.map { |x| [x, double(x)] }] + fields.map { |x| [x, double(x)] }.to_h end context 'when payload is inline_query' do @@ -90,7 +92,7 @@ RSpec.describe Telegram::Bot::UpdatesController do describe '#process' do subject { -> { controller.process(:action, *args) } } - let(:args) { %i[arg1 arg2] } + let(:args) { %i[arg_1 arg_2] } let(:controller_class) do Class.new(described_class) do attr_reader :acted, :hooked @@ -198,7 +200,7 @@ RSpec.describe Telegram::Bot::UpdatesController do end context 'when options hash is given' do - let(:controller_args) { [bot, from: from, chat: chat] } + let(:controller_args) { [bot, {from: from, chat: chat}] } with_reinitialize do its(:bot) { should eq bot } its(:update) { should eq nil } diff --git a/spec/telegram/bot/updates_poller_spec.rb b/spec/telegram/bot/updates_poller_spec.rb index 1a13bbb..aaa5177 100644 --- a/spec/telegram/bot/updates_poller_spec.rb +++ b/spec/telegram/bot/updates_poller_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot::UpdatesPoller do let(:instance) { described_class.new(bot, controller) } let(:bot) { Telegram::Bot::Client.new('token') } diff --git a/spec/telegram/bot_spec.rb b/spec/telegram/bot_spec.rb index 19a51f4..fd54622 100644 --- a/spec/telegram/bot_spec.rb +++ b/spec/telegram/bot_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + RSpec.describe Telegram::Bot do it 'has a version number' do expect(described_class::VERSION).not_to be nil diff --git a/telegram-bot.gemspec b/telegram-bot.gemspec index a71ca53..ae97f06 100644 --- a/telegram-bot.gemspec +++ b/telegram-bot.gemspec @@ -1,4 +1,6 @@ -lib = File.expand_path('../lib', __FILE__) +# frozen_string_literal: true + +lib = File.expand_path('lib', __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'telegram/bot/version' @@ -12,6 +14,10 @@ Gem::Specification.new do |spec| spec.homepage = 'https://github.com/telegram-bot-rb/telegram-bot' spec.license = 'MIT' + spec.metadata = { + 'rubygems_mfa_required' => 'true', + } + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) } spec.bindir = 'exe' spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }