telegram_bot_middleware 0.3.1 → 0.3.2
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 +4 -4
- data/.travis.yml +2 -1
- data/Gemfile.lock +29 -3
- data/README.md +6 -0
- data/lib/telegram_bot_middleware.rb +79 -73
- data/lib/telegram_bot_middleware/version.rb +1 -1
- data/spec/spec_helper.rb +5 -0
- data/spec/telegram_bot_middleware_spec.rb +39 -0
- data/telegram_bot_middleware.gemspec +4 -1
- metadata +35 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e64e5b8be07193b800fce0ed89221089356e346e
|
4
|
+
data.tar.gz: 64ce2fa555fcd5126a447b8aba38cabed1f796fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebe6680804b864eec96966a784c75107d99537dfae53cb0b11b55f67795d80a7dcb8b059d7d5fc64559325cca4f80811f53b311399dcff8c82e186be918be7d9
|
7
|
+
data.tar.gz: d71a1d3d656e25befab1663a17e0a23527dd6ae5bd62c5e5ca41eb2f60cc57031378eca4e9a472cb11b475393619df36cc5d2c8a7b85b31e2f14698247fc299a
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,26 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
telegram_bot_middleware (0.
|
4
|
+
telegram_bot_middleware (0.3.1)
|
5
5
|
httmultiparty
|
6
6
|
http
|
7
7
|
persistent_httparty
|
8
|
+
rack
|
8
9
|
rake (~> 10.0)
|
9
10
|
|
10
11
|
GEM
|
11
12
|
remote: https://rubygems.org/
|
12
13
|
specs:
|
13
14
|
addressable (2.3.8)
|
15
|
+
coveralls (0.8.9)
|
16
|
+
json (~> 1.8)
|
17
|
+
rest-client (>= 1.6.8, < 2)
|
18
|
+
simplecov (~> 0.10.0)
|
19
|
+
term-ansicolor (~> 1.3)
|
20
|
+
thor (~> 0.19.1)
|
21
|
+
tins (~> 1.6.0)
|
14
22
|
diff-lcs (1.2.5)
|
23
|
+
docile (1.1.5)
|
15
24
|
domain_name (0.5.25)
|
16
25
|
unf (>= 0.0.5, < 1.0.0)
|
17
26
|
gene_pool (1.4.1)
|
@@ -33,20 +42,27 @@ GEM
|
|
33
42
|
json (~> 1.8)
|
34
43
|
multi_xml (>= 0.5.2)
|
35
44
|
json (1.8.3)
|
45
|
+
mime-types (2.99)
|
36
46
|
mimemagic (0.3.0)
|
37
47
|
multi_xml (0.5.5)
|
38
48
|
multipart-post (2.0.0)
|
49
|
+
netrc (0.11.0)
|
39
50
|
persistent_http (1.0.6)
|
40
51
|
gene_pool (>= 1.3)
|
41
52
|
persistent_httparty (0.1.2)
|
42
53
|
httparty (~> 0.9)
|
43
54
|
persistent_http (< 2)
|
55
|
+
rack (1.6.4)
|
44
56
|
rake (10.4.2)
|
57
|
+
rest-client (1.8.0)
|
58
|
+
http-cookie (>= 1.0.2, < 2.0)
|
59
|
+
mime-types (>= 1.16, < 3.0)
|
60
|
+
netrc (~> 0.7)
|
45
61
|
rspec (3.4.0)
|
46
62
|
rspec-core (~> 3.4.0)
|
47
63
|
rspec-expectations (~> 3.4.0)
|
48
64
|
rspec-mocks (~> 3.4.0)
|
49
|
-
rspec-core (3.4.
|
65
|
+
rspec-core (3.4.1)
|
50
66
|
rspec-support (~> 3.4.0)
|
51
67
|
rspec-expectations (3.4.0)
|
52
68
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -54,8 +70,17 @@ GEM
|
|
54
70
|
rspec-mocks (3.4.0)
|
55
71
|
diff-lcs (>= 1.2.0, < 2.0)
|
56
72
|
rspec-support (~> 3.4.0)
|
57
|
-
rspec-support (3.4.
|
73
|
+
rspec-support (3.4.1)
|
74
|
+
simplecov (0.10.0)
|
75
|
+
docile (~> 1.1.0)
|
76
|
+
json (~> 1.8)
|
77
|
+
simplecov-html (~> 0.10.0)
|
78
|
+
simplecov-html (0.10.0)
|
79
|
+
term-ansicolor (1.3.2)
|
80
|
+
tins (~> 1.0)
|
81
|
+
thor (0.19.1)
|
58
82
|
thread_safe (0.3.5)
|
83
|
+
tins (1.6.0)
|
59
84
|
unf (0.1.4)
|
60
85
|
unf_ext
|
61
86
|
unf_ext (0.0.7.1)
|
@@ -65,6 +90,7 @@ PLATFORMS
|
|
65
90
|
|
66
91
|
DEPENDENCIES
|
67
92
|
bundler (~> 1.10)
|
93
|
+
coveralls
|
68
94
|
rspec
|
69
95
|
telegram_bot_middleware!
|
70
96
|
|
data/README.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
[](https://travis-ci.org/MirkoMignini/telegram_bot_middleware)
|
2
|
+
[](https://coveralls.io/github/MirkoMignini/telegram_bot_middleware?branch=master)
|
3
|
+
[](https://codeclimate.com/github/MirkoMignini/telegram_bot_middleware)
|
4
|
+
[](https://gemnasium.com/MirkoMignini/telegram_bot_middleware)
|
5
|
+
[](https://badge.fury.io/rb/telegram_bot_middleware)
|
6
|
+
|
1
7
|
# Telegram Bot Middleware
|
2
8
|
|
3
9
|
Rack middleware to communicate with a telegram bot.
|
@@ -10,23 +10,27 @@ class TelegramBotMiddleware
|
|
10
10
|
include HTTMultiParty
|
11
11
|
base_uri 'https://api.telegram.org'
|
12
12
|
|
13
|
-
def initialize(app, &
|
13
|
+
def initialize(app, &_block)
|
14
14
|
# save the app var
|
15
15
|
@app = app
|
16
16
|
|
17
17
|
# local cookies hash
|
18
18
|
@cookies = Hash.new
|
19
19
|
|
20
|
-
@env = nil
|
21
|
-
|
22
20
|
# create the config and populate passing do the block function
|
23
21
|
@config = OpenStruct.new
|
24
22
|
yield(@config) if block_given?
|
25
23
|
|
24
|
+
# validate required input params
|
25
|
+
raise ArgumentError.new("Config error: host can't be null || empty.") if @config.host.nil? || @config.host.empty?
|
26
|
+
raise ArgumentError.new("Config error: token can't be null || empty.") if @config.token.nil? || @config.token.empty?
|
27
|
+
|
28
|
+
# initialize persistent connection to telegram
|
26
29
|
self.class.persistent_connection_adapter pool_size: (@config.connection_pool_size || 2),
|
27
30
|
keep_alive: (@config.connection_keep_alive || 30),
|
28
31
|
force_retry: (@config.connection_force_retry || true)
|
29
32
|
|
33
|
+
# if get_updates is empty set to :polling by default
|
30
34
|
@config.get_updates ||= :polling
|
31
35
|
|
32
36
|
# setup webhook
|
@@ -41,18 +45,18 @@ class TelegramBotMiddleware
|
|
41
45
|
# setup polling
|
42
46
|
when :polling
|
43
47
|
# clear the webhook in case was set in the past
|
44
|
-
|
48
|
+
send_to_telegram('setWebhook', {url: ''})
|
45
49
|
|
46
50
|
# setup a thread with get_updates function
|
47
51
|
start_get_updates_thread
|
48
52
|
|
49
53
|
# setup webhook
|
50
54
|
when :webhook
|
51
|
-
|
55
|
+
send_to_telegram('setWebhook', {url: @config.webhook})
|
52
56
|
|
53
57
|
# in this case get_updates is a non valid value
|
54
58
|
else
|
55
|
-
raise ArgumentError.new('Config error: get_updates must be :webhook
|
59
|
+
raise ArgumentError.new('Config error: get_updates must be :webhook || :polling.')
|
56
60
|
end
|
57
61
|
end
|
58
62
|
|
@@ -66,7 +70,7 @@ class TelegramBotMiddleware
|
|
66
70
|
# loop forever
|
67
71
|
loop do
|
68
72
|
# call the getUpdates telegram function
|
69
|
-
response =
|
73
|
+
response = send_to_telegram('getUpdates', {offset: @offset})
|
70
74
|
# enumerate the results
|
71
75
|
response.to_hash['result'].each do |data|
|
72
76
|
# create an update message from the post data
|
@@ -85,58 +89,37 @@ class TelegramBotMiddleware
|
|
85
89
|
dup._call(env)
|
86
90
|
end
|
87
91
|
|
88
|
-
def _call(env)
|
89
|
-
@env = env
|
90
|
-
|
92
|
+
def _call(env)
|
91
93
|
# retrieve the request object
|
92
|
-
|
94
|
+
request = Rack::Request.new(env)
|
93
95
|
|
94
96
|
# if the request is a post to bot webhhok
|
95
|
-
if
|
97
|
+
if request.post? and request.path == "/#{@config.token}"
|
96
98
|
|
97
99
|
# in case someone already read it
|
98
|
-
|
100
|
+
request.body.rewind
|
99
101
|
# build an openstruct based on post params
|
100
|
-
params = OpenStruct.from_json(
|
102
|
+
params = OpenStruct.from_json(request.body.read)
|
101
103
|
|
102
104
|
log_debug("Message from chat: #{params}")
|
103
|
-
|
104
|
-
path = nil
|
105
|
-
unless params.message['text'].nil?
|
106
|
-
# build path based on message
|
107
|
-
# - get only message part of post params
|
108
|
-
# - remove empty chars from beginning or end (strip)
|
109
|
-
# - replace first sequence of spaces with /
|
110
|
-
# - encode as uri
|
111
|
-
path = URI.escape(params.message.text.strip.sub(/\s+/, '/'))
|
112
|
-
# - add first / if not present
|
113
|
-
path = "/#{path}" unless path.start_with?('/')
|
114
|
-
else
|
115
|
-
%w(audio document photo sticker video voice contact location new_chat_participant left_chat_participant new_chat_title new_chat_photo delete_chat_photo group_chat_created).each do |type|
|
116
|
-
unless params.message[type].nil?
|
117
|
-
path = "/#{type}"
|
118
|
-
break
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
105
|
|
123
|
-
# build
|
124
|
-
|
106
|
+
# build command based on message
|
107
|
+
command = get_command(params)
|
125
108
|
|
126
109
|
# transform the POST in GET
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
110
|
+
env['PATH_INFO'] = command
|
111
|
+
env['QUERY_STRING'] = Rack::Utils.build_nested_query(params.message.to_h_nested)
|
112
|
+
env['REQUEST_METHOD'] = 'GET'
|
113
|
+
env['REQUEST_URI'] = "https://#{request.host}#{command}"
|
131
114
|
|
132
115
|
# if in cache a cookie for this chat was present add to the header
|
133
|
-
|
116
|
+
env['HTTP_COOKIE'] = @cookies[params.message.chat.id] if @cookies.include?(params.message.chat.id)
|
134
117
|
|
135
118
|
# call the rack stack
|
136
|
-
status, headers, body = @app.call(
|
119
|
+
status, headers, body = @app.call(env)
|
137
120
|
|
138
121
|
# try to send to telegram only if no errors
|
139
|
-
if status == 200
|
122
|
+
if status == 200 || status == '200'
|
140
123
|
|
141
124
|
# if the call setted a cookie save to local cache
|
142
125
|
@cookies[params.message.chat.id] = headers['Set-Cookie'] if headers.include?('Set-Cookie')
|
@@ -152,19 +135,19 @@ class TelegramBotMiddleware
|
|
152
135
|
#TODO: add better json parsing to support symbols too
|
153
136
|
process_hash_message(JSON.parse(data.gsub('=>', ':')), params)
|
154
137
|
rescue
|
155
|
-
|
138
|
+
send_to_telegram('sendMessage', {chat_id: params.message.chat.id, text: data})
|
156
139
|
end
|
157
140
|
end
|
158
141
|
end
|
159
142
|
|
160
143
|
when /(^image\/)/
|
161
|
-
|
144
|
+
send_to_telegram('sendPhoto', {chat_id: params.message.chat.id, photo: File.new(body)})
|
162
145
|
|
163
146
|
when /(^audio\/)/
|
164
|
-
|
147
|
+
send_to_telegram('sendAudio', {chat_id: params.message.chat.id, audio: File.new(body)})
|
165
148
|
|
166
149
|
when /(^video\/)/
|
167
|
-
|
150
|
+
send_to_telegram('sendVideo', {chat_id: params.message.chat.id, video: File.new(body)})
|
168
151
|
end
|
169
152
|
end
|
170
153
|
|
@@ -176,7 +159,28 @@ class TelegramBotMiddleware
|
|
176
159
|
end
|
177
160
|
end
|
178
161
|
|
179
|
-
|
162
|
+
# build command based on message
|
163
|
+
def get_command(params)
|
164
|
+
unless params.message['text'].nil?
|
165
|
+
# build path based on message
|
166
|
+
# - get only message part of post params
|
167
|
+
# - remove empty chars from beginning || end (strip)
|
168
|
+
# - replace first sequence of spaces with /
|
169
|
+
# - encode as uri
|
170
|
+
command = URI.escape(params.message.text.strip.sub(/\s+/, '/'))
|
171
|
+
# - add first / if not present
|
172
|
+
command = "/#{command}" unless command.start_with?('/')
|
173
|
+
return command
|
174
|
+
else
|
175
|
+
%w(audio document photo sticker video voice contact location new_chat_participant left_chat_participant new_chat_title new_chat_photo delete_chat_photo group_chat_created).each do |type|
|
176
|
+
unless params.message[type].nil?
|
177
|
+
return "/#{type}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def process_hash_message(message, params)
|
180
184
|
if (message.include?(:multiple) && message[:multiple].is_a?(Array))
|
181
185
|
message[:multiple].each { |item| process_json_message(item, params) }
|
182
186
|
elsif (message.include?('multiple') && message['multiple'].is_a?(Array))
|
@@ -187,28 +191,35 @@ class TelegramBotMiddleware
|
|
187
191
|
end
|
188
192
|
|
189
193
|
def process_json_message(message, params)
|
190
|
-
message[:chat_id] = params.message.chat.id unless message.include?(:chat_id)
|
194
|
+
message[:chat_id] = params.message.chat.id unless message.include?(:chat_id) || message.include?('chat_id')
|
191
195
|
|
192
|
-
|
193
|
-
|
196
|
+
['reply_markup', :reply_markup].each do |item|
|
197
|
+
message[item] = message[item].to_json if message.include?(item)
|
198
|
+
end
|
194
199
|
|
195
200
|
['photo', :photo, 'audio', :audio, 'video', :video].each do |item|
|
196
201
|
message[item] = File.new(message[item]) if message.include?(item)
|
197
202
|
end
|
198
203
|
|
199
|
-
if message.include?(:text)
|
200
|
-
|
201
|
-
elsif (message.include?(:latitude) and message.include?(:longitude))
|
202
|
-
|
203
|
-
elsif message.include?(:photo)
|
204
|
-
|
205
|
-
elsif message.include?(:audio)
|
206
|
-
|
207
|
-
elsif message.include?(:video)
|
208
|
-
|
204
|
+
if message.include?(:text) || message.include?('text')
|
205
|
+
send_to_telegram('sendMessage', message)
|
206
|
+
elsif (message.include?(:latitude) and message.include?(:longitude)) || (message.include?('latitude') and message.include?('longitude'))
|
207
|
+
send_to_telegram('sendLocation', message)
|
208
|
+
elsif message.include?(:photo) || message.include?('photo')
|
209
|
+
send_to_telegram('sendPhoto', message)
|
210
|
+
elsif message.include?(:audio) || message.include?('audio')
|
211
|
+
send_to_telegram('sendAudio', message)
|
212
|
+
elsif message.include?(:video) || message.include?('video')
|
213
|
+
send_to_telegram('sendVideo', message)
|
209
214
|
else
|
210
215
|
# TODO: invalid query
|
211
|
-
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def send_to_telegram(path, query)
|
220
|
+
log_debug("Sending to chat: #{path} - #{query}")
|
221
|
+
self.class.post("/bot#{@config.token}/#{path}", query: query)
|
222
|
+
# TODO check response error and return response
|
212
223
|
end
|
213
224
|
|
214
225
|
def log_error(exception)
|
@@ -224,18 +235,13 @@ class TelegramBotMiddleware
|
|
224
235
|
log(:debug, message)
|
225
236
|
end
|
226
237
|
|
238
|
+
# TODO: to fix env
|
227
239
|
def log(level, message)
|
228
|
-
return if @env.nil?
|
229
|
-
if @env['rack.logger']
|
230
|
-
|
231
|
-
else
|
232
|
-
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
def send_to_bot(path, query)
|
237
|
-
log_debug("Sending to chat: #{path} - #{query}")
|
238
|
-
response = self.class.post("/bot#{@config.token}/#{path}", query: query)
|
239
|
-
# TODO check response error and return response
|
240
|
+
#return if @env.nil?
|
241
|
+
#if @env['rack.logger']
|
242
|
+
# @env['rack.logger'].send(level, message)
|
243
|
+
#else
|
244
|
+
# @env['rack.errors'].write(message)
|
245
|
+
#end
|
240
246
|
end
|
241
247
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TelegramBotMiddleware do
|
4
|
+
|
5
|
+
let(:app) { ->(env) { [200, env, 'app'] } }
|
6
|
+
let(:token) { '138381425:AAEXjzZx5U5wZmiKvFmHjdNMkXJqnkHnum4' }
|
7
|
+
let(:host) { 'http://127.0.0.1:9292' }
|
8
|
+
let(:middleware) {
|
9
|
+
TelegramBotMiddleware.new(app) { |config|
|
10
|
+
config.token = token
|
11
|
+
config.host = host
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
def init_middleware(&block)
|
16
|
+
TelegramBotMiddleware.new(app, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'Preliminary checks' do
|
20
|
+
it 'has a version number' do
|
21
|
+
expect(TelegramBotMiddleware::VERSION).not_to be nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'Configuration not valid' do
|
26
|
+
it 'raise ArgumentError if token is null' do expect { init_middleware { |config| config.token = nil } }.to raise_error(ArgumentError) end
|
27
|
+
it 'raise ArgumentError if token is empty' do expect { init_middleware { |config| config.token = '' } }.to raise_error(ArgumentError) end
|
28
|
+
it 'raise ArgumentError if host is null' do expect { init_middleware { |config| config.token = token; config.host = nil } }.to raise_error(ArgumentError) end
|
29
|
+
it 'raise ArgumentError if host is empty' do expect { init_middleware { |config| config.token = token; config.host = '' } }.to raise_error(ArgumentError) end
|
30
|
+
it 'raise ArgumentError if get_updates is not valid' do expect { init_middleware { |config| config.token = token; config.host = host; config.get_updates = :not_valid } }.to raise_error(ArgumentError) end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'Configuration valid' do
|
34
|
+
it 'initialize with correct parameters' do
|
35
|
+
expect(middleware).to_not be nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -13,15 +13,18 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = 'https://github.com/MirkoMignini/telegram_bot_middleware'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
17
|
spec.bindir = "exe"
|
17
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
19
|
spec.require_paths = ["lib"]
|
19
20
|
|
20
21
|
spec.add_dependency 'rake', '~> 10.0'
|
22
|
+
spec.add_dependency 'rack'
|
21
23
|
spec.add_dependency 'http'
|
22
24
|
spec.add_dependency 'httmultiparty'
|
23
25
|
spec.add_dependency 'persistent_httparty'
|
24
26
|
|
25
27
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
26
28
|
spec.add_development_dependency 'rspec'
|
27
|
-
|
29
|
+
spec.add_development_dependency 'coveralls'
|
30
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: telegram_bot_middleware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mirko Mignini
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '10.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: http
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,20 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: coveralls
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
description:
|
98
126
|
email:
|
99
127
|
- mirko.mignini@gmail.com
|
@@ -123,6 +151,8 @@ files:
|
|
123
151
|
- lib/ostruct_nested.rb
|
124
152
|
- lib/telegram_bot_middleware.rb
|
125
153
|
- lib/telegram_bot_middleware/version.rb
|
154
|
+
- spec/spec_helper.rb
|
155
|
+
- spec/telegram_bot_middleware_spec.rb
|
126
156
|
- telegram_bot_middleware.gemspec
|
127
157
|
homepage: https://github.com/MirkoMignini/telegram_bot_middleware
|
128
158
|
licenses:
|
@@ -148,4 +178,6 @@ rubygems_version: 2.2.2
|
|
148
178
|
signing_key:
|
149
179
|
specification_version: 4
|
150
180
|
summary: Rack middleware to communicate with a telegram bot.
|
151
|
-
test_files:
|
181
|
+
test_files:
|
182
|
+
- spec/spec_helper.rb
|
183
|
+
- spec/telegram_bot_middleware_spec.rb
|