neo4apis-twitter 0.7.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/twitter.yml +7 -0
- data/lib/neo4apis/cli/twitter.rb +82 -7
- data/lib/neo4apis/twitter.rb +1 -1
- data/neo4apis-twitter.gemspec +2 -2
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4af92daa4a378b1ced8de1deb45ca1a9b551e637
|
4
|
+
data.tar.gz: dd5db05d098883b4699674761ad2801232ecbc2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecc8240fed4ca7038db29ebb7bda7e1848aa0a6e5b7ca365604c839bd56ff0b33fefa5d0ae491454938c8625c193999d843ef24234bd402f8ab57be60e930a21
|
7
|
+
data.tar.gz: 6004713148e4a3848b3f45c7f006648186a5872e7e4c2048869b7d0d490530e0d29d3cbe72dc152ffa2147258ca854f0817d953534660e10f92b4ab9d57ed6aa
|
data/config/twitter.yml
ADDED
data/lib/neo4apis/cli/twitter.rb
CHANGED
@@ -4,7 +4,7 @@ require 'colorize'
|
|
4
4
|
|
5
5
|
module Neo4Apis
|
6
6
|
module CLI
|
7
|
-
class Twitter <
|
7
|
+
class Twitter < Base
|
8
8
|
class_option :config_path, type: :string, default: 'config/twitter.yml'
|
9
9
|
|
10
10
|
class_option :import_retweets, type: :boolean, default: false
|
@@ -27,18 +27,93 @@ module Neo4Apis
|
|
27
27
|
desc "search QUERY COUNT", "Import tweets via a search query"
|
28
28
|
def search(query, count)
|
29
29
|
neo4apis_client.batch do
|
30
|
-
twitter_client
|
30
|
+
twitter_client.search(query, options).take(count.to_i).each(&tweet_importer)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "followers USERNAME DEPTH", "Imports followers (and optionally followers of followers if depth specified and with a value > 1"
|
35
|
+
def followers(user, depth = 1)
|
36
|
+
neo4apis_client.batch do
|
37
|
+
follower_importer(neo4apis_client, user, depth.to_i)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "friends USERNAME DEPTH", "Imports friends (and optionally friends of friends if depth specified and with a value > 1"
|
42
|
+
def friends(user, depth = 1)
|
43
|
+
neo4apis_client.batch do
|
44
|
+
friend_importer(neo4apis_client, user, depth.to_i)
|
31
45
|
end
|
32
46
|
end
|
33
47
|
|
34
48
|
private
|
35
49
|
|
50
|
+
def follower_importer(neo4apis_client, user, depth)
|
51
|
+
friend_follower_importer(:followers, neo4apis_client, user, depth)
|
52
|
+
end
|
53
|
+
|
54
|
+
def friend_importer(neo4apis_client, user, depth)
|
55
|
+
friend_follower_importer(:friends, neo4apis_client, user, depth)
|
56
|
+
end
|
57
|
+
|
58
|
+
def friend_follower_importer(type, neo4apis_client, user, depth)
|
59
|
+
twitter_user = if user == ::Twitter::User
|
60
|
+
user
|
61
|
+
else
|
62
|
+
throttled_block { twitter_client.user(user) }
|
63
|
+
end
|
64
|
+
user_node = user_importer.call(twitter_user)
|
65
|
+
|
66
|
+
relationship = (type == :friends ? :friended : :follows)
|
67
|
+
get_friends_or_followers(type, twitter_user).each do |other_user|
|
68
|
+
other_user_node = user_importer.call(other_user)
|
69
|
+
|
70
|
+
neo4apis_client.add_relationship(relationship, other_user_node, user_node)
|
71
|
+
|
72
|
+
if depth > 1
|
73
|
+
friend_follower_importer(type, neo4apis_client, other_user, depth - 1)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_friends_or_followers(type, user)
|
79
|
+
[].tap do |user_list|
|
80
|
+
next_cursor = -1
|
81
|
+
while next_cursor != 0
|
82
|
+
result = throttled_block { twitter_client.send(type, user, cursor: next_cursor, count: 5000) }
|
83
|
+
throttled_block { user_list.concat(result.take(5000)) }
|
84
|
+
next_cursor = result.send(:next_cursor)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def throttled_block
|
90
|
+
yield
|
91
|
+
rescue ::Twitter::Error::TooManyRequests => error
|
92
|
+
reset_in = error.rate_limit.reset_in
|
93
|
+
puts "Rate limit exceeded. Sleeping for #{reset_in} seconds"
|
94
|
+
sleep reset_in
|
95
|
+
retry
|
96
|
+
end
|
97
|
+
|
36
98
|
def tweet_importer
|
99
|
+
@tweet_importer ||= object_importer(::Twitter::Tweet, :Tweet)
|
100
|
+
end
|
101
|
+
|
102
|
+
def user_importer
|
103
|
+
@user_importer ||= object_importer(::Twitter::User, :User)
|
104
|
+
end
|
105
|
+
|
106
|
+
def object_importer(gem_class, label)
|
37
107
|
Proc.new do |object|
|
38
108
|
case object
|
39
|
-
when
|
40
|
-
|
41
|
-
|
109
|
+
when gem_class
|
110
|
+
case label
|
111
|
+
when :Tweet
|
112
|
+
say "got tweet from @#{object.user.screen_name.colorize(:light_blue)}: #{object.text}"
|
113
|
+
when :User
|
114
|
+
say "get user ##{object.id}"
|
115
|
+
end
|
116
|
+
neo4apis_client.import label, object
|
42
117
|
when ::Twitter::Streaming::StallWarning
|
43
118
|
say "FALLING BEHIND!".colorize(:red)
|
44
119
|
end
|
@@ -48,10 +123,10 @@ module Neo4Apis
|
|
48
123
|
NEO4APIS_CLIENT_CLASS = ::Neo4Apis::Twitter
|
49
124
|
|
50
125
|
def neo4apis_client
|
51
|
-
@neo4apis_client ||= NEO4APIS_CLIENT_CLASS.new(
|
126
|
+
@neo4apis_client ||= NEO4APIS_CLIENT_CLASS.new(neo4j_session, import_retweets: options[:import_retweets], import_hashtags: options[:import_hashtags], import_user_mentions: options[:import_user_mentions])
|
52
127
|
end
|
53
128
|
|
54
|
-
def twitter_client(streaming)
|
129
|
+
def twitter_client(streaming = false)
|
55
130
|
return @twitter_client if @twitter_client
|
56
131
|
|
57
132
|
twitter_client_class = streaming ? ::Twitter::Streaming::Client : ::Twitter::REST::Client
|
data/lib/neo4apis/twitter.rb
CHANGED
data/neo4apis-twitter.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.unshift lib unless $:.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "neo4apis-twitter"
|
6
|
-
s.version = '0.
|
6
|
+
s.version = '0.8.1'
|
7
7
|
s.required_ruby_version = ">= 1.9.1"
|
8
8
|
|
9
9
|
s.authors = "Brian Underwood"
|
@@ -18,7 +18,7 @@ A ruby gem using neo4apis to make importing twitter data to neo4j easy
|
|
18
18
|
s.require_path = 'lib'
|
19
19
|
s.files = Dir.glob("{bin,lib,config}/**/*") + %w(README.md Gemfile neo4apis-twitter.gemspec)
|
20
20
|
|
21
|
-
s.add_dependency('neo4apis', '
|
21
|
+
s.add_dependency('neo4apis', '>= 0.8.0')
|
22
22
|
s.add_dependency('twitter', '~> 5.12.0')
|
23
23
|
|
24
24
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4apis-twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Underwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: neo4apis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.8.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.8.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: twitter
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- Gemfile
|
49
49
|
- README.md
|
50
|
+
- config/twitter.yml
|
50
51
|
- lib/neo4apis-twitter.rb
|
51
52
|
- lib/neo4apis/cli/twitter.rb
|
52
53
|
- lib/neo4apis/twitter.rb
|
@@ -71,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
72
|
version: '0'
|
72
73
|
requirements: []
|
73
74
|
rubyforge_project:
|
74
|
-
rubygems_version: 2.
|
75
|
+
rubygems_version: 2.4.5
|
75
76
|
signing_key:
|
76
77
|
specification_version: 4
|
77
78
|
summary: An ruby gem to import twitter data to neo4j
|