chatterbot 1.0.2 → 2.0.0.pre
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/.travis.yml +2 -2
- data/LICENSE.txt +18 -9
- data/README.markdown +83 -65
- data/bin/chatterbot-register +0 -1
- data/chatterbot.gemspec +3 -10
- data/examples/class_bot.rb +0 -1
- data/examples/echoes_bot.rb +2 -2
- data/examples/search_bot.rb +1 -1
- data/examples/streaming_bot.rb +21 -15
- data/lib/chatterbot.rb +7 -12
- data/lib/chatterbot/blocklist.rb +61 -0
- data/lib/chatterbot/bot.rb +118 -13
- data/lib/chatterbot/client.rb +52 -20
- data/lib/chatterbot/config.rb +92 -215
- data/lib/chatterbot/config_manager.rb +49 -0
- data/lib/chatterbot/direct_messages.rb +46 -0
- data/lib/chatterbot/dsl.rb +157 -78
- data/lib/chatterbot/followers.rb +4 -0
- data/lib/chatterbot/handler.rb +29 -0
- data/lib/chatterbot/helpers.rb +14 -3
- data/lib/chatterbot/home_timeline.rb +5 -8
- data/lib/chatterbot/logging.rb +0 -17
- data/lib/chatterbot/profile.rb +0 -1
- data/lib/chatterbot/reply.rb +6 -11
- data/lib/chatterbot/retweet.rb +2 -6
- data/lib/chatterbot/safelist.rb +33 -0
- data/lib/chatterbot/search.rb +26 -16
- data/lib/chatterbot/skeleton.rb +7 -38
- data/lib/chatterbot/streaming.rb +26 -33
- data/lib/chatterbot/tweet.rb +0 -1
- data/lib/chatterbot/ui.rb +9 -2
- data/lib/chatterbot/utils.rb +13 -0
- data/lib/chatterbot/version.rb +1 -1
- data/spec/blocklist_spec.rb +170 -0
- data/spec/bot_spec.rb +83 -8
- data/spec/client_spec.rb +61 -7
- data/spec/config_manager_spec.rb +59 -0
- data/spec/config_spec.rb +33 -158
- data/spec/direct_messages_spec.rb +115 -0
- data/spec/dsl_spec.rb +95 -53
- data/spec/handler_spec.rb +27 -0
- data/spec/helpers_spec.rb +7 -11
- data/spec/home_timeline_spec.rb +42 -31
- data/spec/logging_spec.rb +0 -34
- data/spec/reply_spec.rb +10 -34
- data/spec/search_spec.rb +65 -6
- data/spec/spec_helper.rb +25 -1
- data/spec/streaming_spec.rb +56 -58
- data/spec/whitelist_spec.rb +10 -10
- data/specs.watchr +2 -4
- data/templates/skeleton.txt +148 -12
- metadata +20 -22
- data/bin/chatterbot-blacklist +0 -65
- data/bin/chatterbot-status +0 -55
- data/examples/loop_bot.rb +0 -44
- data/lib/chatterbot/blacklist.rb +0 -61
- data/lib/chatterbot/db.rb +0 -79
- data/lib/chatterbot/streaming_handler.rb +0 -96
- data/lib/chatterbot/whitelist.rb +0 -32
- data/spec/blacklist_spec.rb +0 -116
- data/spec/db_spec.rb +0 -53
- data/spec/streaming_handler_spec.rb +0 -78
data/spec/config_spec.rb
CHANGED
@@ -14,12 +14,6 @@ describe "Chatterbot::Config" do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "loading" do
|
17
|
-
it "overrides with incoming params" do
|
18
|
-
expect(@bot).to receive(:global_config).and_return({:foo => :bar})
|
19
|
-
tmp = @bot.load_config({:foo => :baz})
|
20
|
-
expect(tmp[:foo]).to eq(:baz)
|
21
|
-
end
|
22
|
-
|
23
17
|
it "loads config when we need a variable" do
|
24
18
|
expect(@bot).to receive(:load_config).and_return({:foo => :bar})
|
25
19
|
@bot.config = nil
|
@@ -27,30 +21,19 @@ describe "Chatterbot::Config" do
|
|
27
21
|
expect(@bot.config[:foo]).to eq(:bar)
|
28
22
|
end
|
29
23
|
|
30
|
-
it "loads both global config and local config" do
|
31
|
-
expect(@bot).to receive(:global_config).and_return({:foo => :bar, :a => :b})
|
32
|
-
expect(@bot).to receive(:bot_config).and_return({:foo => :baz, :custom => :value})
|
33
|
-
|
34
|
-
@bot.config = nil
|
35
|
-
|
36
|
-
expect(@bot.config[:foo]).to eq(:baz)
|
37
|
-
expect(@bot.config[:a]).to eq(:b)
|
38
|
-
expect(@bot.config[:custom]).to eq(:value)
|
39
|
-
end
|
40
|
-
|
41
24
|
context "environment variables" do
|
42
25
|
before(:each) do
|
43
26
|
ENV["chatterbot_consumer_key"] = "env_chatterbot_consumer_key"
|
44
27
|
ENV["chatterbot_consumer_secret"] = "env_chatterbot_consumer_secret"
|
45
|
-
ENV["
|
46
|
-
ENV["
|
28
|
+
ENV["chatterbot_access_token"] = "env_chatterbot_token"
|
29
|
+
ENV["chatterbot_access_secret"] = "env_chatterbot_secret"
|
47
30
|
end
|
48
31
|
|
49
32
|
after(:each) do
|
50
33
|
ENV.delete "chatterbot_consumer_key"
|
51
34
|
ENV.delete "chatterbot_consumer_secret"
|
52
|
-
ENV.delete "
|
53
|
-
ENV.delete "
|
35
|
+
ENV.delete "chatterbot_access_token"
|
36
|
+
ENV.delete "chatterbot_access_secret"
|
54
37
|
end
|
55
38
|
|
56
39
|
it "checks for environment variables" do
|
@@ -59,16 +42,16 @@ describe "Chatterbot::Config" do
|
|
59
42
|
|
60
43
|
expect(@bot.config[:consumer_key]).to eq("env_chatterbot_consumer_key")
|
61
44
|
expect(@bot.config[:consumer_secret]).to eq("env_chatterbot_consumer_secret")
|
62
|
-
expect(@bot.config[:
|
63
|
-
expect(@bot.config[:
|
45
|
+
expect(@bot.config[:access_token]).to eq("env_chatterbot_token")
|
46
|
+
expect(@bot.config[:access_token_secret]).to eq("env_chatterbot_secret")
|
64
47
|
end
|
65
48
|
|
66
49
|
it "works if env var is nil" do
|
67
50
|
ENV["chatterbot_consumer_key"] = nil
|
68
51
|
@bot.config = nil
|
69
|
-
allow(@bot).to receive(:slurp_file).and_return({:
|
52
|
+
allow(@bot).to receive(:slurp_file).and_return({:consumer_key => "foo"})
|
70
53
|
|
71
|
-
expect(@bot.config[:
|
54
|
+
expect(@bot.config[:consumer_key]).to eq("foo")
|
72
55
|
end
|
73
56
|
end
|
74
57
|
|
@@ -77,7 +60,7 @@ describe "Chatterbot::Config" do
|
|
77
60
|
end
|
78
61
|
|
79
62
|
it "update_config? is false if this is a dry run" do
|
80
|
-
@bot.
|
63
|
+
@bot.no_update = true
|
81
64
|
expect(@bot.update_config?).to eq(false)
|
82
65
|
end
|
83
66
|
|
@@ -90,7 +73,7 @@ describe "Chatterbot::Config" do
|
|
90
73
|
end
|
91
74
|
|
92
75
|
it "checks for an auth_token" do
|
93
|
-
expect(@bot).to receive(:load_config).and_return({:
|
76
|
+
expect(@bot).to receive(:load_config).and_return({:access_token => "123"})
|
94
77
|
@bot.config = nil
|
95
78
|
|
96
79
|
expect(@bot.needs_auth_token?).to eq(false)
|
@@ -118,49 +101,35 @@ describe "Chatterbot::Config" do
|
|
118
101
|
describe "debug_mode=" do
|
119
102
|
it "works" do
|
120
103
|
@bot.debug_mode = true
|
121
|
-
expect(@bot.
|
104
|
+
expect(@bot.debug_mode?).to eq(true)
|
122
105
|
end
|
123
106
|
end
|
124
107
|
|
125
108
|
describe "no_update=" do
|
126
109
|
it "works" do
|
127
110
|
@bot.no_update = true
|
128
|
-
expect(@bot.
|
111
|
+
expect(@bot.no_update?).to eq(true)
|
129
112
|
end
|
130
113
|
end
|
131
114
|
|
132
115
|
describe "verbose=" do
|
133
116
|
it "works" do
|
117
|
+
expect(@bot.verbose?).to eq(false)
|
134
118
|
@bot.verbose = true
|
135
|
-
expect(@bot.
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
describe "reset_bot?" do
|
140
|
-
it "works when reset_bot isn't set" do
|
141
|
-
expect(@bot.reset_bot?).to eq(false)
|
142
|
-
end
|
143
|
-
|
144
|
-
it "works when reset_bot is set" do
|
145
|
-
@bot.config[:reset_since_id] = false
|
146
|
-
expect(@bot.reset_bot?).to eq(false)
|
147
|
-
|
148
|
-
@bot.config[:reset_since_id] = true
|
149
|
-
expect(@bot.reset_bot?).to eq(true)
|
119
|
+
expect(@bot.verbose?).to eq(true)
|
150
120
|
end
|
151
121
|
end
|
152
|
-
|
153
|
-
|
122
|
+
|
154
123
|
describe "debug_mode?" do
|
155
124
|
it "works when debug_mode isn't set" do
|
156
125
|
expect(@bot.debug_mode?).to eq(false)
|
157
126
|
end
|
158
127
|
|
159
128
|
it "works when debug_mode is set" do
|
160
|
-
@bot.
|
129
|
+
@bot.debug_mode = false
|
161
130
|
expect(@bot.debug_mode?).to eq(false)
|
162
131
|
|
163
|
-
@bot.
|
132
|
+
@bot.debug_mode = true
|
164
133
|
expect(@bot.debug_mode?).to eq(true)
|
165
134
|
end
|
166
135
|
end
|
@@ -169,39 +138,31 @@ describe "Chatterbot::Config" do
|
|
169
138
|
it "works" do
|
170
139
|
|
171
140
|
@bot.since_id_reply = 123
|
172
|
-
expect(@bot.config[:
|
141
|
+
expect(@bot.config[:since_id_reply]).to eq(123)
|
173
142
|
end
|
174
143
|
end
|
175
144
|
|
176
145
|
describe "update_since_id_reply" do
|
177
146
|
it "works with tweets" do
|
178
|
-
@bot.config[:
|
147
|
+
@bot.config[:since_id_reply] = 100
|
179
148
|
|
180
149
|
data = fake_tweet(1000, 1000)
|
181
150
|
@bot.update_since_id_reply(data)
|
182
|
-
expect(@bot.config[:
|
183
|
-
end
|
184
|
-
|
185
|
-
it "doesn't work with searches" do
|
186
|
-
data = fake_search(1000, 1).search
|
187
|
-
|
188
|
-
@bot.config[:tmp_since_id_reply] = 100
|
189
|
-
@bot.update_since_id_reply(data)
|
190
|
-
expect(@bot.config[:tmp_since_id_reply]).to eq(100)
|
151
|
+
expect(@bot.config[:since_id_reply]).to eq(1000)
|
191
152
|
end
|
192
153
|
|
193
154
|
it "never rolls back" do
|
194
|
-
@bot.config[:
|
155
|
+
@bot.config[:since_id_reply] = 100
|
195
156
|
data = fake_tweet(50, 50)
|
196
157
|
@bot.update_since_id(data)
|
197
|
-
expect(@bot.config[:
|
158
|
+
expect(@bot.config[:since_id_reply]).to eq(100)
|
198
159
|
end
|
199
160
|
end
|
200
161
|
|
201
162
|
describe "since_id=" do
|
202
163
|
it "works" do
|
203
164
|
@bot.since_id = 123
|
204
|
-
expect(@bot.config[:
|
165
|
+
expect(@bot.config[:since_id]).to eq(123)
|
205
166
|
end
|
206
167
|
end
|
207
168
|
|
@@ -209,42 +170,21 @@ describe "Chatterbot::Config" do
|
|
209
170
|
it "works with searches" do
|
210
171
|
data = fake_search(1000, 1).search
|
211
172
|
|
212
|
-
@bot.config[:
|
173
|
+
@bot.config[:since_id] = 100
|
213
174
|
@bot.update_since_id(data)
|
214
|
-
expect(@bot.config[:
|
215
|
-
end
|
216
|
-
|
217
|
-
it "works with SearchResults" do
|
218
|
-
s = Twitter::SearchResults.new(
|
219
|
-
double(Twitter::REST::Request,
|
220
|
-
:client => nil,
|
221
|
-
:verb => nil,
|
222
|
-
:path => nil,
|
223
|
-
:options => nil,
|
224
|
-
:perform => {
|
225
|
-
:search_metadata => {
|
226
|
-
:max_id => 1000
|
227
|
-
}
|
228
|
-
}
|
229
|
-
)
|
230
|
-
)
|
231
|
-
|
232
|
-
|
233
|
-
@bot.config[:tmp_since_id] = 100
|
234
|
-
@bot.update_since_id(s)
|
235
|
-
expect(@bot.config[:tmp_since_id]).to eq(1000)
|
175
|
+
expect(@bot.config[:since_id]).to eq(1000)
|
236
176
|
end
|
237
177
|
|
238
178
|
it "works with tweets" do
|
239
|
-
@bot.config[:
|
179
|
+
@bot.config[:since_id] = 100
|
240
180
|
|
241
181
|
data = fake_tweet(1000, 1000)
|
242
182
|
@bot.update_since_id(data)
|
243
|
-
expect(@bot.config[:
|
183
|
+
expect(@bot.config[:since_id]).to eq(1000)
|
244
184
|
end
|
245
185
|
|
246
186
|
it "works with arrays" do
|
247
|
-
@bot.config[:
|
187
|
+
@bot.config[:since_id] = 100
|
248
188
|
|
249
189
|
data = [
|
250
190
|
fake_tweet(500, 1000),
|
@@ -253,60 +193,24 @@ describe "Chatterbot::Config" do
|
|
253
193
|
]
|
254
194
|
|
255
195
|
@bot.update_since_id(data)
|
256
|
-
expect(@bot.config[:
|
196
|
+
expect(@bot.config[:since_id]).to eq(1000)
|
257
197
|
end
|
258
198
|
|
259
199
|
it "works with an id" do
|
260
|
-
@bot.config[:
|
200
|
+
@bot.config[:since_id] = 100
|
261
201
|
|
262
202
|
@bot.update_since_id(1000)
|
263
|
-
expect(@bot.config[:
|
203
|
+
expect(@bot.config[:since_id]).to eq(1000)
|
264
204
|
end
|
265
205
|
|
266
206
|
it "never rolls back" do
|
267
|
-
@bot.config[:
|
207
|
+
@bot.config[:since_id] = 100
|
268
208
|
data = fake_tweet(50, 50)
|
269
209
|
@bot.update_since_id(data)
|
270
|
-
expect(@bot.config[:
|
210
|
+
expect(@bot.config[:since_id]).to eq(100)
|
271
211
|
end
|
272
212
|
end
|
273
213
|
|
274
|
-
|
275
|
-
describe "update_config" do
|
276
|
-
it "doesn't update the config if update_config? is false" do
|
277
|
-
expect(@bot).to receive(:update_config?).and_return(false)
|
278
|
-
expect(@bot).not_to receive(:has_db?)
|
279
|
-
@bot.update_config
|
280
|
-
end
|
281
|
-
|
282
|
-
it "doesn't update keys from the global config" do
|
283
|
-
allow(@bot).to receive(:global_config).and_return({:foo => :bar, :a => :b})
|
284
|
-
allow(@bot).to receive(:bot_config).and_return({:foo => :bar, :custom => :value})
|
285
|
-
|
286
|
-
@bot.config = nil
|
287
|
-
|
288
|
-
expect(@bot.config_to_save).to eq({ :custom => :value })
|
289
|
-
end
|
290
|
-
|
291
|
-
it "does update keys from the global config if they've been customized" do
|
292
|
-
allow(@bot).to receive(:global_config).and_return({:foo => :bar, :a => :b})
|
293
|
-
allow(@bot).to receive(:bot_config).and_return({:foo => :baz, :custom => :value})
|
294
|
-
|
295
|
-
@bot.config = nil
|
296
|
-
|
297
|
-
expect(@bot.config_to_save).to eq({ :foo => :baz, :custom => :value })
|
298
|
-
end
|
299
|
-
|
300
|
-
it "updates since_id" do
|
301
|
-
@bot.config[:tmp_since_id] = 100
|
302
|
-
expect(@bot.config_to_save[:since_id]).to eq(100)
|
303
|
-
end
|
304
|
-
|
305
|
-
it "updates since_id_reply" do
|
306
|
-
@bot.config[:tmp_since_id_reply] = 100
|
307
|
-
expect(@bot.config_to_save[:since_id_reply]).to eq(100)
|
308
|
-
end
|
309
|
-
end
|
310
214
|
|
311
215
|
|
312
216
|
describe "global config files" do
|
@@ -368,35 +272,6 @@ describe "Chatterbot::Config" do
|
|
368
272
|
|
369
273
|
expect(@bot.slurp_file(src.path)).to eq({ :since_id => 0 })
|
370
274
|
end
|
371
|
-
|
372
|
-
it "doesn't store local file if we can store to db instead" do
|
373
|
-
expect(@bot).to receive(:has_db?).and_return(true)
|
374
|
-
expect(@bot).to receive(:store_database_config)
|
375
|
-
@bot.update_config
|
376
|
-
end
|
377
|
-
|
378
|
-
it "stores local file if no db" do
|
379
|
-
expect(@bot).to receive(:has_db?).and_return(false)
|
380
|
-
expect(@bot).not_to receive(:store_database_config)
|
381
|
-
expect(@bot).to receive(:store_local_config)
|
382
|
-
@bot.update_config
|
383
|
-
end
|
384
275
|
end
|
385
276
|
|
386
|
-
describe "store_local_config" do
|
387
|
-
before(:each) do
|
388
|
-
tmp = {:x => 123, :foo => :bar}
|
389
|
-
|
390
|
-
@src = Tempfile.new("config")
|
391
|
-
|
392
|
-
allow(@bot).to receive(:config_file).and_return(@src.path)
|
393
|
-
allow(@bot).to receive(:config_to_save).and_return(tmp)
|
394
|
-
end
|
395
|
-
|
396
|
-
it "should work" do
|
397
|
-
@bot.store_local_config
|
398
|
-
expect(@bot.slurp_file(@src.path)).to eq({ :x => 123, :foo => :bar })
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
277
|
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Chatterbot::DirectMessages" do
|
4
|
+
let(:bot) { test_bot }
|
5
|
+
|
6
|
+
describe "direct_message" do
|
7
|
+
it "calls require_login" do
|
8
|
+
expect(bot).to receive(:require_login).and_return(false)
|
9
|
+
bot.direct_message("hello")
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when authenticated" do
|
13
|
+
before(:each) do
|
14
|
+
expect(bot).to receive(:require_login).and_return(true)
|
15
|
+
allow(bot).to receive(:client).and_return(double(Twitter::Client))
|
16
|
+
allow(bot).to receive(:debug_mode?).and_return(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "calls create_direct_message" do
|
20
|
+
test_str = "test!"
|
21
|
+
test_user = fake_user("DM Enthusiast")
|
22
|
+
|
23
|
+
expect(bot.client).to receive(:create_direct_message).with(test_user, test_str)
|
24
|
+
bot.direct_message(test_str, test_user)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "grabs user from most recent tweet object if needed" do
|
28
|
+
test_str = "test!"
|
29
|
+
test_user = fake_user("DM Enthusiast", 1000)
|
30
|
+
|
31
|
+
x = {
|
32
|
+
:from_user => "chatterbot",
|
33
|
+
:id => 100,
|
34
|
+
:text => "I am a tweet",
|
35
|
+
:user => { :id => 1000, :screen_name => "DM Enthusiast" }
|
36
|
+
}
|
37
|
+
|
38
|
+
t = Twitter::Tweet.new(x)
|
39
|
+
bot.instance_variable_set(:@current_tweet, t)
|
40
|
+
|
41
|
+
expect(bot.client).to receive(:create_direct_message).with(test_user, test_str)
|
42
|
+
bot.direct_message(test_str)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "direct_messages" do
|
48
|
+
it "calls require_login" do
|
49
|
+
expect(bot).to receive(:require_login).and_return(false)
|
50
|
+
bot.direct_messages
|
51
|
+
end
|
52
|
+
|
53
|
+
it "updates since_id_dm when complete" do
|
54
|
+
expect(bot).to receive(:require_login).and_return(true)
|
55
|
+
results = fake_direct_messages(1, 1000)
|
56
|
+
|
57
|
+
allow(bot).to receive(:client).and_return(results)
|
58
|
+
|
59
|
+
bot.direct_messages do
|
60
|
+
end
|
61
|
+
|
62
|
+
expect(bot.config[:since_id_dm]).to eq(1000)
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "results handling" do
|
66
|
+
before(:each) do
|
67
|
+
expect(bot).to receive(:require_login).and_return(true)
|
68
|
+
allow(bot).to receive(:client).and_return(fake_direct_messages(3))
|
69
|
+
end
|
70
|
+
|
71
|
+
it "iterates results" do
|
72
|
+
|
73
|
+
expect(bot).to receive(:update_since_id_dm).exactly(3).times
|
74
|
+
|
75
|
+
indexes = []
|
76
|
+
bot.direct_messages do |x|
|
77
|
+
indexes << x.id
|
78
|
+
end
|
79
|
+
|
80
|
+
expect(indexes).to eq([1,2,3])
|
81
|
+
end
|
82
|
+
|
83
|
+
it "checks blocklist" do
|
84
|
+
allow(bot).to receive(:on_blocklist?).and_return(true, false, false)
|
85
|
+
indexes = []
|
86
|
+
bot.direct_messages do |x|
|
87
|
+
indexes << x.id
|
88
|
+
end
|
89
|
+
|
90
|
+
expect(indexes).to eq([2,3])
|
91
|
+
end
|
92
|
+
|
93
|
+
it "checks safelist" do
|
94
|
+
allow(bot).to receive(:has_safelist?).and_return(true)
|
95
|
+
allow(bot).to receive(:on_safelist?).and_return(false, true, false)
|
96
|
+
|
97
|
+
indexes = []
|
98
|
+
bot.direct_messages do |x|
|
99
|
+
indexes << x.id
|
100
|
+
end
|
101
|
+
|
102
|
+
expect(indexes).to eq([2])
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
it "passes along since_id_dm" do
|
107
|
+
allow(bot).to receive(:since_id_dm).and_return(123)
|
108
|
+
|
109
|
+
expect(bot.client).to receive(:direct_messages_received).with({:since_id => 123, :count => 200})
|
110
|
+
|
111
|
+
bot.direct_messages
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|