boppers 0.0.0 → 0.0.1

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +14 -2
  3. data/README.md +282 -10
  4. data/Rakefile +1 -0
  5. data/boppers.gemspec +9 -1
  6. data/exe/boppers +1 -0
  7. data/gems.locked +98 -1
  8. data/images/boppers.png +0 -0
  9. data/images/boppers@2x.png +0 -0
  10. data/images/logo.png +0 -0
  11. data/images/logo.svg +10 -0
  12. data/lib/boppers.rb +35 -0
  13. data/lib/boppers/cli.rb +55 -0
  14. data/lib/boppers/configuration.rb +15 -0
  15. data/lib/boppers/generator/app.rb +28 -0
  16. data/lib/boppers/generator/app/Procfile +1 -0
  17. data/lib/boppers/generator/app/app.json +8 -0
  18. data/lib/boppers/generator/app/config/boppers.rb +83 -0
  19. data/lib/boppers/generator/app/gems.rb +7 -0
  20. data/lib/boppers/generator/plugin.rb +64 -0
  21. data/lib/boppers/generator/plugin/.gitignore +8 -0
  22. data/lib/boppers/generator/plugin/.rubocop.yml +116 -0
  23. data/lib/boppers/generator/plugin/.travis.yml +16 -0
  24. data/lib/boppers/generator/plugin/CODE_OF_CONDUCT.md +74 -0
  25. data/lib/boppers/generator/plugin/LICENSE.txt +21 -0
  26. data/lib/boppers/generator/plugin/README.erb +45 -0
  27. data/lib/boppers/generator/plugin/Rakefile +12 -0
  28. data/lib/boppers/generator/plugin/gems.rb +2 -0
  29. data/lib/boppers/generator/plugin/gemspec.erb +29 -0
  30. data/lib/boppers/generator/plugin/lib/entry.erb +4 -0
  31. data/lib/boppers/generator/plugin/lib/main.erb +10 -0
  32. data/lib/boppers/generator/plugin/lib/version.erb +7 -0
  33. data/lib/boppers/generator/plugin/test/test_file.erb +9 -0
  34. data/lib/boppers/generator/plugin/test/test_helper.erb +11 -0
  35. data/lib/boppers/http_client.rb +9 -0
  36. data/lib/boppers/notifier/hipchat.rb +26 -0
  37. data/lib/boppers/notifier/pushover.rb +27 -0
  38. data/lib/boppers/notifier/sendgrid.rb +40 -0
  39. data/lib/boppers/notifier/slack.rb +35 -0
  40. data/lib/boppers/notifier/stdout.rb +21 -0
  41. data/lib/boppers/notifier/telegram.rb +26 -0
  42. data/lib/boppers/notifier/twitter.rb +34 -0
  43. data/lib/boppers/runner.rb +37 -0
  44. data/lib/boppers/testing.rb +6 -0
  45. data/lib/boppers/testing/bopper_linter.rb +19 -0
  46. data/lib/boppers/testing/notifier_linter.rb +33 -0
  47. data/lib/boppers/utils.rb +11 -0
  48. data/lib/boppers/version.rb +1 -1
  49. data/setup/telegram.rb +20 -0
  50. metadata +142 -5
  51. data/Gemfile.lock +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa2ef8ad5ed1839880731b4cd5aed44c4f510853
4
- data.tar.gz: d67c2fd8bb60cd0c71c83ff8959ddf4af16c9abb
3
+ metadata.gz: 9a7813720dba24c3e0b54524fde1d85e512fded3
4
+ data.tar.gz: 3a7437f2046dc350bc2e7b5d230adbc792387247
5
5
  SHA512:
