robotwitter 0.1.1 → 0.1.2

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/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