1
0
зеркало из https://github.com/glebtv/telegram-bot.git synced 2026-09-03 17:55:52 +03:00

Сравнить коммиты

..

1 Коммитов

Автор SHA1 Сообщение Дата
Max Melentiev
544d392346 v0.16.1 2023-12-18 21:09:36 +00:00
92 изменённых файлов: 190 добавлений и 544 удалений

Просмотреть файл

@@ -2,3 +2,7 @@ checks:
method-complexity: method-complexity:
config: config:
threshold: 6 # should be just fine threshold: 6 # should be just fine
plugins:
rubocop:
enabled: true

22
.github/workflows/ci.yml поставляемый
Просмотреть файл

@@ -3,15 +3,15 @@ name: Lint & Test
on: [push, pull_request] on: [push, pull_request]
jobs: jobs:
lint: # lint:
runs-on: ubuntu-latest # runs-on: ubuntu-latest
steps: # steps:
- uses: actions/checkout@v3 # - uses: actions/checkout@v3
- uses: ruby/setup-ruby@v1 # - uses: ruby/setup-ruby@v1
with: # with:
ruby-version: '3.2' # ruby-version: '3.0'
bundler-cache: true # bundler-cache: true
- run: bundle exec rubocop # - run: bundle exec rubocop
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -26,10 +26,6 @@ jobs:
- gemfiles/rails_51.gemfile - gemfiles/rails_51.gemfile
include: include:
# ruby 3.x # ruby 3.x
- ruby: '3.2'
gemfile: gemfiles/rails_80.gemfile
- ruby: '3.2'
gemfile: gemfiles/rails_72.gemfile
- ruby: '3.2' - ruby: '3.2'
gemfile: gemfiles/rails_71.gemfile gemfile: gemfiles/rails_71.gemfile
- ruby: '3.0' - ruby: '3.0'

Просмотреть файл

@@ -1,18 +1,15 @@
require: rubocop-rails # Rubocop does not support 2.0
Gemspec/RequiredRubyVersion: {Enabled: false}
AllCops: Rails: {Enabled: true}
TargetRubyVersion: 2.4
NewCops: enable
SuggestExtensions: false
Exclude:
- gemfiles/*
- tmp/*
- vendor/**/* # for github actions
Gemspec/DevelopmentDependencies: {Enabled: false} Layout/AlignParameters:
# Disable, till rubocop supports combination of styles.
Layout/ArgumentAlignment: {EnforcedStyle: with_fixed_indentation} # Use one of this styles where appropriate, keep it clean, compact and readable.
Layout/ParameterAlignment: {EnforcedStyle: with_fixed_indentation} Enabled: false
# EnforcedStyle:
# - with_first_parameter
# - with_fixed_indentation
# Breaks # Breaks
# #
@@ -22,11 +19,7 @@ Layout/ParameterAlignment: {EnforcedStyle: with_fixed_indentation}
# ) # )
Layout/ClosingParenthesisIndentation: {Enabled: false} Layout/ClosingParenthesisIndentation: {Enabled: false}
Layout/DotPosition: {EnforcedStyle: trailing} Layout/DotPosition: {EnforcedStyle: trailing}
Layout/EmptyLineAfterGuardClause: {Enabled: false}
Layout/FirstParameterIndentation: {EnforcedStyle: consistent} Layout/FirstParameterIndentation: {EnforcedStyle: consistent}
Layout/LineContinuationLeadingSpace: {Enabled: false}
Layout/LineEndStringConcatenationIndentation: {EnforcedStyle: indented}
Layout/LineLength: {Max: 100}
# Same as Layout/ClosingParenthesisIndentation # Same as Layout/ClosingParenthesisIndentation
Layout/MultilineMethodCallBraceLayout: {Enabled: false} Layout/MultilineMethodCallBraceLayout: {Enabled: false}
Layout/MultilineMethodCallIndentation: {EnforcedStyle: indented} Layout/MultilineMethodCallIndentation: {EnforcedStyle: indented}
@@ -35,16 +28,8 @@ Layout/SpaceInsideHashLiteralBraces: {EnforcedStyle: no_space}
# Offences named scopes and `expect {}.to change {}`. # Offences named scopes and `expect {}.to change {}`.
Lint/AmbiguousBlockAssociation: {Enabled: false} 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/PredicateName: {Enabled: false}
Naming/RescuedExceptionsVariableName: {PreferredName: exception}
Naming/VariableNumber: {EnforcedStyle: snake_case} Naming/VariableNumber: {EnforcedStyle: snake_case}
Style/Alias: {Enabled: false} Style/Alias: {Enabled: false}
@@ -60,16 +45,12 @@ Style/ModuleFunction: {Enabled: false}
Style/NestedParenthesizedCalls: {Enabled: false} Style/NestedParenthesizedCalls: {Enabled: false}
Style/SignalException: {EnforcedStyle: only_raise} Style/SignalException: {EnforcedStyle: only_raise}
Style/TrailingCommaInArguments: {Enabled: false} Style/TrailingCommaInArguments: {Enabled: false}
Style/TrailingCommaInArrayLiteral: {EnforcedStyleForMultiline: comma} Style/TrailingCommaInLiteral: {EnforcedStyleForMultiline: comma}
Style/TrailingCommaInHashLiteral: {EnforcedStyleForMultiline: comma}
Metrics/AbcSize: {Max: 21} Metrics/AbcSize: {Max: 21}
# Other metrics are just enough. # Other metrics are just enough.
# This one offences all specs, routes and some initializers. # This one offences all specs, routes and some initializers.
Metrics/BlockLength: {Enabled: false} Metrics/BlockLength: {Enabled: false}
Metrics/LineLength: {Max: 100}
Metrics/MethodLength: {Max: 30} Metrics/MethodLength: {Max: 30}
Metrics/CyclomaticComplexity: {Max: 8} Metrics/CyclomaticComplexity: {Max: 8}
Rails/IndexWith: {Enabled: false}
Rails/RakeEnvironment: {Enabled: false}
Rails/ShortI18n: {Enabled: false}

Просмотреть файл

@@ -1,15 +1,3 @@
# frozen_string_literal: true
appraise 'rails-80' do
gem 'actionpack', '~> 8.0.0'
gem 'railties', '~> 8.0.0'
end
appraise 'rails-72' do
gem 'actionpack', '~> 7.2.0'
gem 'railties', '~> 7.2.0'
end
appraise 'rails-71' do appraise 'rails-71' do
gem 'actionpack', '~> 7.1.0' gem 'actionpack', '~> 7.1.0'
gem 'railties', '~> 7.1.0' gem 'railties', '~> 7.1.0'

Просмотреть файл

@@ -1,33 +1,5 @@
# Unreleased # Unreleased
# 0.16.7
- Update to Bot API 8.2
# 0.16.6
- Fix poller rake task for Rails 8.0
# 0.16.5
- Rails 8.0 support
- Update to Bot API 8.0
# 0.16.4
- Rails 7.2 support
- Update to Bot API 7.9
# 0.16.3
- Update to Bot API 7.7
- Added `pre_checkout_query` to PAYLOAD_TYPES
# 0.16.2
- Update to Bot API 7.3
- Add `# frozen_string_literal: true` to all source files.
# 0.16.1 # 0.16.1
- Fix logger in poller mode in rails 7.1 - Fix logger in poller mode in rails 7.1

Просмотреть файл

@@ -1,12 +1,11 @@
# frozen_string_literal: true
source 'https://rubygems.org' source 'https://rubygems.org'
gemspec gemspec
group :development do group :development do
gem 'appraisal', '~> 2.2' gem 'appraisal', '~> 2.2'
gem 'debug', '~> 1.9.2' gem 'pry', '~> 0.14.1'
gem 'pry-byebug', '~> 3.10.1'
gem 'sdoc', '~> 2.0.3' gem 'sdoc', '~> 2.0.3'
gem 'telegram-bot-types', '~> 0.6.3' gem 'telegram-bot-types', '~> 0.6.3'
@@ -15,8 +14,7 @@ group :development do
gem 'rspec-its', '~> 1.3.0' gem 'rspec-its', '~> 1.3.0'
gem 'rspec-rails', '~> 4.0.2' gem 'rspec-rails', '~> 4.0.2'
gem 'rubocop', '~> 1.59.0' gem 'rubocop', '~> 0.52.1'
gem 'rubocop-rails', '~> 2.23.1'
gem 'coveralls', '~> 0.8.23', require: false gem 'coveralls', '~> 0.8.23', require: false
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'bundler/gem_tasks' require 'bundler/gem_tasks'
require 'rspec/core/rake_task' require 'rspec/core/rake_task'

