neo4apis-twitter 0.7.0 → 0.8.1
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.
- 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
|