boppers 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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