Просмотреть файл

@@ -1,11 +1,7 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# frozen_string_literal: true
require 'bundler/setup' require 'bundler/setup'
require 'telegram/bot' require 'telegram/bot'
require 'irb' require 'pry'
require 'irb/completion' Pry.start
IRB.setup(nil)
IRB::Irb.new.run(IRB.conf)

Просмотреть файл

@@ -1,6 +1,4 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# frozen_string_literal: true
# #
# Fetch list of methods from Telegram docs. # Fetch list of methods from Telegram docs.
# Use it to update client.rb. # Use it to update client.rb.
@@ -8,7 +6,7 @@
require 'net/http' require 'net/http'
require 'nokogiri' require 'nokogiri'
DOCS_URL = 'https://core.telegram.org/bots/api' DOCS_URL = 'https://core.telegram.org/bots/api'.freeze
page_html = Net::HTTP.get(URI(DOCS_URL)) page_html = Net::HTTP.get(URI(DOCS_URL))
doc = Nokogiri::HTML(page_html) doc = Nokogiri::HTML(page_html)
@@ -20,11 +18,11 @@ headers = doc.css('h3, h4').
map { |g| g.map(&:text) } map { |g| g.map(&:text) }
# Method starts with lowercase and does not have spaces. # Method starts with lowercase and does not have spaces.
NOT_METHOD_REGEXP = /(\A[^a-z])|\s/.freeze NOT_METHOD_REGEXP = /(\A[^a-z])|\s/
# Filter method names. # Filter method names.
method_list = headers. method_list = headers.
map { |g| g.grep_v(NOT_METHOD_REGEXP) }. map { |g| g.reject { |x| x.match?(NOT_METHOD_REGEXP) } }.
reject(&:empty?) reject(&:empty?)
api_version = doc.text.match(/^(?:Introducing )?(Bot API ([\d\.]+))\.?$/) api_version = doc.text.match(/^(?:Introducing )?(Bot API ([\d\.]+))\.?$/)
@@ -41,24 +39,3 @@ puts result_txt
API_METHODS_FILE = File.expand_path('../lib/telegram/bot/client/api_methods.txt', __dir__).freeze API_METHODS_FILE = File.expand_path('../lib/telegram/bot/client/api_methods.txt', __dir__).freeze
File.write(API_METHODS_FILE, result_txt) File.write(API_METHODS_FILE, result_txt)
puts '', "Updated #{API_METHODS_FILE}" puts '', "Updated #{API_METHODS_FILE}"
puts '', 'Payload types:'
update_tbody = doc.css('tbody').
find { |tbody| tbody.css('td').any? { |td| td.text == 'update_id' } }
payload_types = update_tbody.css('td:first-child').map(&:text).reject { |x| x == 'update_id' }
result = ['# Generated with bin/fetch-telegram-methods']
result << "# #{api_version[1]}" if api_version
result << payload_types.join("\n")
result << ''
result_txt = result.join("\n")
puts result_txt
PAYLOAD_TYPES_FILE = File.expand_path(
'../lib/telegram/bot/updates_controller/payload_types.txt',
__dir__,
).freeze
File.write(PAYLOAD_TYPES_FILE, result_txt)
puts '', "Updated #{PAYLOAD_TYPES_FILE}"

Просмотреть файл

@@ -1,7 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# frozen_string_literal: true
root = File.expand_path('..', __dir__) root = File.expand_path('../../', __FILE__)
hooks_dir = "#{root}/bin/git-hooks" hooks_dir = "#{root}/bin/git-hooks"
`ls -1 #{hooks_dir}`.each_line.map(&:strip).each do |file| `ls -1 #{hooks_dir}`.each_line.map(&:strip).each do |file|

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 5.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 5.2.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 6.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 6.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 7.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -7,14 +7,14 @@ gem "railties", "~> 7.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0" gem "rubocop", "~> 0.52.1"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false gem "coveralls", "~> 0.8.23", require: false
end end

Просмотреть файл

@@ -1,21 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "actionpack", "~> 7.2.0"
gem "railties", "~> 7.2.0"
group :development do
gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2"
gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false
end
gemspec path: "../"

Просмотреть файл

@@ -1,21 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "actionpack", "~> 8.0.0"
gem "railties", "~> 8.0.0"
group :development do
gem "appraisal", "~> 2.2"
gem "debug", "~> 1.9.2"
gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 1.59.0"
gem "rubocop-rails", "~> 2.23.1"
gem "coveralls", "~> 0.8.23", require: false
end
gemspec path: "../"

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
namespace :telegram do namespace :telegram do
namespace :bot do namespace :bot do
desc 'Run poller. It broadcasts Rails.logger to STDOUT in dev like `rails s` do. ' \ desc 'Run poller. It broadcasts Rails.logger to STDOUT in dev like `rails s` do. ' \
@@ -8,17 +6,14 @@ namespace :telegram do
ENV['BOT_POLLER_MODE'] = 'true' ENV['BOT_POLLER_MODE'] = 'true'
Rake::Task['environment'].invoke Rake::Task['environment'].invoke
if ENV.fetch('LOG_TO_STDOUT') { Rails.env.development? }.present? if ENV.fetch('LOG_TO_STDOUT') { Rails.env.development? }.present?
console = ActiveSupport::Logger.new($stderr) console = ActiveSupport::Logger.new(STDERR)
if Rails.logger.respond_to?(:broadcast_to) if ::Rails.logger.respond_to?(:broadcast_to)
Rails.logger.broadcast_to(console) ::Rails.logger.broadcast_to(console)
else else
Rails.logger.extend ActiveSupport::Logger.broadcast console Rails.logger.extend ActiveSupport::Logger.broadcast console
end end
end end
# Routes are not loaded by default in Rails >= 8.0. Telegram::Bot::UpdatesPoller.start(ENV['BOT'].try!(:to_sym) || :default)
# Load them explicitly to identify a controller for a bot.
Rails.application.try(:reload_routes_unless_loaded)
Telegram::Bot::UpdatesPoller.start(ENV['BOT']&.to_sym || :default)
end end
desc 'Set webhook urls for all bots' desc 'Set webhook urls for all bots'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/config_methods' require 'telegram/bot/config_methods'
module Telegram module Telegram
@@ -14,6 +12,15 @@ module Telegram
# Raised for valid telegram response with 404 status code. # Raised for valid telegram response with 404 status code.
class NotFound < Error; end 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 :Async, 'telegram/bot/async'
autoload :Client, 'telegram/bot/client' autoload :Client, 'telegram/bot/client'
autoload :ClientStub, 'telegram/bot/client_stub' autoload :ClientStub, 'telegram/bot/client_stub'
@@ -23,7 +30,6 @@ module Telegram
autoload :Tasks, 'telegram/bot/tasks' autoload :Tasks, 'telegram/bot/tasks'
autoload :UpdatesController, 'telegram/bot/updates_controller' autoload :UpdatesController, 'telegram/bot/updates_controller'
autoload :UpdatesPoller, 'telegram/bot/updates_poller' autoload :UpdatesPoller, 'telegram/bot/updates_poller'
autoload :VERSION, 'telegram/bot/version'
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
# Telegram clients can perform requests in async way with # Telegram clients can perform requests in async way with
@@ -130,7 +128,7 @@ module Telegram
# #
# If no block is given returns previously set value or the global one, # If no block is given returns previously set value or the global one,
# set by #async=. # set by #async=.
def async(val = true) # rubocop:disable Style/OptionalBooleanParameter def async(val = true)
thread_key = object_id thread_key = object_id
thread_store = Async.thread_store thread_store = Async.thread_store
return thread_store.fetch(thread_key) { @async } unless block_given? return thread_store.fetch(thread_key) { @async } unless block_given?
@@ -139,7 +137,7 @@ module Telegram
thread_store[thread_key] = self.class.prepare_async_val(val) thread_store[thread_key] = self.class.prepare_async_val(val)
yield yield
ensure ensure
if old_val == MISSING_VALUE if MISSING_VALUE == old_val
thread_store.delete(thread_key) thread_store.delete(thread_key)
else else
thread_store[thread_key] = old_val thread_store[thread_key] = old_val