6
- metadata.gz: b18cd291c3c976b780d7404959675300bd144aeec9fc5699555adbb6a92cce74602c99df9bcc695f7451d524765f84b56dcb7d37d0409be1e748ec7bf636c2bc
7
- data.tar.gz: c82446d9745f8009ce35b5f99080622e09306a00b7e80e8c10c97c27c6d80054e6ffb6420b3faac98979d63db593957a8723ead8e5ff2a200d1cb2b053a13f15
6
+ metadata.gz: 5627c872fd83adf4815e8a3e58f80c279cb505ec59b40eaf8cfe2b5864f26d3da2d7653aa5f70286f6c6395b2860635550a0cd88fa435f90313e24dfbe3d0bb0
7
+ data.tar.gz: 8909d9fe48d32f0b2daf90b5f5ee18b7d691dc4f733248513e098858e2f252e9a828b2aaa35f54b419ea9c526ab23db0d4e4607bcec6e9238fdb597f05f392e1
@@ -1,7 +1,19 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ cache: bundler
3
4
  rvm:
4
- - 2.4.2
5
- before_install: gem install bundler
5
+ - 2.4.2
6
+ before_install:
7
+ - gem install bundler
8
+ - bundle install
9
+ before_script:
10
+ - "curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter"
11
+ - chmod +x ./cc-test-reporter
12
+ - "./cc-test-reporter before-build"
13
+ after_script:
14
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
6
15
  notifications:
7
16
  email: false
