chatterbot 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/bin/chatterbot-register +3 -1
- data/chatterbot.gemspec +2 -1
- data/lib/chatterbot/client.rb +13 -2
- data/lib/chatterbot/config.rb +29 -1
- data/lib/chatterbot/db.rb +1 -0
- data/lib/chatterbot/dsl.rb +19 -3
- data/lib/chatterbot/reply.rb +3 -3
- data/lib/chatterbot/skeleton.rb +3 -0
- data/lib/chatterbot/version.rb +1 -1
- data/spec/blacklist_spec.rb +8 -8
- data/spec/client_spec.rb +22 -9
- data/spec/config_spec.rb +45 -7
- data/spec/db_spec.rb +1 -1
- data/spec/dsl_spec.rb +21 -3
- data/spec/followers_spec.rb +1 -1
- data/spec/logging_spec.rb +5 -5
- data/spec/reply_spec.rb +27 -18
- data/spec/retweet_spec.rb +2 -2
- data/spec/search_spec.rb +12 -11
- data/spec/skeleton_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -6
- data/spec/tweet_spec.rb +8 -8
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a201bdebfa6dbcffa480ca035bc84053a6c6a10
|
4
|
+
data.tar.gz: 611a0e13a984bdb0afc67a208a011aa6b113e750
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2fc941f17f82850bef55c0af704b66b65cd1986640f8bdaa2b3ac53c528028a5f9feda5826822eccbc567b1f900ad03bb3a4872ae369b386f88c1d2430ea573
|
7
|
+
data.tar.gz: 4d605782e35d922cca012873ef32ea9c82e4aafb1e80a6424074467fdd26c280120f0e9276eff5f3f94826dcc5765265f59f93dbf2473f4666590be0445a205d
|
data/Gemfile
CHANGED
data/bin/chatterbot-register
CHANGED
data/chatterbot.gemspec
CHANGED
@@ -29,12 +29,13 @@ Gem::Specification.new do |s|
|
|
29
29
|
end
|
30
30
|
|
31
31
|
s.add_runtime_dependency(%q<oauth>, [">= 0"])
|
32
|
-
s.add_runtime_dependency(%q<twitter>, ["
|
32
|
+
s.add_runtime_dependency(%q<twitter>, ["4.8.1"])
|
33
33
|
s.add_runtime_dependency(%q<launchy>, [">= 2.1.2"])
|
34
34
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
35
35
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
36
36
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
37
37
|
s.add_development_dependency(%q<rspec>, [">= 2.14.1"])
|
38
|
+
s.add_development_dependency(%q<rspec-mocks>, [">= 2.14.1"])
|
38
39
|
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
39
40
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
40
41
|
s.add_development_dependency(%q<watchr>, [">= 0"])
|
data/lib/chatterbot/client.rb
CHANGED
@@ -49,6 +49,15 @@ module Chatterbot
|
|
49
49
|
result = client.search("a")
|
50
50
|
update_since_id(result)
|
51
51
|
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# resets the since_id_reply for this bot to the last mention received
|
55
|
+
#
|
56
|
+
def reset_since_id_reply
|
57
|
+
config[:tmp_since_id_reply] = 0
|
58
|
+
result = client.mentions.max_by(&:id)
|
59
|
+
update_since_id_reply(result)
|
60
|
+
end
|
52
61
|
|
53
62
|
|
54
63
|
#
|
@@ -67,6 +76,7 @@ module Chatterbot
|
|
67
76
|
:result_type => "recent"
|
68
77
|
}
|
69
78
|
opts[:since_id] = since_id if since_id > 0
|
79
|
+
opts[:since_id_reply] = since_id_reply if since_id_reply > 0
|
70
80
|
|
71
81
|
opts
|
72
82
|
end
|
@@ -161,14 +171,15 @@ module Chatterbot
|
|
161
171
|
@access_token = request_token.get_access_token(:oauth_verifier => pin.chomp)
|
162
172
|
get_screen_name
|
163
173
|
|
164
|
-
config[:token] = @access_token.token
|
165
|
-
config[:secret] = @access_token.secret
|
174
|
+
self.config[:token] = @access_token.token
|
175
|
+
self.config[:secret] = @access_token.secret
|
166
176
|
|
167
177
|
update_config unless ! do_update_config
|
168
178
|
reset_client
|
169
179
|
|
170
180
|
rescue OAuth::Unauthorized => e
|
171
181
|
display_oauth_error
|
182
|
+
puts e.inspect
|
172
183
|
return false
|
173
184
|
end
|
174
185
|
end
|
data/lib/chatterbot/config.rb
CHANGED
@@ -38,6 +38,7 @@ module Chatterbot
|
|
38
38
|
def debug_mode=(d)
|
39
39
|
config[:debug_mode] = d
|
40
40
|
end
|
41
|
+
|
41
42
|
def no_update=(d)
|
42
43
|
config[:no_update] = d
|
43
44
|
end
|
@@ -92,7 +93,20 @@ module Chatterbot
|
|
92
93
|
# return the ID of the most recent tweet pulled up in searches
|
93
94
|
def since_id
|
94
95
|
config[:since_id] || 0
|
95
|
-
end
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# store since_id_reply to a different key so that it doesn't actually
|
100
|
+
# get updated until the bot is done running
|
101
|
+
def since_id_reply=(x)
|
102
|
+
config[:tmp_since_id_reply] = x
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# return the ID of the most recent tweet pulled up in mentions or since_id if since_id_reply is nil
|
107
|
+
def since_id_reply
|
108
|
+
config[:since_id_reply] || since_id
|
109
|
+
end
|
96
110
|
|
97
111
|
#
|
98
112
|
# write out our config file
|
@@ -115,6 +129,18 @@ module Chatterbot
|
|
115
129
|
def max_id_from(s)
|
116
130
|
s.max { |a, b| a.id <=> b.id }.id
|
117
131
|
end
|
132
|
+
|
133
|
+
#
|
134
|
+
# update the since_id_reply with the id of the given tweet,
|
135
|
+
# unless it is lower thant what we have already
|
136
|
+
#
|
137
|
+
def update_since_id_reply(tweet)
|
138
|
+
return if tweet.nil? or tweet.class != Twitter::Tweet
|
139
|
+
|
140
|
+
tmp_id = tweet.id
|
141
|
+
|
142
|
+
config[:tmp_since_id_reply] = [config[:tmp_since_id_reply].to_i, tmp_id].max
|
143
|
+
end
|
118
144
|
|
119
145
|
#
|
120
146
|
# update the since_id with either the highest ID of the specified
|
@@ -268,6 +294,7 @@ module Chatterbot
|
|
268
294
|
|
269
295
|
# update the since_id now
|
270
296
|
tmp[:since_id] = tmp.delete(:tmp_since_id) unless ! tmp.has_key?(:tmp_since_id)
|
297
|
+
tmp[:since_id_reply] = tmp.delete(:tmp_since_id_reply) unless ! tmp.has_key?(:tmp_since_id_reply)
|
271
298
|
|
272
299
|
tmp
|
273
300
|
end
|
@@ -302,6 +329,7 @@ module Chatterbot
|
|
302
329
|
configs = db[:config]
|
303
330
|
data = {
|
304
331
|
:since_id => config.has_key?(:tmp_since_id) ? config[:tmp_since_id] : config[:since_id],
|
332
|
+
:since_id_reply => config.has_key?(:tmp_since_id_reply) ? config[:tmp_since_id_reply] : config[:since_id_reply],
|
305
333
|
:token => config[:token],
|
306
334
|
:secret => config[:secret],
|
307
335
|
:consumer_secret => config[:consumer_secret],
|
data/lib/chatterbot/db.rb
CHANGED
data/lib/chatterbot/dsl.rb
CHANGED
@@ -5,7 +5,10 @@ module Chatterbot
|
|
5
5
|
#
|
6
6
|
# very basic DSL to handle the common stuff you would want to do with a bot.
|
7
7
|
module DSL
|
8
|
-
|
8
|
+
def client
|
9
|
+
bot.client
|
10
|
+
end
|
11
|
+
|
9
12
|
#
|
10
13
|
# search twitter for the specified terms, then pass any matches to
|
11
14
|
# the block.
|
@@ -84,6 +87,7 @@ module Chatterbot
|
|
84
87
|
opts.on('-v', '--verbose', "verbose output to stdout") { params[:verbose] = true }
|
85
88
|
opts.on('--dry-run', "Run the bot in test mode, and also don't update the database") { params[:debug_mode] = true ; params[:no_update] = true }
|
86
89
|
opts.on('-s', '--since_id [ARG]', "Check for tweets since tweet id #[ARG]") { |s| params[:since_id] = s.to_i }
|
90
|
+
opts.on('-m', '--since_id_reply [ARG]', "Check for mentions since tweet id #[ARG]") { |s| params[:since_id_reply] = s.to_i }
|
87
91
|
opts.on('-r', '--reset', "Reset your bot to ignore old tweets") {
|
88
92
|
params[:debug_mode] = true
|
89
93
|
params[:reset_since_id] = true
|
@@ -145,6 +149,11 @@ module Chatterbot
|
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
152
|
+
#
|
153
|
+
# return a list of users following the bot. This passes directly
|
154
|
+
# to the underlying Twitter API call
|
155
|
+
# @see http://rdoc.info/gems/twitter/Twitter/API/FriendsAndFollowers#followers-instance_method
|
156
|
+
#
|
148
157
|
def followers(opts={})
|
149
158
|
bot.followers(opts)
|
150
159
|
end
|
@@ -171,7 +180,10 @@ module Chatterbot
|
|
171
180
|
#
|
172
181
|
# The ID of the most recent tweet processed by the bot
|
173
182
|
#
|
174
|
-
def since_id
|
183
|
+
def since_id(s=nil)
|
184
|
+
if s
|
185
|
+
bot.config[:since_id] = s
|
186
|
+
end
|
175
187
|
bot.config[:since_id]
|
176
188
|
end
|
177
189
|
|
@@ -189,7 +201,11 @@ module Chatterbot
|
|
189
201
|
def token(s)
|
190
202
|
bot.config[:token] = s
|
191
203
|
end
|
192
|
-
|
204
|
+
|
205
|
+
def since_id_reply
|
206
|
+
bot.config[:since_id_reply]
|
207
|
+
end
|
208
|
+
|
193
209
|
#
|
194
210
|
# explicitly save the configuration/state of the bot.
|
195
211
|
#
|
data/lib/chatterbot/reply.rb
CHANGED
@@ -8,15 +8,15 @@ module Chatterbot
|
|
8
8
|
def replies(&block)
|
9
9
|
return unless require_login
|
10
10
|
|
11
|
-
debug "check for replies since #{
|
11
|
+
debug "check for replies since #{since_id_reply}"
|
12
12
|
|
13
|
-
opts =
|
13
|
+
opts = since_id_reply > 0 ? {:since_id => since_id_reply} : {}
|
14
14
|
opts[:count] = 200
|
15
15
|
|
16
16
|
results = client.mentions(opts)
|
17
17
|
results.each { |s|
|
18
|
+
update_since_id_reply(s)
|
18
19
|
unless ! block_given? || on_blacklist?(s) || skip_me?(s)
|
19
|
-
update_since_id(s)
|
20
20
|
yield s
|
21
21
|
end
|
22
22
|
}
|
data/lib/chatterbot/skeleton.rb
CHANGED
@@ -7,11 +7,14 @@ module Chatterbot
|
|
7
7
|
def generate(bot)
|
8
8
|
path = File.join(Chatterbot.libdir, "..", "templates", "skeleton.txt")
|
9
9
|
src = File.read(path)
|
10
|
+
puts bot.config.inspect
|
10
11
|
opts = bot.config.merge({
|
11
12
|
:name => bot.botname,
|
12
13
|
:timestamp => Time.now
|
13
14
|
})
|
14
15
|
|
16
|
+
puts opts.inspect
|
17
|
+
|
15
18
|
if RUBY_VERSION =~ /^1\.8\./
|
16
19
|
apply_vars(src, opts)
|
17
20
|
else
|
data/lib/chatterbot/version.rb
CHANGED
data/spec/blacklist_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe "Chatterbot::Blacklist" do
|
|
10
10
|
describe "skip_me?" do
|
11
11
|
before(:each) do
|
12
12
|
@bot = test_bot
|
13
|
-
@bot.stub
|
13
|
+
@bot.stub(:exclude).and_return(["junk", "i hate bots", "foobar", "spam"])
|
14
14
|
end
|
15
15
|
|
16
16
|
it "blocks tweets with phrases we don't want" do
|
@@ -35,7 +35,7 @@ describe "Chatterbot::Blacklist" do
|
|
35
35
|
describe "on_blacklist?" do
|
36
36
|
before(:each) do
|
37
37
|
@bot = test_bot
|
38
|
-
@bot.stub
|
38
|
+
@bot.stub(:blacklist).and_return(["skippy", "blippy", "dippy"])
|
39
39
|
end
|
40
40
|
|
41
41
|
it "blocks users we don't want" do
|
@@ -68,20 +68,20 @@ describe "Chatterbot::Blacklist" do
|
|
68
68
|
end
|
69
69
|
|
70
70
|
it "collects name from the db if it exists" do
|
71
|
-
@bot.stub
|
72
|
-
blacklist_table =
|
73
|
-
|
71
|
+
@bot.stub(:has_db?).and_return(true)
|
72
|
+
blacklist_table = double(Object)
|
73
|
+
double_dataset = double(Object, {:count => 1})
|
74
74
|
blacklist_table.should_receive(:where).
|
75
75
|
with({ :user => "a"}).
|
76
|
-
and_return(
|
76
|
+
and_return( double_dataset )
|
77
77
|
|
78
78
|
|
79
|
-
missing_dataset =
|
79
|
+
missing_dataset = double(Object, {:count => 0})
|
80
80
|
blacklist_table.should_receive(:where).
|
81
81
|
with({ :user => "b"}).
|
82
82
|
and_return( missing_dataset )
|
83
83
|
|
84
|
-
@bot.stub
|
84
|
+
@bot.stub(:db).and_return({
|
85
85
|
:blacklist => blacklist_table
|
86
86
|
})
|
87
87
|
@bot.on_global_blacklist?("a").should == true
|
data/spec/client_spec.rb
CHANGED
@@ -3,14 +3,27 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Chatterbot::Client" do
|
4
4
|
before(:each) do
|
5
5
|
@bot = Chatterbot::Bot.new
|
6
|
-
@bot.client =
|
6
|
+
@bot.client = double(Object)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "reset_since_id_reply" do
|
10
|
+
it "gets the id of the last reply" do
|
11
|
+
bot = test_bot
|
12
|
+
bot.stub(:client).and_return(fake_replies(1, 1000))
|
13
|
+
bot.client.should_receive(:mentions)
|
14
|
+
|
15
|
+
bot.reset_since_id_reply
|
16
|
+
|
17
|
+
bot.config[:tmp_since_id_reply].should == 1000
|
18
|
+
end
|
19
|
+
|
7
20
|
end
|
8
21
|
|
9
22
|
describe "reset_since_id" do
|
10
23
|
it "runs a search to get a new max_id" do
|
11
24
|
bot = test_bot
|
12
25
|
|
13
|
-
bot.stub
|
26
|
+
bot.stub(:client).and_return(fake_search(100, 1))
|
14
27
|
bot.client.should_receive(:search).with("a")
|
15
28
|
# bot.search("a")
|
16
29
|
bot.reset_since_id
|
@@ -27,7 +40,7 @@ describe "Chatterbot::Client" do
|
|
27
40
|
|
28
41
|
describe "init_client" do
|
29
42
|
before(:each) do
|
30
|
-
@client =
|
43
|
+
@client = double(Twitter::Client)
|
31
44
|
@bot.should_receive(:client).and_return(@client)
|
32
45
|
end
|
33
46
|
|
@@ -65,14 +78,14 @@ describe "Chatterbot::Client" do
|
|
65
78
|
end
|
66
79
|
|
67
80
|
it "handles getting an auth token" do
|
68
|
-
token =
|
81
|
+
token = double(Object,
|
69
82
|
:token => "token",
|
70
83
|
:secret => "secret"
|
71
84
|
)
|
72
85
|
|
73
86
|
@bot.should_receive(:request_token).and_return(token)
|
74
87
|
token.should_receive(:get_access_token).with(:oauth_verifier => "pin").
|
75
|
-
and_return(
|
88
|
+
and_return(double(:token => "access_token", :secret => "access_secret"))
|
76
89
|
|
77
90
|
@bot.should_receive(:get_screen_name)
|
78
91
|
@bot.should_receive(:update_config)
|
@@ -91,16 +104,16 @@ describe "Chatterbot::Client" do
|
|
91
104
|
|
92
105
|
describe "get_screen_name" do
|
93
106
|
before(:each) do
|
94
|
-
@json = '{"id":12345,"screen_name":"
|
107
|
+
@json = '{"id":12345,"screen_name":"bot"}'
|
95
108
|
|
96
|
-
@token =
|
97
|
-
response =
|
109
|
+
@token = double(Object)
|
110
|
+
response = double(Object, :body => @json)
|
98
111
|
@token.should_receive(:get).with("/1.1/account/verify_credentials.json").and_return(response)
|
99
112
|
end
|
100
113
|
|
101
114
|
it "should work" do
|
102
115
|
@bot.get_screen_name(@token)
|
103
|
-
@bot.screen_name.should == "
|
116
|
+
@bot.screen_name.should == "bot"
|
104
117
|
end
|
105
118
|
end
|
106
119
|
|
data/spec/config_spec.rb
CHANGED
@@ -125,13 +125,46 @@ describe "Chatterbot::Config" do
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
describe "since_id_reply=" do
|
129
|
+
it "works" do
|
130
|
+
|
131
|
+
@bot.since_id_reply = 123
|
132
|
+
@bot.config[:tmp_since_id_reply].should == 123
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "update_since_id_reply" do
|
137
|
+
it "works with tweets" do
|
138
|
+
@bot.config[:tmp_since_id_reply] = 100
|
139
|
+
|
140
|
+
data = fake_tweet(1000, 1000, true)
|
141
|
+
@bot.update_since_id_reply(data)
|
142
|
+
@bot.config[:tmp_since_id_reply].should == 1000
|
143
|
+
end
|
144
|
+
|
145
|
+
it "doesn't work with searches" do
|
146
|
+
data = fake_search(1000, 1).search
|
147
|
+
|
148
|
+
@bot.config[:tmp_since_id_reply] = 100
|
149
|
+
@bot.update_since_id_reply(data)
|
150
|
+
@bot.config[:tmp_since_id_reply].should == 100
|
151
|
+
end
|
152
|
+
|
153
|
+
it "never rolls back" do
|
154
|
+
@bot.config[:tmp_since_id_reply] = 100
|
155
|
+
data = fake_tweet(50, 50, true)
|
156
|
+
@bot.update_since_id(data)
|
157
|
+
@bot.config[:tmp_since_id_reply].should == 100
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
128
161
|
describe "since_id=" do
|
129
162
|
it "works" do
|
130
163
|
@bot.since_id = 123
|
131
164
|
@bot.config[:tmp_since_id].should == 123
|
132
165
|
end
|
133
166
|
end
|
134
|
-
|
167
|
+
|
135
168
|
describe "update_since_id" do
|
136
169
|
it "works with searches" do
|
137
170
|
data = fake_search(1000, 1).search
|
@@ -179,8 +212,8 @@ describe "Chatterbot::Config" do
|
|
179
212
|
end
|
180
213
|
|
181
214
|
it "doesn't update keys from the global config" do
|
182
|
-
@bot.stub
|
183
|
-
@bot.stub
|
215
|
+
@bot.stub(:global_config).and_return({:foo => :bar, :a => :b})
|
216
|
+
@bot.stub(:bot_config).and_return({:foo => :bar, :custom => :value})
|
184
217
|
|
185
218
|
@bot.config = nil
|
186
219
|
|
@@ -188,8 +221,8 @@ describe "Chatterbot::Config" do
|
|
188
221
|
end
|
189
222
|
|
190
223
|
it "does update keys from the global config if they've been customized" do
|
191
|
-
@bot.stub
|
192
|
-
@bot.stub
|
224
|
+
@bot.stub(:global_config).and_return({:foo => :bar, :a => :b})
|
225
|
+
@bot.stub(:bot_config).and_return({:foo => :baz, :custom => :value})
|
193
226
|
|
194
227
|
@bot.config = nil
|
195
228
|
|
@@ -200,6 +233,11 @@ describe "Chatterbot::Config" do
|
|
200
233
|
@bot.config[:tmp_since_id] = 100
|
201
234
|
@bot.config_to_save[:since_id].should == 100
|
202
235
|
end
|
236
|
+
|
237
|
+
it "updates since_id_reply" do
|
238
|
+
@bot.config[:tmp_since_id_reply] = 100
|
239
|
+
@bot.config_to_save[:since_id_reply].should == 100
|
240
|
+
end
|
203
241
|
end
|
204
242
|
|
205
243
|
|
@@ -283,8 +321,8 @@ describe "Chatterbot::Config" do
|
|
283
321
|
|
284
322
|
@src = Tempfile.new("config")
|
285
323
|
|
286
|
-
@bot.stub
|
287
|
-
@bot.stub
|
324
|
+
@bot.stub(:config_file).and_return(@src.path)
|
325
|
+
@bot.stub(:config_to_save).and_return(tmp)
|
288
326
|
end
|
289
327
|
|
290
328
|
it "should work" do
|
data/spec/db_spec.rb
CHANGED
data/spec/dsl_spec.rb
CHANGED
@@ -3,10 +3,16 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Chatterbot::DSL" do
|
4
4
|
describe "client routines" do
|
5
5
|
before(:each) do
|
6
|
-
@bot =
|
6
|
+
@bot = double(Chatterbot::Bot, :config => {})
|
7
7
|
@bot.send :require, 'chatterbot/dsl'
|
8
8
|
|
9
|
-
Chatterbot::DSL.stub
|
9
|
+
Chatterbot::DSL.stub(:bot).and_return(@bot)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "client" do
|
13
|
+
it "returns the bot object" do
|
14
|
+
client.should eql(@bot.client)
|
15
|
+
end
|
10
16
|
end
|
11
17
|
|
12
18
|
describe "blacklist" do
|
@@ -120,11 +126,23 @@ describe "Chatterbot::DSL" do
|
|
120
126
|
@bot.should_receive(:config).and_return({:since_id => 1234})
|
121
127
|
since_id.should == 1234
|
122
128
|
end
|
129
|
+
|
130
|
+
it "can be set" do
|
131
|
+
since_id(1234)
|
132
|
+
@bot.config[:since_id].should == 1234
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "since_id_reply" do
|
137
|
+
it "should pass to bot object" do
|
138
|
+
@bot.should_receive(:config).and_return({:since_id_reply => 1234})
|
139
|
+
since_id_reply.should == 1234
|
140
|
+
end
|
123
141
|
end
|
124
142
|
|
125
143
|
describe "db" do
|
126
144
|
it "should pass to bot object" do
|
127
|
-
bot_db =
|
145
|
+
bot_db = double(Object)
|
128
146
|
@bot.should_receive(:db).and_return(bot_db)
|
129
147
|
|
130
148
|
db.should eql(bot_db)
|
data/spec/followers_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe "Chatterbot::Followers" do
|
|
10
10
|
it "returns followers" do
|
11
11
|
bot = test_bot
|
12
12
|
bot.should_receive(:require_login).and_return(true)
|
13
|
-
bot.stub
|
13
|
+
bot.stub(:client).and_return(fake_followers(3))
|
14
14
|
|
15
15
|
result = bot.followers
|
16
16
|
result.size.should == 3
|
data/spec/logging_spec.rb
CHANGED
@@ -4,8 +4,8 @@ describe "Chatterbot::Logging" do
|
|
4
4
|
describe "debug logging" do
|
5
5
|
before(:each) do
|
6
6
|
@bot = Chatterbot::Bot.new
|
7
|
-
@logger =
|
8
|
-
@bot.stub
|
7
|
+
@logger = double(Logger)
|
8
|
+
@bot.stub(:logger).and_return(@logger)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should call logger on debug" do
|
@@ -39,10 +39,10 @@ describe "Chatterbot::Logging" do
|
|
39
39
|
@bot.should_receive(:log_tweets?).and_return(true)
|
40
40
|
|
41
41
|
@bot.should_receive(:botname).and_return("logger")
|
42
|
-
Time.stub
|
42
|
+
Time.stub(:now).and_return(123)
|
43
43
|
|
44
|
-
@tweets_table =
|
45
|
-
@bot.stub
|
44
|
+
@tweets_table = double(Object)
|
45
|
+
@bot.stub(:db).and_return({
|
46
46
|
:tweets => @tweets_table
|
47
47
|
})
|
48
48
|
end
|
data/spec/reply_spec.rb
CHANGED
@@ -7,26 +7,25 @@ describe "Chatterbot::Reply" do
|
|
7
7
|
bot.replies
|
8
8
|
end
|
9
9
|
|
10
|
-
it "updates
|
10
|
+
it "updates since_id_reply when complete" do
|
11
11
|
bot = test_bot
|
12
12
|
bot.should_receive(:require_login).and_return(true)
|
13
|
-
results = fake_replies(
|
13
|
+
results = fake_replies(1, 1000)
|
14
14
|
|
15
|
-
bot.stub
|
15
|
+
bot.stub(:client).and_return(results)
|
16
16
|
|
17
|
-
bot.replies do
|
18
|
-
;
|
17
|
+
bot.replies do
|
19
18
|
end
|
20
19
|
|
21
|
-
bot.config[:
|
20
|
+
bot.config[:tmp_since_id_reply].should == 1000
|
22
21
|
end
|
23
22
|
|
24
23
|
it "iterates results" do
|
25
24
|
bot = test_bot
|
26
25
|
bot.should_receive(:require_login).and_return(true)
|
27
|
-
bot.stub
|
26
|
+
bot.stub(:client).and_return(fake_replies(3))
|
28
27
|
|
29
|
-
bot.should_receive(:
|
28
|
+
bot.should_receive(:update_since_id_reply).exactly(3).times
|
30
29
|
|
31
30
|
indexes = []
|
32
31
|
bot.replies do |x|
|
@@ -39,11 +38,9 @@ describe "Chatterbot::Reply" do
|
|
39
38
|
it "checks blacklist" do
|
40
39
|
bot = test_bot
|
41
40
|
bot.should_receive(:require_login).and_return(true)
|
42
|
-
bot.stub
|
41
|
+
bot.stub(:client).and_return(fake_replies(3))
|
43
42
|
|
44
|
-
bot.
|
45
|
-
|
46
|
-
bot.stub!(:on_blacklist?).and_return(true, false)
|
43
|
+
bot.stub(:on_blacklist?).and_return(true, false, false)
|
47
44
|
|
48
45
|
|
49
46
|
indexes = []
|
@@ -55,11 +52,11 @@ describe "Chatterbot::Reply" do
|
|
55
52
|
end
|
56
53
|
|
57
54
|
|
58
|
-
it "passes along
|
55
|
+
it "passes along since_id_reply" do
|
59
56
|
bot = test_bot
|
60
57
|
bot.should_receive(:require_login).and_return(true)
|
61
|
-
bot.stub
|
62
|
-
bot.stub
|
58
|
+
bot.stub(:client).and_return(fake_replies(100, 3))
|
59
|
+
bot.stub(:since_id_reply).and_return(123)
|
63
60
|
|
64
61
|
bot.client.should_receive(:mentions).with({:since_id => 123, :count => 200})
|
65
62
|
|
@@ -67,14 +64,26 @@ describe "Chatterbot::Reply" do
|
|
67
64
|
end
|
68
65
|
|
69
66
|
|
70
|
-
it "doesn't pass along invalid
|
67
|
+
it "doesn't pass along invalid since_id_reply" do
|
71
68
|
bot = test_bot
|
72
69
|
bot.should_receive(:require_login).and_return(true)
|
73
|
-
bot.stub
|
74
|
-
bot.stub
|
70
|
+
bot.stub(:client).and_return(fake_replies(100, 3))
|
71
|
+
bot.stub(:since_id_reply).and_return(0)
|
75
72
|
|
76
73
|
bot.client.should_receive(:mentions).with({:count => 200})
|
77
74
|
|
78
75
|
bot.replies
|
79
76
|
end
|
77
|
+
|
78
|
+
it "pass along since_id if since_id_reply is nil or zero" do
|
79
|
+
bot = test_bot
|
80
|
+
bot.should_receive(:require_login).and_return(true)
|
81
|
+
bot.stub(:client).and_return(fake_replies(100, 3))
|
82
|
+
bot.stub(:since_id).and_return(12345)
|
83
|
+
|
84
|
+
bot.client.should_receive(:mentions).with({:count => 200, :since_id => 12345})
|
85
|
+
|
86
|
+
bot.replies
|
87
|
+
|
88
|
+
end
|
80
89
|
end
|
data/spec/retweet_spec.rb
CHANGED
@@ -15,9 +15,9 @@ describe "Chatterbot::Retweet" do
|
|
15
15
|
bot = test_bot
|
16
16
|
|
17
17
|
bot.should_receive(:require_login).and_return(true)
|
18
|
-
bot.stub
|
18
|
+
bot.stub(:client).and_return(mock(Twitter::Client))
|
19
19
|
|
20
|
-
bot.stub
|
20
|
+
bot.stub(:debug_mode?).and_return(false)
|
21
21
|
|
22
22
|
tweet_id = 12345
|
23
23
|
bot.client.should_receive(:retweet).with(tweet_id)
|
data/spec/search_spec.rb
CHANGED
@@ -30,7 +30,7 @@ describe "Chatterbot::Search" do
|
|
30
30
|
bot = test_bot
|
31
31
|
|
32
32
|
data = fake_search(100, 1)
|
33
|
-
bot.stub
|
33
|
+
bot.stub(:search_client).and_return(data)
|
34
34
|
bot.should_receive(:update_since_id).with(100)
|
35
35
|
|
36
36
|
bot.search("foo")
|
@@ -39,7 +39,7 @@ describe "Chatterbot::Search" do
|
|
39
39
|
it "accepts multiple searches at once" do
|
40
40
|
bot = test_bot
|
41
41
|
|
42
|
-
bot.stub
|
42
|
+
bot.stub(:search_client).and_return(fake_search(100, 1))
|
43
43
|
bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
|
44
44
|
bot.search_client.should_receive(:search).with("bar -include:retweets", {:result_type=>"recent"})
|
45
45
|
|
@@ -49,7 +49,7 @@ describe "Chatterbot::Search" do
|
|
49
49
|
it "accepts extra params" do
|
50
50
|
bot = test_bot
|
51
51
|
|
52
|
-
bot.stub
|
52
|
+
bot.stub(:search_client).and_return(fake_search(100, 1))
|
53
53
|
bot.search_client.should_receive(:search).with("foo -include:retweets", {:lang => "en", :result_type=>"recent"})
|
54
54
|
|
55
55
|
bot.search("foo", :lang => "en")
|
@@ -58,7 +58,7 @@ describe "Chatterbot::Search" do
|
|
58
58
|
it "accepts a single search query" do
|
59
59
|
bot = test_bot
|
60
60
|
|
61
|
-
bot.stub
|
61
|
+
bot.stub(:search_client).and_return(fake_search(100, 1))
|
62
62
|
bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
|
63
63
|
|
64
64
|
bot.search("foo")
|
@@ -66,10 +66,11 @@ describe "Chatterbot::Search" do
|
|
66
66
|
|
67
67
|
it "passes along since_id" do
|
68
68
|
bot = test_bot
|
69
|
-
bot.stub
|
69
|
+
bot.stub(:since_id).and_return(123)
|
70
|
+
bot.stub(:since_id_reply).and_return(456)
|
70
71
|
|
71
|
-
bot.stub
|
72
|
-
bot.search_client.should_receive(:search).with("foo -include:retweets", {:since_id => 123, :result_type => "recent"})
|
72
|
+
bot.stub(:search_client).and_return(fake_search(100, 1))
|
73
|
+
bot.search_client.should_receive(:search).with("foo -include:retweets", {:since_id => 123, :result_type => "recent", :since_id_reply => 456})
|
73
74
|
|
74
75
|
bot.search("foo")
|
75
76
|
end
|
@@ -77,7 +78,7 @@ describe "Chatterbot::Search" do
|
|
77
78
|
it "updates since_id when complete" do
|
78
79
|
bot = test_bot
|
79
80
|
results = fake_search(1000, 1)
|
80
|
-
bot.stub
|
81
|
+
bot.stub(:search_client).and_return(results)
|
81
82
|
|
82
83
|
bot.should_receive(:update_since_id).with(1000)
|
83
84
|
bot.search("foo")
|
@@ -85,7 +86,7 @@ describe "Chatterbot::Search" do
|
|
85
86
|
|
86
87
|
it "iterates results" do
|
87
88
|
bot = test_bot
|
88
|
-
bot.stub
|
89
|
+
bot.stub(:search_client).and_return(fake_search(100, 3))
|
89
90
|
indexes = []
|
90
91
|
|
91
92
|
bot.search("foo") do |x|
|
@@ -97,9 +98,9 @@ describe "Chatterbot::Search" do
|
|
97
98
|
|
98
99
|
it "checks blacklist" do
|
99
100
|
bot = test_bot
|
100
|
-
bot.stub
|
101
|
+
bot.stub(:search_client).and_return(fake_search(100, 3))
|
101
102
|
|
102
|
-
bot.stub
|
103
|
+
bot.stub(:on_blacklist?).and_return(true, false)
|
103
104
|
|
104
105
|
indexes = []
|
105
106
|
bot.search("foo") do |x|
|
data/spec/skeleton_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe "Chatterbot::Skeleton" do
|
|
11
11
|
:secret => "secret",
|
12
12
|
:token => "token"
|
13
13
|
}
|
14
|
-
@bot.stub
|
14
|
+
@bot.stub(:botname).and_return("Skelley_The_Skeleton")
|
15
15
|
|
16
16
|
@output = Chatterbot::Skeleton.generate(@bot)
|
17
17
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,21 +21,21 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
21
21
|
|
22
22
|
def test_bot
|
23
23
|
bot = Chatterbot::Bot.new
|
24
|
-
bot.stub
|
25
|
-
bot.stub
|
24
|
+
bot.stub(:load_config).and_return({})
|
25
|
+
bot.stub(:update_config_at_exit)
|
26
26
|
bot
|
27
27
|
end
|
28
28
|
|
29
29
|
def fake_search(max_id = 100, result_count = 0, id_base=0)
|
30
|
-
|
30
|
+
double(Twitter::Client,
|
31
31
|
:credentials? => true,
|
32
32
|
:search => Twitter::SearchResults.new(:search_metadata => {:max_id => max_id},
|
33
33
|
:statuses => 1.upto(result_count).collect { |i| fake_tweet(i, id_base) } )
|
34
34
|
)
|
35
35
|
end
|
36
36
|
|
37
|
-
def fake_replies(
|
38
|
-
|
37
|
+
def fake_replies(result_count = 0, id_base = 0)
|
38
|
+
double(Twitter::Client,
|
39
39
|
{
|
40
40
|
:credentials? => true,
|
41
41
|
:mentions => 1.upto(result_count).collect { |i| fake_tweet(i, id_base, true) }
|
@@ -44,7 +44,7 @@ def fake_replies(max_id = 100, result_count = 0, id_base = 0)
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def fake_followers(count)
|
47
|
-
|
47
|
+
double(Twitter::Client,
|
48
48
|
{
|
49
49
|
:credentials? => true,
|
50
50
|
:followers => 1.upto(count).collect { |i| fake_follower(i) }
|
@@ -69,3 +69,4 @@ end
|
|
69
69
|
def fake_follower(index=0)
|
70
70
|
Twitter::User.new(:id => index, :name => "Follower #{index}")
|
71
71
|
end
|
72
|
+
|
data/spec/tweet_spec.rb
CHANGED
@@ -15,9 +15,9 @@ describe "Chatterbot::Tweet" do
|
|
15
15
|
bot = test_bot
|
16
16
|
|
17
17
|
bot.should_receive(:require_login).and_return(true)
|
18
|
-
bot.stub
|
18
|
+
bot.stub(:client).and_return(double(Twitter::Client))
|
19
19
|
|
20
|
-
bot.stub
|
20
|
+
bot.stub(:debug_mode?).and_return(false)
|
21
21
|
|
22
22
|
test_str = "test!"
|
23
23
|
bot.client.should_receive(:update).with(test_str, {})
|
@@ -28,9 +28,9 @@ describe "Chatterbot::Tweet" do
|
|
28
28
|
bot = test_bot
|
29
29
|
|
30
30
|
bot.should_receive(:require_login).and_return(true)
|
31
|
-
bot.stub
|
31
|
+
bot.stub(:client).and_return(double(Twitter::Client))
|
32
32
|
|
33
|
-
bot.stub
|
33
|
+
bot.stub(:debug_mode?).and_return(true)
|
34
34
|
|
35
35
|
bot.client.should_not_receive(:update)
|
36
36
|
bot.tweet "no tweet!"
|
@@ -47,9 +47,9 @@ describe "Chatterbot::Tweet" do
|
|
47
47
|
it "calls client.update with the right values" do
|
48
48
|
bot = test_bot
|
49
49
|
bot.should_receive(:require_login).and_return(true)
|
50
|
-
bot.stub
|
50
|
+
bot.stub(:client).and_return(double(Twitter::Client))
|
51
51
|
|
52
|
-
bot.stub
|
52
|
+
bot.stub(:debug_mode?).and_return(false)
|
53
53
|
|
54
54
|
test_str = "test!"
|
55
55
|
|
@@ -64,9 +64,9 @@ describe "Chatterbot::Tweet" do
|
|
64
64
|
it "doesn't reply when debug_mode? is set" do
|
65
65
|
bot = test_bot
|
66
66
|
bot.should_receive(:require_login).and_return(true)
|
67
|
-
bot.stub
|
67
|
+
bot.stub(:client).and_return(double(Twitter::Client))
|
68
68
|
|
69
|
-
bot.stub
|
69
|
+
bot.stub(:debug_mode?).and_return(true)
|
70
70
|
|
71
71
|
bot.client.should_not_receive(:update)
|
72
72
|
bot.reply "no reply test!", {:id => 100}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chatterbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Mitchell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redcarpet
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: twitter
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4.
|
47
|
+
version: 4.8.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 4.
|
54
|
+
version: 4.8.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: launchy
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 2.14.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec-mocks
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.14.1
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 2.14.1
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rdoc
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
260
|
version: '0'
|
247
261
|
requirements: []
|
248
262
|
rubyforge_project: chatterbot
|
249
|
-
rubygems_version: 2.
|
263
|
+
rubygems_version: 2.1.11
|
250
264
|
signing_key:
|
251
265
|
specification_version: 4
|
252
266
|
summary: A ruby framework for writing Twitter bots
|