chatterbot 0.7.0 → 0.7.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.
- 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
|