chatterbot 1.0.2 → 2.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,96 +0,0 @@
|
|
1
|
-
|
2
|
-
class StreamingHandler
|
3
|
-
attr_reader :tweet_handler
|
4
|
-
attr_reader :favorite_handler
|
5
|
-
attr_reader :dm_handler
|
6
|
-
attr_reader :follow_handler
|
7
|
-
attr_reader :delete_handler
|
8
|
-
attr_reader :friends_handler
|
9
|
-
attr_reader :search_filter
|
10
|
-
|
11
|
-
attr_accessor :opts
|
12
|
-
|
13
|
-
def initialize(bot, opts = {})
|
14
|
-
@bot = bot
|
15
|
-
@opts = opts
|
16
|
-
end
|
17
|
-
|
18
|
-
def bot
|
19
|
-
@bot
|
20
|
-
end
|
21
|
-
|
22
|
-
def config
|
23
|
-
bot.config
|
24
|
-
end
|
25
|
-
|
26
|
-
# filter, firehose, sample, user
|
27
|
-
def endpoint
|
28
|
-
opts[:endpoint] || :user
|
29
|
-
end
|
30
|
-
|
31
|
-
def search(query, opts = {}, &block)
|
32
|
-
@search_filter = query
|
33
|
-
@search_opts = opts
|
34
|
-
apply_main_block(&block) if block_given?
|
35
|
-
end
|
36
|
-
|
37
|
-
def user(&block)
|
38
|
-
apply_main_block(&block)
|
39
|
-
end
|
40
|
-
alias_method :replies, :user
|
41
|
-
alias_method :timeline, :user
|
42
|
-
alias_method :sample, :user
|
43
|
-
alias_method :filter, :user
|
44
|
-
|
45
|
-
def favorited(&block)
|
46
|
-
@favorite_handler = block
|
47
|
-
end
|
48
|
-
|
49
|
-
def direct_message(&block)
|
50
|
-
@dm_handler = block
|
51
|
-
end
|
52
|
-
|
53
|
-
def followed(&block)
|
54
|
-
@follow_handler = block
|
55
|
-
end
|
56
|
-
|
57
|
-
def delete(&block)
|
58
|
-
@delete_handler = block
|
59
|
-
end
|
60
|
-
|
61
|
-
def friends(&block)
|
62
|
-
@friends_handler = block
|
63
|
-
end
|
64
|
-
|
65
|
-
def connection_params
|
66
|
-
opts = {
|
67
|
-
#:with => 'followings',
|
68
|
-
#:replies => false,
|
69
|
-
:stall_warnings => false
|
70
|
-
}.merge(@opts)
|
71
|
-
|
72
|
-
opts.delete(:endpoint)
|
73
|
-
|
74
|
-
# convert true/false to strings
|
75
|
-
opts.each { |k, v| opts[k] = v.to_s }
|
76
|
-
|
77
|
-
if @search_filter
|
78
|
-
opts[:track] = @search_filter
|
79
|
-
end
|
80
|
-
|
81
|
-
opts
|
82
|
-
end
|
83
|
-
|
84
|
-
def apply_main_block(&block)
|
85
|
-
if !@tweet_handler.nil?
|
86
|
-
warn "WARNING: when using streaming, you may only have one block of user/replies/timeline/sample/filter"
|
87
|
-
raise RuntimeError, 'Unable to load bot'
|
88
|
-
end
|
89
|
-
@tweet_handler = block
|
90
|
-
end
|
91
|
-
|
92
|
-
|
93
|
-
def apply(block)
|
94
|
-
instance_exec &block
|
95
|
-
end
|
96
|
-
end
|
data/lib/chatterbot/whitelist.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module Chatterbot
|
2
|
-
|
3
|
-
#
|
4
|
-
# methods for only tweeting to users on a specific list
|
5
|
-
module Whitelist
|
6
|
-
attr_accessor :whitelist
|
7
|
-
|
8
|
-
# A list of Twitter users that we can communicate with
|
9
|
-
def whitelist
|
10
|
-
@whitelist || []
|
11
|
-
end
|
12
|
-
|
13
|
-
def whitelist=(b)
|
14
|
-
@whitelist = b
|
15
|
-
@whitelist = @whitelist.flatten.collect { |e|
|
16
|
-
(e.is_a?(Twitter::User) ? from_user(e) : e).downcase
|
17
|
-
}
|
18
|
-
@whitelist
|
19
|
-
end
|
20
|
-
|
21
|
-
def has_whitelist?
|
22
|
-
!whitelist.empty?
|
23
|
-
end
|
24
|
-
|
25
|
-
#
|
26
|
-
# Is this tweet from a user on our whitelist?
|
27
|
-
def on_whitelist?(s)
|
28
|
-
search = (s.respond_to?(:user) ? from_user(s) : s).downcase
|
29
|
-
whitelist.any? { |b| search.include?(b.downcase) }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/spec/blacklist_spec.rb
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "Chatterbot::Blacklist" do
|
4
|
-
it "has a list of excluded phrases" do
|
5
|
-
@bot = test_bot
|
6
|
-
@bot.exclude = ["junk", "i hate bots", "foobar", "spam"]
|
7
|
-
expect(@bot.skip_me?("did you know that i hate bots?")).to eq(true)
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "skip_me?" do
|
11
|
-
before(:each) do
|
12
|
-
@bot = test_bot
|
13
|
-
@bot.exclude = ["junk", "i hate bots", "foobar", "spam"]
|
14
|
-
end
|
15
|
-
|
16
|
-
it "blocks tweets with phrases we don't want" do
|
17
|
-
expect(@bot.skip_me?("did you know that i hate bots?")).to eq(true)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "isn't case-specific" do
|
21
|
-
expect(@bot.skip_me?("DID YOU KNOW THAT I HATE BOTS?")).to eq(true)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "allows users we do want" do
|
25
|
-
expect(@bot.skip_me?("a tweet without any bad content")).to eq(false)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "works with result hashes" do
|
29
|
-
expect(@bot.skip_me?(Twitter::Tweet.new(:id => 1, :text => "did you know that i hate bots?"))).to eq(true)
|
30
|
-
expect(@bot.skip_me?(Twitter::Tweet.new(:id => 1, :text => "a tweet without any bad content"))).to eq(false)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "on_blacklist?" do
|
35
|
-
before(:each) do
|
36
|
-
@bot = test_bot
|
37
|
-
@bot.blacklist = ["skippy", "blippy", "dippy"]
|
38
|
-
end
|
39
|
-
|
40
|
-
it "blocks users we don't want" do
|
41
|
-
expect(@bot.on_blacklist?("skippy")).to eq(true)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "allows users we do want" do
|
45
|
-
expect(@bot.on_blacklist?("flippy")).to eq(false)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "isn't case-specific" do
|
49
|
-
expect(@bot.on_blacklist?("FLIPPY")).to eq(false)
|
50
|
-
expect(@bot.on_blacklist?("SKIPPY")).to eq(true)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "works with result hashes" do
|
54
|
-
expect(@bot.on_blacklist?(Twitter::Tweet.new(:id => 1,
|
55
|
-
:user => {:id => 1, :screen_name => "skippy"}))).to eq(true)
|
56
|
-
expect(@bot.on_blacklist?(Twitter::Tweet.new(:id => 1,
|
57
|
-
:user => {:id => 1, :screen_name => "flippy"}))).to eq(false)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe "on_global_blacklist?" do
|
62
|
-
before(:each) do
|
63
|
-
@bot = test_bot
|
64
|
-
end
|
65
|
-
|
66
|
-
it "doesn't freak out if no db" do
|
67
|
-
expect(@bot).to receive(:has_db?).and_return(false)
|
68
|
-
expect(@bot.on_global_blacklist?("foobar")).to eq(false)
|
69
|
-
end
|
70
|
-
|
71
|
-
it "collects name from the db if it exists" do
|
72
|
-
allow(@bot).to receive(:has_db?).and_return(true)
|
73
|
-
blacklist_table = double(Object)
|
74
|
-
double_dataset = double(Object, {:count => 1})
|
75
|
-
expect(blacklist_table).to receive(:where).
|
76
|
-
with({ :user => "a"}).
|
77
|
-
and_return( double_dataset )
|
78
|
-
|
79
|
-
|
80
|
-
missing_dataset = double(Object, {:count => 0})
|
81
|
-
expect(blacklist_table).to receive(:where).
|
82
|
-
with({ :user => "b"}).
|
83
|
-
and_return( missing_dataset )
|
84
|
-
|
85
|
-
allow(@bot).to receive(:db).and_return({
|
86
|
-
:blacklist => blacklist_table
|
87
|
-
})
|
88
|
-
expect(@bot.on_global_blacklist?("a")).to eq(true)
|
89
|
-
expect(@bot.on_global_blacklist?("b")).to eq(false)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
describe "db interaction" do
|
95
|
-
before(:each) do
|
96
|
-
# @db_tmp = Tempfile.new("blacklist.db")
|
97
|
-
@db_uri = "sqlite:/"
|
98
|
-
|
99
|
-
@bot = Chatterbot::Bot.new
|
100
|
-
@bot.config[:db_uri] = @db_uri
|
101
|
-
@bot.db
|
102
|
-
end
|
103
|
-
|
104
|
-
describe "add_to_blacklist" do
|
105
|
-
it "adds to the blacklist table" do
|
106
|
-
@bot.add_to_blacklist("tester")
|
107
|
-
end
|
108
|
-
|
109
|
-
it "doesn't add a double entry" do
|
110
|
-
@bot.add_to_blacklist("tester")
|
111
|
-
@bot.add_to_blacklist("tester")
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
data/spec/db_spec.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
#require 'sequel'
|
4
|
-
|
5
|
-
describe "Chatterbot::DB" do
|
6
|
-
before(:each) do
|
7
|
-
@db_uri = "sqlite:/tmp/chatterbot.db"
|
8
|
-
File.delete("/tmp/chatterbot.db") if File.exist?("/tmp/chatterbot.db")
|
9
|
-
end
|
10
|
-
|
11
|
-
context "prerequisites" do
|
12
|
-
describe "get_connection" do
|
13
|
-
it "should make sure sequel is actually installed" do
|
14
|
-
allow_any_instance_of(Chatterbot::Bot).to receive(:has_sequel?) { false }
|
15
|
-
@bot = Chatterbot::Bot.new
|
16
|
-
@bot.config[:db_uri] = @db_uri
|
17
|
-
expect(@bot).to receive(:display_db_config_notice)
|
18
|
-
@bot.db
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "db interactions" do
|
24
|
-
before(:each) do
|
25
|
-
@bot = Chatterbot::Bot.new
|
26
|
-
allow(@bot).to receive(:update_config_at_exit)
|
27
|
-
@bot.config[:db_uri] = @db_uri
|
28
|
-
end
|
29
|
-
|
30
|
-
after(:each) do
|
31
|
-
@bot.db.disconnect unless @bot.db.nil?
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "table creation" do
|
35
|
-
[:blacklist, :tweets, :config].each do |table|
|
36
|
-
it "should create table #{table}" do
|
37
|
-
@tmp_conn = @bot.db
|
38
|
-
expect(@tmp_conn.tables.include?(table)).to eq(true)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "store_database_config" do
|
44
|
-
it "doesn't fail" do
|
45
|
-
@bot = Chatterbot::Bot.new
|
46
|
-
@bot.config[:db_uri] = @db_uri
|
47
|
-
|
48
|
-
@bot.db
|
49
|
-
expect(@bot.store_database_config).to eq(true)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "Chatterbot::StreamingHandler" do
|
4
|
-
let(:bot) { test_bot }
|
5
|
-
let(:handler) { StreamingHandler.new(test_bot) }
|
6
|
-
|
7
|
-
def apply_to_handler(&block)
|
8
|
-
handler.apply block
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "endpoint" do
|
12
|
-
it "should default to :user" do
|
13
|
-
expect(handler.endpoint).to eql(:user)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should pull from opts" do
|
17
|
-
expect(StreamingHandler.new(test_bot, {:endpoint => :bar}).endpoint).to eql(:bar)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should set search query" do
|
22
|
-
apply_to_handler { search 'foo' }
|
23
|
-
expect(handler.search_filter).to eql('foo')
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should set tweet_handler" do
|
27
|
-
apply_to_handler { replies {'bar'} }
|
28
|
-
expect(handler.tweet_handler.call).to eql('bar')
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should set favorited_handler" do
|
32
|
-
apply_to_handler { favorited {'bar'} }
|
33
|
-
expect(handler.favorite_handler.call).to eql('bar')
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should set dm_handler" do
|
37
|
-
apply_to_handler { direct_message {'bar'} }
|
38
|
-
expect(handler.dm_handler.call).to eql('bar')
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should set follow_handler" do
|
42
|
-
apply_to_handler { followed {'bar'} }
|
43
|
-
expect(handler.follow_handler.call).to eql('bar')
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should set delete_handler" do
|
47
|
-
apply_to_handler { delete {'bar'} }
|
48
|
-
expect(handler.delete_handler.call).to eql('bar')
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should set friends_handler" do
|
52
|
-
apply_to_handler { friends {'bar'} }
|
53
|
-
expect(handler.friends_handler.call).to eql('bar')
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should pull config from bot" do
|
57
|
-
expect(handler.bot).to receive(:config).and_return('config')
|
58
|
-
expect(handler.config).to eql('config')
|
59
|
-
end
|
60
|
-
|
61
|
-
it "limits to one main block type" do
|
62
|
-
apply_to_handler { replies {'bar'} }
|
63
|
-
expect{
|
64
|
-
apply_to_handler { replies {'bar'} }
|
65
|
-
}.to raise_error(RuntimeError)
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "connection_params" do
|
69
|
-
it "has defaults" do
|
70
|
-
expect(handler.connection_params[:stall_warnings]).to eql("false")
|
71
|
-
end
|
72
|
-
|
73
|
-
it "applies search filter" do
|
74
|
-
apply_to_handler { search 'foo' }
|
75
|
-
expect(handler.connection_params[:track]).to eql("foo")
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|