lita-tweet 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2075bb6c559760c56f41340005b53999d1dfa134
4
- data.tar.gz: dd51909e34b310662c31ae91b983a2937f7a2762
3
+ metadata.gz: 263cf1dd5488823347205ebf4056792676e7e3e4
4
+ data.tar.gz: 84a43ad8a14e1f04ae2d8bc76b41497be2b09e91
5
5
  SHA512:
6
- metadata.gz: 838bd08b7db776304826b8211349c8d983c318fd95a5eb2e776b1fa096669c3481a0a6dd97cc6cb6da4ed37814c342b1e1802705c95365156b8e4aee432e227b
7
- data.tar.gz: 87353ed0740d0b6673e24c2535b36e32608a16a4a6e5c084c24e4db00eb7e889e3c7a7e9f2a861a277f288d78506342ca8c6fa537f4a01cd4a07c662b3c98c80
6
+ metadata.gz: c6a3960e01053b68c3fb483f7b7ec6e7e7e0adb4fc8b35051cd924b7c5661172b3b6292f293f08fc0a6f6e9cabb8b8b296f1d577c055011e7dbf78cc865194ec
7
+ data.tar.gz: 14c659282690525c55dce342dab2f9bc3512619f77e6707dd2805ef64abc44f115b4c7e7c0a973e3c37837acfc8d1a5b85eca6ccc1232df8661926b2b164b27d
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  *.rbc
3
3
  .bundle
4
4
  .config
5
+ .rspec_examples
5
6
  .yardoc
6
7
  Gemfile.lock
7
8
  InstalledFiles
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.3.1
4
- script: bundle exec rake
5
- before_install:
6
- - gem update --system
4
+ script:
5
+ - bin/rake
7
6
  services:
8
7
  - redis-server
data/Gemfile CHANGED
@@ -1,3 +1,17 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ group :development do
6
+ gem "coveralls", require: false
7
+ gem "guard-rspec"
8
+ gem "pry-byebug"
9
+ gem "rack-test"
10
+ gem "rake"
11
+ gem "rspec", "~> 3.4"
12
+ gem "simplecov"
13
+ gem "webmock"
14
+ end
15
+
16
+ # This fixes `already initialized constant` warnings while running commands
17
+ begin; require "rb-readline"; rescue LoadError; end
@@ -0,0 +1,14 @@
1
+ guard :rspec, cmd: "bin/rspec" do
2
+ require "guard/rspec/dsl"
3
+ dsl = Guard::RSpec::Dsl.new(self)
4
+
5
+ # RSpec files
6
+ rspec = dsl.rspec
7
+ watch(rspec.spec_helper) { rspec.spec_dir }
8
+ watch(rspec.spec_support) { rspec.spec_dir }
9
+ watch(rspec.spec_files)
10
+
11
+ # Ruby files
12
+ ruby = dsl.ruby
13
+ dsl.watch_spec_files_for(ruby.lib_files)
14
+ end
data/README.md CHANGED
@@ -5,18 +5,31 @@
5
5
 
6
6
  Allows the Lita chat bot to tweet on command.
7
7
 
8
+
8
9
  ## Installation
9
10
 
10
11
  Add lita-tweet to your Lita instance's Gemfile:
11
12
 
12
- ``` ruby
13
+ ```ruby
13
14
  gem "lita-tweet"