Просмотреть файл

@@ -1,13 +1,11 @@
# frozen_string_literal: true
require 'active_support/core_ext/hash/keys' require 'active_support/core_ext/hash/keys'
require 'httpclient' require 'httpclient'
module Telegram module Telegram
module Bot module Bot
class Client class Client
SERVER = 'https://api.telegram.org' SERVER = 'https://api.telegram.org'.freeze
URL_TEMPLATE = '%<server>s/bot%<token>s/' URL_TEMPLATE = '%<server>s/bot%<token>s/'.freeze
autoload :RequestBodyFormatter, 'telegram/bot/client/request_body_formatter' autoload :RequestBodyFormatter, 'telegram/bot/client/request_body_formatter'
autoload :TypedResponse, 'telegram/bot/client/typed_response' autoload :TypedResponse, 'telegram/bot/client/typed_response'
@@ -43,7 +41,7 @@ module Telegram
end end
def error_for_response(response) def error_for_response(response)
result = JSON.parse(response.body) rescue nil # rubocop:disable Style/RescueModifier result = JSON.parse(response.body) rescue nil # rubocop:disable RescueModifier
return Error.new(response.reason) unless result return Error.new(response.reason) unless result
message = result['description'] || '-' message = result['description'] || '-'
# This errors are raised only for valid responses from Telegram # This errors are raised only for valid responses from Telegram

Просмотреть файл

@@ -1,12 +1,10 @@
# frozen_string_literal: true
require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/string/inflections'
module Telegram module Telegram
module Bot module Bot
class Client class Client
module ApiHelper module ApiHelper
METHODS_LIST_FILE = File.expand_path('api_methods.txt', __dir__) METHODS_LIST_FILE = File.expand_path('../api_methods.txt', __FILE__)
class << self class << self
def methods_list(file = METHODS_LIST_FILE) def methods_list(file = METHODS_LIST_FILE)

Просмотреть файл

@@ -1,5 +1,5 @@
# Generated with bin/fetch-telegram-methods # Generated with bin/fetch-telegram-methods
# Bot API 8.2 # Bot API 6.8
getUpdates getUpdates
setWebhook setWebhook
@@ -11,9 +11,7 @@ logOut
close close
sendMessage sendMessage
forwardMessage forwardMessage
forwardMessages
copyMessage copyMessage
copyMessages
sendPhoto sendPhoto
sendAudio sendAudio
sendDocument sendDocument
@@ -21,7 +19,6 @@ sendVideo
sendAnimation sendAnimation
sendVoice sendVoice
sendVideoNote sendVideoNote
sendPaidMedia
sendMediaGroup sendMediaGroup
sendLocation sendLocation
sendVenue sendVenue
@@ -29,9 +26,7 @@ sendContact
sendPoll sendPoll
sendDice sendDice
sendChatAction sendChatAction
setMessageReaction
getUserProfilePhotos getUserProfilePhotos
setUserEmojiStatus
getFile getFile
banChatMember banChatMember
unbanChatMember unbanChatMember
@@ -44,8 +39,6 @@ setChatPermissions
exportChatInviteLink exportChatInviteLink
createChatInviteLink createChatInviteLink
editChatInviteLink editChatInviteLink
createChatSubscriptionInviteLink
editChatSubscriptionInviteLink
revokeChatInviteLink revokeChatInviteLink
approveChatJoinRequest approveChatJoinRequest
declineChatJoinRequest declineChatJoinRequest
@@ -77,8 +70,6 @@ hideGeneralForumTopic
unhideGeneralForumTopic unhideGeneralForumTopic
unpinAllGeneralForumTopicMessages unpinAllGeneralForumTopicMessages
answerCallbackQuery answerCallbackQuery
getUserChatBoosts
getBusinessConnection
setMyCommands setMyCommands
deleteMyCommands deleteMyCommands
getMyCommands getMyCommands
@@ -101,7 +92,6 @@ stopMessageLiveLocation
editMessageReplyMarkup editMessageReplyMarkup
stopPoll stopPoll
deleteMessage deleteMessage
deleteMessages
sendSticker sendSticker
getStickerSet getStickerSet
@@ -111,7 +101,6 @@ createNewStickerSet
addStickerToSet addStickerToSet
setStickerPositionInSet setStickerPositionInSet
deleteStickerFromSet deleteStickerFromSet
replaceStickerInSet
setStickerEmojiList setStickerEmojiList
setStickerKeywords setStickerKeywords
setStickerMaskPosition setStickerMaskPosition
@@ -119,24 +108,14 @@ setStickerSetTitle
setStickerSetThumbnail setStickerSetThumbnail
setCustomEmojiStickerSetThumbnail setCustomEmojiStickerSetThumbnail
deleteStickerSet deleteStickerSet
getAvailableGifts
sendGift
verifyUser
verifyChat
removeUserVerification
removeChatVerification
answerInlineQuery answerInlineQuery
answerWebAppQuery answerWebAppQuery
savePreparedInlineMessage
sendInvoice sendInvoice
createInvoiceLink createInvoiceLink
answerShippingQuery answerShippingQuery
answerPreCheckoutQuery answerPreCheckoutQuery
getStarTransactions
refundStarPayment
editUserStarSubscription
setPassportDataErrors setPassportDataErrors

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'json' require 'json'
module Telegram module Telegram

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/client/api_helper' require 'telegram/bot/client/api_helper'
require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/string/inflections'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
# Stubbed client for tests. Saves all requests into #requests hash. # Stubbed client for tests. Saves all requests into #requests hash.
@@ -19,7 +17,7 @@ module Telegram
class << self class << self
# Any call to Client.new will return ClientStub instance when `enabled` is true. # Any call to Client.new will return ClientStub instance when `enabled` is true.
# Can be used with a block. # Can be used with a block.
def stub_all!(enabled = true) # rubocop:disable Style/OptionalBooleanParameter def stub_all!(enabled = true)
Client.extend(StubbedConstructor) unless Client < StubbedConstructor Client.extend(StubbedConstructor) unless Client < StubbedConstructor
return @_stub_all = enabled unless block_given? return @_stub_all = enabled unless block_given?
begin begin
@@ -36,7 +34,7 @@ module Telegram
end end
end end
def initialize(token = nil, username = nil, **options) # rubocop:disable Lint/MissingSuper def initialize(token = nil, username = nil, **options)
@token = token || options[:token] @token = token || options[:token]
@username = username || options[:username] || token @username = username || options[:username] || token
reset reset

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'active_support/core_ext/hash/keys' require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/hash/indifferent_access' require 'active_support/core_ext/hash/indifferent_access'
@@ -46,7 +44,7 @@ module Telegram
# from `secrets.yml` merging `telegram['bot']` at `:default` key. # from `secrets.yml` merging `telegram['bot']` at `:default` key.
# #
# Can be overwritten with .bots_config= # Can be overwritten with .bots_config=
def bots_config # rubocop:disable Metrics/PerceivedComplexity def bots_config
@bots_config ||= @bots_config ||=
if defined?(Rails.application) if defined?(Rails.application)
app = Rails.application app = Rails.application

Просмотреть файл

