robotwitter 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,11 +1,8 @@
1
1
  source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
2
  gem "twitter"
5
3
  gem "sqlite3"
4
+ gem "fakeweb"
6
5
 
7
- # Add dependencies to develop your gem here.
8
- # Include everything needed to run rake, tests, features, etc.
9
6
  group :development do
10
7
  gem "shoulda", ">= 0"
11
8
  gem "bundler", "~> 1.0.0"
data/README.rdoc CHANGED
@@ -24,6 +24,19 @@ your_twitter_login:
24
24
  oauth_token: oauth_token
25
25
  oauth_token_secret: oauth_token
26
26
 
27
+ == GETTER
28
+ You can use GETTER as a lambda-function to get new tweets from somewhere.
29
+ Actually it used to work with external http and sqlite database.
30
+ It should be a lambda function wich return string
31
+
32
+ If you do not need getter, just set GETTER to nil.
33
+
34
+ === Getter example
35
+ GETTER = lambda do
36
+ return_string_got_it_from_somewhere
37
+ end
38
+
39
+
27
40
  == Copyright
28
41
 
29
42
  Copyright (c) 2011 Krivich Ekaterina. See LICENSE.txt for
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
File without changes
data/example/tweets.db ADDED
Binary file
data/lib/robotwitter.rb CHANGED
@@ -1,18 +1,16 @@
1
- require "rubygems"
2
- require "twitter"
3
- require "open-uri"
4
- require 'pp'
1
+ require 'rubygems'
2
+ require 'twitter'
3
+ require 'open-uri'
5
4
  require 'yaml'
6
5
  require 'sqlite3'
6
+ require 'logger'
7
7
 
8
- require "robotwitter/db"
9
- require "robotwitter/path"
10
- require "robotwitter/version"
8
+ require 'robotwitter/db'
9
+ require 'robotwitter/version'
11
10
 
12
11
  module Robotwitter
13
12
  class Robot
14
- attr_accessor :stub
15
- @db = nil
13
+ attr_reader :path
16
14
 
17
15
  # getter should be a lambda - function
18
16
  # which returns string
@@ -22,25 +20,25 @@ module Robotwitter
22
20
  # db = SQLite3::Database.new("database.db")
23
21
  # db.get_first_row( "select * from table" )
24
22
  # end
25
- def initialize config_file, section, &getter
26
- @getter = getter
23
+ def initialize(path, section, &getter)
24
+ @getter = getter
27
25
  @followers_ids = nil
28
26
  @following_ids = nil
27
+ @path = path
29
28
 
30
- @stub = false
29
+ @logger = Logger.new('tweelog.txt', 'weekly')
31
30
 
32
31
  begin
33
- yml = YAML.load_file Robotwitter::Path.get_base + '/' + config_file
34
-
32
+ yml = YAML.load_file(path + '/' + "settings.yml")
35
33
  Twitter.configure do |config|
36
- config.consumer_key = yml[section]['consumer_key']
37
- config.consumer_secret = yml[section]['consumer_secret']
38
- config.oauth_token = yml[section]['oauth_token']
34
+ config.consumer_key = yml[section]['consumer_key']
35
+ config.consumer_secret = yml[section]['consumer_secret']
36
+ config.oauth_token = yml[section]['oauth_token']
39
37
  config.oauth_token_secret = yml[section]['oauth_token_secret']
40
38
  end
41
39
  @client = Twitter::Client.new
42
- rescue
43
- print 'error occurred: ' + $!
40
+ rescue Exception => exception
41
+ @logger.error %/error occurred: #{exception.inspect}\n#{exception.backtrace.join("\n")}/
44
42
  end
45
43
  end
46
44
 
@@ -50,53 +48,52 @@ module Robotwitter
50
48
  get_following_ids
51
49
 
52
50
  follow_them = @followers_ids - @following_ids
53
- pp 'follows:'
51
+ @logger.info 'follows:'
54
52
  follow_them.each do |id|
55
53
  begin
56
- @client.follow id if not @stub
54
+ @client.follow id
57
55
  rescue
58
56
  end
