streambot 0.5.4 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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