chatterbot 0.7.1 → 0.9.0
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 +1 -1
- data/Gemfile +7 -5
- data/README.markdown +1 -1
- data/Rakefile +8 -0
- data/bin/chatterbot-blacklist +2 -0
- data/bin/chatterbot-register +2 -0
- data/bin/chatterbot-status +2 -0
- data/chatterbot.gemspec +6 -6
- data/examples/streaming_bot.rb +42 -0
- data/lib/chatterbot.rb +16 -1
- data/lib/chatterbot/blacklist.rb +3 -1
- data/lib/chatterbot/bot.rb +4 -0
- data/lib/chatterbot/client.rb +21 -26
- data/lib/chatterbot/config.rb +26 -30
- data/lib/chatterbot/db.rb +2 -0
- data/lib/chatterbot/dsl.rb +117 -3
- data/lib/chatterbot/favorite.rb +23 -0
- data/lib/chatterbot/followers.rb +9 -0
- data/lib/chatterbot/helpers.rb +3 -1
- data/lib/chatterbot/logging.rb +4 -3
- data/lib/chatterbot/profile.rb +40 -0
- data/lib/chatterbot/reply.rb +10 -2
- data/lib/chatterbot/retweet.rb +10 -4
- data/lib/chatterbot/search.rb +12 -6
- data/lib/chatterbot/skeleton.rb +6 -0
- data/lib/chatterbot/streaming.rb +67 -0
- data/lib/chatterbot/streaming_handler.rb +96 -0
- data/lib/chatterbot/tweet.rb +2 -0
- data/lib/chatterbot/ui.rb +2 -1
- data/lib/chatterbot/utils.rb +11 -0
- data/lib/chatterbot/version.rb +1 -1
- data/spec/blacklist_spec.rb +24 -23
- data/spec/bot_spec.rb +12 -0
- data/spec/client_spec.rb +36 -32
- data/spec/config_spec.rb +135 -85
- data/spec/db_spec.rb +5 -5
- data/spec/dsl_spec.rb +74 -27
- data/spec/favorite_spec.rb +34 -0
- data/spec/followers_spec.rb +32 -11
- data/spec/helpers_spec.rb +25 -20
- data/spec/logging_spec.rb +16 -15
- data/spec/profile_spec.rb +65 -0
- data/spec/reply_spec.rb +24 -24
- data/spec/retweet_spec.rb +17 -9
- data/spec/search_spec.rb +26 -26
- data/spec/skeleton_spec.rb +6 -6
- data/spec/spec_helper.rb +44 -32
- data/spec/streaming_handler_spec.rb +78 -0
- data/spec/streaming_spec.rb +172 -0
- data/spec/tweet_spec.rb +18 -18
- data/spec/utils_spec.rb +29 -0
- data/specs.watchr +1 -13
- metadata +27 -16
data/spec/db_spec.rb
CHANGED
@@ -11,10 +11,10 @@ describe "Chatterbot::DB" do
|
|
11
11
|
context "prerequisites" do
|
12
12
|
describe "get_connection" do
|
13
13
|
it "should make sure sequel is actually installed" do
|
14
|
-
Chatterbot::Bot.
|
14
|
+
allow_any_instance_of(Chatterbot::Bot).to receive(:has_sequel?) { false }
|
15
15
|
@bot = Chatterbot::Bot.new
|
16
16
|
@bot.config[:db_uri] = @db_uri
|
17
|
-
@bot.
|
17
|
+
expect(@bot).to receive(:display_db_config_notice)
|
18
18
|
@bot.db
|
19
19
|
end
|
20
20
|
end
|
@@ -23,7 +23,7 @@ describe "Chatterbot::DB" do
|
|
23
23
|
context "db interactions" do
|
24
24
|
before(:each) do
|
25
25
|
@bot = Chatterbot::Bot.new
|
26
|
-
@bot.
|
26
|
+
allow(@bot).to receive(:update_config_at_exit)
|
27
27
|
@bot.config[:db_uri] = @db_uri
|
28
28
|
end
|
29
29
|
|
@@ -35,7 +35,7 @@ describe "Chatterbot::DB" do
|
|
35
35
|
[:blacklist, :tweets, :config].each do |table|
|
36
36
|
it "should create table #{table}" do
|
37
37
|
@tmp_conn = @bot.db
|
38
|
-
@tmp_conn.tables.include?(table).
|
38
|
+
expect(@tmp_conn.tables.include?(table)).to eq(true)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -46,7 +46,7 @@ describe "Chatterbot::DB" do
|
|
46
46
|
@bot.config[:db_uri] = @db_uri
|
47
47
|
|
48
48
|
@bot.db
|
49
|
-
@bot.store_database_config.
|
49
|
+
expect(@bot.store_database_config).to eq(true)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
data/spec/dsl_spec.rb
CHANGED
@@ -6,28 +6,28 @@ describe "Chatterbot::DSL" do
|
|
6
6
|
@bot = double(Chatterbot::Bot, :config => {})
|
7
7
|
@bot.send :require, 'chatterbot/dsl'
|
8
8
|
|
9
|
-
Chatterbot::DSL.
|
9
|
+
allow(Chatterbot::DSL).to receive(:bot).and_return(@bot)
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "client" do
|
13
13
|
it "returns the bot object" do
|
14
|
-
client.
|
14
|
+
expect(client).to eql(@bot.client)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "blacklist" do
|
19
19
|
it "#blacklist passes along to bot object" do
|
20
|
-
@bot.
|
20
|
+
expect(@bot).to receive(:blacklist=).with(["foo"])
|
21
21
|
blacklist ["foo"]
|
22
22
|
end
|
23
23
|
|
24
24
|
it "#blacklist turns single-string arg into an array" do
|
25
|
-
@bot.
|
25
|
+
expect(@bot).to receive(:blacklist=).with(["foo"])
|
26
26
|
blacklist "foo"
|
27
27
|
end
|
28
28
|
|
29
29
|
it "#blacklist turns comma-delimited string arg into an array" do
|
30
|
-
@bot.
|
30
|
+
expect(@bot).to receive(:blacklist=).with(["foo", "bar"])
|
31
31
|
blacklist "foo, bar"
|
32
32
|
end
|
33
33
|
end
|
@@ -35,117 +35,164 @@ describe "Chatterbot::DSL" do
|
|
35
35
|
[:no_update, :debug_mode, :verbose].each do |method|
|
36
36
|
describe method.to_s do
|
37
37
|
it "#{method.to_s} with nil passes along true to bot object" do
|
38
|
-
@bot.
|
38
|
+
expect(@bot).to receive("#{method.to_s}=").with(true)
|
39
39
|
send method
|
40
40
|
end
|
41
41
|
|
42
42
|
it "#debug_mode with false is passed" do
|
43
|
-
@bot.
|
43
|
+
expect(@bot).to receive("#{method.to_s}=").with(false)
|
44
44
|
send method, false
|
45
45
|
end
|
46
46
|
|
47
47
|
it "#debug_mode with true is passed" do
|
48
|
-
@bot.
|
48
|
+
expect(@bot).to receive("#{method.to_s}=").with(true)
|
49
49
|
send method, true
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
it "#badwords returns an array" do
|
55
|
+
expect(bad_words).to be_a(Array)
|
56
|
+
end
|
57
|
+
|
54
58
|
describe "exclude" do
|
55
59
|
it "#exclude passes along to bot object" do
|
56
|
-
@bot.
|
60
|
+
expect(@bot).to receive(:exclude=).with(["foo"])
|
57
61
|
exclude ["foo"]
|
58
62
|
end
|
59
63
|
|
60
64
|
it "#exclude turns single-string arg into an array" do
|
61
|
-
@bot.
|
65
|
+
expect(@bot).to receive(:exclude=).with(["foo"])
|
62
66
|
exclude "foo"
|
63
67
|
end
|
64
68
|
|
65
69
|
it "#exclude turns comma-delimited string arg into an array" do
|
66
|
-
@bot.
|
70
|
+
expect(@bot).to receive(:exclude=).with(["foo", "bar"])
|
67
71
|
exclude "foo, bar"
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
71
75
|
describe "search" do
|
72
76
|
it "passes along to bot object" do
|
73
|
-
@bot.
|
77
|
+
expect(@bot).to receive(:search).with("foo", { })
|
74
78
|
search("foo")
|
75
79
|
end
|
76
80
|
|
77
81
|
it "passes multiple queries along to bot object" do
|
78
|
-
@bot.
|
82
|
+
expect(@bot).to receive(:search).with(["foo","bar"], { })
|
79
83
|
search(["foo","bar"])
|
80
84
|
end
|
81
85
|
end
|
82
86
|
|
87
|
+
describe "streaming" do
|
88
|
+
it "passes along to bot object" do
|
89
|
+
expect(@bot).to receive(:do_streaming)
|
90
|
+
streaming {}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
|
83
95
|
it "#retweet passes along to bot object" do
|
84
|
-
@bot.
|
96
|
+
expect(@bot).to receive(:retweet).with(1234)
|
85
97
|
retweet(1234)
|
86
98
|
end
|
87
99
|
|
100
|
+
it "#favorite passes along to bot object" do
|
101
|
+
expect(@bot).to receive(:favorite).with(1234)
|
102
|
+
favorite(1234)
|
103
|
+
end
|
104
|
+
|
88
105
|
it "#replies passes along to bot object" do
|
89
|
-
@bot.
|
106
|
+
expect(@bot).to receive(:replies)
|
90
107
|
replies
|
91
108
|
end
|
92
109
|
|
110
|
+
it "#streaming_tweets passes along to bot object" do
|
111
|
+
expect(@bot).to receive(:streaming_tweets)
|
112
|
+
streaming_tweets
|
113
|
+
end
|
114
|
+
|
93
115
|
it "#followers passes along to bot object" do
|
94
|
-
@bot.
|
116
|
+
expect(@bot).to receive(:followers)
|
95
117
|
followers
|
96
118
|
end
|
97
119
|
|
120
|
+
it "#follow passes along to bot object" do
|
121
|
+
expect(@bot).to receive(:follow).with(1234)
|
122
|
+
follow(1234)
|
123
|
+
end
|
124
|
+
|
98
125
|
it "#tweet passes along to bot object" do
|
99
|
-
@bot.
|
126
|
+
expect(@bot).to receive(:tweet).with("hello sailor!", {:foo => "bar" }, nil)
|
100
127
|
tweet "hello sailor!", {:foo => "bar"}
|
101
128
|
end
|
102
129
|
|
103
130
|
it "#reply passes along to bot object" do
|
104
|
-
@bot.
|
131
|
+
expect(@bot).to receive(:reply).with("hello sailor!", { :source => "source "})
|
105
132
|
reply "hello sailor!", { :source => "source "}
|
106
133
|
end
|
107
134
|
|
135
|
+
it "#profile_text setter passes along to bot object" do
|
136
|
+
expect(@bot).to receive(:profile_text).with("hello sailor!")
|
137
|
+
profile_text "hello sailor!"
|
138
|
+
end
|
139
|
+
|
140
|
+
it "#profile_text getter passes along to bot object" do
|
141
|
+
expect(@bot).to receive(:profile_text)
|
142
|
+
profile_text
|
143
|
+
end
|
144
|
+
|
145
|
+
it "#profile_website passes along to bot object" do
|
146
|
+
expect(@bot).to receive(:profile_website).with("http://hellosailor.com")
|
147
|
+
profile_website "http://hellosailor.com"
|
148
|
+
end
|
149
|
+
|
150
|
+
it "#profile_website getter passes along to bot object" do
|
151
|
+
expect(@bot).to receive(:profile_website)
|
152
|
+
profile_website
|
153
|
+
end
|
154
|
+
|
108
155
|
context "setters" do
|
109
156
|
[:consumer_secret, :consumer_key, :token, :secret].each do |k|
|
110
157
|
it "should be able to set #{k}" do
|
111
158
|
send(k, "foo")
|
112
|
-
@bot.config[k].
|
159
|
+
expect(@bot.config[k]).to eq("foo")
|
113
160
|
end
|
114
161
|
end
|
115
162
|
end
|
116
163
|
|
117
164
|
describe "update_config" do
|
118
165
|
it "should pass to bot object" do
|
119
|
-
@bot.
|
166
|
+
expect(@bot).to receive(:update_config)
|
120
167
|
update_config
|
121
168
|
end
|
122
169
|
end
|
123
170
|
|
124
171
|
describe "since_id" do
|
125
172
|
it "should pass to bot object" do
|
126
|
-
@bot.
|
127
|
-
since_id.
|
173
|
+
expect(@bot).to receive(:config).and_return({:since_id => 1234})
|
174
|
+
expect(since_id).to eq(1234)
|
128
175
|
end
|
129
176
|
|
130
177
|
it "can be set" do
|
131
178
|
since_id(1234)
|
132
|
-
@bot.config[:since_id].
|
179
|
+
expect(@bot.config[:since_id]).to eq(1234)
|
133
180
|
end
|
134
181
|
end
|
135
182
|
|
136
183
|
describe "since_id_reply" do
|
137
184
|
it "should pass to bot object" do
|
138
|
-
@bot.
|
139
|
-
since_id_reply.
|
185
|
+
expect(@bot).to receive(:config).and_return({:since_id_reply => 1234})
|
186
|
+
expect(since_id_reply).to eq(1234)
|
140
187
|
end
|
141
188
|
end
|
142
189
|
|
143
190
|
describe "db" do
|
144
191
|
it "should pass to bot object" do
|
145
192
|
bot_db = double(Object)
|
146
|
-
@bot.
|
193
|
+
expect(@bot).to receive(:db).and_return(bot_db)
|
147
194
|
|
148
|
-
db.
|
195
|
+
expect(db).to eql(bot_db)
|
149
196
|
end
|
150
197
|
end
|
151
198
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Chatterbot::Favorite" do
|
4
|
+
describe "#favorite" do
|
5
|
+
before(:each) do
|
6
|
+
@bot = test_bot
|
7
|
+
@t = Twitter::Tweet.new(:id => 7890, :text => "something awesome that you should fave")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "calls require_login" do
|
11
|
+
expect(@bot).to receive(:require_login).and_return(false)
|
12
|
+
@bot.favorite @t
|
13
|
+
end
|
14
|
+
|
15
|
+
context "data" do
|
16
|
+
before(:each) do
|
17
|
+
expect(@bot).to receive(:require_login).and_return(true)
|
18
|
+
allow(@bot).to receive(:client).and_return(double(Twitter::Client))
|
19
|
+
|
20
|
+
allow(@bot).to receive(:debug_mode?).and_return(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "calls client.favorite with an id" do
|
24
|
+
expect(@bot.client).to receive(:favorite).with(7890)
|
25
|
+
@bot.favorite(@t.id)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "calls client.retweet with a tweet" do
|
29
|
+
expect(@bot.client).to receive(:favorite).with(7890)
|
30
|
+
@bot.favorite(@t)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/followers_spec.rb
CHANGED
@@ -1,19 +1,40 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Chatterbot::Followers" do
|
4
|
-
|
5
|
-
bot = test_bot
|
6
|
-
bot.should_receive(:require_login).and_return(false)
|
7
|
-
bot.followers
|
4
|
+
before(:each) do
|
5
|
+
@bot = test_bot
|
8
6
|
end
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
describe "followers" do
|
9
|
+
it "calls require_login" do
|
10
|
+
expect(@bot).to receive(:require_login).and_return(false)
|
11
|
+
@bot.followers
|
12
|
+
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
it "returns followers" do
|
15
|
+
expect(@bot).to receive(:require_login).and_return(true)
|
16
|
+
allow(@bot).to receive(:client).and_return(fake_followers(3))
|
17
|
+
|
18
|
+
result = @bot.followers
|
19
|
+
expect(result.size).to eq(3)
|
20
|
+
expect(result[0].name).to eq("Follower 1")
|
21
|
+
end
|
18
22
|
end
|
23
|
+
|
24
|
+
describe "follow" do
|
25
|
+
it "calls require_login" do
|
26
|
+
expect(@bot).to receive(:require_login).and_return(false)
|
27
|
+
@bot.follow(1234)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "works" do
|
31
|
+
expect(@bot).to receive(:require_login).and_return(true)
|
32
|
+
allow(@bot).to receive(:client).and_return(double(Twitter::Client))
|
33
|
+
expect(@bot.client).to receive(:follow).with(1234)
|
34
|
+
|
35
|
+
@bot.follow(1234)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
19
40
|
end
|
data/spec/helpers_spec.rb
CHANGED
@@ -3,20 +3,20 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Chatterbot::Helpers" do
|
4
4
|
it "#tweet_user works with [:from_user]" do
|
5
5
|
bot = Chatterbot::Bot.new
|
6
|
-
bot.tweet_user({:from_user => "foo"}).
|
7
|
-
bot.tweet_user({:from_user => "@foo"}).
|
6
|
+
expect(bot.tweet_user({:from_user => "foo"})).to eq("@foo")
|
7
|
+
expect(bot.tweet_user({:from_user => "@foo"})).to eq("@foo")
|
8
8
|
end
|
9
9
|
|
10
10
|
it "#tweet_user works with [:user][:screen_name]" do
|
11
11
|
bot = Chatterbot::Bot.new
|
12
|
-
bot.tweet_user({:user => {:screen_name => "foo"}}).
|
13
|
-
bot.tweet_user({:user => {:screen_name => "@foo"}}).
|
12
|
+
expect(bot.tweet_user({:user => {:screen_name => "foo"}})).to eq("@foo")
|
13
|
+
expect(bot.tweet_user({:user => {:screen_name => "@foo"}})).to eq("@foo")
|
14
14
|
end
|
15
15
|
|
16
16
|
it "#tweet_user works with string" do
|
17
17
|
bot = Chatterbot::Bot.new
|
18
|
-
bot.tweet_user("foo").
|
19
|
-
bot.tweet_user("@foo").
|
18
|
+
expect(bot.tweet_user("foo")).to eq("@foo")
|
19
|
+
expect(bot.tweet_user("@foo")).to eq("@foo")
|
20
20
|
end
|
21
21
|
|
22
22
|
describe "#from_user" do
|
@@ -25,15 +25,21 @@ describe "Chatterbot::Helpers" do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should accept strings" do
|
28
|
-
@bot.from_user("x").
|
28
|
+
expect(@bot.from_user("x")).to eq("x")
|
29
29
|
end
|
30
30
|
|
31
|
-
it "should accept
|
32
|
-
|
31
|
+
it "should accept tweet" do
|
32
|
+
t = Twitter::Tweet.new(:id => 123, :text => 'Tweet text.', :user => {:id => 123, :screen_name => "x"})
|
33
|
+
expect(@bot.from_user(t)).to eq("x")
|
33
34
|
end
|
34
35
|
|
36
|
+
it "should accept user" do
|
37
|
+
u = Twitter::User.new(:id => 123, :name => "x")
|
38
|
+
expect(@bot.from_user(fake_user("x"))).to eq("x")
|
39
|
+
end
|
40
|
+
|
35
41
|
it "should accept :screen_name" do
|
36
|
-
@bot.from_user(:user => {:screen_name => "x"}).
|
42
|
+
expect(@bot.from_user(:user => {:screen_name => "x"})).to eq("x")
|
37
43
|
end
|
38
44
|
end
|
39
45
|
|
@@ -41,28 +47,27 @@ describe "Chatterbot::Helpers" do
|
|
41
47
|
before(:each) do
|
42
48
|
class TestBot < Chatterbot::Bot; end
|
43
49
|
@bot = Chatterbot::Bot.new
|
44
|
-
#@bot.client = mock(Object)
|
45
50
|
end
|
46
51
|
|
47
52
|
it "can set botname" do
|
48
53
|
@bot = TestBot.new
|
49
54
|
@bot.botname = "foo"
|
50
|
-
@bot.botname.
|
55
|
+
expect(@bot.botname).to eq("foo")
|
51
56
|
end
|
52
57
|
|
53
58
|
it "calls botname smartly for inherited classes" do
|
54
59
|
@bot2 = TestBot.new
|
55
|
-
@bot2.botname.
|
60
|
+
expect(@bot2.botname).to eq("testbot")
|
56
61
|
end
|
57
62
|
|
58
63
|
it "calls botname for non-inherited bots" do
|
59
|
-
File.
|
60
|
-
@bot.botname.
|
64
|
+
expect(File).to receive(:basename).and_return("bot")
|
65
|
+
expect(@bot.botname).to eq("bot")
|
61
66
|
end
|
62
67
|
|
63
68
|
it "uses specified name" do
|
64
69
|
@bot = Chatterbot::Bot.new(:name => 'xyzzy')
|
65
|
-
@bot.botname.
|
70
|
+
expect(@bot.botname).to eq("xyzzy")
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
@@ -73,16 +78,16 @@ describe "Chatterbot::Helpers" do
|
|
73
78
|
end
|
74
79
|
|
75
80
|
it "should replace username by calling tweet_user" do
|
76
|
-
@bot.
|
77
|
-
@bot.replace_variables("#USER#", @tweet).
|
81
|
+
expect(@bot).to receive(:tweet_user).and_return("@foobar")
|
82
|
+
expect(@bot.replace_variables("#USER#", @tweet)).to eq("@foobar")
|
78
83
|
end
|
79
84
|
|
80
85
|
it "should be fine with not replacing anything" do
|
81
|
-
@bot.replace_variables("foobar", @tweet).
|
86
|
+
expect(@bot.replace_variables("foobar", @tweet)).to eq("foobar")
|
82
87
|
end
|
83
88
|
|
84
89
|
it "should be fine without a tweet" do
|
85
|
-
@bot.replace_variables("foobar").
|
90
|
+
expect(@bot.replace_variables("foobar")).to eq("foobar")
|
86
91
|
end
|
87
92
|
end
|
88
93
|
end
|