@@ -1,9 +1,7 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
module DebugClient module DebugClient
def debug!(dev = $stdout) def debug!(dev = STDOUT)
if block_given? if block_given?
begin begin
old_dev = client.debug_dev old_dev = client.debug_dev

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'active_support/concern' require 'active_support/concern'
require 'active_support/core_ext/hash/indifferent_access' require 'active_support/core_ext/hash/indifferent_access'
require 'active_support/json' require 'active_support/json'
@@ -23,7 +21,7 @@ module Telegram
end end
def inspect def inspect
"#<#{self.class.name}(#{controller&.name})>" "#<#{self.class.name}(#{controller.try!(:name)})>"
end end
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/routes_helper' require 'telegram/bot/routes_helper'
module Telegram module Telegram
@@ -12,7 +10,7 @@ module Telegram
end end
config.before_initialize do config.before_initialize do
::ActionDispatch::Routing::Mapper.include RoutesHelper ::ActionDispatch::Routing::Mapper.send(:include, RoutesHelper)
end end
initializer 'telegram.bot.updates_controller.set_config' do |app| initializer 'telegram.bot.updates_controller.set_config' do |app|

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'base64' require 'base64'
require 'openssl' require 'openssl'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
module RSpec module RSpec

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec' require 'telegram/bot/rspec'
require 'telegram/bot/rspec/message_helpers' require 'telegram/bot/rspec/message_helpers'
@@ -9,7 +7,7 @@ RSpec.shared_context 'telegram/bot/callback_query' do
subject { -> { dispatch callback_query: payload } } subject { -> { dispatch callback_query: payload } }
let(:payload) { {id: callback_query_id, from: from, message: message, data: data} } let(:payload) { {id: callback_query_id, from: from, message: message, data: data} }
let(:callback_query_id) { '11' } let(:callback_query_id) { 11 }
let(:message_id) { 22 } let(:message_id) { 22 }
let(:message) { {message_id: message_id, chat: chat, text: 'message text'} } let(:message) { {message_id: message_id, chat: chat, text: 'message text'} }
let(:data) { raise '`let(:data) { "callback query data here" }` is required' } let(:data) { raise '`let(:data) { "callback query data here" }` is required' }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
module RSpec module RSpec
@@ -63,14 +61,14 @@ module Telegram
attr_reader :performed_requests, :description attr_reader :performed_requests, :description
def initialize(bot, action, description: nil) # rubocop:disable Lint/MissingSuper def initialize(bot, action, description: nil)
@bot = bot @bot = bot
@action = action @action = action
@description = description || "make #{action} telegram request" @description = description || "make #{action} telegram request"
exactly(1) exactly(1)
end end
def matches?(proc) # rubocop:disable Metrics/AbcSize def matches?(proc) # rubocop:disable AbcSize
raise ArgumentError, 'matcher only supports block expectations' unless proc.is_a?(Proc) raise ArgumentError, 'matcher only supports block expectations' unless proc.is_a?(Proc)
original_requests_count = bot.requests[action].count original_requests_count = bot.requests[action].count
proc.call proc.call
@@ -117,15 +115,15 @@ module Telegram
:arg_list_matcher, :matching_requests_count :arg_list_matcher, :matching_requests_count
def base_message def base_message
msg = "make #{expectation_type.to_s.tr('_', ' ')} #{expected_number} " \ "make #{expectation_type.to_s.tr('_', ' ')} #{expected_number} " \
"#{bot.inspect}.#{action} requests," "#{bot.inspect}.#{action} requests,".tap do |msg|
msg += " with #{arg_list_matcher}," if arg_list_matcher msg << " with #{arg_list_matcher}," if arg_list_matcher
msg += " but made #{matching_requests_count}" msg << " but made #{matching_requests_count}"
if performed_requests if performed_requests
actual_args = performed_requests.map(&:inspect).join(', ') actual_args = performed_requests.map(&:inspect).join(', ')
msg += ", and #{performed_requests.count} with #{actual_args}" msg << ", and #{performed_requests.count} with #{actual_args}"
end
end end
msg
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/shared' require 'telegram/bot/rspec/integration/shared'
RSpec.shared_context 'telegram/bot/integration/poller' do RSpec.shared_context 'telegram/bot/integration/poller' do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/shared' require 'telegram/bot/rspec/integration/shared'
require 'rack/test' require 'rack/test'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/shared' require 'telegram/bot/rspec/integration/shared'
RSpec.shared_context 'telegram/bot/integration/rails', type: :request do RSpec.shared_context 'telegram/bot/integration/rails', type: :request do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'active_support/json' require 'active_support/json'
require 'telegram/bot' require 'telegram/bot'
require 'telegram/bot/rspec/message_helpers' require 'telegram/bot/rspec/message_helpers'
@@ -12,5 +10,5 @@ RSpec.shared_context 'telegram/bot/integration/shared' do
let(:bot) { Telegram.bot } let(:bot) { Telegram.bot }
let(:clear_session?) { described_class.respond_to?(:session_store) } let(:clear_session?) { described_class.respond_to?(:session_store) }
before { described_class.session_store&.clear if clear_session? } before { described_class.session_store.try!(:clear) if clear_session? }
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
# Shared helpers for testing message updates. # Shared helpers for testing message updates.
RSpec.shared_context 'telegram/bot/message_helpers' do RSpec.shared_context 'telegram/bot/message_helpers' do
let(:default_message_options) { {from: from, chat: chat} } let(:default_message_options) { {from: from, chat: chat} }

Просмотреть файл