59
- pp id
57
+ @logger.info id
60
58
  end
61
59
  end
62
60
 
63
61
  # string '_msg_ somth'
64
- def send_message pattern
62
+ def send_message(pattern)
65
63
  phrase = get_phrase
66
64
  send = pattern.gsub('_msg_', phrase)
67
- @client.update send if not @stub
68
- pp send
65
+ @client.update send
66
+ @logger.info send
69
67
  end
70
68
 
71
- def retweet_about word
69
+ def retweet_about(word)
72
70
  search = search_users_tweets_about(word, 2)
73
71
  init_db
74
72
  search.each do |result|
75
73
  next if @db.retweeted?(result)
76
74
  retweet result
77
75
  @db.save_retweet result
78
- pp result['id']
76
+ @logger.info result['id']
79
77
  end
80
78
  end
81
79
 
82
80
  # follow who tweet about word
83
- def follow_users_tweets_about word
81
+ def follow_users_tweets_about(word)
84
82
  users = search_users_tweets_about word
85
83
 
86
84
  get_followers_ids
87
85
  get_following_ids
88
- pp users
86
+ @logger.info users
89
87
  users.each do |user|
90
88
  id = user['from_user_id']
91
89
  name = user['from_user']
92
90
  begin
93
- if (not @followers_ids.include?(id)) \
94
- and (not @following_ids.include?(id) and not @stub)
91
+ if (not @followers_ids.include?(id)) and (not @following_ids.include?(id))
95
92
  @client.follow name
96
- pp name
93
+ @logger.info name
97
94
  end
98
95
  rescue Exception => msg
99
- pp "Error #{msg}"
96
+ @logger.error "Error #{msg}"
100
97
  end
101
98
  end
102
99
  end
@@ -109,17 +106,17 @@ module Robotwitter
109
106
  unfollow_them = @following_ids - @followers_ids
110
107
  unfollow_them.each do |id|
111
108
  begin
112
- @client.unfollow id if not @stub
109
+ @client.unfollow id
113
110
  rescue
114
111
  end
115
- pp id
112
+ @logger.info id
116
113
  end
117
114
  end
118
115
 
119
116
  protected
120
117
 
121
118
  def init_db
122
- @db = Robotwitter::Db.new('tweets') if @db.nil?
119
+ @db = Robotwitter::Db.new('tweets', @path) if @db.nil?
123
120
  @db
124
121
  end
125
122
 
@@ -129,8 +126,13 @@ module Robotwitter
129
126
  end
130
127
 
131
128
  # ищем пользователей, которые пишут о
132
- def search_users_tweets_about word, count = 5
133
- Twitter::Search.new.containing(word).locale("ru").no_retweets.per_page(count).fetch
129
+ def search_users_tweets_about(word, count = 5)
130
+ resp = Twitter::Search.new.containing(word).locale("ru").no_retweets.per_page(count).fetch
131
+ if resp.is_a?(Twitter::Unauthorized)
132
+ @logger.error 'unauthorized'
133
+ return []
134
+ end
135
+ resp
134
136
  end
135
137
 
136
138
  # get follower ids
@@ -152,14 +154,14 @@ module Robotwitter
152
154
  # result - hash от поиска
153
155
  def retweet(result)
154
156
  begin
155
- @client.retweet(result['id']) unless @stub
156
- rescue
157
- puts 'error: ' + $!
157
+ @client.retweet(result['id'])
158
+ rescue => desc
159
+ @logger.error 'error: ' + desc.inspect
158
160
  end
159
161
  end
160
162
 
161
163
  def rate_limit
162
- puts @client.rate_limit_status.remaining_hits.to_s + " Twitter API request(s) remaining this hour"
164
+ @logger.error @client.rate_limit_status.remaining_hits.to_s + " Twitter API request(s) remaining this hour"
163
165
  end
164
166
  end
165
167
  end
@@ -21,9 +21,9 @@ SQL
21
21
  db.execute_batch(sql)
22
22
  end
23
23
 
