robotwitter 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -8
- data/Rakefile +0 -7
- data/VERSION +1 -1
- data/example/settings.yml +5 -5
- data/example/tweets.db +0 -0
- data/lib/robotwitter.rb +41 -67
- data/lib/robotwitter/db.rb +7 -7
- data/robotwitter.gemspec +20 -24
- data/spec/robotwitter/robotwitter_spec.rb +91 -39
- data/spec/spec_helper.rb +6 -6
- metadata +29 -31
data/Gemfile
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
source
|
2
|
-
gem
|
3
|
-
gem
|
4
|
-
gem
|
1
|
+
source :rubygems
|
2
|
+
gem 'twitter'
|
3
|
+
gem 'sqlite3'
|
4
|
+
gem 'fakeweb'
|
5
|
+
gem 'minitest'
|
6
|
+
gem 'pry'
|
5
7
|
|
6
8
|
group :development do
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem "jeweler", "~> 1.5.2"
|
10
|
-
gem "rcov", ">= 0"
|
9
|
+
gem 'shoulda'
|
10
|
+
gem 'jeweler'
|
11
11
|
end
|
data/Rakefile
CHANGED
@@ -33,13 +33,6 @@ Rake::TestTask.new(:test) do |test|
|
|
33
33
|
test.verbose = true
|
34
34
|
end
|
35
35
|
|
36
|
-
require 'rcov/rcovtask'
|
37
|
-
Rcov::RcovTask.new do |test|
|
38
|
-
test.libs << 'test'
|
39
|
-
test.pattern = 'test/**/test_*.rb'
|
40
|
-
test.verbose = true
|
41
|
-
end
|
42
|
-
|
43
36
|
task :default => :test
|
44
37
|
|
45
38
|
require 'rake/rdoctask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/example/settings.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
consumer_key:
|
3
|
-
consumer_secret:
|
4
|
-
oauth_token:
|
5
|
-
oauth_token_secret:
|
1
|
+
serialmaniak_ru:
|
2
|
+
consumer_key: qhQYAKHy5mVWhdqPD0DX1g
|
3
|
+
consumer_secret: bFgbeWrr6y10qtFrC089WswSgbhWdmQPYZxbvB30uwk
|
4
|
+
oauth_token: 27295510-cZOZYtSnRHYEdnLyIcEbWPFaDQz0Ev7RdZanUbZY
|
5
|
+
oauth_token_secret: 6bIrZX6burEjHS5BMrYcQDBFKvtK2lsr4E2sOcnOQYg
|
data/example/tweets.db
CHANGED
Binary file
|
data/lib/robotwitter.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'twitter'
|
3
|
+
require 'twitter/error/unauthorized'
|
3
4
|
require 'open-uri'
|
4
5
|
require 'yaml'
|
5
6
|
require 'sqlite3'
|
@@ -16,56 +17,46 @@ module Robotwitter
|
|
16
17
|
# which returns string
|
17
18
|
# example of getter
|
18
19
|
#
|
19
|
-
# SQLITE_GETTER = lambda do
|
20
|
+
# SQLITE_GETTER = lambda do
|
20
21
|
# db = SQLite3::Database.new("database.db")
|
21
22
|
# db.get_first_row( "select * from table" )
|
22
23
|
# end
|
23
24
|
def initialize(path, section, &getter)
|
24
|
-
@getter
|
25
|
-
@followers_ids = nil
|
26
|
-
@following_ids = nil
|
27
|
-
@path = path
|
25
|
+
@getter, @path, @followers_ids, @following_ids = getter, path, nil, nil
|
28
26
|
|
29
27
|
@logger = Logger.new('tweelog.txt', 'weekly')
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@logger.error %/error occurred: #{exception.inspect}\n#{exception.backtrace.join("\n")}/
|
29
|
+
|
30
|
+
path ||= ''
|
31
|
+
path += '/' if path != ''
|
32
|
+
|
33
|
+
yml = YAML.load_file(path + "settings.yml")
|
34
|
+
Twitter.configure do |config|
|
35
|
+
config.consumer_key = yml[section]['consumer_key']
|
36
|
+
config.consumer_secret = yml[section]['consumer_secret']
|
37
|
+
config.oauth_token = yml[section]['oauth_token']
|
38
|
+
config.oauth_token_secret = yml[section]['oauth_token_secret']
|
42
39
|
end
|
40
|
+
@client = Twitter::Client.new
|
41
|
+
@search_client = Twitter
|
43
42
|
end
|
44
43
|
|
45
44
|
# follow who follows me
|
46
45
|
def follow_all_back
|
47
|
-
get_followers_ids
|
48
|
-
get_following_ids
|
49
|
-
|
50
|
-
follow_them = @followers_ids - @following_ids
|
51
|
-
@logger.info 'follows:'
|
46
|
+
follow_them = get_followers_ids - get_following_ids
|
52
47
|
follow_them.each do |id|
|
53
|
-
|
54
|
-
|
55
|
-
rescue
|
56
|
-
end
|
57
|
-
@logger.info id
|
48
|
+
@client.follow(id)
|
49
|
+
@logger.info 'following' + id.to_s
|
58
50
|
end
|
59
51
|
end
|
60
52
|
|
61
53
|
# string '_msg_ somth'
|
62
54
|
def send_message(pattern)
|
63
55
|
phrase = get_phrase
|
64
|
-
p phrase
|
65
56
|
return if phrase == ''
|
66
57
|
send = pattern.gsub('_msg_', phrase)
|
67
|
-
@client.update
|
68
|
-
@logger.info
|
58
|
+
@client.update(send)
|
59
|
+
@logger.info(send)
|
69
60
|
end
|
70
61
|
|
71
62
|
def retweet_about(word)
|
@@ -73,70 +64,54 @@ module Robotwitter
|
|
73
64
|
init_db
|
74
65
|
search.each do |result|
|
75
66
|
next if @db.retweeted?(result)
|
76
|
-
retweet
|
77
|
-
@db.save_retweet
|
78
|
-
@logger.info
|
67
|
+
retweet(result)
|
68
|
+
@db.save_retweet(result)
|
69
|
+
@logger.info(result['id'])
|
79
70
|
end
|
80
71
|
end
|
81
72
|
|
82
73
|
# follow who tweet about word
|
83
74
|
def follow_users_tweets_about(word)
|
84
|
-
users = search_users_tweets_about
|
75
|
+
users = search_users_tweets_about(word)
|
85
76
|
|
86
77
|
get_followers_ids
|
87
78
|
get_following_ids
|
88
|
-
@logger.info
|
79
|
+
@logger.info(users)
|
89
80
|
users.each do |user|
|
90
81
|
id = user['from_user_id']
|
91
82
|
name = user['from_user']
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
@logger.info name
|
96
|
-
end
|
97
|
-
rescue Exception => msg
|
98
|
-
@logger.error "Error #{msg}"
|
83
|
+
if (not @followers_ids.include?(id)) and (not @following_ids.include?(id))
|
84
|
+
@client.follow(name)
|
85
|
+
@logger.info(name)
|
99
86
|
end
|
100
87
|
end
|
101
88
|
end
|
102
89
|
|
103
90
|
#unfollow who not following me
|
104
91
|
def unfollow_users
|
105
|
-
get_followers_ids
|
106
|
-
get_following_ids
|
107
|
-
|
108
|
-
unfollow_them = @following_ids - @followers_ids
|
92
|
+
unfollow_them = get_following_ids - get_followers_ids
|
109
93
|
unfollow_them.each do |id|
|
110
|
-
|
111
|
-
|
112
|
-
rescue
|
113
|
-
end
|
114
|
-
@logger.info id
|
94
|
+
@client.unfollow(id)
|
95
|
+
@logger.info(id)
|
115
96
|
end
|
116
97
|
end
|
117
98
|
|
118
99
|
protected
|
119
100
|
|
120
101
|
def init_db
|
121
|
-
@db
|
122
|
-
@db
|
102
|
+
@db ||= Robotwitter::Db.new('tweets', @path)
|
123
103
|
end
|
124
104
|
|
125
|
-
# get phrase
|
105
|
+
# get phrase from internal resource
|
126
106
|
def get_phrase
|
127
107
|
@getter.call(self)
|
128
108
|
rescue
|
129
109
|
""
|
130
110
|
end
|
131
111
|
|
132
|
-
#
|
112
|
+
# search for users tweets about
|
133
113
|
def search_users_tweets_about(word, count = 5)
|
134
|
-
|
135
|
-
if resp.is_a?(Twitter::Unauthorized)
|
136
|
-
@logger.error 'unauthorized'
|
137
|
-
return []
|
138
|
-
end
|
139
|
-
resp
|
114
|
+
@search_client.search(word, :locale => 'ru', :result_type => 'resent', :rpp => count)
|
140
115
|
end
|
141
116
|
|
142
117
|
# get follower ids
|
@@ -152,20 +127,19 @@ module Robotwitter
|
|
152
127
|
if @following_ids.nil?
|
153
128
|
@following_ids = @client.friend_ids['ids']
|
154
129
|
end
|
130
|
+
@following_ids
|
155
131
|
end
|
156
132
|
|
157
|
-
#
|
133
|
+
# retweet
|
158
134
|
# result - hash от поиска
|
159
135
|
def retweet(result)
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
@logger.error 'error: ' + desc.inspect
|
164
|
-
end
|
136
|
+
@client.retweet(result['id'])
|
137
|
+
rescue => detail
|
138
|
+
@logger.error(detail)
|
165
139
|
end
|
166
140
|
|
167
141
|
def rate_limit
|
168
|
-
@logger.error
|
142
|
+
@logger.error(@client.rate_limit_status.remaining_hits.to_s + ' Twitter API request(s) remaining this hour')
|
169
143
|
end
|
170
144
|
end
|
171
145
|
end
|
data/lib/robotwitter/db.rb
CHANGED
@@ -11,12 +11,12 @@ module Robotwitter
|
|
11
11
|
def create_db(name)
|
12
12
|
db = SQLite3::Database.new("#{name}.db")
|
13
13
|
|
14
|
-
sql =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
SQL
|
14
|
+
sql = <<-SQL
|
15
|
+
create table #{TABLENAME} (
|
16
|
+
id integer PRIMARY KEY AUTOINCREMENT,
|
17
|
+
tweet_id string
|
18
|
+
);
|
19
|
+
SQL
|
20
20
|
|
21
21
|
db.execute_batch(sql)
|
22
22
|
end
|
@@ -36,7 +36,7 @@ SQL
|
|
36
36
|
# сохраняем ретвитт, чтобы не ретвиттить снова
|
37
37
|
# result - результат twitter.search
|
38
38
|
def save_retweet result
|
39
|
-
id = result['id_str']
|
39
|
+
id = result.attrs['id_str']
|
40
40
|
sql = "insert into #{TABLENAME} (tweet_id) values (#{id})"
|
41
41
|
@db.query(sql)
|
42
42
|
end
|
data/robotwitter.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "robotwitter"
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["Krivich Ekaterina"]
|
12
|
+
s.date = "2012-03-13"
|
13
|
+
s.description = "automate twitter tasks, such as retweetting, following, unfollowing"
|
14
|
+
s.email = "krivich.ekaterina@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
17
|
"README.rdoc"
|
@@ -33,15 +33,11 @@ Gem::Specification.new do |s|
|
|
33
33
|
"spec/robotwitter/robotwitter_spec.rb",
|
34
34
|
"spec/spec_helper.rb"
|
35
35
|
]
|
36
|
-
s.homepage =
|
37
|
-
s.licenses = [
|
38
|
-
s.require_paths = [
|
39
|
-
s.rubygems_version =
|
40
|
-
s.summary =
|
41
|
-
s.test_files = [
|
42
|
-
"spec/robotwitter/robotwitter_spec.rb",
|
43
|
-
"spec/spec_helper.rb"
|
44
|
-
]
|
36
|
+
s.homepage = "http://github.com/kiote/robotwitter"
|
37
|
+
s.licenses = ["MIT"]
|
38
|
+
s.require_paths = ["lib"]
|
39
|
+
s.rubygems_version = "1.8.17"
|
40
|
+
s.summary = "automate some twitter tasks"
|
45
41
|
|
46
42
|
if s.respond_to? :specification_version then
|
47
43
|
s.specification_version = 3
|
@@ -50,27 +46,27 @@ Gem::Specification.new do |s|
|
|
50
46
|
s.add_runtime_dependency(%q<twitter>, [">= 0"])
|
51
47
|
s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
|
52
48
|
s.add_runtime_dependency(%q<fakeweb>, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<minitest>, [">= 0"])
|
50
|
+
s.add_runtime_dependency(%q<pry>, [">= 0"])
|
53
51
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
54
|
-
s.add_development_dependency(%q<
|
55
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
56
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
57
53
|
else
|
58
54
|
s.add_dependency(%q<twitter>, [">= 0"])
|
59
55
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
60
56
|
s.add_dependency(%q<fakeweb>, [">= 0"])
|
57
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
58
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
61
59
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
62
|
-
s.add_dependency(%q<
|
63
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
64
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
60
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
65
61
|
end
|
66
62
|
else
|
67
63
|
s.add_dependency(%q<twitter>, [">= 0"])
|
68
64
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
69
65
|
s.add_dependency(%q<fakeweb>, [">= 0"])
|
66
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
67
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
70
68
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
71
|
-
s.add_dependency(%q<
|
72
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
73
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
69
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
74
70
|
end
|
75
71
|
end
|
76
72
|
|
@@ -1,60 +1,112 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH << File.expand_path('../../', __FILE__)
|
2
|
+
require 'spec_helper'
|
2
3
|
|
3
|
-
describe
|
4
|
-
|
5
|
-
|
6
|
-
|
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 => '')
|
4
|
+
describe Robotwitter do
|
5
|
+
def mock_client(object)
|
6
|
+
@mock = MiniTest::Mock.new
|
7
|
+
object.instance_variable_set(:@client, @mock)
|
17
8
|
end
|
18
9
|
|
19
|
-
|
20
|
-
|
10
|
+
def follower_and_friends
|
11
|
+
ids = [1,2,3,4]
|
12
|
+
@mock.expect(:follower_ids, 'ids' => ids)
|
13
|
+
@mock.expect(:friend_ids, 'ids' => [4,5,6,7,8])
|
14
|
+
ids
|
21
15
|
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
@client = Robotwitter::Robot.new @settings_path, 'test_login', &POSTER
|
17
|
+
def tweet_params
|
18
|
+
['id' => 'kolyan', 'from_user_id' => 'vasyan_id', 'from_user' => 'vasyan']
|
26
19
|
end
|
27
20
|
|
28
|
-
|
29
|
-
@
|
21
|
+
before do
|
22
|
+
@robotwitter = Robotwitter::Robot.new('', 'test_login') do
|
23
|
+
'hello'
|
24
|
+
end
|
25
|
+
mock_client(@robotwitter)
|
30
26
|
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
# мы фалловим 5 пользователей: [4,5,6,7,8]
|
29
|
+
# нас фалловят 4: [1,2,3,4]
|
30
|
+
# follow_all_back должна зафалловить 3х пользователей: [1,2,3]
|
31
|
+
describe 'follow_all_back' do
|
32
|
+
before do
|
33
|
+
ids = follower_and_friends
|
34
|
+
ids.pop
|
35
|
+
ids.each { |id| @mock.expect(:follow, [], [id]) }
|
36
|
+
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
+
it 'should follow those, who follows me' do
|
39
|
+
@robotwitter.follow_all_back
|
40
|
+
end
|
38
41
|
end
|
39
42
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
# тестируем отправку сообщений
|
44
|
+
# перед отправкой сообщение получается из внешнего источника
|
45
|
+
describe 'send_message' do
|
46
|
+
before do
|
47
|
+
@mock.expect(:update, nil, ['hello there'])
|
48
|
+
end
|
43
49
|
|
44
|
-
|
45
|
-
|
50
|
+
it 'should successfully sends message' do
|
51
|
+
@robotwitter.send_message('_msg_ there')
|
52
|
+
end
|
46
53
|
end
|
47
54
|
|
48
|
-
|
49
|
-
|
55
|
+
describe 'containing' do
|
56
|
+
# сначала мокаем search_client
|
57
|
+
# он вызывает кучу методов через method chaining и возвращает id твитта
|
58
|
+
before do
|
59
|
+
sk = MiniTest::Mock.new
|
60
|
+
sk.expect(:search, tweet_params, %w/hell/)
|
61
|
+
@robotwitter.instance_variable_set(:@search_client, sk)
|
62
|
+
end
|
63
|
+
|
64
|
+
# тестируем ретвит о каком-то слове
|
65
|
+
describe 'retweet_about' do
|
66
|
+
# мокаем сохраниение в базе
|
67
|
+
before do
|
68
|
+
db = MiniTest::Mock.new
|
69
|
+
db.expect(:nil?, false)
|
70
|
+
db.expect(:retweeted?, false, tweet_params)
|
71
|
+
db.expect(:save_retweet, false, tweet_params)
|
72
|
+
|
73
|
+
@robotwitter.instance_variable_set(:@db, db)
|
74
|
+
@mock.expect(:retweet, nil, %w/kolyan/)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should retweet' do
|
78
|
+
@robotwitter.retweet_about('hell')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# тестируем фолловинг пользователей, которые пишут о...
|
83
|
+
describe 'follow_users_tweets_about' do
|
84
|
+
before do
|
85
|
+
follower_and_friends
|
86
|
+
@mock.expect(:follow, [], ['vasyan'])
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should follow users' do
|
90
|
+
@robotwitter.follow_users_tweets_about('hell')
|
91
|
+
end
|
92
|
+
end
|
50
93
|
end
|
51
94
|
|
52
|
-
|
53
|
-
|
54
|
-
|
95
|
+
# мы фалловим 5 пользователей: [4,5,6,7,8]
|
96
|
+
# нас фалловят 4: [1,2,3,4]
|
97
|
+
# follow_all_back должна отфалловить 3х пользователей: [1,2,3]
|
98
|
+
describe 'unfollow_users' do
|
99
|
+
before do
|
100
|
+
follower_and_friends
|
101
|
+
(1..3).to_a.map {|i| @mock.expect(:unfollow, [], [i])}
|
55
102
|
end
|
56
103
|
|
57
|
-
|
58
|
-
|
104
|
+
it 'should unfollow' do
|
105
|
+
@robotwitter.unfollow_users
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
after do
|
110
|
+
@mock.verify
|
59
111
|
end
|
60
112
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
$LOAD_PATH << File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'robotwitter'
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'minitest/mock'
|
6
|
+
require 'pry'
|
3
7
|
|
4
|
-
require 'twitter'
|
5
|
-
require 'rspec'
|
6
|
-
require 'fakeweb'
|
7
|
-
require 'robotwitter'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robotwitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-03-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: twitter
|
16
|
-
requirement: &
|
16
|
+
requirement: &70334826215500 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70334826215500
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sqlite3
|
27
|
-
requirement: &
|
27
|
+
requirement: &70334826214720 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70334826214720
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: fakeweb
|
38
|
-
requirement: &
|
38
|
+
requirement: &70334826214180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,43 +43,43 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70334826214180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
48
|
+
name: minitest
|
49
|
+
requirement: &70334826211800 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
type: :
|
55
|
+
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70334826211800
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement: &
|
59
|
+
name: pry
|
60
|
+
requirement: &70334826210940 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
|
-
- -
|
63
|
+
- - ! '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
66
|
-
type: :
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70334826210940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
-
requirement: &
|
70
|
+
name: shoulda
|
71
|
+
requirement: &70334826188940 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ! '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70334826188940
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
82
|
-
requirement: &
|
81
|
+
name: jeweler
|
82
|
+
requirement: &70334826187180 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70334826187180
|
91
91
|
description: automate twitter tasks, such as retweetting, following, unfollowing
|
92
92
|
email: krivich.ekaterina@gmail.com
|
93
93
|
executables: []
|
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
segments:
|
128
128
|
- 0
|
129
|
-
hash:
|
129
|
+
hash: 1002785137624157305
|
130
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
131
|
none: false
|
132
132
|
requirements:
|
@@ -135,10 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
135
|
version: '0'
|
136
136
|
requirements: []
|
137
137
|
rubyforge_project:
|
138
|
-
rubygems_version: 1.8.
|
138
|
+
rubygems_version: 1.8.17
|
139
139
|
signing_key:
|
140
140
|
specification_version: 3
|
141
141
|
summary: automate some twitter tasks
|
142
|
-
test_files:
|
143
|
-
- spec/robotwitter/robotwitter_spec.rb
|
144
|
-
- spec/spec_helper.rb
|
142
|
+
test_files: []
|