streambot 0.2.5 → 0.3.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.
data/README.rdoc CHANGED
@@ -1,28 +1,37 @@
1
1
  = streambot
2
2
 
3
- streambot is using tweetstream (http://github.com/intridea/tweetstream) for simple access to twitter streaming api
3
+ streambot is using tweetstream[http://github.com/intridea/tweetstream] for simple access to twitter streaming api
4
4
 
5
5
  == Installation
6
6
 
7
- the streambot gem is available on rubygems.org - http://rubygems.org/gems/streambot
8
-
9
- gem install streambot
7
+ the streambot gem is available on rubygems.org[http://rubygems.org/gems/streambot]
8
+ to get streambot installed, you simply need to run
10
9
 
10
+ gem install streambot
11
+
11
12
  == Usage
12
13
 
13
14
  require 'streambot'
14
15
 
15
16
  @auth = {:username=>'username',:password=>'password'}
16
17
  @blacklist = ['mac_rt','apple_rt']
17
- bot = StreamBot.new(@auth, @blacklist, 'apple','ipad','iphone os 4','steve jobs')
18
+ bot = StreamBot::Tracker.new(@auth, @blacklist, 'apple','ipad','iphone os 4','steve jobs')
18
19
  bot.start
19
20
 
20
- == Todo
21
+
22
+ == Contribution
23
+ === Testing
24
+
25
+ All Tests should inherit from StreamBot::BaseTest
21
26
 
22
- All todos are listed in issue-tracker and labeled with todo (http://github.com/gr4y/streambot/issues/labels/todo)
27
+ === Feature Requests / Issues
28
+
29
+ If you ran into some errors? Then don't be shy and file an issue in the issue-tracker[http://github.com/gr4y/streambot/issues]
30
+ Maybe you have a feature request then file an issue too.
23
31
 
24
- == Note on Patches/Pull Requests
25
-
32
+ === Note on Patches/Pull Requests
33
+
34
+ You want to add a feature or you want to patch streambot?
26
35
  * Fork the project.
27
36
  * Make your feature addition or bug fix.
28
37
  * Add tests for it. This is important so I don't break it in a
@@ -33,4 +42,4 @@ All todos are listed in issue-tracker and labeled with todo (http://github.com/g
33
42
 
34
43
  == Copyright
35
44
 
36
- Copyright (c) 2010 Sascha Wessel. See LICENSE for details.
45
+ Copyright (c) 2010 Sascha Wessel. See LICENSE for details.
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ begin
10
10
  gem.email = "swessel@gr4yweb.de"
11
11
  gem.homepage = "http://github.com/gr4y/streambot"
12
12
  gem.authors = ["Sascha Wessel"]
13
+ gem.post_install_message = File.exist?('USAGE.rdoc') ? File.read('USAGE.rdoc') : ""
13
14
  gem.require_path = 'lib'
14
15
  gem.files = %w(Rakefile) + Dir.glob("{lib}/**/*")
15
16
 
@@ -17,6 +18,7 @@ begin
17
18
  gem.add_dependency "tweetstream",">= 1.0.4"
18
19
  gem.add_development_dependency "webmock",">= 1.0.0"
19
20
  gem.add_development_dependency "rcov",">= 0.9.8"
21
+
20
22
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
21
23
  end
22
24
  rescue LoadError
data/lib/streambot.rb CHANGED
@@ -1,36 +1,15 @@
1
1
  require 'rubygems'
2
+ require 'open-uri'
3
+ require 'net/http'
2
4
  require 'tweetstream'
3
- require 'retweet'
5
+ require 'logger'
4
6
 
5
- # The StreamBot class that provides a start and a stop method
6
- class StreamBot
7
-
8
- # the initialization method aka the constructor
9
- def initialize(auth, blacklist, *keywords)
10
- @stream = TweetStream::Client.new(auth[:username],auth[:password])
11
- # initializing retweet
12
- @retweet = Retweet.new(auth) #
13
- # get string with keywords comma separated keywords
14
- @keywords=keywords.join(',')
15
- # set blacklist array if not nil
16
- @blacklist=blacklist
17
- end
18
-
19
- # start the bot
20
- def start
21
- # starting to track the keywords via tweetstream
22
- @stream.track(@keywords) do |status|
23
- # if status.user is NOT in blacklist then retweet it
24
- if !@blacklist.include?(status.user.screen_name)
25
- #puts "#{status.text} ##{status.id}"
26
- @retweet.retweet(status.id)
27
- end
28
- end
29
- end
30
-
31
- # stop the bot
32
- def stop
33
- @stream.stop
34
- end
35
-
36
- end
7
+ require 'streambot/tracker'
8
+ require 'streambot/retweet'
9
+ require 'streambot/http'
10
+
11
+ module StreamBot
12
+ LOG = Logger.new(STDOUT)
13
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
14
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
15
+ end
@@ -0,0 +1,28 @@
1
+ module StreamBot
2
+ # http communication wrapper
3
+ class HTTP
4
+ # initialize request with basic authentication and send
5
+ def post_with_auth(auth, url)
6
+ uri = URI.parse(url)
7
+ request = init_request(uri)
8
+ request.basic_auth auth[:username], auth[:password]
9
+ post_request(request, uri)
10
+ end
11
+
12
+ private
13
+ # send request
14
+ def post_request(request, url)
15
+ Net::HTTP.new(url.host, url.port).start do |http|
16
+ LOG.debug("#{http.inspect}")
17
+ http.request(request)
18
+ end
19
+ end
20
+
21
+ # initialize an Net::HTTP::Post Request
22
+ def init_request(url)
23
+ LOG.debug("#{self.class}#init_request(#{url})")
24
+ puts url.inspect
25
+ Net::HTTP::Post.new(url.path)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ module StreamBot
2
+ # wrapper class for dealing with twitters native retweet api
3
+ class Retweet
4
+ # api base url
5
+ $BASE_URL = "http://api.twitter.com/1/"
6
+
7
+ # intitialize method aka constructor
8
+ def initialize(auth)
9
+ @auth = auth
10
+ @http = StreamBot::HTTP.new
11
+ end
12
+
13
+ # retweets the status with given id
14
+ def retweet(id)
15
+ LOG.debug("#{self.class}#retweet")
16
+ res = @http.post_with_auth(@auth, "#{$BASE_URL}statuses/retweet/#{id}.json")
17
+ case res
18
+ when Net::HTTPSuccess then return res
19
+ else
20
+ res.error!
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ module StreamBot
2
+ # The Tracker class that provides a start and a stop method
3
+ class Tracker
4
+ # the initialization method aka the constructor
5
+ def initialize(auth, blacklist, *keywords)
6
+ LOG.debug("#{self.class}#initialize")
7
+ @stream = TweetStream::Client.new(auth[:username],auth[:password])
8
+ # initializing retweet
9
+ @retweet = StreamBot::Retweet.new(auth) #
10
+ # get string with keywords comma separated keywords
11
+ @keywords=keywords.join(',')
12
+ # set blacklist array if not nil
13
+ @blacklist=blacklist
14
+ end
15
+
16
+ # start the bot
17
+ def start
18
+ LOG.debug("#{self.class}#start")
19
+ # starting to track the keywords via tweetstream
20
+ @stream.track(@keywords) do |status|
21
+ username = status.user.screen_name
22
+ # if status.user is NOT in blacklist then retweet it
23
+ if !@blacklist.include?(username)
24
+ LOG.debug("#{self.class}#start - retweet ##{status.id} from @#{username}")
25
+ @retweet.retweet(status.id)
26
+ end
27
+ end
28
+ end
29
+
30
+ # stop the bot
31
+ def stop
32
+ @stream.stop
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'webmock'
4
+ require 'yaml'
5
+ include WebMock
6
+
7
+ require 'streambot'
8
+
9
+ module StreamBot
10
+ # The base of all tests in this projet
11
+ #
12
+ # class TestName < StreamBot::BaseTest
13
+ #
14
+ # def setup
15
+ # super
16
+ # # implementation goes here
17
+ # end
18
+ # end
19
+ class BaseTest < Test::Unit::TestCase
20
+
21
+ # reading config.yml and assign all keys to instance
22
+ def read_config
23
+ yml_config = YAML.load_file(File.dirname(__FILE__) + "/config.yml")
24
+ yml_config.each do |key, value|
25
+ instance_variable_set("@#{key}", value)
26
+ end
27
+ end
28
+
29
+ # :nodoc:
30
+ def setup
31
+ self.read_config
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ require 'streambot/base_test'
2
+
3
+ module StreamBot
4
+ # test for http wrapper class
5
+ class TestHttp < StreamBot::BaseTest
6
+ # setup
7
+ def setup
8
+ @http = StreamBot::HTTP.new
9
+ # override auth
10
+ @auth = {:username=>'test', :password=>'test'}
11
+ stub_request(:post, "http://test:test@testing.com/path/to/data").to_return(:body => @auth)
12
+ end
13
+
14
+ # nil all variables
15
+ def teardown
16
+ @http = nil
17
+ end
18
+
19
+ # test a post with basic authentication
20
+ def test_post
21
+ WebMock.disable_net_connect!
22
+ res = @http.post_with_auth(@auth, 'http://testing.com/path/to/data')
23
+ assert_not_nil(res)
24
+ assert_equal(@auth, res.body)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require 'streambot/base_test'
2
+
3
+ module StreamBot
4
+ # the test for testing retweet functionality
5
+ class TestRetweet < StreamBot::BaseTest
6
+ # setup the test
7
+ def setup
8
+ super
9
+ @retweet = StreamBot::Retweet.new(@auth)
10
+ stub_request(:post, "http://#{@auth[:username]}:#{@auth[:password]}@api.twitter.com/1/statuses/retweet/#{@id}.json").to_return(:body => 'content')
11
+ end
12
+
13
+ # teardown the test
14
+ # nil all instance variables
15
+ def teardown
16
+ @id, @retweet = nil
17
+ end
18
+
19
+ # retweet
20
+ def test_retweet
21
+ # no permission to access web!
22
+ WebMock.disable_net_connect!
23
+ # retweet the given id
24
+ response = @retweet.retweet(@id)
25
+ # assertion
26
+ assert_not_nil(response)
27
+ assert_equal('content', response.body)
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 5
9
- version: 0.2.5
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Sascha Wessel
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-23 00:00:00 +02:00
17
+ date: 2010-05-13 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -70,15 +70,28 @@ extra_rdoc_files:
70
70
  - README.rdoc
71
71
  files:
72
72
  - Rakefile
73
- - lib/retweet.rb
74
73
  - lib/streambot.rb
74
+ - lib/streambot/http.rb
75
+ - lib/streambot/retweet.rb
76
+ - lib/streambot/tracker.rb
75
77
  - LICENSE
76
78
  - README.rdoc
77
79
  has_rdoc: true
78
80
  homepage: http://github.com/gr4y/streambot
79
81
  licenses: []
80
82
 
81
- post_install_message:
83
+ post_install_message: "\n\
84
+ === You are upgrading from an earlier version?\n\n\
85
+ Maybe you need to change your code a little bit\n\
86
+ \t\n\
87
+ === A simple example how to use streambot\n\n\
88
+ \trequire 'streambot'\n\n\
89
+ \t@auth = {:username=>'username',:password=>'password'}\n\
90
+ \t@blacklist = ['mac_rt','apple_rt']\n\
91
+ \tbot = StreamBot::Tracker.new(@auth, @blacklist, 'apple','ipad','iphone os 4','steve jobs')\n\
92
+ \tbot.start\n\n\
93
+ === streambot is an open source project\n\n\
94
+ the code is available on github[http://github.com/gr4y/streambot] "
82
95
  rdoc_options:
83
96
  - --charset=UTF-8
84
97
  require_paths:
@@ -105,6 +118,6 @@ signing_key:
105
118
  specification_version: 3
106
119
  summary: retweeting tweets with specified keywords on twitter
107
120
  test_files:
108
- - test/base_test.rb
109
- - test/test_streambot.rb
110
- - test/test_retweet.rb
121
+ - test/streambot/base_test.rb
122
+ - test/streambot/test_retweet.rb
123
+ - test/streambot/test_http.rb
data/lib/retweet.rb DELETED
@@ -1,29 +0,0 @@
1
- require 'net/http'
2
- require 'open-uri'
3
-
4
- # wrapper class for dealing with twitters native retweet api
5
- # it simply connects to twitter api via http basic auth with given credentials
6
- class Retweet
7
-
8
- # intitialize method aka constructor
9
- def initialize(auth)
10
- return if auth.nil?
11
- @auth = auth
12
- end
13
-
14
- # retweets the status with given id
15
- def retweet(id)
16
- url = URI.parse("http://api.twitter.com/1/statuses/retweet/#{id}.json")
17
- req = Net::HTTP::Post.new(url.path)
18
- # set credentials
19
- req.basic_auth @auth[:username],@auth[:password]
20
- # connect
21
- res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req)}
22
- case res
23
- when Net::HTTPSuccess then return res
24
- else
25
- res.error!
26
- end
27
- end
28
-
29
- end
data/test/base_test.rb DELETED
@@ -1,35 +0,0 @@
1
- require 'rubygems'
2
- require 'yaml'
3
- require 'test/unit'
4
- require 'webmock'
5
-
6
- include WebMock
7
-
8
- # The base of all tests in this projet
9
- # New Testcases need to look like this:
10
- #
11
- #
12
- # class TestName < BaseTest
13
- #
14
- # def setup
15
- # super
16
- # # implementation goes here
17
- # end
18
- #
19
- # end
20
- class BaseTest < Test::Unit::TestCase
21
-
22
- # reading config.yml and assign all keys to instance
23
- def read_config
24
- yml_config = YAML.load_file(File.dirname(__FILE__) + "/config.yml")
25
- yml_config.each do |key, value|
26
- instance_variable_set("@#{key}", value)
27
- end
28
- end
29
-
30
- # :nodoc:
31
- def setup
32
- self.read_config
33
- end
34
-
35
- end
data/test/test_retweet.rb DELETED
@@ -1,32 +0,0 @@
1
- require 'retweet'
2
- require 'base_test'
3
-
4
- # the test for testing retweet functionality
5
- class TestRetweet < BaseTest
6
-
7
- # setup the test
8
- def setup
9
- super
10
- @id = 12355936428
11
- @retweet = Retweet.new(@auth)
12
- stub_request(:post, "http://#{@auth[:username]}:#{@auth[:password]}@api.twitter.com/1/statuses/retweet/#{@id}.json").to_return(:body => 'content')
13
- end
14
-
15
- # teardown the test
16
- # nil all instance variables
17
- def teardown
18
- @id, @retweet = nil
19
- end
20
-
21
- # retweet
22
- def test_retweet
23
- # no permission to access web!
24
- WebMock.disable_net_connect!
25
- # retweet the given id
26
- response = @retweet.retweet(@id)
27
- # assertion
28
- assert_not_nil(response)
29
- assert_equal('content',response.body)
30
- end
31
-
32
- end
@@ -1,10 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
-
4
- class TestStreambot < Test::Unit::TestCase
5
-
6
- def test_for_truth
7
- assert true
8
- end
9
-
10
- end