pork_sandwich 0.4.8 → 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README +2 -2
- data/VERSION +1 -1
- data/lib/pork_sandwich/auth.rb +1 -1
- data/lib/pork_sandwich/log.rb +4 -4
- data/lib/pork_sandwich/puller.rb +4 -1
- data/lib/pork_sandwich/random_puller.rb +40 -0
- data/lib/pork_sandwich/saver.rb +3 -1
- data/lib/pork_sandwich/search.rb +18 -5
- data/lib/pork_sandwich/trend_puller.rb +6 -0
- data/test/log_test.rb +15 -1
- data/test/random_puller_test.rb +4 -0
- data/test/saver_test.rb +4 -4
- data/test/test_helper.rb +8 -0
- data/test/twitter_user_test.rb +6 -1
- metadata +5 -2
data/README
CHANGED
@@ -16,6 +16,6 @@ sudo rake gems:install
|
|
16
16
|
5. script/generate pork_sandwich_migration
|
17
17
|
|
18
18
|
6. rake db:migrate
|
19
|
-
(may have to comment the
|
19
|
+
(may have to comment the "with timestamp" stuff out in the migration. Starts with "begin" and has a lot of execute statements in it.)
|
20
20
|
|
21
|
-
Pork Classes and db Objects can now be referenced throughout your project.
|
21
|
+
Pork Classes and db Objects can now be referenced throughout your project. Happy porking.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.9
|
data/lib/pork_sandwich/auth.rb
CHANGED
data/lib/pork_sandwich/log.rb
CHANGED
@@ -4,13 +4,13 @@ module Pork
|
|
4
4
|
|
5
5
|
def initialize(output, options = {})
|
6
6
|
@log = Logger.new(output)
|
7
|
-
@log.level =
|
8
|
-
@researcher =
|
9
|
-
@project = options[:project]
|
7
|
+
@log.level = Logger::INFO
|
8
|
+
@researcher = options[:researcher]? options[:researcher] : ""
|
9
|
+
@project = options[:project]? options[:project] : ""
|
10
10
|
end
|
11
11
|
|
12
12
|
def write(message)
|
13
|
-
@log.info("#{@project}, #{@researcher}, #{Time.now}
|
13
|
+
@log.info("#{@project}, #{@researcher}, #{Time.now.to_s} -- " + message)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/pork_sandwich/puller.rb
CHANGED
@@ -72,7 +72,10 @@ FOLLOWER_IDS = lambda do |user, auth_object|
|
|
72
72
|
@pull_data = auth_object.follower_ids({:user_id => user.twitter_id})
|
73
73
|
@pull_data.each do |user_id|
|
74
74
|
db_user_object = $SAVER.save(Pork::TwitterUser.new(:twitter_id => user_id), &TWITTER_ACCOUNT_SAVE)
|
75
|
-
follower_relationship_db_ids << $SAVER.save({:friend => user,
|
75
|
+
follower_relationship_db_ids << $SAVER.save({:friend => user,
|
76
|
+
:follower => Pork::TwitterUser.new(:twitter_id => user_id,
|
77
|
+
:db_object => db_user_object)},
|
78
|
+
&RELATIONSHIP_SAVE)
|
76
79
|
end
|
77
80
|
$SAVER.rules[:complete_follower_set] = false
|
78
81
|
{:follower_relationship_db_ids => follower_relationship_db_ids}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pork
|
2
|
+
class RandomPuller
|
3
|
+
|
4
|
+
def self.pull(opts)
|
5
|
+
|
6
|
+
|
7
|
+
# if (!opts[:desired_count] and !opts[:duration_in_minutes]) or (opts[:desired_count] and opts[:duration_in_minutes])
|
8
|
+
# #raise an error that you must specify EITHER a :duration in minutes or a :desired_count
|
9
|
+
# end
|
10
|
+
|
11
|
+
# twitter_username = AppConfig.twitter_username
|
12
|
+
# twitter_password = AppConfig.twitter_password
|
13
|
+
#
|
14
|
+
# TweetStream::Client.new(twitter_username,twitter_password).track(Hashtag.search_string, :delete => Proc.new{ |status_id, user_id|}, :limit => Proc.new{ |skip_count| }) do |tweet|
|
15
|
+
# if tweet.geo.present? && tweet.geo.coordinates.present?
|
16
|
+
# latitude, longitude = *tweet.geo.coordinates
|
17
|
+
# else
|
18
|
+
# latitude, longitude = nil, nil
|
19
|
+
# end
|
20
|
+
# if Tweet.create(:tweet_id => tweet[:id],
|
21
|
+
# :text => tweet.text,
|
22
|
+
# :from_user => tweet.user.screen_name,
|
23
|
+
# :time_of_tweet => tweet.created_at,
|
24
|
+
# :to_user => tweet.in_reply_to_screen_name,
|
25
|
+
# :profile_image_url => tweet.user.profile_image_url,
|
26
|
+
# :source => tweet.source,
|
27
|
+
# :latitude => latitude,
|
28
|
+
# :longitude => longitude
|
29
|
+
# ).valid?
|
30
|
+
# p tweet.text
|
31
|
+
# end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/pork_sandwich/saver.rb
CHANGED
@@ -154,7 +154,9 @@ RELATIONSHIP_SAVE = lambda do |users_to_save, rules|
|
|
154
154
|
follower = users_to_save[:follower]
|
155
155
|
friend = users_to_save[:friend]
|
156
156
|
|
157
|
-
twitter_relationship = TwitterRelationship.new(:follower_id => follower.db_object.id,
|
157
|
+
twitter_relationship = TwitterRelationship.new(:follower_id => follower.db_object.id,
|
158
|
+
:friend_id => friend.db_object.id,
|
159
|
+
:current => true)
|
158
160
|
if rules[:complete_friend_set]
|
159
161
|
twitter_relationship[:complete_friend_set] = rules[:complete_friend_set]
|
160
162
|
end
|
data/lib/pork_sandwich/search.rb
CHANGED
@@ -16,6 +16,9 @@ module Pork
|
|
16
16
|
@search_params.from(@from_user) if @from_user
|
17
17
|
begin
|
18
18
|
loop do
|
19
|
+
if $PORK_LOG
|
20
|
+
$PORK_LOG.write("historical pull, query = #{@query}, max_id = #{@search_params.query[:max_id].to_s}")
|
21
|
+
end
|
19
22
|
@tweets_pulled = @search_params.dup.fetch.results
|
20
23
|
@tweets_pulled.each do |tweet|
|
21
24
|
tweet.status_id = tweet.id
|
@@ -33,20 +36,30 @@ module Pork
|
|
33
36
|
end
|
34
37
|
end
|
35
38
|
rescue Twitter::Unavailable
|
36
|
-
|
39
|
+
if $PORK_LOG
|
40
|
+
$PORK_LOG.write("ERROR: Twitter unavailable, trying in 60")
|
41
|
+
end
|
37
42
|
sleep 60
|
38
43
|
retry
|
39
44
|
rescue Twitter::NotFound
|
40
|
-
|
45
|
+
if $PORK_LOG
|
46
|
+
$PORK_LOG.write("ERROR: Info target not found, trying to skip")
|
47
|
+
end
|
41
48
|
rescue Crack::ParseError
|
42
|
-
|
49
|
+
if $PORK_LOG
|
50
|
+
$PORK_LOG.write("Error: JSON Parsing error, trying to skip past problem tweet")
|
51
|
+
end
|
43
52
|
@search_params.query[:max_id] -= 1000
|
44
53
|
rescue Errno::ETIMEDOUT
|
45
|
-
|
54
|
+
if $PORK_LOG
|
55
|
+
$PORK_LOG.write("ERROR: Puller timed out, retrying in 10")
|
56
|
+
end
|
46
57
|
sleep 10
|
47
58
|
retry
|
48
59
|
rescue Twitter::InformTwitter
|
49
|
-
|
60
|
+
if $PORK_LOG
|
61
|
+
$PORK_LOG.write("ERROR: Twitter internal error, retrying in 30")
|
62
|
+
end
|
50
63
|
sleep 30
|
51
64
|
retry
|
52
65
|
# rescue NoMethodError
|
data/test/log_test.rb
CHANGED
@@ -3,12 +3,26 @@ require "#{File.dirname(__FILE__)}/test_helper"
|
|
3
3
|
class LogTest < Test::Unit::TestCase
|
4
4
|
context "A default Log" do
|
5
5
|
setup do
|
6
|
-
@log = Pork::Log.new(
|
6
|
+
@log = Pork::Log.new('testlog.txt',{:researcher => "Researcher", :project => "Project"})
|
7
7
|
end
|
8
8
|
|
9
9
|
should "be able to be created" do
|
10
10
|
@log.inspect
|
11
11
|
end
|
12
|
+
|
13
|
+
should 'be able to write to the specified log file' do
|
14
|
+
@log.write("testing123")
|
15
|
+
log_string = ""
|
16
|
+
File.open('testlog.txt','r').each do |line|
|
17
|
+
log_string << line
|
18
|
+
end
|
19
|
+
assert log_string.include? ("testing123")
|
20
|
+
assert log_string.include? ("Project, Researcher")
|
21
|
+
end
|
22
|
+
|
23
|
+
teardown do
|
24
|
+
File.delete('testlog.txt')
|
25
|
+
end
|
12
26
|
end
|
13
27
|
|
14
28
|
end
|
data/test/saver_test.rb
CHANGED
@@ -42,11 +42,11 @@ class SaverTest < Test::Unit::TestCase
|
|
42
42
|
context "when saving a tweet_reaction" do
|
43
43
|
setup do
|
44
44
|
@tweet_reaction_size = TweetReaction.all.size
|
45
|
-
@tweet_reaction = Factory.
|
46
|
-
@saver.save(@tweet_reaction, &REACTION_SAVE)
|
45
|
+
@tweet_reaction = {:tweet => Factory.create(:tweet),:initiator => Factory.create(:twitter_account), :responder => Factory.create(:twitter_account), :type => 'retweet'}
|
47
46
|
end
|
48
47
|
|
49
48
|
should "allow the reaction to be saved" do
|
49
|
+
@saver.save(@tweet_reaction, &REACTION_SAVE)
|
50
50
|
assert_equal @tweet_reaction_size+1, TweetReaction.all.size
|
51
51
|
end
|
52
52
|
end
|
@@ -94,11 +94,11 @@ class SaverTest < Test::Unit::TestCase
|
|
94
94
|
end
|
95
95
|
context "when saving a tweet_reaction" do
|
96
96
|
setup do
|
97
|
-
@tweet_reaction = Factory.
|
98
|
-
@saver.save(@tweet_reaction, &REACTION_SAVE)
|
97
|
+
@tweet_reaction = {:tweet => Factory.create(:tweet),:initiator => Factory.create(:twitter_account), :responder => Factory.create(:twitter_account), :type => 'retweet'}
|
99
98
|
end
|
100
99
|
|
101
100
|
should "allow the reaction to be tagged" do
|
101
|
+
@saver.save(@tweet_reaction, &REACTION_SAVE)
|
102
102
|
assert_contains TweetReaction.last.tag_list,@rules["tags"]["tag"]
|
103
103
|
end
|
104
104
|
end
|
data/test/test_helper.rb
CHANGED
@@ -13,10 +13,18 @@ require 'rr'
|
|
13
13
|
|
14
14
|
require "#{File.dirname(__FILE__)}/../lib/pork_sandwich"
|
15
15
|
|
16
|
+
Object.send :undef_method, :id
|
17
|
+
|
16
18
|
class Test::Unit::TestCase
|
17
19
|
include RR::Adapters::TestUnit
|
18
20
|
config = YAML::load(File.open("#{File.dirname(__FILE__)}/../config/pork_config.yml"))
|
19
21
|
$AUTH = Pork::Auth.new(config['config']['twitter_auth']['username'], config['config']['twitter_auth']['password'], :user_agent => 'web_ecology_project')
|
22
|
+
reaction_types = ['retweet', 'mention', 'reply']
|
23
|
+
reaction_types.each do |r|
|
24
|
+
unless Reaction.find_by_reaction_type(r)
|
25
|
+
Reaction.create(:reaction_type => r)
|
26
|
+
end
|
27
|
+
end
|
20
28
|
end
|
21
29
|
|
22
30
|
|
data/test/twitter_user_test.rb
CHANGED
@@ -33,6 +33,12 @@ class TwitterUserTest < Test::Unit::TestCase
|
|
33
33
|
@user.update_account_info
|
34
34
|
assert_equal 'Sam Gilbert', @user.user_info[:name]
|
35
35
|
assert_equal 'sam1vp', @user.twitter_screen_name
|
36
|
+
assert_equal 'sam1vp', @user.db_object.screen_name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context "A TwitterUser with only a twitter_id" do
|
40
|
+
setup do
|
41
|
+
@user = Pork::TwitterUser.new({:twitter_id => 15019521})
|
36
42
|
end
|
37
43
|
|
38
44
|
should "be able to pull tweets" do
|
@@ -60,7 +66,6 @@ class TwitterUserTest < Test::Unit::TestCase
|
|
60
66
|
assert_equal @user.db_object.id, TwitterRelationship.find(@user.follower_relationship_db_ids.first).friend_id
|
61
67
|
end
|
62
68
|
|
63
|
-
|
64
69
|
end
|
65
70
|
|
66
71
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pork_sandwich
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Gilbert
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-02-
|
13
|
+
date: 2010-02-17 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -59,9 +59,11 @@ files:
|
|
59
59
|
- lib/pork_sandwich/crawler.rb
|
60
60
|
- lib/pork_sandwich/log.rb
|
61
61
|
- lib/pork_sandwich/puller.rb
|
62
|
+
- lib/pork_sandwich/random_puller.rb
|
62
63
|
- lib/pork_sandwich/reaction_processor.rb
|
63
64
|
- lib/pork_sandwich/saver.rb
|
64
65
|
- lib/pork_sandwich/search.rb
|
66
|
+
- lib/pork_sandwich/trend_puller.rb
|
65
67
|
- lib/pork_sandwich/twitter_user.rb
|
66
68
|
has_rdoc: true
|
67
69
|
homepage: http://github.com/sam1vp/pork_sandwich
|
@@ -98,6 +100,7 @@ test_files:
|
|
98
100
|
- test/fakewebs.rb
|
99
101
|
- test/log_test.rb
|
100
102
|
- test/puller_test.rb
|
103
|
+
- test/random_puller_test.rb
|
101
104
|
- test/reaction_processor_test.rb
|
102
105
|
- test/saver_test.rb
|
103
106
|
- test/schema.rb
|