@@ -7,7 +7,7 @@ module Telegram
def set_webhook def set_webhook
routes = Rails.application.routes.url_helpers routes = Rails.application.routes.url_helpers
cert_file = ENV.fetch('CERT', nil) cert_file = ENV['CERT']
cert = File.open(cert_file) if cert_file cert = File.open(cert_file) if cert_file
each_bot do |key, bot| each_bot do |key, bot|
route_name = RoutesHelper.route_name_for_bot(bot) route_name = RoutesHelper.route_name_for_bot(bot)
@@ -16,7 +16,7 @@ module Telegram
bot.set_webhook( bot.set_webhook(
url: url, url: url,
certificate: cert, certificate: cert,
ip_address: ENV.fetch('IP_ADDRESS', nil), ip_address: ENV['IP_ADDRESS'],
drop_pending_updates: drop_pending_updates, drop_pending_updates: drop_pending_updates,
) )
end end
@@ -50,13 +50,13 @@ module Telegram
end end
def each_bot(&block) def each_bot(&block)
id = ENV['BOT']&.to_sym id = ENV['BOT'].try!(:to_sym)
bots = id ? {id => Client.by_id(id)} : Telegram.bots bots = id ? {id => Client.by_id(id)} : Telegram.bots
bots.each { |key, bot| bot.async(false) { block[key, bot] } } bots.each { |key, bot| bot.async(false) { block[key, bot] } }
end end
def drop_pending_updates def drop_pending_updates
ENV['DROP_PENDING_UPDATES']&.downcase == 'true' ENV['DROP_PENDING_UPDATES'].try!(:downcase) == 'true'
end end
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'abstract_controller' require 'abstract_controller'
require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/string/inflections'
require 'active_support/callbacks' require 'active_support/callbacks'
@@ -49,7 +47,7 @@ module Telegram
# ControllerClass.new(bot, from: telegram_user, chat: telegram_chat). # ControllerClass.new(bot, from: telegram_user, chat: telegram_chat).
# process(:help, *args) # process(:help, *args)
# #
class UpdatesController < AbstractController::Base # rubocop:disable Metrics/ClassLength class UpdatesController < AbstractController::Base # rubocop:disable ClassLength
abstract! abstract!
%w[ %w[
@@ -71,12 +69,12 @@ module Telegram
include AbstractController::Callbacks include AbstractController::Callbacks
# Redefine callbacks with default terminator. # Redefine callbacks with default terminator.
if ActiveSupport::VERSION::MAJOR >= 5 if ActiveSupport::VERSION::MAJOR >= 5
define_callbacks :process_action, define_callbacks :process_action,
skip_after_callbacks_if_terminated: true skip_after_callbacks_if_terminated: true
else else
define_callbacks :process_action, define_callbacks :process_action,
terminator: ->(_, result) { result == false }, terminator: ->(_, result) { result == false },
skip_after_callbacks_if_terminated: true skip_after_callbacks_if_terminated: true
end end
include Commands include Commands
@@ -89,13 +87,22 @@ module Telegram
extend Session::ConfigMethods extend Session::ConfigMethods
PAYLOAD_TYPES_FILE = File.expand_path('updates_controller/payload_types.txt', __dir__) PAYLOAD_TYPES = %w[
PAYLOAD_TYPES = File.read(PAYLOAD_TYPES_FILE). message
lines. edited_message
map(&:strip). channel_post
reject { |x| x.empty? || x.start_with?('#') }. edited_channel_post
to_set. inline_query
freeze chosen_inline_result
callback_query
shipping_query
pre_checkout_query
poll
poll_answer
my_chat_member
chat_member
chat_join_request
].freeze
class << self class << self
# Initialize controller and process update. # Initialize controller and process update.
@@ -104,28 +111,9 @@ module Telegram
end end
def payload_from_update(update) def payload_from_update(update)
case update update && PAYLOAD_TYPES.find do |type|
when nil then nil item = update[type]
when Hash return [item, type] if item
# faster lookup for the case when telegram-bot-types is not used
update.find do |type, item|
return [item, type] if PAYLOAD_TYPES.include?(type)
end
else
payload_from_typed_update(update)
end
end
private
def payload_from_typed_update(update)
PAYLOAD_TYPES.find do |type|
begin
item = update[type]
return [item, type] if item
rescue Exception # rubocop:disable Lint/RescueException
# dry-rb raises exception if field is not defined in schema
end
end end
end end
end end
@@ -138,14 +126,14 @@ module Telegram
# that update is nil. # that update is nil.
# ActionDispatch::Request object is passed in `webhook_request` when bot running # ActionDispatch::Request object is passed in `webhook_request` when bot running
# in webhook mode. # in webhook mode.
def initialize(bot = nil, update = nil, webhook_request = nil) # rubocop:disable Lint/MissingSuper def initialize(bot = nil, update = nil, webhook_request = nil)
if update.is_a?(Hash) && (update.key?(:from) || update.key?(:chat)) if update.is_a?(Hash) && (update.key?(:from) || update.key?(:chat))
options = update options = update
update = nil update = nil
end end
@_bot = bot @_bot = bot
@_update = update @_update = update
@_chat, @_from = options&.values_at(:chat, :from) @_chat, @_from = options && options.values_at(:chat, :from)
@_payload, @_payload_type = self.class.payload_from_update(update) @_payload, @_payload_type = self.class.payload_from_update(update)
@_webhook_request = webhook_request @_webhook_request = webhook_request
end end
@@ -154,13 +142,13 @@ module Telegram
# when there is no such field in payload. # when there is no such field in payload.
# #
# Can be overriden with `chat` option for #initialize. # Can be overriden with `chat` option for #initialize.
def chat # rubocop:disable Metrics/PerceivedComplexity def chat
@_chat ||= # rubocop:disable Naming/MemoizedInstanceVariableName @_chat ||=
if payload if payload
if payload.is_a?(Hash) if payload.is_a?(Hash)
payload['chat'] || (payload['message'] && payload['message']['chat']) payload['chat'] || payload['message'] && payload['message']['chat']
else else
payload.try(:chat) || payload.try(:message)&.chat payload.try(:chat) || payload.try(:message).try!(:chat)
end end
end end
end end
@@ -168,8 +156,7 @@ module Telegram
# Accessor to `'from'` field of payload. Can be overriden with `from` option # Accessor to `'from'` field of payload. Can be overriden with `from` option
# for #initialize. # for #initialize.
def from def from
@_from ||= # rubocop:disable Naming/MemoizedInstanceVariableName @_from ||= payload.is_a?(Hash) ? payload['from'] : payload.try(:from)
payload.is_a?(Hash) ? payload['from'] : payload.try(:from)
end end
# Processes current update. # Processes current update.
@@ -234,7 +221,7 @@ module Telegram
# Silently ignore unsupported messages to not fail when user crafts # Silently ignore unsupported messages to not fail when user crafts
# an update with usupported command, callback query context, etc. # an update with usupported command, callback query context, etc.
def action_missing(action, *_args) def action_missing(action, *_args)
logger&.debug { "The action '#{action}' is not defined in #{self.class.name}" } logger.debug { "The action '#{action}' is not defined in #{self.class.name}" } if logger
nil nil
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController

Просмотреть файл

@@ -1,11 +1,9 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController
# Support for parsing commands # Support for parsing commands
module Commands module Commands
CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i.freeze CMD_REGEX = %r{\A/([a-z\d_]{,31})(@(\S+))?(\s|$)}i
class << self class << self
# Fetches command from text message. All subsequent words are returned # Fetches command from text message. All subsequent words are returned
@@ -36,7 +34,7 @@ module Telegram
def action_for_message def action_for_message
cmd, args = Commands.command_from_text(payload['text'], bot_username) cmd, args = Commands.command_from_text(payload['text'], bot_username)
return unless cmd return unless cmd
[[action_for_command(cmd), {type: :command, command: cmd}], args] [[action_for_command(cmd), type: :command, command: cmd], args]
end end
alias_method :action_for_channel_post, :action_for_message alias_method :action_for_channel_post, :action_for_message

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController
@@ -25,8 +23,8 @@ module Telegram
def process_action(*args) def process_action(*args)
raw_payload = { raw_payload = {
controller: self.class.name, controller: self.class.name,
action: action_name, action: action_name,
update: update, update: update,
} }
Instrumentation.instrument(:start_processing, raw_payload.dup) Instrumentation.instrument(:start_processing, raw_payload.dup)
Instrumentation.instrument(:process_action, raw_payload) do |payload| Instrumentation.instrument(:process_action, raw_payload) do |payload|
@@ -63,14 +61,14 @@ module Telegram
# end # end
# #
# :api: plugin # :api: plugin
def cleanup_view_runtime # :nodoc: def cleanup_view_runtime #:nodoc:
yield yield
end end
# Every time after an action is processed, this method is invoked # Every time after an action is processed, this method is invoked
# with the payload, so you can add more information. # with the payload, so you can add more information.
# :api: plugin # :api: plugin
def append_info_to_payload(_payload) # :nodoc: def append_info_to_payload(_payload) #:nodoc:
end end
module ClassMethods module ClassMethods
@@ -78,7 +76,7 @@ module Telegram
# controller process action. This method should return an array # controller process action. This method should return an array
# with the messages to be added. # with the messages to be added.
# :api: plugin # :api: plugin
def log_process_action(_payload) # :nodoc: def log_process_action(_payload) #:nodoc:
[] []
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'active_support/log_subscriber' require 'active_support/log_subscriber'
module Telegram module Telegram
@@ -10,7 +8,7 @@ module Telegram
info do info do
payload = event.payload payload = event.payload
"Processing by #{payload[:controller]}##{payload[:action]}\n" \ "Processing by #{payload[:controller]}##{payload[:action]}\n" \
" Update: #{payload[:update].to_json}" " Update: #{payload[:update].to_json}"
end end
end end
@@ -19,7 +17,7 @@ module Telegram
payload = event.payload payload = event.payload
additions = UpdatesController.log_process_action(payload) additions = UpdatesController.log_process_action(payload)
message = "Completed in #{event.duration.round}ms" message = "Completed in #{event.duration.round}ms"
message += " (#{additions.join(' | ')})" if additions.present? message << " (#{additions.join(' | ')})" if additions.present?
message message
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController
@@ -50,12 +48,12 @@ module Telegram
# it has higher priority than contextual action. # it has higher priority than contextual action.
def action_for_message def action_for_message
val = message_context_session.delete(:context) val = message_context_session.delete(:context)
context = val&.to_s context = val && val.to_s
super || (context && begin super || context && begin
args = payload['text']&.split || [] args = payload['text'].try!(:split) || []
action = action_for_message_context(context) action = action_for_message_context(context)
[[action, {type: :message_context, context: context}], args] [[action, type: :message_context, context: context], args]
end) end
end end
# Save context for the next request. # Save context for the next request.

Просмотреть файл

@@ -1,25 +0,0 @@
# Generated with bin/fetch-telegram-methods
# Bot API 8.2
message
edited_message
channel_post
edited_channel_post
business_connection
business_message
edited_business_message
deleted_business_messages
message_reaction
message_reaction_count
inline_query
chosen_inline_result
callback_query
shipping_query
pre_checkout_query
purchased_paid_media
poll
poll_answer
my_chat_member
chat_member
chat_join_request
chat_boost
removed_chat_boost

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController
@@ -61,9 +59,9 @@ module Telegram
# Edit message from callback query. # Edit message from callback query.
def edit_message(type, params = {}) def edit_message(type, params = {})
params = params =
if message_id = payload['inline_message_id'] # rubocop:disable Lint/AssignmentInCondition if message_id = payload['inline_message_id'] # rubocop:disable AssignmentInCondition
params.merge(inline_message_id: message_id) params.merge(inline_message_id: message_id)
elsif message = payload['message'] # rubocop:disable Lint/AssignmentInCondition elsif message = payload['message'] # rubocop:disable AssignmentInCondition
params.merge(chat_id: message['chat']['id'], message_id: message['message_id']) params.merge(chat_id: message['chat']['id'], message_id: message['message_id'])
else else
raise 'Can not edit message without `inline_message_id` or `message`' raise 'Can not edit message without `inline_message_id` or `message`'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'active_support/rescuable' require 'active_support/rescuable'
module Telegram module Telegram
@@ -13,7 +11,7 @@ module Telegram
def process_action(*) def process_action(*)
super super
rescue Exception => exception # rubocop:disable Lint/RescueException rescue Exception => exception # rubocop:disable RescueException
rescue_with_handler(exception) || raise rescue_with_handler(exception) || raise
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/updates_controller/testing' require 'telegram/bot/updates_controller/testing'
require 'telegram/bot/rspec/message_helpers' require 'telegram/bot/rspec/message_helpers'
require 'telegram/bot/rspec/callback_query_helpers' require 'telegram/bot/rspec/callback_query_helpers'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'rack/session/abstract/id' require 'rack/session/abstract/id'
require 'active_support/cache' require 'active_support/cache'
@@ -29,8 +27,7 @@ module Telegram
protected protected
def session def session
@_session ||= # rubocop:disable Naming/MemoizedInstanceVariableName @_session ||= self.class.build_session(session_key)
self.class.build_session(session_key)
end end
def session_key def session_key
@@ -44,7 +41,7 @@ module Telegram
class SessionHash < Rack::Session::Abstract::SessionHash class SessionHash < Rack::Session::Abstract::SessionHash
attr_reader :id attr_reader :id
def initialize(store, id) # rubocop:disable Lint/MissingSuper def initialize(store, id)
@store = store @store = store
@id = id @id = id
end end
@@ -68,13 +65,13 @@ module Telegram
def commit def commit
return unless loaded? return unless loaded?
data = to_hash.compact data = to_hash.delete_if { |_, v| v.nil? }
@store.write(id, data) @store.write(id, data)
end end
end end
class NullSessionHash < Session::SessionHash class NullSessionHash < Session::SessionHash
def initialize # rubocop:disable Lint/MissingSuper def initialize
@data = {} @data = {}
@loaded = true @loaded = true
@exists = true @exists = true

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController
@@ -18,7 +16,7 @@ module Telegram
# everything will be rewriten with #initialize. # everything will be rewriten with #initialize.
# #
# With `full` set to `true` it'll clear all cached instance variables. # With `full` set to `true` it'll clear all cached instance variables.
def recycle!(full = false) # rubocop:disable Style/OptionalBooleanParameter def recycle!(full = false)
return unless full return unless full
(instance_variables - IVARS_TO_KEEP).each do |ivar| (instance_variables - IVARS_TO_KEEP).each do |ivar|
remove_instance_variable(ivar) remove_instance_variable(ivar)
@@ -29,8 +27,7 @@ module Telegram
# Stubs session. # Stubs session.
def session def session
@_session ||= # rubocop:disable Naming/MemoizedInstanceVariableName @_session ||= Session::NullSessionHash.new
Session::NullSessionHash.new
end end
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
class UpdatesController class UpdatesController

Просмотреть файл

@@ -1,11 +1,9 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
# Supposed to be used in development environments only. # Supposed to be used in development environments only.
class UpdatesPoller class UpdatesPoller
class << self class << self
@@instances = {} # rubocop:disable Style/ClassVars @@instances = {} # rubocop:disable ClassVars
def instances def instances
@@instances @@instances
@@ -38,7 +36,7 @@ module Telegram
end end
def log(&block) def log(&block)
logger&.info(&block) logger.info(&block) if logger
end end
def start def start
@@ -58,7 +56,7 @@ module Telegram
def run def run
while running while running
updates = fetch_updates updates = fetch_updates
process_updates(updates) if updates&.any? process_updates(updates) if updates && updates.any?
end end
end end
@@ -84,8 +82,8 @@ module Telegram
process_update(update) process_update(update)
end end
end end
rescue StandardError => exception rescue StandardError => e
logger&.error { ([exception.message] + exception.backtrace).join("\n") } logger.error { ([e.message] + e.backtrace).join("\n") } if logger
end end
# Override this method to setup custom error collector. # Override this method to setup custom error collector.
@@ -104,8 +102,10 @@ module Telegram
end end
if defined?(Rails.application) && Rails.application.respond_to?(:reloader) if defined?(Rails.application) && Rails.application.respond_to?(:reloader)
def reloading_code(&block) def reloading_code
Rails.application.reloader.wrap(&block) Rails.application.reloader.wrap do
yield
end
end end
else else
def reloading_code def reloading_code

Просмотреть файл

@@ -1,8 +1,6 @@
# frozen_string_literal: true
module Telegram module Telegram
module Bot module Bot
VERSION = '0.16.7' VERSION = '0.16.0'.freeze
def self.gem_version def self.gem_version
Gem::Version.new VERSION Gem::Version.new VERSION

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'integration_helper' require 'integration_helper'
RSpec.describe DefaultBotController, telegram_bot: :rails do RSpec.describe DefaultBotController, telegram_bot: :rails do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'integration_helper' require 'integration_helper'
RSpec.describe NamedBotController, telegram_bot: :rails do RSpec.describe NamedBotController, telegram_bot: :rails do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'integration_helper' require 'integration_helper'
RSpec.describe OtherBotController, telegram_bot: :rails do RSpec.describe OtherBotController, telegram_bot: :rails do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/rails' require 'telegram/bot/rspec/integration/rails'
require 'action_controller' require 'action_controller'
require 'action_dispatch' require 'action_dispatch'
@@ -15,12 +13,7 @@ ENV['RAILS_ENV'] = 'test'
class TestApplication < Rails::Application class TestApplication < Rails::Application
config.eager_load = false config.eager_load = false
config.log_level = :debug config.log_level = :debug
if (ActionPack::VERSION::MAJOR >= 8) || config.action_dispatch.show_exceptions = false
(ActionPack::VERSION::MAJOR == 7 && ActionPack::VERSION::MINOR >= 2)
config.action_dispatch.show_exceptions = :none
else
config.action_dispatch.show_exceptions = false
end
routes.default_url_options = {host: 'test.rpsec'} routes.default_url_options = {host: 'test.rpsec'}
telegram_config = { telegram_config = {

Просмотреть файл

@@ -1,7 +1,5 @@
# frozen_string_literal: true
require 'pathname' require 'pathname'
require 'debug' require 'pry'
require 'rspec/its' require 'rspec/its'
if ENV['CI'] if ENV['CI']
@@ -12,7 +10,7 @@ elsif ENV.key?('COV')
SimpleCov.start SimpleCov.start
end end
GEM_ROOT = Pathname.new File.expand_path('..', __dir__) GEM_ROOT = Pathname.new File.expand_path('../..', __FILE__)
$LOAD_PATH.unshift GEM_ROOT.join('lib') $LOAD_PATH.unshift GEM_ROOT.join('lib')
require 'telegram/bot' require 'telegram/bot'
@@ -20,7 +18,7 @@ require 'telegram/bot/updates_controller/rspec_helpers'
require 'telegram/bot/types' require 'telegram/bot/types'
require 'active_support/json' require 'active_support/json'
Dir[GEM_ROOT.join('spec/support/**/*.rb')].sort.each { |f| require f } Dir[GEM_ROOT.join('spec/support/**/*.rb')].each { |f| require f }
RSpec.configure do |config| RSpec.configure do |config|
config.expect_with :rspec do |expectations| config.expect_with :rspec do |expectations|

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
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(:instance) { described_class.new(token: token, id: id, async: async) }
let(:id) { :default_bot } let(:id) { :default_bot }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.shared_examples 'shared integration examples' do RSpec.shared_examples 'shared integration examples' do
let(:bot) { Telegram::Bot::ClientStub.new('token') } let(:bot) { Telegram::Bot::ClientStub.new('token') }
let(:controller_class) do let(:controller_class) do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::Async::Job do RSpec.describe Telegram::Bot::Async::Job do
let(:job_class) do let(:job_class) do
described_class = self.described_class described_class = self.described_class

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::Client::RequestBodyFormatter do RSpec.describe Telegram::Bot::Client::RequestBodyFormatter do
describe '.format' do describe '.format' do
subject { described_class.format(input, action) } subject { described_class.format(input, action) }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::Client::TypedResponse do RSpec.describe Telegram::Bot::Client::TypedResponse do
let(:bot) { Telegram::Bot::Client.new('token').tap { |x| x.extend described_class } } let(:bot) { Telegram::Bot::Client.new('token').tap { |x| x.extend described_class } }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::Client do RSpec.describe Telegram::Bot::Client do
let(:instance) { described_class.new 'token' } let(:instance) { described_class.new 'token' }
let(:token) { 'token' } let(:token) { 'token' }
@@ -75,8 +73,8 @@ RSpec.describe Telegram::Bot::Client do
describe '.prepare_async_args' do describe '.prepare_async_args' do
subject { described_class.prepare_async_args(*input) } subject { described_class.prepare_async_args(*input) }
let(:input) { [: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'}] } it { should eq ['action', a: 1, b: 'sym', c: '["other"]', 'd' => 'str'] }
end end
describe '.new' do describe '.new' do

Просмотреть файл

@@ -1,9 +1,7 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::ClientStub do RSpec.describe Telegram::Bot::ClientStub do
describe '#stub_all!' do describe '#stub_all!' do
let(:client) { Telegram::Bot::Client.new('token', 'bot_name') } 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| shared_examples 'constructors' do |expected_class|
it 'makes Client.new return ClientStub' do it 'makes Client.new return ClientStub' do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::ConfigMethods do RSpec.describe Telegram::Bot::ConfigMethods do
let(:registry) do let(:registry) do
Object.new.tap do |x| Object.new.tap do |x|

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'rack/mock' require 'rack/mock'
RSpec.describe Telegram::Bot::Middleware do RSpec.describe Telegram::Bot::Middleware do
@@ -13,7 +11,7 @@ RSpec.describe Telegram::Bot::Middleware do
let(:env) do let(:env) do
Rack::MockRequest.env_for('/', Rack::MockRequest.env_for('/',
method: :post, method: :post,
input: JSON.dump(update), input: JSON.dump(update),
'CONTENT_TYPE' => 'application/json', 'CONTENT_TYPE' => 'application/json',
) )
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/routes_helper' require 'telegram/bot/routes_helper'
RSpec.describe Telegram::Bot::RoutesHelper do RSpec.describe Telegram::Bot::RoutesHelper do
@@ -48,7 +46,7 @@ RSpec.describe Telegram::Bot::RoutesHelper do
let(:controller) { double(:controller, name: :controller) } let(:controller) { double(:controller, name: :controller) }
before { allow(Telegram).to receive(:bots) { bots } } before { allow(Telegram).to receive(:bots) { bots } }
def assert_route(bot, controller, path: nil, **expected_options) # rubocop:disable Metrics/AbcSize def assert_route(bot, controller, path: nil, **expected_options) # rubocop:disable AbcSize
path ||= "telegram/#{described_class.token_hash(bot.token)}" path ||= "telegram/#{described_class.token_hash(bot.token)}"
expect(mapper).to receive(:post) do |actual_path, actual_options| expect(mapper).to receive(:post) do |actual_path, actual_options|
expect(actual_path).to eq(path) expect(actual_path).to eq(path)

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/poller' require 'telegram/bot/rspec/integration/poller'
RSpec.describe 'Integration spec helpers', telegram_bot: :poller do RSpec.describe 'Integration spec helpers', telegram_bot: :poller do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::RSpec::ClientMatchers do RSpec.describe Telegram::Bot::RSpec::ClientMatchers do
let(:bot) { Telegram::Bot::ClientStub.new('TestBot') } let(:bot) { Telegram::Bot::ClientStub.new('TestBot') }
let(:other_bot) { Telegram::Bot::ClientStub.new('OtherTestBot') } let(:other_bot) { Telegram::Bot::ClientStub.new('OtherTestBot') }
@@ -33,9 +31,6 @@ RSpec.describe Telegram::Bot::RSpec::ClientMatchers do
args = {text: 'test', parseMode: :Markdown} args = {text: 'test', parseMode: :Markdown}
block = ->(*) { bot.send_message(args) } block = ->(*) { bot.send_message(args) }
expect(&block).to make_telegram_request(bot, :sendMessage).with(args) expect(&block).to make_telegram_request(bot, :sendMessage).with(args)
expect do
expect(&block).to make_telegram_request(bot, :sendMessage).with(args.merge(extra: 1))
end.to raise_error RSpec::Expectations::ExpectationNotMetError
expect(&block).to_not make_telegram_request(bot, :sendMessage).with(args.except(:text)) expect(&block).to_not make_telegram_request(bot, :sendMessage).with(args.except(:text))
expect { 3.times(&block) }.to make_telegram_request(bot, :sendMessage). expect { 3.times(&block) }.to make_telegram_request(bot, :sendMessage).
with(args).exactly(3).times with(args).exactly(3).times

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/poller' require 'telegram/bot/rspec/integration/poller'
RSpec.describe 'Poller integration spec', telegram_bot: :poller do RSpec.describe 'Poller integration spec', telegram_bot: :poller do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/rack' require 'telegram/bot/rspec/integration/rack'
RSpec.describe 'Rack integration spec', telegram_bot: :rack do RSpec.describe 'Rack integration spec', telegram_bot: :rack do

Просмотреть файл

@@ -1,2 +1 @@
# frozen_string_literal: true
# Tested in spec/integration # Tested in spec/integration

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'telegram/bot/rspec/integration/poller' require 'telegram/bot/rspec/integration/poller'
RSpec.describe 'Integration: message helpers', telegram_bot: :poller do RSpec.describe 'Integration: message helpers', telegram_bot: :poller do
@@ -110,7 +108,7 @@ RSpec.describe 'Integration: message helpers', telegram_bot: :poller do
end end
context 'with options' do 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" } it { should respond_with_message "Start: #{args[0...-1].inspect}, option: 1" }
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:controller_class) do let(:controller_class) do
@@ -8,8 +6,7 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do
include described_class include described_class
attr_accessor :filter_done attr_accessor :filter_done
before_action only: :ctx2_callback_query do
before_action only: :ctx_2_callback_query do
self.filter_done = true self.filter_done = true
end end
@@ -17,12 +14,12 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do
[:no_context, data] [:no_context, data]
end end
def ctx_1_callback_query(data) def ctx1_callback_query(data)
[:ctx_1, data] [:ctx1, data]
end end
def ctx_2_callback_query(data) def ctx2_callback_query(data)
[:ctx_2, data] [:ctx2, data]
end end
end end
end end
@@ -43,19 +40,19 @@ RSpec.describe Telegram::Bot::UpdatesController::CallbackQueryContext do
let(:data) { "#{ctx}:#{text}" } let(:data) { "#{ctx}:#{text}" }
context 'and valid' do context 'and valid' do
let(:ctx) { 'ctx_1' } let(:ctx) { 'ctx1' }
its(:call) { should eq [:ctx_1, text] } its(:call) { should eq [:ctx1, text] }
it { should_not change(controller, :filter_done) } it { should_not change(controller, :filter_done) }
context 'and context has callback' do context 'and context has callback' do
let(:ctx) { 'ctx_2' } let(:ctx) { 'ctx2' }
its(:call) { should eq [:ctx_2, text] } its(:call) { should eq [:ctx2, text] }
it { should change(controller, :filter_done) } it { should change(controller, :filter_done) }
end end
context 'and data has multiple colons' do context 'and data has multiple colons' do
let(:text) { super().tr(' ', ':') } let(:text) { super().tr(' ', ':') }
its(:call) { should eq [:ctx_1, text] } its(:call) { should eq [:ctx1, text] }
end end
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::Commands do RSpec.describe Telegram::Bot::UpdatesController::Commands do
describe '#action_for_command' do describe '#action_for_command' do
subject { ->(*args) { object.action_for_command(*args) } } subject { ->(*args) { object.action_for_command(*args) } }
@@ -90,11 +88,11 @@ RSpec.describe Telegram::Bot::UpdatesController::Commands do
context 'with command' do context 'with command' do
let(:text) { "/test#{"@#{mention}" if mention} arg 1 2" } let(:text) { "/test#{"@#{mention}" if mention} arg 1 2" }
let(:mention) {} 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 context 'with mention' do
let(:mention) { bot.username } 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 end
context 'with mention for other bot' do context 'with mention for other bot' do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::Instrumentation do RSpec.describe Telegram::Bot::UpdatesController::Instrumentation do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::MessageContext do RSpec.describe Telegram::Bot::UpdatesController::MessageContext do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:controller_class) do let(:controller_class) do
@@ -8,13 +6,11 @@ RSpec.describe Telegram::Bot::UpdatesController::MessageContext do
include described_class include described_class
attr_accessor :filter_done attr_accessor :filter_done
before_action only: :context_with_filter do before_action only: :context_with_filter do
self.filter_done = true self.filter_done = true
end end
attr_reader :callbacks_runs attr_reader :callbacks_runs
before_action { @callbacks_runs = (@callbacks_runs || 0) + 1 } before_action { @callbacks_runs = (@callbacks_runs || 0) + 1 }
def message(*args) def message(*args)

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController do RSpec.describe Telegram::Bot::UpdatesController do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:params) { {arg: 1, 'other_arg' => 2} } let(:params) { {arg: 1, 'other_arg' => 2} }
@@ -40,7 +38,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
end end
context 'when update is not set' do 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 it 'sets chat_id' do
expect(bot).to receive("send_#{respond_type}"). expect(bot).to receive("send_#{respond_type}").
with(params.merge(chat_id: chat[:id])) { result } with(params.merge(chat_id: chat[:id])) { result }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::Rescue do RSpec.describe Telegram::Bot::UpdatesController::Rescue do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::Session do RSpec.describe Telegram::Bot::UpdatesController::Session do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:controller_class) do let(:controller_class) do

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
require 'action_dispatch' require 'action_dispatch'
RSpec.describe Telegram::Bot::UpdatesController::Testing do RSpec.describe Telegram::Bot::UpdatesController::Testing do
@@ -45,7 +43,7 @@ RSpec.describe Telegram::Bot::UpdatesController::Testing do
context 'when webhook_request is given' do context 'when webhook_request is given' do
it 'passes it to controller' do it 'passes it to controller' do
webhook_request = ActionDispatch::Request.new({}) webhook_request = ::ActionDispatch::Request.new({})
dispatch(update, bot, webhook_request) dispatch(update, bot, webhook_request)
expect(controller.webhook_request).to eq webhook_request expect(controller.webhook_request).to eq webhook_request
end end

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::Translation do RSpec.describe Telegram::Bot::UpdatesController::Translation do
def self.stub_translations(translations) def self.stub_translations(translations)
around do |ex| around do |ex|

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:controller_class) do let(:controller_class) do
@@ -18,18 +16,6 @@ RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do
my_chat_member my_chat_member
chat_member chat_member
chat_join_request chat_join_request
# TODO: remove when added to telegram-bot-types
business_connection
business_message
edited_business_message
deleted_business_messages
message_reaction
message_reaction_count
chat_boost
removed_chat_boost
purchased_paid_media
pre_checkout_query
]). ]).
map { |x| [x, Telegram::Bot::Types.const_get(x.camelize)] }.to_h. map { |x| [x, Telegram::Bot::Types.const_get(x.camelize)] }.to_h.
merge( merge(

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesController do RSpec.describe Telegram::Bot::UpdatesController do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
@@ -7,7 +5,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
subject { controller.action_for_payload } subject { controller.action_for_payload }
def stub_payload(*fields) def stub_payload(*fields)
fields.map { |x| [x, double(x)] }.to_h Hash[fields.map { |x| [x, double(x)] }]
end end
context 'when payload is inline_query' do context 'when payload is inline_query' do
@@ -49,7 +47,6 @@ RSpec.describe Telegram::Bot::UpdatesController do
callback_query callback_query
poll_answer poll_answer
chat_join_request chat_join_request
pre_checkout_query
] ]
(described_class::PAYLOAD_TYPES - custom_payload_types).each do |type| (described_class::PAYLOAD_TYPES - custom_payload_types).each do |type|
context "when payload is #{type}" do context "when payload is #{type}" do
@@ -93,7 +90,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
describe '#process' do describe '#process' do
subject { -> { controller.process(:action, *args) } } subject { -> { controller.process(:action, *args) } }
let(:args) { %i[arg_1 arg_2] } let(:args) { %i[arg1 arg2] }
let(:controller_class) do let(:controller_class) do
Class.new(described_class) do Class.new(described_class) do
attr_reader :acted, :hooked attr_reader :acted, :hooked
@@ -201,7 +198,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
end end
context 'when options hash is given' do 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 with_reinitialize do
its(:bot) { should eq bot } its(:bot) { should eq bot }
its(:update) { should eq nil } its(:update) { should eq nil }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot::UpdatesPoller do RSpec.describe Telegram::Bot::UpdatesPoller do
let(:instance) { described_class.new(bot, controller) } let(:instance) { described_class.new(bot, controller) }
let(:bot) { Telegram::Bot::Client.new('token') } let(:bot) { Telegram::Bot::Client.new('token') }

