streambot 0.5.4 → 1.0.0.rc1

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
@@ -7,7 +7,7 @@ to get streambot installed, you simply need to run
7
7
 
8
8
  gem install streambot
9
9
 
10
- == beta release
10
+ == development release
11
11
 
12
12
  gem install streambot --pre
13
13
 
@@ -19,10 +19,10 @@ The full rdoc is available on rdoc.info[http://rdoc.info/projects/gr4y/streambot
19
19
 
20
20
  require 'streambot'
21
21
 
22
- @params = { "oauth" => {"key" => "consumer key", "secret" => "consumer secret"},
23
- "http" => {"username" => "username", "password" => "password"} }
24
- @blacklist = ['mac_rt','apple_rt']
25
- bot = StreamBot::Tracker.new(@params, @blacklist, 'apple','ipad','iphone os 4','steve jobs')
22
+ @params = { 'auth' => { 'username' => 'your username', 'password' => 'your password' },
23
+ 'oauth' => { 'key' => 'your consumer key', 'secret' => 'your consumer secret' },
24
+ 'keywords' => ['nowplaying'] }
25
+ bot = StreamBot::Tracker.new(@params)
26
26
  bot.start
27
27
 
28
28
  = Configuration
@@ -38,54 +38,54 @@ You need to register an application of the type desktop application on http://de
38
38
  *key*:: The consumer key Twitter provides you
39
39
  *secret*:: The consumer secret Twitter provides you
40
40
 
41
- === http
41
+ === auth
42
42
  *username*:: Your login username
43
43
  *password*:: Your login password
44
44
 
45
- === filters
46
- When a filter is matching on an status, then it won't be retweeted.
45
+ === keywords
46
+ :: the list of keywords as an array
47
47
 
48
- *key*:: this should just hold an description of your filter
49
- *type*:: the type,
50
- *value*:: a string, thats the content that should be filtered
51
-
52
- ----
53
- These types are actually supported:
54
-
55
- *USER*:: The users screenname/nickname *NOT* realname
56
- *SOURCE*:: The client which the user is using
57
- *LANGUAGE*:: The language that's set in users profile
58
- *TIMEZONE*:: The timezone that's set in users profile
59
- *CONTENT*:: A word the status text could include
60
- ----
48
+ === filters_config
49
+ :: the path to the filters.yml file
61
50
 
62
51
  I wrote this stuff into my config.yml and load the params with
63
52
 
64
53
  require 'yaml'
65
54
  @params = YAML.load_file('config.yml')
66
55
 
67
- == Callbacks
56
+ = Callbacks
68
57
 
69
- Since version 0.5.0 streambot has an simple callback mechanism.
58
+ *on_error*:: this callback is fired when an error occures
70
59
 
71
- *before_start*:: is fired before the tracker is running
72
- *before_match*:: is fired before we start the filtering
73
- *match_filter*:: is fired when an filter has matched
74
- *before_retweet*:: is fired before retweeting
60
+ = Filters
75
61
 
76
- === Examples
77
- ==== before_match
62
+ You need to configure the *filters_config* in the params and set the path to the YAML file. At the moment this needs to be an YAML file, cause the tracker is reading this file, every time a new status comes in via the client. I decided to read it on each status, cause I don't wanted to restart the Tracker every time I made a change to the filters.
78
63
 
79
- Before filtering we just want to print the status id to the console
64
+ For example we want to filter all tweets with the source "web", we need to define the following line in our *filters.yml*
80
65
 
81
- bot = StreamBot::Tracker.new(@params, nil,'nowplaying')
82
- bot.before_match do
83
- status = bot.instance_variable_get("@status")
84
- puts status.id
85
- end
86
- bot.start
66
+ "source": "web"
67
+
68
+ The Tracker checks if the field "source" of the incoming status *includes* OR *is equal* to "web". If you want to filter more than one source, you simply need to write it this way:
69
+
70
+ "source": ["web", "TweetDeck"]
71
+
72
+ You can define all fields inside the status object. You want to filter tweets by me, so you need to define
87
73
 
88
- That's just an example. You can do anything you want to do here.
74
+ "user/screen_name": "gr4y"
75
+
76
+ You can even filter all tweets of users with an evil background color.
77
+
78
+ "user/profile_background_color": "666666"
79
+
80
+ = Example
81
+
82
+ @params = YAML.load_file('config.yml')
83
+ @client = StreamBot::Tracker.new(@params)
84
+
85
+ @client.on_error do |msg, stacktrace|
86
+ puts msg
87
+ puts stacktrace
88
+ end
89
89
 
90
90
  = Contribution
91
91
  == Testing
data/Rakefile CHANGED
@@ -10,47 +10,22 @@ 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') : ""
14
13
  gem.require_path = 'lib'
15
14
  gem.files = %w(Rakefile) + Dir.glob("{lib}/**/*") + %w(VERSION)
16
-
17
- # Dependency for dealing with twitter streaming API
18
- gem.add_dependency "tweetstream",">= 1.0.4"
19
- gem.add_dependency "oauth",">= 0.4.0"
20
- gem.add_development_dependency "webmock",">= 1.0.0"
21
- gem.add_development_dependency "rcov",">= 0.9.8"
22
- gem.add_development_dependency "reek",">= 1.2.8"
23
-
24
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ # the runtime dependencies
16
+ gem.add_runtime_dependency "twistream", "~> 0.2.3"
17
+ gem.add_runtime_dependency "oauth","~> 0.4.0"
18
+ # the development dependencies
19
+ gem.add_development_dependency "bundler", "~> 1.0.0"
20
+ gem.add_development_dependency "rspec", [">= 2.4.0"]
21
+ gem.add_development_dependency "webmock","~> 1.0.0"
22
+ gem.add_development_dependency "rcov","~> 0.9.8"
23
+ gem.add_development_dependency "reek","~> 1.2.8"
25
24
  end
26
25
  rescue LoadError
27
26
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
28
27
  end
29
28
 
30
- require 'rake/testtask'
31
- Rake::TestTask.new(:test) do |test|
32
- test.libs << 'lib' << 'test'
33
- test.pattern = 'test/**/test_*.rb'
34
- test.verbose = true
35
- end
36
-
37
- begin
38
- require 'rcov/rcovtask'
39
- Rcov::RcovTask.new do |test|
40
- test.libs << 'test'
41
- test.pattern = 'test/**/test_*.rb'
42
- test.verbose = true
43
- end
44
- rescue LoadError
45
- task :rcov do
46
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
47
- end
48
- end
49
-
50
- task :build_gem => [:test,:rdoc,:build]
51
- task :install_gem => [:build_gem,:install]
52
- task :default => [:check_dependencies,:rcov,:reek,:build_gem]
53
-
54
29
  require 'rake/rdoctask'
55
30
  Rake::RDocTask.new do |rdoc|
56
31
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
@@ -65,3 +40,9 @@ Reek::Rake::Task.new do |t|
65
40
  t.fail_on_error = false
66
41
  t.verbose = true
67
42
  end
43
+
44
+ require 'rspec/core/rake_task'
45
+ RSpec::Core::RakeTask.new(:spec)
46
+
47
+ task :test => [:check_dependencies, :spec]
48
+ task :default => [:test, :reek, :build]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 1.0.0.rc1
data/lib/streambot.rb CHANGED
@@ -2,19 +2,21 @@ require 'rubygems'
2
2
  require 'open-uri'
3
3
  require 'net/http'
4
4
  require 'oauth'
5
- require 'tweetstream'
5
+ require 'twistream'
6
6
  require 'logger'
7
7
  require 'yaml'
8
8
 
9
- require 'streambot/callbacks'
9
+ require 'streambot/event'
10
+ require 'streambot/event_handler'
10
11
  require 'streambot/retweet'
11
12
  require 'streambot/handler'
12
13
  require 'streambot/oauth'
14
+ require 'streambot/array_path'
13
15
  require 'streambot/tracker'
14
16
 
15
- module StreamBot
17
+ module StreamBot
16
18
  LOG = Logger.new(STDOUT)
17
19
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
18
20
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
19
- VERSION = ::File.exist?(PATH + 'VERSION') ? ::File.read(PATH+'VERSION') : ""
21
+ VERSION = ::File.exist?('VERSION') ? ::File.read('VERSION') : ""
20
22
  end
@@ -0,0 +1,15 @@
1
+ module StreamBot
2
+ # ArrayPath like XPath, but for Arrays
3
+ class ArrayPath
4
+
5
+ def self.get_path(object, path)
6
+ # raise "#{object} is not an array" if !object.is_a?(Array)
7
+ segments = path.chomp.split("/")
8
+ segments.each do |segment|
9
+ object = object[segment]
10
+ end
11
+ object
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module StreamBot
2
+ # event class
3
+ class Event
4
+ attr_reader :name
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def handle(method=nil, & block)
11
+ @handler = method if method
12
+ @handler = block if block
13
+ end
14
+
15
+ def trigger(* args)
16
+ @handler.call(* args) if !@handler.nil?
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module StreamBot
2
+ module EventHandler
3
+
4
+ # register an event with the given name
5
+ def event(name)
6
+ register_event(name)
7
+ end
8
+
9
+ # register several events with the given names
10
+ def events(* names)
11
+ names.each do |name|
12
+ event(name)
13
+ end
14
+ end
15
+
16
+ private
17
+ # the real event registration
18
+ def register_event(name)
19
+ class_eval do
20
+ variable =:"@#{name}"
21
+ define_method(name) do
22
+ event = instance_variable_get(variable)
23
+ if event == nil
24
+ event = StreamBot::Event.new(name)
25
+ instance_variable_set(variable, event)
26
+ end
27
+ event
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -8,7 +8,7 @@ module StreamBot
8
8
 
9
9
  # retweets the status with given id
10
10
  def retweet(id)
11
- @handler.post("/statuses/retweet/#{id}.json",nil)
11
+ @handler.post("/statuses/retweet/#{id}.json", nil)
12
12
  end
13
13
  end
14
14
  end
@@ -1,88 +1,79 @@
1
1
  module StreamBot
2
+
2
3
  # The Tracker class that provides a start and a stop method
3
4
  # This class has serveral callback methods
4
5
  class Tracker
5
- extend StreamBot::Callbacks
6
- callbacks :before_start, :before_match, :match_filter, :before_retweet
7
- # the initialization method aka the constructor
8
- def initialize(params, blacklist, * keywords)
9
- LOG.debug("Tracker#initialize")
10
- http_auth = params['http']
11
- @stream = TweetStream::Client.new(http_auth['username'], http_auth['password'])
12
- @stream.on_error do |message|
13
- LOG.error "#{message}"
14
- @stream.stop
15
- end
16
- # initializing retweet
17
- @retweet = StreamBot::Retweet.new(params)
18
- # get string with keywords comma separated keywords
19
- @keywords=keywords.join(',')
20
- # set blacklist array if not nil
21
- @blacklist=blacklist
22
- if !@blacklist.nil?
23
- warn "blacklisting is deprecated and will be removed with streambot 0.6.0"
6
+ extend StreamBot::EventHandler
7
+ events :on_error, :on_match
8
+ attr_accessor :auth, :params
9
+
10
+ # initializes the tracker
11
+ def initialize(params)
12
+ self.params = params
13
+ @retweet = StreamBot::Retweet.new(self.params)
14
+ @client = TwiStream::Client.new(authentication)
15
+ @client.on_error do |msg, trace|
16
+ on_error.trigger(msg, trace)
24
17
  end
25
- @filters = params['filters']
26
18
  end
27
19
 
28
- # start the bot
20
+ # start the tracker
29
21
  def start
30
- before_start
31
- LOG.debug("Tracker#start")
32
- # starting to track the keywords via tweetstream
33
- @stream.track(@keywords) do |status|
34
- # make status an instance variable for callbacks
35
- @status = status
36
- username = status.user.screen_name
37
- matched = false
38
- # if status.user is NOT in blacklist or filters don't match then retweet it
39
- before_match
40
- if (@blacklist.nil? || !@blacklist.include?(username)) && !@filters.nil?
41
- @filters.each do |key, value|
42
- matched = match?(status, value)
43
- if matched == true
44
- match_filter
45
- LOG.debug("Tracker#start - filter #{key} matched!")
46
- break
47
- end
22
+ keywords = self.params["keywords"]
23
+ @client.filter_by_keywords(keywords) do |status|
24
+ if retweet?(status)
25
+ # one thread per retweet,
26
+ # cause it's much, much faster
27
+ @thread = Thread.new do
28
+ @retweet.retweet(status["id"])
48
29
  end
49
30
  end
50
- if matched == false
51
- retweet(status)
52
- end
53
31
  end
54
32
  end
55
-
56
- # retweet the status
57
- def retweet(status)
58
- before_retweet
59
- id = status.id
60
- LOG.debug("Tracker#retweet - retweet ##{id} from @#{status.user.screen_name}")
61
- @retweet.retweet(id)
33
+
34
+ # stop the tracker
35
+ def stop
36
+ @client.stop
62
37
  end
63
-
64
- # returns true if an filter is matching
65
- def match?(status, filter)
66
- @type = filter["type"]
67
- @value = filter["value"]
68
- if @type == "USER" then
69
- status.user.screen_name.eql?(@value)
70
- elsif @type == "CONTENT" then
71
- status.text.include?(@value)
72
- elsif @type == "LANGUAGE" then
73
- status.user.lang.eql?(@value)
74
- elsif @type == "SOURCE" then
75
- # just a thought at this point:
76
- # why the heck is html markup in the source field?
77
- status.source.include?(@value)
78
- elsif @type == "TIMEZONE" then
79
- status.user.time_zone.eql?(@value)
38
+
39
+ private
40
+ # returns the authentication object
41
+ def authentication
42
+ auth = self.params["auth"]
43
+ {:user => auth["username"], :pass => auth["password"]}
44
+ end
45
+
46
+ # load the YAML file that is specified in the params
47
+ def load_filters
48
+ filters_config = self.params["filters_config" ]
49
+ if !filters_config.nil? && File.exists?(filters_config)
50
+ begin
51
+ YAML::load_file(filters_config)
52
+ rescue
53
+ on_error.trigger($!, $@)
54
+ end
80
55
  end
81
56
  end
82
57
 
83
- # stop the bot
84
- def stop
85
- @stream.stop
58
+ # decide if the status is retweetable
59
+ def retweet?(status)
60
+ filters = load_filters
61
+ retweet = true
62
+ if !filters.nil?
63
+ filters.each_pair do |path, value|
64
+ array = []
65
+ array << value
66
+ array.flatten.each do |aValue|
67
+ path_value = ArrayPath.get_path(status, path)
68
+ if path_value.eql?(aValue) || path_value.include?(aValue)
69
+ LOG.info "filter matched on #{path} with #{aValue} in status ##{status['id']}"
70
+ on_match.trigger(status)
71
+ retweet = false
72
+ end
73
+ end
74
+ end
75
+ end
76
+ retweet
86
77
  end
87
78
  end
88
79
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe StreamBot::Retweet do
4
+
5
+ before :all do
6
+ params = YAML.load_file('spec/params.yml')
7
+ @retweet = StreamBot::Retweet.new(params)
8
+ end
9
+
10
+ describe "#retweet" do
11
+ end
12
+
13
+ end
@@ -0,0 +1,2 @@
1
+ require 'streambot'
2
+ require 'yaml'
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe StreamBot::Tracker do
4
+
5
+ before :all do
6
+ params = YAML.load_file('spec/params.yml')
7
+ @tracker = StreamBot::Tracker.new(params)
8
+ @tracker.on_error do |msg, trace|
9
+ puts "#{msg}: #{trace}"
10
+ end
11
+ @tracker.on_match do |status, filter_path, filter_value|
12
+ puts "filter matched on #{filter_path} with #{filter_value} in status ##{status['id']}"
13
+ end
14
+ end
15
+
16
+ describe "#start" do
17
+ it "should start" do
18
+ @tracker.start
19
+ end
20
+ end
21
+
22
+ describe "wait" do
23
+ it "should sleep for 60 seconds" do
24
+ sleep 60
25
+ end
26
+ end
27
+
28
+ describe "#stop" do
29
+ it "should stop" do
30
+ @tracker.stop
31
+ end
32
+ end
33
+
34
+ end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: streambot
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 5
8
- - 4
9
- version: 0.5.4
4
+ prerelease: 6
5
+ version: 1.0.0.rc1
10
6
  platform: ruby
11
7
  authors:
12
8
  - Sascha Wessel
@@ -14,22 +10,18 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2010-09-09 00:00:00 +02:00
13
+ date: 2011-02-07 00:00:00 +01:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
21
- name: tweetstream
17
+ name: twistream
22
18
  prerelease: false
23
19
  requirement: &id001 !ruby/object:Gem::Requirement
24
20
  none: false
25
21
  requirements:
26
- - - ">="
22
+ - - ~>
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 1
30
- - 0
31
- - 4
32
- version: 1.0.4
24
+ version: 0.2.3
33
25
  type: :runtime
34
26
  version_requirements: *id001
35
27
  - !ruby/object:Gem::Dependency
@@ -38,60 +30,66 @@ dependencies:
38
30
  requirement: &id002 !ruby/object:Gem::Requirement
39
31
  none: false
40
32
  requirements:
41
- - - ">="
33
+ - - ~>
42
34
  - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- - 4
46
- - 0
47
35
  version: 0.4.0
48
36
  type: :runtime
49
37
  version_requirements: *id002
50
38
  - !ruby/object:Gem::Dependency
51
- name: webmock
39
+ name: bundler
52
40
  prerelease: false
53
41
  requirement: &id003 !ruby/object:Gem::Requirement
54
42
  none: false
55
43
  requirements:
56
- - - ">="
44
+ - - ~>
57
45
  - !ruby/object:Gem::Version
58
- segments:
59
- - 1
60
- - 0
61
- - 0
62
46
  version: 1.0.0
63
47
  type: :development
64
48
  version_requirements: *id003
65
49
  - !ruby/object:Gem::Dependency
66
- name: rcov
50
+ name: rspec
67
51
  prerelease: false
68
52
  requirement: &id004 !ruby/object:Gem::Requirement
69
53
  none: false
70
54
  requirements:
71
55
  - - ">="
72
56
  - !ruby/object:Gem::Version
73
- segments:
74
- - 0
75
- - 9
76
- - 8
77
- version: 0.9.8
57
+ version: 2.4.0
78
58
  type: :development
79
59
  version_requirements: *id004
80
60
  - !ruby/object:Gem::Dependency
81
- name: reek
61
+ name: webmock
82
62
  prerelease: false
83
63
  requirement: &id005 !ruby/object:Gem::Requirement
84
64
  none: false
85
65
  requirements:
86
- - - ">="
66
+ - - ~>
87
67
  - !ruby/object:Gem::Version
88
- segments:
89
- - 1
90
- - 2
91
- - 8
92
- version: 1.2.8
68
+ version: 1.0.0
93
69
  type: :development
94
70
  version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rcov
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 0.9.8
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: reek
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: 1.2.8
91
+ type: :development
92
+ version_requirements: *id007
95
93
  description: a simple gem that tracks several keywords via twitter streaming api and re-publish it on twitter
96
94
  email: swessel@gr4yweb.de
97
95
  executables: []
@@ -105,26 +103,25 @@ files:
105
103
  - Rakefile
106
104
  - VERSION
107
105
  - lib/streambot.rb
108
- - lib/streambot/callbacks.rb
106
+ - lib/streambot/array_path.rb
107
+ - lib/streambot/event.rb
108
+ - lib/streambot/event_handler.rb
109
109
  - lib/streambot/handler.rb
110
110
  - lib/streambot/oauth.rb
111
111
  - lib/streambot/retweet.rb
112
112
  - lib/streambot/tracker.rb
113
113
  - LICENSE
114
114
  - README.rdoc
115
- - test/streambot/base_test.rb
116
- - test/streambot/test_oauth.rb
117
- - test/streambot/test_retweet.rb
115
+ - spec/retweet_spec.rb
116
+ - spec/spec_helper.rb
117
+ - spec/tracker_spec.rb
118
118
  has_rdoc: true
119
119
  homepage: http://github.com/gr4y/streambot
120
120
  licenses: []
121
121
 
122
- post_install_message: "=== You are upgrading from an earlier version?\n\n\
123
- Then you maybe need to change your code.\n\
124
- In version 0.4.0 oauth was introduced and I recommend you to read the README\n\n\
125
- code is available on github[http://github.com/gr4y/streambot] "
126
- rdoc_options:
127
- - --charset=UTF-8
122
+ post_install_message:
123
+ rdoc_options: []
124
+
128
125
  require_paths:
129
126
  - lib
130
127
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -132,25 +129,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
129
  requirements:
133
130
  - - ">="
134
131
  - !ruby/object:Gem::Version
135
- segments:
136
- - 0
137
132
  version: "0"
138
133
  required_rubygems_version: !ruby/object:Gem::Requirement
139
134
  none: false
140
135
  requirements:
141
- - - ">="
136
+ - - ">"
142
137
  - !ruby/object:Gem::Version
143
- segments:
144
- - 0
145
- version: "0"
138
+ version: 1.3.1
146
139
  requirements: []
147
140
 
148
141
  rubyforge_project:
149
- rubygems_version: 1.3.7
142
+ rubygems_version: 1.5.0
150
143
  signing_key:
151
144
  specification_version: 3
152
145
  summary: retweeting tweets with specified keywords on twitter
153
146
  test_files:
154
- - test/streambot/base_test.rb
155
- - test/streambot/test_oauth.rb
156
- - test/streambot/test_retweet.rb
147
+ - spec/retweet_spec.rb
148
+ - spec/spec_helper.rb
149
+ - spec/tracker_spec.rb
@@ -1,29 +0,0 @@
1
- module StreamBot
2
- module Callbacks
3
- def callback(name)
4
- register_callback(name)
5
- end
6
-
7
- def callbacks(* names)
8
- names.each do |name|
9
- register_callback(name)
10
- end
11
- end
12
-
13
- def is_registered?(name)
14
- @callbacks.include?(name)
15
- end
16
-
17
- def register_callback(name)
18
- class_eval <<-EOF
19
- def #{name} (*args,&block)
20
- if block
21
- @#{name} = block
22
- elsif @#{name}
23
- @#{name}.call(*args)
24
- end
25
- end
26
- EOF
27
- end
28
- end
29
- end
@@ -1,34 +0,0 @@
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
@@ -1,31 +0,0 @@
1
- require 'streambot/base_test'
2
-
3
- module StreamBot
4
- # test for http wrapper class
5
- class TestOAuth < StreamBot::BaseTest
6
- # setup
7
- def setup
8
- super
9
- WebMock.allow_net_connect!
10
- @oauth = StreamBot::OAuth.new(@params['oauth'])
11
- stub_request(:post,"http://api.twitter.com/statuses/update.json").to_return(:body=>"response")
12
- end
13
-
14
- def test_verify_credentials
15
- json = @oauth.get('/account/verify_credentials.json')
16
- assert_not_nil(json)
17
- end
18
-
19
- def test_post
20
- WebMock.disable_net_connect!
21
- json = @oauth.post('/statuses/update.json',{:status => 'test'})
22
- assert_not_nil(json)
23
- assert_equal("response",json)
24
- end
25
-
26
- # nil all variables
27
- def teardown
28
- @oauth = nil
29
- end
30
- end
31
- end
@@ -1,34 +0,0 @@
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(@params)
10
- if @params['auth_type'] == "oauth"
11
- stub_request(:post, "http://api.twitter.com/statuses/retweet/12355936428.json").to_return(:body => "response")
12
- elsif @params['auth_type'] == "http"
13
- stub_request(:post, "http://#{@params['http']['username']}:#{@params['http']['password']}@api.twitter.com/statuses/retweet/12355936428.json").to_return(:body => "response")
14
- end
15
- end
16
-
17
- # retweet
18
- def test_retweet
19
- # no permission to access web!
20
- WebMock.disable_net_connect!
21
- # retweet the given id
22
- response = @retweet.retweet(@id)
23
- # assertion
24
- assert_not_nil(response)
25
- assert_equal("response", response)
26
- end
27
-
28
- # teardown the test
29
- # nil all instance variables
30
- def teardown
31
- @id, @retweet = nil
32
- end
33
- end
34
- end