24
- def initialize(name)
25
- create_db("#{Robotwitter::Path.get_base}/#{name}") unless exists? "#{Robotwitter::Path.get_base}/#{name}"
26
- @db = SQLite3::Database.new "#{Robotwitter::Path.get_base}/#{name}.db"
24
+ def initialize(name, path)
25
+ create_db("#{path}/#{name}") unless exists? "#{path}/#{name}"
26
+ @db = SQLite3::Database.new "#{path}/#{name}.db"
27
27
  end
28
28
 
29
29
  # already retweeted this post
data/robotwitter.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{robotwitter}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Krivich Ekaterina"]
12
- s.date = %q{2011-04-23}
12
+ s.date = %q{2011-07-28}
13
13
  s.description = %q{automate twitter tasks, such as retweetting, following, unfollowing}
14
14
  s.email = %q{krivich.ekaterina@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -23,11 +23,11 @@ Gem::Specification.new do |s|
23
23
  "README.rdoc",
24
24
  "Rakefile",
25
25
  "VERSION",
26
- "example/settings.yaml",
26
+ "example/settings.yml",
27
27
  "example/test.rb",
28
+ "example/tweets.db",
28
29
  "lib/robotwitter.rb",
29
30
  "lib/robotwitter/db.rb",
30
- "lib/robotwitter/path.rb",
31
31
  "lib/robotwitter/version.rb",
32
32
  "robotwitter.gemspec",
33
33
  "spec/robotwitter/robotwitter_spec.rb",
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
36
36
  s.homepage = %q{http://github.com/kiote/robotwitter}
37
37
  s.licenses = ["MIT"]
38
38
  s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.7}
39
+ s.rubygems_version = %q{1.6.2}
40
40
  s.summary = %q{automate some twitter tasks}
41
41
  s.test_files = [
42
42
  "spec/robotwitter/robotwitter_spec.rb",
@@ -44,12 +44,12 @@ Gem::Specification.new do |s|
44
44
  ]
45
45
 
46
46
  if s.respond_to? :specification_version then
47
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
47
  s.specification_version = 3
49
48
 
50
49
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
50
  s.add_runtime_dependency(%q<twitter>, [">= 0"])
52
51
  s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
52
+ s.add_runtime_dependency(%q<fakeweb>, [">= 0"])
53
53
  s.add_development_dependency(%q<shoulda>, [">= 0"])
54
54
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
55
55
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
@@ -57,6 +57,7 @@ Gem::Specification.new do |s|
57
57
  else
58
58
  s.add_dependency(%q<twitter>, [">= 0"])
59
59
  s.add_dependency(%q<sqlite3>, [">= 0"])
60
+ s.add_dependency(%q<fakeweb>, [">= 0"])
60
61
  s.add_dependency(%q<shoulda>, [">= 0"])
61
62
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
62
63
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
@@ -65,6 +66,7 @@ Gem::Specification.new do |s|
65
66
  else
66
67
  s.add_dependency(%q<twitter>, [">= 0"])
67
68
  s.add_dependency(%q<sqlite3>, [">= 0"])
69
+ s.add_dependency(%q<fakeweb>, [">= 0"])
68
70
  s.add_dependency(%q<shoulda>, [">= 0"])
69
71
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
72
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
@@ -2,44 +2,50 @@ require "spec_helper"
2
2
 
3
3
  describe "Robotwitter" do
4
4
 
5
- context "with nil POSTER" do
6
-
7
- POSTER = nil
8
-
9
- before(:each) do
10
- settings_path = File.expand_path('../../../example', __FILE__)
11
- @client = Robotwitter::Robot.new "#{settings_path}/settings.yaml", 'test_login', &POSTER
12
- end
13
-
14
- it "should create new object on right init params" do
15
- @client.class.to_s.should eq("Robotwitter::Robot")
16
- end
17
-
18
- it "should follows those who follows me" do
19
- pending "get the mock for twitter" do
20
- @client.follow_all_back
21
- a_request(:get, "https://search.twitter.com/search.json").
22
- with(:query => {:q => "twitter"}).
23
- should have_been_made
24
- end
25
- end
26
-
27
- it "should tweet a message" do
28
- pending("get the mock for twitter")
29
- end
5
+ before do
6
+ FakeWeb.register_uri(:get, %r|https://api\.twitter\.com/1/followers/ids\.json|,
7
+ :body => %|{"ids": [1,2,3]}|)
8
+ # GET https://api.twitter.com/1/friends/ids.json
9
+ FakeWeb.register_uri(:get, %r|https://api\.twitter\.com/1/friends/ids\.json|,
10
+ :body => %|{"ids": [1,2,3]}|)
11
+ # POST https://api.twitter.com/1/statuses/update.json
12
+ FakeWeb.register_uri(:post, %r|https://api\.twitter\.com/1/statuses/update\.json|,
13
+ :body => '')
14
+ # POST https://api.twitter.com/1/statuses/retweet/
15
+ FakeWeb.register_uri(:post, %r|https://api\.twitter\.com/1/statuses/retweet|,
16
+ :body => '')
17
+ end
30
18
 
31
- it "should retweet about word" do
19
+ POSTER = lambda do |l|
20
+ 'some tweet'
21
+ end
32
22
 
33
- end
23
+ before(:each) do
24
+ settings_path = File.expand_path('../../../example', __FILE__)
25
+ @client = Robotwitter::Robot.new settings_path, 'test_login', &POSTER
26
+ end
34
27
 
35
- it "should follow users tweets about" do
28
+ it "should create new object on right init params" do
29
+ @client.class.to_s.should eq("Robotwitter::Robot")
30
+ end
36
31
 
37
- end
32
+ it "should follows those who follows me" do
33
+ @client.follow_all_back
34
+ end
38
35
 
39
- it "should unfollow users who did not following me" do
36
+ it "should tweet a message" do
37
+ @client.send_message('_msg_ #hash')
38
+ end
40
39
 
41
- end
40
+ it "should retweet about word" do
41
+ @client.retweet_about('something')
42
42
  end
43
43
 
44
+ it "should follow users tweets about" do
45
+ @client.follow_users_tweets_about('something')
46
+ end
44
47
 
48
+ it "should unfollow users who did not following me" do
49
+ @client.unfollow_users
50
+ end
45
51
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,7 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
2
- $:.unshift File.dirname(__FILE__)
1
+ $:.unshift(File.dirname(__FILE__))
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
3
 
4
- require "robotwitter"
4
+ require 'twitter'
5
+ require 'rspec'
6
+ require 'fakeweb'
7
+ require 'robotwitter'
metadata CHANGED
@@ -1,170 +1,146 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: robotwitter
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Krivich Ekaterina
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-04-23 00:00:00 +04:00
12
+ date: 2011-07-28 00:00:00.000000000 +04:00
19
13
  default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- prerelease: false
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: twitter
24
- version_requirements: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2156764480 !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
33
- requirement: *id001
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
34
23
  type: :runtime
35
- - !ruby/object:Gem::Dependency
36
24
  prerelease: false
25
+ version_requirements: *2156764480
26
+ - !ruby/object:Gem::Dependency
37
27
  name: sqlite3
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &2156762100 !ruby/object:Gem::Requirement
39
29
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
47
- requirement: *id002
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
48
34
  type: :runtime
49
- - !ruby/object:Gem::Dependency
50
35
  prerelease: false
36
+ version_requirements: *2156762100
37
+ - !ruby/object:Gem::Dependency
38
+ name: fakeweb
39
+ requirement: &2156760560 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *2156760560
48
+ - !ruby/object:Gem::Dependency
51
49
  name: shoulda
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
50
+ requirement: &2156758520 !ruby/object:Gem::Requirement
53
51
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
61
- requirement: *id003
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
62
56
  type: :development
63
- - !ruby/object:Gem::Dependency
64
57
  prerelease: false
58
+ version_requirements: *2156758520
59
+ - !ruby/object:Gem::Dependency
65
60
  name: bundler
66
- version_requirements: &id004 !ruby/object:Gem::Requirement
61
+ requirement: &2156753480 !ruby/object:Gem::Requirement
67
62
  none: false
68
- requirements:
63
+ requirements:
69
64
  - - ~>
70
- - !ruby/object:Gem::Version
71
- hash: 23
72
- segments:
73
- - 1
74
- - 0
75
- - 0
65
+ - !ruby/object:Gem::Version
76
66
  version: 1.0.0
77
- requirement: *id004
78
67
  type: :development
79
- - !ruby/object:Gem::Dependency
80
68
  prerelease: false
69
+ version_requirements: *2156753480
70
+ - !ruby/object:Gem::Dependency
81
71
  name: jeweler
82
- version_requirements: &id005 !ruby/object:Gem::Requirement
72
+ requirement: &2156749940 !ruby/object:Gem::Requirement
83
73
  none: false
84
- requirements:
74
+ requirements:
85
75
  - - ~>
86
- - !ruby/object:Gem::Version
87
- hash: 7
88
- segments:
89
- - 1
90
- - 5
91
- - 2
76
+ - !ruby/object:Gem::Version
92
77
  version: 1.5.2
93
- requirement: *id005
94
78
  type: :development
95
- - !ruby/object:Gem::Dependency
96
79
  prerelease: false
80
+ version_requirements: *2156749940
81
+ - !ruby/object:Gem::Dependency
97
82
  name: rcov
98
- version_requirements: &id006 !ruby/object:Gem::Requirement
83
+ requirement: &2156730380 !ruby/object:Gem::Requirement
99
84
  none: false
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- hash: 3
104
- segments:
105
- - 0
106
- version: "0"
107
- requirement: *id006
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
108
89
  type: :development
90
+ prerelease: false
91
+ version_requirements: *2156730380
109
92
  description: automate twitter tasks, such as retweetting, following, unfollowing
110
93
  email: krivich.ekaterina@gmail.com
111
94
  executables: []
112
-
113
95
  extensions: []
114
-
115
- extra_rdoc_files:
96
+ extra_rdoc_files:
116
97
  - LICENSE.txt
117
98
  - README.rdoc
118
- files:
99
+ files:
119
100
  - .document
120
101
  - Gemfile
121
102
  - LICENSE.txt
122
103
  - README.rdoc
123
104
  - Rakefile
124
105
  - VERSION
125
- - example/settings.yaml
106
+ - example/settings.yml
126
107
  - example/test.rb
108
+ - example/tweets.db
127
109
  - lib/robotwitter.rb
128
110
  - lib/robotwitter/db.rb
129
- - lib/robotwitter/path.rb
130
111
  - lib/robotwitter/version.rb
131
112
  - robotwitter.gemspec
132
113
  - spec/robotwitter/robotwitter_spec.rb
133
114
  - spec/spec_helper.rb
134
115
  has_rdoc: true
135
116
  homepage: http://github.com/kiote/robotwitter
136
- licenses:
117
+ licenses:
137
118
  - MIT
138
119
  post_install_message:
139
120
  rdoc_options: []
140
-
141
- require_paths:
121
+ require_paths:
142
122
  - lib
143
- required_ruby_version: !ruby/object:Gem::Requirement
123
+ required_ruby_version: !ruby/object:Gem::Requirement
144
124
  none: false
145
- requirements:
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- hash: 3
149
- segments:
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ segments:
150
130
  - 0
151
- version: "0"
152
- required_rubygems_version: !ruby/object:Gem::Requirement
131
+ hash: 150190672050493529
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
133
  none: false
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- hash: 3
158
- segments:
159
- - 0
160
- version: "0"
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
161
138
  requirements: []
162
-
163
139
  rubyforge_project:
164
- rubygems_version: 1.3.7
140
+ rubygems_version: 1.6.2
165
141
  signing_key:
166
142
  specification_version: 3
167
143
  summary: automate some twitter tasks
168
- test_files:
144
+ test_files:
169
145
  - spec/robotwitter/robotwitter_spec.rb
170
146
  - spec/spec_helper.rb
@@ -1,13 +0,0 @@
1
- module Robotwitter
2
- class Path
3
- @@base = nil
4
-
5
- def self.set_base base
6
- @@base = base
7
- end
8
-
9
- def self.get_base
10
- @@base
11
- end
12
- end
13
- end