telegram_workflow 1.2.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c96cb2e0a64ca84710249746fba7e205101fa03d3708f154e7b9532133c550f6
4
- data.tar.gz: edf5c725fb5100eea709c375657026cc80d3e16075de537422f55604dea150b7
3
+ metadata.gz: 2fd629dee17a8e0caa932b91ad3cdccda3eba9e2cbd33dd15c57f38fcbb9aca7
4
+ data.tar.gz: e6ae112b2d49d6e9539549254605cc1ee8a5c57ac1421335195b531dd5ebde12
5
5
  SHA512:
6
- metadata.gz: fb13268c4f33b5add25b82ccc628199aaec2571e57e8731f88b417c5727bb9c9d7639d860a7f6ef9af09110ba12a39db5c4d2ebbd777ea40e2f54c39d0d893ae
7
- data.tar.gz: 5cdeb13d1098f17784dfdca787e2f73a0c8d8ee6cd704d42c5894b3de4b714b2cf1118ffbcd2f3391aa0e977b8a1c7806b3b3f606cf51e85e3df6074b6a61204
6
+ metadata.gz: '058ad9c7866ccd36ae2f5adc9a8c52c51364ecb84e1d0c3f7d39fd514f3868ba50745ff384485ab541988bbb87a1a725691c06d28b28f121cb7dfd36bfb8f3bb'
7
+ data.tar.gz: a5f3dc285f8fa706be2f9fad08d3cc192e6e90c256204e01befdce1ed547d9400de1a5e132cc750adbf369f18b064e019368df0b352836cc7bb3ecc23fd57b82
@@ -0,0 +1,41 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ test:
7
+
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ matrix:
11
+ ruby-version: ['2.4', '2.5', '2.6', '2.7']
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Install packages
16
+ run: |
17
+ sudo apt update -qy
18
+ sudo apt install libdb-dev
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby-version }}
23
+ bundler-cache: true
24
+ - name: Run tests
25
+ run: bundle exec rake
26
+ - name: Coveralls Parallel
27
+ uses: coverallsapp/github-action@master
28
+ with:
29
+ github-token: ${{ secrets.github_token }}
30
+ flag-name: run-${{ matrix.ruby-version }}
31
+ parallel: true
32
+
33
+ finish:
34
+ needs: test
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - name: Coveralls Finished
38
+ uses: coverallsapp/github-action@master
39
+ with:
40
+ github-token: ${{ secrets.github_token }}
41
+ parallel-finished: true
data/.gitignore CHANGED
@@ -7,6 +7,7 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  Gemfile.lock
10
+ *.db
10
11
 
11
12
  # rspec failure tracking
12
13
  .rspec_status
data/Gemfile CHANGED
@@ -7,5 +7,7 @@ gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
8
 
9
9
  group :test do
10
- gem "coveralls", require: false
10
+ gem "simplecov"
11
+ gem "simplecov-lcov", "~> 0.8.0"
12
+ gem "dbm"
11
13
  end
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TelegramWorkflow
2
2
 