17
+ env:
18
+ global:
19
+ secure: eoCW4QzjfgDFpD8ygDYJVpm2gmq4eLvZxsgKarOeGOeh6TYGOuAZrz23TGiXy7XwRPlEd8IJf9DufqegitY8QHmrP09C9mUwlk3LbjwNFvsS0aaMKgxIkaBKzgqtaJSySXaKWzoV8wjCUk3/Ip9CNBLq/vLulOcKF4B1HuxtHUKHGHT/Uj/IJWORukFfhaaTi48d9VcizPWH15yj0w3D507sz/HEm0MaeihYHwLYpScgLlNgzFp8+TlTB1TRjf70rUW2Y480zqdxeDvHaKiQt21wyEHcSOwwNVRLXM8jUHAyAN5bEMGJ4PhVE1ehbYarK28Sm3qdUABZngXP5XVsJPJOmf0QXg/oP0RC/zh7xwYFe3rBGdKBp9Vwc3PopjcVzmxSo0mg0IzObq6Kz0lEuHqbqo3kQBdCmSscLpGjCQA9FGf7ylViaeleLd59YN98jw3Z3/dMwN97VD3IFnqDb/ZSPW8KpQmjOzEXm84NglQfodxCqEejaghKi9dHJToWJrxauyJmO6T1s3ykGowfy/PtfVwbXJaGD9OPjxlnqH8GAHGXFg+6vOsxFBRdtuJ3iX7w9ED80mOxaDFgG9o1dtnL43fudSxywrzGQXpMS97sUBUwHiAsCDcE6D8kxRCp5ki9tzKGnc18xQRlnWpUyuP13b6QzhOVZbuX23IArQc=
data/README.md CHANGED
@@ -1,15 +1,17 @@
1
- # Boppers
1
+ ![Boppers](https://github.com/fnando/boppers/raw/master/images/logo.png)
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/boppers`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Travis-CI](https://travis-ci.org/fnando/boppers.png)](https://travis-ci.org/fnando/boppers)
4
+ [![GPA](https://codeclimate.com/github/fnando/boppers/badges/gpa.svg)](https://codeclimate.com/github/fnando/boppers)
5
+ [![Test Coverage](https://codeclimate.com/github/fnando/boppers/badges/coverage.svg)](https://codeclimate.com/github/fnando/boppers)
6
+ [![Gem](https://img.shields.io/gem/v/boppers.svg)](https://rubygems.org/gems/boppers)
7
+ [![Gem](https://img.shields.io/gem/dt/boppers.svg)](https://rubygems.org/gems/boppers)
4
8
 
5
- TODO: Delete this and the text above, and describe your gem
6
-
7
- ## Installation
9
+ # Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
10
12
 
11
13
  ```ruby
12
- gem 'boppers'
14
+ gem "boppers"
13
15
  ```
14
16
 
15
17
  And then execute:
@@ -20,9 +22,279 @@ Or install it yourself as:
20
22
 
21
23
  $ gem install boppers
22
24
 
23
- ## Usage
25
+ # Usage
26
+
27
+ ## Using the CLI
28
+
29
+ To create a new app, use `boppers app [YOUR APP NAME]`. This will generate a structure so you can just configure your boppers and notifiers.
30
+
31
+ ## Boppers
32
+
33
+ A bopper is a bot. Basically is a class that responds to `#call`. For instance, a lambda.
34
+
35
+ ```ruby
36
+ Boppers.configure do |config|
37
+ config.boppers << lambda do
38
+ Boppers.notify(:clock, title: "Clock", message: "Now is #{Time.now}")
39
+ end
40
+ end
41
+ ```
42
+
43
+ By default, boppers are executed every 60 seconds. If you create a class, you can define your custom interval by creating a method `#interval`. The following example changes the interval to `15 seconds`.
44
+
45
+ ```ruby
46
+ class Clock
47
+ def call
48
+ Boppers.notify(:clock, title: "Clock", message: "Now is #{Time.now}")
49
+ end
50
+
51
+ def interval
52
+ 15
53
+ end
54
+ end
55
+
56
+ Boppers.configure do |config|
57
+ config.boppers << Clock.new
58
+ end
59
+ ```
60
+
61
+ The `Boppers.notify` method expects a event name (the recommended value is the bot's name), a title, message and a hash of options (it's up to the notifier to use the options).
62
+
63
+ ### Distributing boppers
64
+
65
+ I encourage you to share your boppers. I even added a command to generate a common structure, so you don't have to think about how to organize it. Let's say you want to distribute the clock bopper above.
66
+
67
+ ```
68
+ $ boppers plugin clock
69
+ create boppers-clock.gemspec
70
+ create gems.rb
71
+ create .gitignore
72
+ create .rubocop.yml
73
+ create .travis.yml
74
+ create CODE_OF_CONDUCT.md
75
+ ...
76
+ ```
77
+
78
+ Now add your bopper code to `lib/boppers/clock.rb`.
79
+
80
+ ```ruby
81
+ # frozen_string_literal: true
82
+
83
+ require "boppers/clock/version"
84
+
85
+ module Boppers
86
+ class Clock
87
+ def call
88
+ Boppers.notify(:clock, title: "Clock", message: "Now is #{Time.now}")
89
+ end
90
+ end
91
+ end
92
+ ```
93
+
94
+ Change the `boppers-clock.gemspec` file accordingly (add a description, author name and email).
95
+
96
+ If you're writing tests, use `Boppers::Testing::BopperLinter` to lint your bopper (some basic validations will be made).
97
+
98
+ ```ruby
99
+ # frozen_string_literal: true
100
+
101
+ require "test_helper"
102
+
103
+ class BoppersClockTest < Minitest::Test
104
+ test "lint bopper" do
105
+ bopper = Boppers::Clock.new
106
+ Boppers::Testing::BopperLinter.call(bopper)
107
+ end
108
+ end
109
+ ```
110
+
111
+ Then make a commit and run `rake release` to distribute it (I'm assuming your Rubygems account is already configured).
112
+
113
+ ## Notifiers
114
+
115
+ A notifier is basically a class that responds to `#call(title, message, options)`. The following example implements a `stderr` notifier.
116
+
117
+ ```ruby
118
+ class Stderr
119
+ attr_reader :subscribe
120
+
121
+ def initialize(subscribe: nil)
122
+ @subscribe = subscribe
123
+ end
124
+
125
+ def call(title, message, _options)
126
+ $stderr << "== #{title}\n"
127
+ $stderr << message.gsub(/^/m, " ")
128
+ $stderr << "\n\n"
129
+ end
130
+ end
131
+
132
+ Boppers.configure do |config|
133
+ config.notifiers << Stderr.new
134
+ end
135
+ ```
136
+
137
+ You can specify which messages a notifier will receive by setting `subscribe:`, like the following:
138
+
139
+ ```ruby
140
+ Boppers.configure do |config|
141
+ config.notifiers << Stderr.new(subscribe: %i[clock])
142
+ end
143
+ ```
144
+
145
+ Now this notifier will only be triggered when `Boppers.notify(:clock, *args)` is called, ignoring other boppers.
146
+
147
+ ### Available notifiers
148
+
149
+ By default, Boppers comes with the following notifiers.
150
+
151
+ - [Hipchat](https://www.hipchat.com/sign_in)
152
+ - [Pushover](https://pushover.net)
153
+ - [Sendgrid](https://sendgrid.com)
154
+ - [Slack](https://slack.com)
155
+ - stdout
156
+ - [Telegram](https://telegram.org)
157
+ - [Twitter](https://twitter.com)
158
+
159
+ #### Hipchat
160
+
161
+ 1. Create a "Send Notification" room API token at `https://[SUBDOMAIN].hipchat.com/rooms`.
162
+ 2. The room id is available at the "Summary" section as "API ID".
163
+
164
+ ```ruby
165
+ Boppers.configure do |config|
166
+ config.notifiers << Boppers::Notifier::Hipchat.new(
167
+ api_token: "API_TOKEN,
168
+ room: "ROOM"
169
+ )
170
+ end
171
+ ```
172
+
173
+ #### Pushover
174
+
175
+ ```ruby
176
+ Boppers.configure do |config|
177
+ config.notifiers << Boppers::Notifier::Pushover.new(
178
+ app_token: "APP_TOKEN",
179
+ user_token: "USER_TOKEN"
180
+ )
181
+ end
182
+ ```
183
+
184
+ #### Slack
24
185
 
25
- TODO: Write usage instructions here
186
+ 1. Create a new bot user at https://my.slack.com/services/new/bot
187
+ 2. Set the API token as the `api_token:`.
188
+ 3. Set the channel as the `channel:`.
189
+
190
+ ```ruby
191
+ Boppers.configure do |config|
192
+ config.notifiers << Boppers::Notifier::Slack.new(
193
+ api_token: "API_TOKEN",
194
+ channel: "#core"
195
+ )
196
+ end
197
+ ```
198
+
199
+ #### Sendgrid
200
+
201
+ ```ruby
202
+ Boppers.configure do |config|
203
+ config.notifiers << Boppers::Notifier::Sendgrid.new(
204
+ username: "USERNAME",
205
+ password: "PASSWORD",
206
+ domain: "DOMAIN",
207
+ email: "your@email.com"
208
+ )
209
+ end
210
+ ```
211
+
212
+ #### Stdout
213
+
214
+ ```ruby
215
+ Boppers.configure do |config|
216
+ config.notifiers << Boppers::Notifier::Stdout.new
217
+ end
218
+ ```
219
+
220
+ #### Telegram
221
+
222
+ 1. [Create a bot](https://core.telegram.org/bots#6-botfather). The returned API token must be defined as `api_token:`.
223
+ 2. Send a message to the bot.
224
+ 3. Run `ruby setup/telegram.rb` locally to get the channel id. You may need to install the dependencies with `bundle install` before doing it so.
225
+ 4. Set the channel as `channel_id: <channel id>`. Sometimes id can be a negative number and this is important.
226
+
227
+ ```ruby
228
+ Boppers.configure do |config|
229
+ config.notifiers << Boppers::Notifer::Telegram.new(
230
+ api_token: "API_TOKEN",
231
+ channel_id: "CHANNEL_ID"
232
+ )
233
+ end
234
+ ```
235
+
236
+ #### Twitter
237
+
238
+ 1. Create an user for your bot.
239
+ 2. Follow your bot, and make your bot follow you.
240
+ 3. Create a new Twitter application under your bot's account at https://apps.twitter.com/app/new
241
+ 4. Go to "Keys and Access Tokens" and create a new access token.
242
+ 5. Set `consumer_key:`, `consumer_secret:`, `access_token:` and `access_secret:` named arguments, all available under "Keys and Access Token".
243
+ 6. Set the user that'll receive the notification as `user: <username>`.
244
+
245
+ ```ruby
246
+ Boppers.configure do |config|
247
+ config.notifiers << Boppers::Notifer::Twitter.new(
248
+ consumer_key: "CONSUMER_KEY",
249
+ consumer_secret: "CONSUMER_SECRET",
250
+ access_token: "ACCESS_TOKEN",
251
+ access_secret: "ACCESS_SECRET",
252
+ user: "someuser"
253
+ )
254
+ end
255
+ ```
256
+
257
+ ### Distributing notifiers
258
+
259
+ The idea is pretty much the same. Create a new plugin with `boppers plugin [NAME]` and configure it accordingly. There's also a linter for notifiers: `Boppers::Testing::NotifierLinter`.
260
+
261
+ ## Deploying to Heroku
262
+
263
+ I'm assuming you installed the gem with `gem install boppers` and generated your app.
264
+
265
+ Add your configuration to `config/boppers.rb`. Also make sure you don't hardcode any sensitive value, like API tokens or passwords. Use [env_vars](https://rubygems.org/gems/env_vars) to manage access to your environment variables.
266
+
267
+ Now, configure Heroku. Create a new app for this.
268
+
269
+ ```
270
+ heroku create
271
+ ```
272
+
273
+ If you're going to send e-mail notification, you'll need Sendgrid.
274
+
275
+ ```
276
+ heroku addons:create sendgrid:starter
277
+ ```
278
+
279
+ Make a commit and deploy to your Heroku account.
280
+
281
+ ```
282
+ git add .
283
+ git commit -m "Initial commit"
284
+ git push heroku master
285
+ ```
286
+
287
+ Scale up the boppers worker:
288
+
289
+ ```
290
+ heroku ps:scale worker=1
291
+ ```
292
+
293
+ To make your worker run 24/7 (will cost you $7/month):
294
+
295
+ ```
296
+ heroku dyno:type worker=hobby
297
+ ```
26
298
 
27
299
  ## Development
28
300
 
@@ -32,7 +304,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
304
 
33
305
  ## Contributing
34
306
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/boppers. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
307
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fnando/boppers. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
308
 
37
309
  ## License
38
310
 
@@ -40,4 +312,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
40
312
 
41
313
  ## Code of Conduct
42
314
 
43
- Everyone interacting in the Boppers project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/boppers/blob/master/CODE_OF_CONDUCT.md).
315
+ Everyone interacting in the Boppers project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/fnando/boppers/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.libs << "test"
8
8
  t.libs << "lib"
9
9
  t.test_files = FileList["test/**/*_test.rb"]
10
+ t.warning = false
10
11
  end
11
12
 
12
13
  task default: :test
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Nando Vieira"]
9
9
  spec.email = ["fnando.vieira@gmail.com"]
10
10
 
11
- spec.summary = "Bots."
11
+ spec.summary = "A simple bot framework for individuals."
12
12
  spec.description = spec.summary
13
13
  spec.homepage = "https://rubygems.org/gems/boppers"
14
14
  spec.license = "MIT"
@@ -20,7 +20,15 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
+ spec.add_dependency "thor"
24
+ spec.add_dependency "aitch"
25
+
23
26
  spec.add_development_dependency "bundler"
24
27
  spec.add_development_dependency "rake"
25
28
  spec.add_development_dependency "minitest-utils"
29
+ spec.add_development_dependency "simplecov"
30
+ spec.add_development_dependency "pry-meta"
31
+ spec.add_development_dependency "mail"
32
+ spec.add_development_dependency "telegram_bot"
33
+ spec.add_development_dependency "twitter"
26
34
  end
@@ -2,3 +2,4 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "boppers"
5
+ Boppers::CLI.start
@@ -1,15 +1,107 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- boppers (0.0.0)
4
+ boppers (0.0.1)
5
+ aitch
6
+ thor
5
7
 
6
8
  GEM
7
9
  remote: https://rubygems.org/
8
10
  specs:
11
+ addressable (2.5.2)
12
+ public_suffix (>= 2.0.2, < 4.0)
13
+ aitch (1.0.2)
14
+ nokogiri (>= 1.6.0)
15
+ awesome_print (1.8.0)
16
+ axiom-types (0.1.1)
17
+ descendants_tracker (~> 0.0.4)
18
+ ice_nine (~> 0.11.0)
19
+ thread_safe (~> 0.3, >= 0.3.1)
20
+ buftok (0.2.0)
21
+ byebug (9.1.0)
22
+ coderay (1.1.2)
23
+ coercible (1.0.0)
24
+ descendants_tracker (~> 0.0.1)
25
+ descendants_tracker (0.0.4)
26
+ thread_safe (~> 0.3, >= 0.3.1)
27
+ docile (1.1.5)
28
+ domain_name (0.5.20170404)
29
+ unf (>= 0.0.5, < 1.0.0)
30
+ equalizer (0.0.11)
31
+ excon (0.59.0)
32
+ faraday (0.11.0)
33
+ multipart-post (>= 1.2, < 3)
34
+ http (2.2.2)
35
+ addressable (~> 2.3)
36
+ http-cookie (~> 1.0)
37
+ http-form_data (~> 1.0.1)
38
+ http_parser.rb (~> 0.6.0)
39
+ http-cookie (1.0.3)
40
+ domain_name (~> 0.5)
41
+ http-form_data (1.0.3)
42
+ http_parser.rb (0.6.0)
43
+ ice_nine (0.11.2)
44
+ json (2.1.0)
45
+ mail (2.7.0)
46
+ mini_mime (>= 0.1.1)
47
+ memoizable (0.4.2)
48
+ thread_safe (~> 0.3, >= 0.3.1)
49
+ method_source (0.9.0)
50
+ mini_mime (0.1.4)
51
+ mini_portile2 (2.3.0)
9
52
  minitest (5.10.3)
10
53
  minitest-utils (0.4.0)
11
54
  minitest
55
+ multipart-post (2.0.0)
56
+ naught (1.1.0)
57
+ nokogiri (1.8.1)
58
+ mini_portile2 (~> 2.3.0)
59
+ pry (0.11.2)
60
+ coderay (~> 1.1.0)
61
+ method_source (~> 0.9.0)
62
+ pry-byebug (3.5.0)
63
+ byebug (~> 9.1)
64
+ pry (~> 0.10)
65
+ pry-meta (0.0.10)
66
+ awesome_print
67
+ pry
68
+ pry-byebug
69
+ pry-remote
70
+ pry-remote (0.1.8)
71
+ pry (~> 0.9)
72
+ slop (~> 3.0)
73
+ public_suffix (3.0.0)
12
74
  rake (12.2.1)
75
+ simple_oauth (0.3.1)
76
+ simplecov (0.15.1)
77
+ docile (~> 1.1.0)
78
+ json (>= 1.8, < 3)
79
+ simplecov-html (~> 0.10.0)
80
+ simplecov-html (0.10.2)
81
+ slop (3.6.0)
82
+ telegram_bot (0.0.7)
83
+ excon (>= 0.30.0)
84
+ virtus (>= 1.0.0)
85
+ thor (0.20.0)
86
+ thread_safe (0.3.6)
87
+ twitter (6.1.0)
88
+ addressable (~> 2.5)
89
+ buftok (~> 0.2.0)
90
+ equalizer (= 0.0.11)
91
+ faraday (~> 0.11.0)
92
+ http (~> 2.1)
93
+ http_parser.rb (~> 0.6.0)
94
+ memoizable (~> 0.4.2)
95
+ naught (~> 1.1)
96
+ simple_oauth (~> 0.3.1)
97
+ unf (0.1.4)
98
+ unf_ext
99
+ unf_ext (0.0.7.4)
100
+ virtus (1.0.5)
101
+ axiom-types (~> 0.1)
102
+ coercible (~> 1.0)
103
+ descendants_tracker (~> 0.0, >= 0.0.3)
104
+ equalizer (~> 0.0, >= 0.0.9)
13
105
 
14
106
  PLATFORMS
15
107
  ruby
@@ -17,8 +109,13 @@ PLATFORMS
17
109
  DEPENDENCIES
18
110
  boppers!
19
111
  bundler
112
+ mail
20
113
  minitest-utils
114
+ pry-meta
21
115
  rake
116
+ simplecov
117
+ telegram_bot
118
+ twitter
22
119
 
23
120
  BUNDLED WITH
24
121
  1.16.0