Просмотреть файл

@@ -1,5 +1,3 @@
# frozen_string_literal: true
RSpec.describe Telegram::Bot do RSpec.describe Telegram::Bot do
it 'has a version number' do it 'has a version number' do
expect(described_class::VERSION).not_to be nil expect(described_class::VERSION).not_to be nil

Просмотреть файл

@@ -1,6 +1,4 @@
# frozen_string_literal: true lib = File.expand_path('../lib', __FILE__)
lib = File.expand_path('lib', __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'telegram/bot/version' require 'telegram/bot/version'
@@ -14,10 +12,6 @@ Gem::Specification.new do |spec|
spec.homepage = 'https://github.com/telegram-bot-rb/telegram-bot' spec.homepage = 'https://github.com/telegram-bot-rb/telegram-bot'
spec.license = 'MIT' spec.license = 'MIT'
spec.metadata = {
'rubygems_mfa_required' => 'true',
}
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) } spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
spec.bindir = 'exe' spec.bindir = 'exe'
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -25,8 +19,8 @@ Gem::Specification.new do |spec|
spec.required_ruby_version = '>= 2.4' spec.required_ruby_version = '>= 2.4'
spec.add_dependency 'actionpack', '>= 4.0', '< 8.1' spec.add_dependency 'actionpack', '>= 4.0', '< 7.2'
spec.add_dependency 'activesupport', '>= 4.0', '< 8.1' spec.add_dependency 'activesupport', '>= 4.0', '< 7.2'
spec.add_dependency 'httpclient', '~> 2.7' spec.add_dependency 'httpclient', '~> 2.7'
spec.add_development_dependency 'bundler', '> 1.16' spec.add_development_dependency 'bundler', '> 1.16'