3
- [![Build Status](https://travis-ci.org/rsamoilov/telegram_workflow.svg?branch=master)](https://travis-ci.org/rsamoilov/telegram_workflow)
3
+ ![Build Status](https://github.com/rsamoilov/telegram_workflow/actions/workflows/ruby.yml/badge.svg)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/rsamoilov/telegram_workflow/badge.svg?branch=master)](https://coveralls.io/github/rsamoilov/telegram_workflow?branch=master)
5
5
  [![Maintainability](https://api.codeclimate.com/v1/badges/fd13239262e3550c2193/maintainability)](https://codeclimate.com/github/rsamoilov/telegram_workflow/maintainability)
6
6
 
@@ -110,276 +110,13 @@ end
110
110
  Here you can see an example of redirection to another action.
111
111
  Having a bot logic split over such small actions improves code maintanability and allows to follow SRP.
112
112
 
113
- ## Global Objects
113
+ ## Documentation
114
114
 
115
- Each action has a set of globally accessible objects:
115
+ Please see the [TelegramWorkflow wiki](https://github.com/rsamoilov/telegram_workflow/wiki) for more detailed documentation.
116
116
 
117
- Object | Description
118
- -------|------------
119
- [params](README.md#params) | Instance of `TelegramWorkflow::Params`.
120
- [client](README.md#client) | Instance of `TelegramWorkflow::Client`. Can be [customized](README.md#client-customization).
121
- [session](README.md#session) | Persistent store to keep session data. Instance of `Hash`.
122
- [flash](README.md#flash) | Temporary store to keep some data between different steps. Instance of `Hash`.
117
+ ## Example
123
118
 
124
- ## Public API
125
-
126
- ### params
127
-
128
- The `params` object encapsulates the logic to parse Telegram params.
129
- It implements useful methods, like `message_text`, `callback_data` or `deep_link_payload` to fetch user submitted data from the params.
130
-
131
- ### client
132
-
133
- This is an instance of `TelegramWorkflow::Client` class, which implements a complete Telegram Bot API.
134
- The methods to access the API are called after raw Telegram API methods.
135
- For example, if you needed to call a [sendLocation](https://core.telegram.org/bots/api#sendlocation) method, you would use the following code:
136
-
137
- ```ruby
138
- client.send_location latitude: 40.748, longitude: -73.985, live_period: 120
139
- ```
140
-
141
- `chat_id` parameter should be omitted.
142
-
143
- ### session
144
-
145
- This is a persistent store to save the data associated with a user, e.g. current user's id, some settings or anything you would store in a session in a regular web application.
146
-
147
- ### flash
148
-
149
- This is a temporary store to save the data between the steps. The data persists while redirecting between the steps, but **gets deleted automatically when redirecting to another action**.
150
-
151
- ### redirect_to(action_or_class, flash_params = {})
152
-
153
- As you already know, this function allows to build complex workflows by redirecting between actions and steps.
154
- The function expects either a symbol or instance of `Class` as a first argument. Passing a symbol will redirect to another step inside the current action. Passing instance of `Class` will redirect to another action.
155
-
156
- ```ruby
157
- # redirect to a step
158
- redirect_to :suggest
159
-
160
- # redirect to an action
161
- redirect_to RateMovie
162
- ```
163
-
164
- Sometimes you will need to share some data between the actions. You could use `session` for this, but a more appropriate solution would be to have `redirect_to` function to preserve the flash between actions.
165
- Check out this example:
166
-
167
- ```ruby
168
- class AskForBirthday < TelegramWorkflow::Action
169
- def initial
170
- on_redirect do
171
- client.send_message text: "What year is your birthday?"
172
- end
173
-
174
- on_message do
175
- birthday = params.message_text.to_i
176
- redirect_to DisplayAge, birthday: birthday
177
- end
178
- end
179
- end
180
-
181
- class DisplayAge < TelegramWorkflow::Action
182
- def initial
183
- on_redirect do
184
- age = Date.today.year - flash[:birthday]
185
- client.send_message text: "You are #{age}!"
186
- end
187
- end
188
- end
189
- ```
190
-
191
- You can see that despite the fact that flash is being cleared when redirecting to another action, passing `birthday` value to the `redirect_to` call made it accessible via flash in the action we redirected to.
192
-
193
- ## Configuration
194
-
195
- Configure the gem using the `TelegramWorkflow.configure` call.
196
- The two required parameters are `start_action` and `api_token`.
197
-
198
- ```ruby
199
- TelegramWorkflow.configure do |config|
200
- config.start_action = <Start Action Class>
201
- config.api_token = <Your Token>
202
- end
203
- ```
204
-
205
- Method | Default | Description
206
- -------|---------|------------
207
- api_token | | This is the token you get from `@botfather` to access the Telegram API.
208
- start_action | | This is an entry-point action, which is called every time `/start` or `/startgroup` command is sent to the chat. You cannnot redirect to this action or call it manually. Use it to set the things up, e.g. create a user record or store current user's id in the session.
209
- session_store | `Rails.cache` or `InMemoryStore.new` | This is the session store. Default implementation stores session in memory, which means it will be reset after server shutdown. Can be [customized](README.md#customization). Use `TelegramWorkflow::Stores::File` for persistent file store.
210
- logger | `Rails.logger` or `STDOUT` | Logger object. Can be [customized](README.md#customization).
211
- client | `TelegramWorkflow::Client` | The object which implements Telegram API. Can be [customized](README.md#client-customization).
212
- webhook_url | nil | The webhook url. Set it only if you are using webhooks for getting updates. TelegramWorkflow will create a webhook subscription automatically.
213
-
214
- ## Updates
215
-
216
- The gem implements both methods of getting updates from the Telegram API.
217
-
218
- ### Webhooks
219
-
220
- * Configure the gem with `webhook_url` value.
221
- * Process the updates with the following code in your controller:
222
-
223
- ```ruby
224
- class TelegramWebhooksController < ApplicationController
225
- def create
226
- TelegramWorkflow.process(params)
227
- end
228
- end
229
- ```
230
-
231
- ### Long polling
232
-
233
- * Make sure you don't configure the gem with `webhook_url` value.
234
- * Run the following code:
235
-
236
- ```ruby
237
- TelegramWorkflow.updates.each do |params|
238
- TelegramWorkflow.process(params)
239
- end
240
- ```
241
-
242
- Be aware that `TelegramWorkflow.updates.each` call is blocking.
243
-
244
- `TelegramWorkflow` accepts all the parameters [getUpdates](https://core.telegram.org/bots/api#getupdates) does.
245
-
246
- ```ruby
247
- TelegramWorkflow.updates(timeout: 60, allowed_updates: %w(channel_post edited_channel_post)).each do |params|
248
- ...
249
- end
250
- ```
251
-
252
- Since most of the time will be spent on waiting for the Telegram API to respond, you might also want to process the updates in parallel:
253
-
254
- ```ruby
255
- require "concurrent-ruby"
256
-
257
- pool = Concurrent::CachedThreadPool.new
258
-
259
- TelegramWorkflow.updates.each do |params|
260
- pool.post { TelegramWorkflow.process(params) }
261
- end
262
- ```
263
-
264
- Use `stop_updates` call to exit the updates loop:
265
-
266
- ```ruby
267
- trap "SIGINT" do
268
- TelegramWorkflow.stop_updates
269
- end
270
-
271
- # decrease the timeout to wait no more than 10 seconds when exiting
272
- TelegramWorkflow.updates(timeout: 10).each do |params|
273
- TelegramWorkflow.process(params)
274
- end
275
-
276
- ```
277
-
278
- ## Customization
279
-
280
- Object | Customization
281
- -------|--------------
282
- logger | An object that responds to `info` and `error` methods.
283
- session_store | An object that responds to `read` and `write` methods. Refer to [InMemoryStore](lib/telegram_workflow/stores/in_memory.rb) class definition.
284
- client | An object that responds to `new(chat_id)` method.
285
-
286
- ### Client Customization
287
-
288
- Use this customization to abstract your action's code from the Telegram API implementation details.
289
-
290
- Create a customized client:
291
-
292
- ```ruby
293
- class MyClient < TelegramWorkflow::Client
294
- def send_prize_location(user)
295
- # this is an example call
296
- prize = user.find_last_prize
297
-
298
- send_venue latitude: prize.latitude,
299
- longitude: prize.longitude,
300
- address: prize.address
301
- title: "Collect the last prize here!",
302
- reply_markup: { keyboard: [[{ text: "Give me a hint" }], [{ text: "Give me anohter hint" }]] }
303
- end
304
- end
305
- ```
306
-
307
- Now, configure the gem to use the customized client:
308
-
309
- ```ruby
310
- TelegramWorkflow.configure do |config|
311
- config.client = MyClient
312
- end
313
- ```
314
-
315
- Then, in your action:
316
-
317
- ```ruby
318
- class FindPrize < TelegramWorkflow::Action
319
- def initial
320
- on_redirect do
321
- client.send_prize_location(current_user)
322
- end
323
- end
324
- end
325
- ```
326
-
327
- ## Testing
328
-
329
- Testing utility provides `send_message` helper to emulate messages sent into the chat.
330
-
331
- ```ruby
332
- # send a message
333
- send_message message_text: "text"
334
-
335
- # send CallbackQuery data
336
- send_message callback_data: "data"
337
-
338
- # send InlineQuery data
339
- send_message inline_data: "data"
340
-
341
- # customize the params
342
- send_message { |params| params[:edited_channel_post] = { text: "message" } }
343
- ```
344
-
345
- Also, `subject.client` and `subject.flow` spies are available to track redirects and calls to the API client inside your actions.
346
- Store your tests under `spec/telegram_actions` or tag them with `type: :telegram_action`.
347
-
348
- Suppose we have the following action:
349
-
350
- ```ruby
351
- class AskForBirthday < TelegramWorkflow::Action
352
- def initial
353
- on_redirect do
354
- client.send_message text: "What year is your birthday?"
355
- end
356
-
357
- on_message do
358
- Birthday.create! date: params.message_text
359
- redirect_to DisplayAge
360
- end
361
- end
362
- end
363
- ```
364
-
365
- Now, let's add some tests for this action:
366
-
367
- ```ruby
368
- require "telegram_workflow/rspec"
369
-
370
- RSpec.describe AskForBirthday, type: :telegram_action do
371
- it "asks for user's birthday" do
372
- expect(subject.client).to have_received(:send_message).with(text: "What year is your birthday?")
373
- expect {
374
- send_message message_text: "10/10/2000"
375
- }.to change { Birthday.count }.by(1)
376
-
377
- expect(subject.flow).to have_received(:redirect_to).with(DisplayAge)
378
- end
379
- end
380
- ```
381
-
382
- As you can see, testing utility starts the flow automatically, calling `initial` step on `described_class`.
119
+ Check out an example of a bot under [example](example) folder.
383
120
 
384
121
  ## Development
385
122
 
@@ -33,11 +33,12 @@ require "telegram_workflow/session"
33
33
  require "telegram_workflow/version"
34
34
  require "telegram_workflow/updates"
35
35
  require "telegram_workflow/workflow"
36
+ require "telegram_workflow/input_file"
36
37
  require "telegram_workflow/stores/in_memory"
37
38
  require "telegram_workflow/stores/file"
38
39
 
39
40
  TelegramWorkflow.__after_configuration do |config|
40
41
  if config.webhook_url
41
- TelegramWorkflow::Client.new.__setup_webhook
42
+ TelegramWorkflow::Client.new.__setup_webhook(config.webhook_url, config.webhook_params)
42
43
  end
43
44
  end
@@ -1,6 +1,6 @@
1
1
  class TelegramWorkflow::Client
2
- API_VERSION = "4.8"
3
- WebhookFilePath = Pathname.new("tmp/telegram_workflow/webhook_url.txt")
2
+ API_VERSION = "5.3"
3
+ WebhookConfigPath = Pathname.new("tmp/telegram_workflow/webhook_config.txt")
4
4
 
5
5
  AVAILABLE_ACTIONS = %i(
6
6
  getUpdates
@@ -9,6 +9,7 @@ class TelegramWorkflow::Client
9
9
  getMe
10
10
  sendMessage
11
11
  forwardMessage
12
+ copyMessage
12
13
  sendPhoto
13
14
  sendAudio
14
15
  sendDocument
@@ -28,27 +29,34 @@ class TelegramWorkflow::Client
28
29
  getUserProfilePhotos
29
30
  getFile
30
31
  kickChatMember
32
+ banChatMember
31
33
  unbanChatMember
32
34
  restrictChatMember
33
35
  promoteChatMember
34
36
  setChatAdministratorCustomTitle
35
37
  setChatPermissions
36
38
  exportChatInviteLink
39
+ createChatInviteLink
40
+ editChatInviteLink
41
+ revokeChatInviteLink
37
42
  setChatPhoto
38
43
  deleteChatPhoto
39
44
  setChatTitle
40
45
  setChatDescription
41
46
  pinChatMessage
42
47
  unpinChatMessage
48
+ unpinAllChatMessages
43
49
  leaveChat
44
50
  getChat
45
51
  getChatAdministrators
46
52
  getChatMembersCount
53
+ getChatMemberCount
47
54
  getChatMember
48
55
  setChatStickerSet
49
56
  deleteChatStickerSet
50
57
  answerCallbackQuery
51
58
  setMyCommands
59
+ deleteMyCommands
52
60
  getMyCommands
53
61
 
54
62
  editMessageText
@@ -78,59 +86,85 @@ class TelegramWorkflow::Client
78
86
  sendGame
79
87
  setGameScore
80
88
  getGameHighScores
89
+
90
+ logOut
91
+ close
81
92
  )
82
93
 
94
+ DEPRECATED_ACTIONS = {
95
+ kickChatMember: :banChatMember,
96
+ getChatMembersCount: :getChatMemberCount
97
+ }
98
+
83
99
  AVAILABLE_ACTIONS.each do |action|
84
100
  method_name = action.to_s.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
85
101
 
86
102
  define_method(method_name) do |params = {}|
87
- make_request(action, params)
103
+ if deprecated_in_favor_of = DEPRECATED_ACTIONS[action]
104
+ TelegramWorkflow.config.logger.warn "[TelegramWorkflow] #{action} action is deprecated. Use #{deprecated_in_favor_of} action instead."
105
+ end
106
+
107
+ @inline ?
108
+ save_request(action, params) :
109
+ make_request(action, params)
88
110
  end
89
111
  end
90
112
 
113
+ attr_accessor :inline, :inline_request
114
+ attr_reader :api_url
115
+
91
116
  def initialize(chat_id = nil)
92
117
  @chat_id = chat_id
93
- @webhook_url = TelegramWorkflow.config.webhook_url
94
118
  @api_url = "https://api.telegram.org/bot#{TelegramWorkflow.config.api_token}"
95
119
  end
96
120
 
97
121
  def set_webhook(params = {})
98
122
  make_request("setWebhook", params)
99
- cached_webhook_url(new_url: @webhook_url)
123
+ cached_webhook_config(params)
100
124
  end
101
125
 
102
- def delete_webhook
103
- make_request("deleteWebhook", {})
104
- cached_webhook_url(new_url: "")
126
+ def delete_webhook(params = {})
127
+ make_request("deleteWebhook", params)
128
+ cached_webhook_config(params)
105
129
  end
106
130
 
107
- def __setup_webhook
131
+ def __setup_webhook(webhook_url = TelegramWorkflow.config.webhook_url, params = {})
108
132
  TelegramWorkflow.config.logger.info "[TelegramWorkflow] Checking webhook setup..."
109
133
 
110
- if cached_webhook_url != @webhook_url
134
+ webhook_params = { url: webhook_url, allowed_updates: [], **params }
135
+
136
+ if cached_webhook_config != webhook_params
111
137
  TelegramWorkflow.config.logger.info "[TelegramWorkflow] Setting up a new webhook..."
112
- set_webhook(url: @webhook_url)
138
+ set_webhook(webhook_params)
113
139
  end
114
140
  end
115
141
 
116
142
  private
117
143
 
118
- def cached_webhook_url(new_url: nil)
119
- unless WebhookFilePath.exist?
120
- WebhookFilePath.dirname.mkpath
121
- WebhookFilePath.write("")
144
+ def cached_webhook_config(new_config = nil)
145
+ unless WebhookConfigPath.exist?
146
+ WebhookConfigPath.dirname.mkpath
147
+ WebhookConfigPath.write(Marshal.dump({}))
122
148
  end
123
149
 
124
- if new_url.nil?
125
- WebhookFilePath.read
150
+ if new_config.nil?
151
+ Marshal.load(WebhookConfigPath.read)
126
152
  else
127
- WebhookFilePath.write(new_url)
153
+ WebhookConfigPath.write(Marshal.dump(new_config))
128
154
  end
129
155
  end
130
156
 
131
- def make_request(action, params)
157
+ def save_request(action, params = {})
158
+ raise TelegramWorkflow::Errors::DoubleInlineRequest if @inline_request
159
+ @inline_request = { method: action, chat_id: @chat_id, **params }
160
+ end
161
+
162
+ def make_request(action, params = {})
163
+ has_file_params = params.any? { |_, param| param.is_a?(TelegramWorkflow::InputFile) }
164
+ request_type = has_file_params ? :form : :json
165
+
132
166
  response = ::Retryable.retryable(tries: 3, on: HTTP::ConnectionError) do
133
- ::HTTP.post("#{@api_url}/#{action}", json: { chat_id: @chat_id, **params })
167
+ ::HTTP.post("#{@api_url}/#{action}", request_type => { chat_id: @chat_id, **params })
134
168
  end
135
169
 
136
170
  if response.code != 200
@@ -21,12 +21,14 @@ module TelegramWorkflow
21
21
  end
22
22
 
23
23
  class Configuration
24
- attr_accessor :session_store, :logger, :client, :start_action, :webhook_url, :api_token
24
+ attr_accessor :session_store, :logger, :client, :start_action, :webhook_url, :api_token,
25
+ :webhook_params
25
26
 
26
27
  REQUIRED_PARAMS = %i(session_store start_action api_token)
27
28
 
28
29
  def initialize
29
30
  @client = TelegramWorkflow::Client
31
+ @webhook_params = {}
30
32
 
31
33
  if defined?(Rails)
32
34
  @session_store = Rails.cache
@@ -11,12 +11,24 @@ module TelegramWorkflow::Errors
11
11
  end
12
12
  end
13
13
 
14
+ class StartRedirect < StandardError
15
+ def initialize(msg = "You cannot redirect to a start action.")
16
+ super
17
+ end
18
+ end
19
+
14
20
  class NoSession < StandardError
15
21
  def initialize(msg = "Session could not be fetched for this update.")
16
22
  super
17
23
  end
18
24
  end
19
25
 
26
+ class DoubleInlineRequest < StandardError
27
+ def initialize(msg = "Cannot send more than one request in a row in inline mode.")
28
+ super
29
+ end
30
+ end
31
+
20
32
  class ApiError < StandardError
21
33
  end
22
34
 
@@ -0,0 +1,2 @@
1
+ class TelegramWorkflow::InputFile < HTTP::FormData::File
2
+ end
@@ -1,3 +1,3 @@
1
1
  module TelegramWorkflow
2
- VERSION = "1.2.0"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -31,11 +31,14 @@ class TelegramWorkflow::Workflow
31
31
  end
32
32
 
33
33
  @session.dump
34
+
35
+ @client.inline_request
34
36
  end
35
37
 
36
38
  def redirect_to(action_or_step, session_params = nil)
37
39
  raise TelegramWorkflow::Errors::DoubleRedirect if @redirect_to
38
40
  raise TelegramWorkflow::Errors::SharedRedirect if action_or_step == :shared
41
+ raise TelegramWorkflow::Errors::StartRedirect if action_or_step == TelegramWorkflow.config.start_action
39
42
 
40
43
  @redirect_to = action_or_step
41
44
  @session_params = session_params
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
23
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|example)/}) }
25
25
  end
26
26
  spec.bindir = "exe"
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegram_workflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Samoilov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-21 00:00:00.000000000 Z
11
+ date: 2021-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -66,15 +66,15 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 5.2.0
69
- description:
70
- email:
69
+ description:
70
+ email:
71
71
  executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
+ - ".github/workflows/ruby.yml"
75
76
  - ".gitignore"
76
77
  - ".rspec"
77
- - ".travis.yml"
78
78
  - CODE_OF_CONDUCT.md
79
79
  - Gemfile
80
80
  - LICENSE.txt
@@ -87,6 +87,7 @@ files:
87
87
  - lib/telegram_workflow/client.rb
88
88
  - lib/telegram_workflow/config.rb
89
89
  - lib/telegram_workflow/errors.rb
90
+ - lib/telegram_workflow/input_file.rb
90
91
  - lib/telegram_workflow/params.rb
91
92
  - lib/telegram_workflow/rspec.rb
92
93
  - lib/telegram_workflow/session.rb
@@ -102,7 +103,7 @@ licenses:
102
103
  metadata:
103
104
  homepage_uri: https://github.com/rsamoilov/telegram_workflow
104
105
  source_code_uri: https://github.com/rsamoilov/telegram_workflow
105
- post_install_message:
106
+ post_install_message:
106
107
  rdoc_options: []
107
108
  require_paths:
108
109
  - lib
@@ -118,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
119
  version: '0'
119
120
  requirements: []
120
121
  rubygems_version: 3.1.2
121
- signing_key:
122
+ signing_key:
122
123
  specification_version: 4
123
124
  summary: A simple library to create Telegram Bots in Ruby.
124
125
  test_files: []
data/.travis.yml DELETED
@@ -1,9 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.4.9
6
- - 2.5.7
7
- - 2.6.5
8
- - 2.7.0
9
- before_install: gem install bundler