14
15
  ```
15
16
 
16
17
  ## Configuration
17
18
 
18
- TODO: Describe any configuration attributes the plugin exposes.
19
+ To make this plugin work, you'll need to set at least `TWITTER\_CONSUMER\_KEY` and `TWITTER\_CONSUMER\_SECRET`. If you want to host the bot at a specific URL, rather than the default `0.0.0.0:1234` type address, you'll also need to set `SERVER\_URL` so that the bot knows where to send users and Twitter auth callbacks.
20
+
21
+ ```ruby
22
+ require "lita-tweet" if ENV.has_key?("TWITTER_CONSUMER_KEY")
23
+
24
+ Lita.configure do |config|
25
+ if ENV.has_key?("TWITTER_CONSUMER_KEY")
26
+ config.handlers.tweet.http_url = ENV["SERVER_URL"]
27
+ config.handlers.tweet.consumer_key = ENV.fetch("TWITTER_CONSUMER_KEY")
28
+ config.handlers.tweet.consumer_secret = ENV.fetch("TWITTER_CONSUMER_SECRET")
29
+ end
30
+ end
31
+ ```
19
32
 
20
33
  ## Usage
21
34
 
22
- TODO: Describe the plugin's features and how to use them.
35
+ To authorize an account for tweeting, use the command `twitter accounts add` and follow the instructions. To tweet, use the command `tweet some text that should go in the tweet`. To delete the last tweet, use the command `untweet`. For a complete list of commands, including how to map specific twitter accounts to specific chat channels, see the output from the command `help`.
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'guard' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("guard", "guard")
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rspec' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rspec-core", "rspec")
@@ -15,12 +15,16 @@ module Lita
15
15
  restrict_to: :tweeters, help: {
16
16
  "twitter accounts" => "List accounts that can be tweeted from.",
17
17
  "twitter accounts add" => "Authorize a new account for tweeting.",
18
- "twitter accounts remove NAME" => "Remove the twitter account NAME"
18
+ "twitter accounts remove NAME" => "Remove the twitter account NAME."
19
19
  }
20
- # route %r{^twitter channels\s(.+?)\s(.+)}, :channels, command: true, help: {
21
- # "twitter channels" => "List account to channel mappings.",
22
- # "twitter channels NAME CHANNEL" => "Tweet as twitter account NAME when told to tweet in channel CHANNEL."
23
- # }
20
+ route %r{^twitter default}, :default, command: true, restrict_to: :tweeters,
21
+ help: { "twitter default ACCOUNT" => "Set the default account to tweet from." }
22
+ route %r{^twitter map}, :map, command: true, restrict_to: :tweeters, help: {
23
+ "twitter map" => "List account to channel mappings.",
24
+ "twitter map NAME ACCOUNT" => "Tweet as ACCOUNT when told to tweet from NAME.",
25
+ }
26
+ route %r{^twitter unmap}, :unmap, command: true, restrict_to: :tweeters,
27
+ help: { "twitter unmap NAME" => "Tweet as the default twitter account when told to tweet in channel CHANNEL." }
24
28
 
25
29
  TWITTER_AUTH_URL = "/twitter/auth"
26
30
  TWITTER_AUTH_CALLBACK_URL = "/twitter/callback"
@@ -33,17 +37,17 @@ module Lita
33
37
  return response.reply("I need something to tweet!")
34
38
  end
35
39
 
36
- account = account_for(response)
37
- return response.relpy(no_accounts) if account.nil?
40
+ account = account_for(response.message.source)
41
+ return response.reply(no_accounts_message) if account.nil?
38
42
 
39
43
  tweet = account.tweet(text)
40
44
  twitter_data.set_last_tweet(account.username, tweet.id)
41
- response.reply(tweet.url)
45
+ response.reply(tweet.url.to_s)
42
46
  end
43
47
 
44
48
  def untweet(response)
45
- account = account_for(response)
46
- return response.relpy(no_accounts) if account.nil?
49
+ account = account_for(response.message.source)
50
+ return response.reply(no_accounts_message) if account.nil?
47
51
 
48
52
  if account.untweet
49
53
  response.reply("Removed last tweet.")
@@ -63,9 +67,27 @@ module Lita
63
67
  end
64
68
  end
65
69
 
66
- # def channels(response)
67
- # # do channel stuff here
68
- # end
70
+ def map(response)
71
+ name, account = response.args[1..2]
72
+ account.gsub!(/^@/, '') if account
73
+
74
+ if name
75
+ response.reply(set_map(name, account))
76
+ else
77
+ response.reply(list_map)
78
+ end
79
+ end
80
+
81
+ def default(response)
82
+ account = response.args[1]
83
+ account.gsub!(/^@/, '') if account
84
+ response.reply(set_default_map(account))
85
+ end
86
+
87
+ def unmap(response)
88
+ name = response.args[1]
89
+ response.reply(clear_map(name))
90
+ end
69
91
 
70
92
  def twitter_auth(request, response)
71
93
  callback_url = TWITTER_AUTH_CALLBACK_URL
@@ -81,6 +103,10 @@ module Lita
81
103
  response.body << "Done! You can now tweet from @#{account.username}."
82
104
  end
83
105
 
106
+ def twitter_data
107
+ @twitter_data ||= Data.new(redis, config, robot)
108
+ end
109
+
84
110
  private
85
111
 
86
112
  def list_accounts
@@ -103,12 +129,86 @@ module Lita
103
129
  twitter_data.remove_account(name)
104
130
  "Removed @#{name}."
105
131
  end
106
- def account_for(response)
107
- twitter_data.account(twitter_data.usernames.first)
132
+
133
+ def valid_name?(name)
134
+ %w[@ #].include?(name[0])
108
135
  end
109
136
 
110
- def twitter_data
111
- @twitter_data ||= Data.new(redis, config, robot)
137
+ def invalid_name
138
+ "Names for mapping need to be @username (for DMs) or #channel!"
139
+ end
140
+
141
+ def list_map
142
+ return "No accounts are configured." unless default_account
143
+
144
+ channels = twitter_data.channel_map
145
+ if channels.empty?
146
+ "All channels will tweet as @#{default_account.username}"
147
+ else
148
+ "Channel twitter accounts:\n" +
149
+ channels.map{|c,u| " - #{c} will tweet as @#{u}" }.join("\n") +
150
+ "\n - all other channels will tweet as @#{default_account.username}"
151
+ end
152
+ end
153
+
154
+ def set_default_map(username)
155
+ if username.nil?
156
+ "You need to provide an account to set as the default!"
157
+ elsif twitter_data.set_default(username)
158
+ "Done. The default account is now @#{username}."
159
+ else
160
+ "I can't tweet as @#{username}, so it can't be the default."
161
+ end
162
+ end
163
+
164
+ def set_map(channel, username)
165
+ if !valid_name?(channel)
166
+ invalid_name
167
+ elsif username.nil?
168
+ "Provide an account name to set as the default!"
169
+ elsif twitter_data.set_channel_map(channel, username)
170
+ "From now on, tweets from #{channel} will use the twitter account @#{username}."
171
+ else
172
+ "I can't tweet as @#{username}, so it can't be mapped."
173
+ end
174
+ end
175
+
176
+ def clear_map(channel)
177
+ return invalid_name unless valid_name?(channel)
178
+
179
+ twitter_data.clear_channel_map(channel)
180
+
181
+ if default_account
182
+ "Tweets from #{channel} will come from the default account, @#{default_account.username}."
183
+ else
184
+ no_accounts_message
185
+ end
186
+ end
187
+
188
+ def account_for(source)
189
+ channel_name = sender_for(source)
190
+ twitter_data.get_channel_account(channel_name) || default_account
191
+ end
192
+
193
+ def default_account
194
+ twitter_data.default_account
195
+ end
196
+
197
+ def no_accounts_message
198
+ "No accounts are configured for tweeting."
199
+ end
200
+
201
+ def sender_for(source)
202
+ if source.private_message
203
+ handle = source.user.metadata["mention_name"] || source.user.name
204
+ handle ? "@#{handle}" : nil
205
+ else
206
+ # lita-slack has a bug where source.room_object.name is wrong,
207
+ # and to get the correct name you have to find the room again
208
+ # https://github.com/litaio/lita-slack/issues/44
209
+ name = Lita::Room.find_by_id(source.room).name
210
+ name ? "##{name}" : nil
211
+ end
112
212
  end
113
213
 
114
214
  Lita.register_handler(self)
@@ -6,10 +6,6 @@ module Lita
6
6
  class Tweet < Handler
7
7
 
8
8
  Account = KeywordStruct.new(:username, :token, :secret, :config, :last_tweet) do
9
- def username
10
- @username ||= client.user.screen_name
11
- end
12
-
13
9
  def tweet(text)
14
10
  client.update(text)
15
11
  end
@@ -18,9 +14,17 @@ module Lita
18
14
  last_tweet ? client.destroy_status(last_tweet) : false
19
15
  end
20
16
 
17
+ def lookup_username!
18
+ client.user.screen_name.tap do |username|
19
+ self.username = username
20
+ end
21
+ end
22
+
21
23
  private
22
24
 
23
25
  def client
26
+ return nil unless config && token && secret
27
+
24
28
  @client ||= ::Twitter::REST::Client.new do |c|
25
29
  c.consumer_key = config.consumer_key
26
30
  c.consumer_secret = config.consumer_secret
@@ -9,16 +9,26 @@ module Lita
9
9
  redis.smembers("twitter_accounts")
10
10
  end
11
11
 
12
+ def default_account
13
+ account(redis.get("default_username"))
14
+ end
15
+
12
16
  def account(username)
17
+ return nil if username.nil?
18
+
13
19
  hash = redis.hgetall("twitter_accounts:#{username}")
20
+ return nil if hash.empty?
21
+
14
22
  data = hash.each_with_object({}){|(k,v),h| h[k.to_sym] = v }
15
23
  Account.new(**data.merge(config: config))
16
24
  end
17
25
 
18
- def add_account(token, secret)
19
- account = Account.new(token: token, secret: secret, config: config)
20
- username = account.username
26
+ def add_account(token, secret, username = nil)
27
+ account = Account.new(token: token, secret: secret,
28
+ config: config, username: username)
29
+ username ||= account.lookup_username!
21
30
 
31
+ redis.setnx("default_username", username)
22
32
  redis.sadd("twitter_accounts", username)
23
33
  redis.hmset("twitter_accounts:#{username}",
24
34
  "username", username,
@@ -32,6 +42,11 @@ module Lita
32
42
  def remove_account(username)
33
43
  redis.del("twitter_accounts:#{username}")
34
44
  redis.srem("twitter_accounts", username)
45
+
46
+ if redis.get("default_username") == username
47
+ next_username = usernames.first
48
+ redis.set("default_username", next_username)
49
+ end
35
50
  end
36
51
 
37
52
  def set_last_tweet(username, tweet_id)
@@ -42,6 +57,37 @@ module Lita
42
57
  redis.hget("twitter_accounts:#{username}", "last_tweet")
43
58
  end
44
59
 
60
+ def channel_map
61
+ redis.smembers("channels").map do |name|
62
+ [name, get_channel_map(name)]
63
+ end.to_h
64
+ end
65
+
66
+ def get_channel_account(channel)
67
+ return nil unless channel
68
+ account(get_channel_map(channel))
69
+ end
70
+
71
+ def get_channel_map(channel)
72
+ redis.get("channels:#{channel}")
73
+ end
74
+
75
+ def set_channel_map(channel, username)
76
+ return false unless usernames.include?(username)
77
+ redis.sadd("channels", channel)
78
+ redis.set("channels:#{channel}", username)
79
+ end
80
+
81
+ def clear_channel_map(channel)
82
+ redis.del("channels:#{channel}")
83
+ redis.srem("channels", channel)
84
+ end
85
+
86
+ def set_default(username)
87
+ return false unless usernames.include?(username)
88
+ redis.set("default_username", username)
89
+ end
90
+
45
91
  def create_request_token(callback_path)
46
92
  request_token = consumer.get_request_token(
47
93
  oauth_callback: bot_uri(callback_path).to_s)
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-tweet"
3
- spec.version = "0.3.0"
3
+ spec.version = "0.4.0"
4
4
  spec.authors = ["Andre Arko"]
5
5
  spec.email = ["andre@arko.net"]
6
6
  spec.description = "Tweeting for Lita"
@@ -19,10 +19,4 @@ Gem::Specification.new do |spec|
19
19
  spec.add_runtime_dependency "oauth", "~> 0.5.1"
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.12"
22
- spec.add_development_dependency "pry-byebug"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rack-test"
25
- spec.add_development_dependency "rspec", ">= 3.0.0"
26
- spec.add_development_dependency "simplecov"
27
- spec.add_development_dependency "coveralls"
28
22
  end
@@ -1,4 +1,63 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Lita::Handlers::Tweet, lita_handler: true do
4
+ # Chat routes
5
+ {
6
+ "tweet some text" => :tweet,
7
+ "untweet" => :untweet,
8
+ "twitter accounts" => :accounts,
9
+ "twitter accounts add" => :accounts,
10
+ "twitter accounts remove foo" => :accounts,
11
+ "twitter default foo" => :default,
12
+ "twitter map" => :map,
13
+ "twitter map foo" => :map,
14
+ "twitter unmap foo" => :unmap
15
+ }.each do |command, method|
16
+ it { is_expected.to route_command(command).
17
+ with_authorization_for(:tweeters).
18
+ to(method) }
19
+ end
20
+
21
+ # HTTP routes
22
+ {
23
+ "/twitter/auth" => :twitter_auth,
24
+ "/twitter/callback" => :twitter_auth_callback
25
+ }.each do |route, method|
26
+ it { is_expected.to route_http(:get, route).to(method) }
27
+ end
28
+
29
+ before(:each) do
30
+ Lita::Authorization.new(registry.config).add_user_to_group!(source.user, :tweeters)
31
+ end
32
+
33
+ describe "#tweet" do
34
+ context "without an authorized account" do
35
+ it "should complain" do
36
+ send_command("tweet some text")
37
+ expect(replies).to include(/no accounts/i)
38
+ end
39
+ end
40
+
41
+ context "with an authorized account" do
42
+ before do
43
+ subject.twitter_data.add_account("token", "secret", "handle")
44
+ end
45
+
46
+ it "should send a tweet" do
47
+ stub_request(:post, "https://api.twitter.com/1.1/statuses/update.json").
48
+ with(body: {status: "some text"}).to_return(status: 200, body: %q[{
49
+ "created_at": "Sun Aug 14 01:53:54 +0000 2016",
50
+ "id": 12345,
51
+ "text": "some text",
52
+ "user": {
53
+ "id": 123,
54
+ "screen_name": "handle",
55
+ "created_at": "Wed Nov 04 17:18:22 +0000 2009"
56
+ }
57
+ }])
58
+ send_command("tweet some text")
59
+ expect(replies).to include("https://twitter.com/handle/status/12345")
60
+ end
61
+ end
62
+ end
4
63
  end
@@ -1,14 +1,18 @@
1
- require "simplecov"
2
1
  require "coveralls"
3
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
- SimpleCov::Formatter::HTMLFormatter,
5
- Coveralls::SimpleCov::Formatter
6
- ]
7
- SimpleCov.start { add_filter "/spec/" }
2
+ require "simplecov"
3
+ SimpleCov.add_filter("/.bundle/")
4
+ Coveralls.wear!
8
5
 
9
6
  require "lita-tweet"
10
7
  require "lita/rspec"
8
+ require "webmock/rspec"
11
9
 
12
10
  # A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
13
11
  # was generated with Lita 4, the compatibility mode should be left disabled.
14
12
  Lita.version_3_compatibility_mode = false
13
+
14
+ RSpec.configure do |config|
15
+ config.example_status_persistence_file_path = ".rspec_examples"
16
+ config.filter_run focus: true
17
+ config.run_all_when_everything_filtered = true
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-tweet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andre Arko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-07 00:00:00.000000000 Z
11
+ date: 2016-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
@@ -66,103 +66,27 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.12'
69
- - !ruby/object:Gem::Dependency
70
- name: pry-byebug
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rack-test
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: 3.0.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: 3.0.0
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: coveralls
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
69
  description: Tweeting for Lita
154
70
  email:
155
71
  - andre@arko.net
156
- executables: []
72
+ executables:
73
+ - guard
74
+ - rake
75
+ - rspec
157
76
  extensions: []
158
77
  extra_rdoc_files: []
159
78
  files:
160
79
  - ".gitignore"
80
+ - ".rspec"
161
81
  - ".travis.yml"
162
82
  - Gemfile
83
+ - Guardfile
163
84
  - LICENSE
164
85
  - README.md
165
86
  - Rakefile
87
+ - bin/guard
88
+ - bin/rake
89
+ - bin/rspec
166
90
  - lib/keyword_struct.rb
167
91
  - lib/lita-tweet.rb
168
92
  - lib/lita/handlers/tweet.rb
@@ -194,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
118
  version: '0'
195
119
  requirements: []
196
120
  rubyforge_project:
197
- rubygems_version: 2.6.6
121
+ rubygems_version: 2.5.1
198
122
  signing_key:
199
123
  specification_version: 4
200
124
  summary: Allows the Lita chat bot to tweet on command