1
0
зеркало из https://github.com/glebtv/telegram-bot.git synced 2026-09-06 02:55:50 +03:00
Этот коммит содержится в:
Max Melentiev
2018-01-05 13:18:48 +03:00
родитель 70a1ed8a8f
Коммит 45e8a7283f
5 изменённых файлов: 60 добавлений и 2 удалений

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

@@ -1,5 +1,7 @@
# Unreleased # Unreleased
- `rescue_from`.
# 0.12.4 # 0.12.4
- Fix spec helpers for callback queries. - Fix spec helpers for callback queries.

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

@@ -130,6 +130,9 @@ can represent actions as separate methods keeping source much more readable and
New instance of controller is instantiated for each update. New instance of controller is instantiated for each update.
This way every update is processed in isolation from others. This way every update is processed in isolation from others.
Bot controllers like usual rails controllers provides features like callbacks,
`rescue_from` and instrumentation.
```ruby ```ruby
class Telegram::WebhookController < Telegram::Bot::UpdatesController class Telegram::WebhookController < Telegram::Bot::UpdatesController
# use callbacks like in any other controllers # use callbacks like in any other controllers
@@ -331,7 +334,7 @@ end
# And this one is for `make_cool:%{something}` # And this one is for `make_cool:%{something}`
def make_cool_callback_query(thing = nil, *) def make_cool_callback_query(thing = nil, *)
do_it(thing) do_it(thing)
answer_callback_query("#{thing} is cool now! Like a callback query context.") answer_callback_query("#{thing} is cool now! Like a callback query context.")
end end
``` ```
@@ -360,7 +363,7 @@ There are several options to run it automatically:
- Use poller (described in the next section). - Use poller (described in the next section).
To run action without update (ex., send notifications from jobs), To run action without update (ex., send notifications from jobs),
you can call `#process` directly. In this case controller can be initialized you can call `#process` directly. In this case controller can be initialized
with `:from` and/or `:chat` options instead of `update` object: with `:from` and/or `:chat` options instead of `update` object:
```ruby ```ruby

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

@@ -57,6 +57,7 @@ module Telegram
instrumentation instrumentation
log_subscriber log_subscriber
reply_helpers reply_helpers
rescue
session session
].each { |file| require "telegram/bot/updates_controller/#{file}" } ].each { |file| require "telegram/bot/updates_controller/#{file}" }
@@ -78,6 +79,7 @@ module Telegram
end end
include AbstractController::Translation include AbstractController::Translation
include Rescue
include ReplyHelpers include ReplyHelpers
prepend Instrumentation prepend Instrumentation
extend Session::ConfigMethods extend Session::ConfigMethods

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

@@ -0,0 +1,20 @@
require 'active_support/rescuable'
module Telegram
module Bot
class UpdatesController
module Rescue
extend ActiveSupport::Concern
include ActiveSupport::Rescuable
private
def process_action(*)
super
rescue Exception => exception # rubocop:disable RescueException
rescue_with_handler(exception) || raise
end
end
end
end
end

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

@@ -0,0 +1,31 @@
RSpec.describe Telegram::Bot::UpdatesController::Rescue do
include_context 'telegram/bot/updates_controller'
describe '#process_action' do
subject { -> { dispatch_message("/#{command} x y z") } }
let(:controller_class) do
Class.new(Telegram::Bot::UpdatesController) do
rescue_from ArgumentError, with: -> { respond_with :message, text: 'Rescued' }
def rescuable(*)
raise ArgumentError, 'rescuable'
end
def not_rescuable(*)
raise 'not_rescuable'
end
end
end
context 'when exception is rescued' do
let(:command) { :rescuable }
it { should respond_with_message 'Rescued' }
end
context 'when exception is not rescued' do
let(:command) { :not_rescuable }
it { should raise_error('not_rescuable') }
end
end
end