tw 0.1.1 → 0.2.0
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 +2 -1
- data/Gemfile.lock +9 -2
- data/History.txt +5 -0
- data/Manifest.txt +1 -0
- data/README.rdoc +24 -5
- data/Rakefile +1 -1
- data/lib/tw.rb +4 -2
- data/lib/tw/app/cmds.rb +22 -1
- data/lib/tw/app/main.rb +16 -2
- data/lib/tw/app/render.rb +1 -0
- data/lib/tw/client/auth.rb +21 -14
- data/lib/tw/client/stream.rb +49 -0
- metadata +16 -9
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,13 +2,15 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
RedCloth (4.2.9)
|
5
|
+
RedCloth (4.2.9-java)
|
5
6
|
activesupport (2.3.14)
|
6
7
|
args_parser (0.1.0)
|
7
|
-
backports (2.6.4)
|
8
8
|
faraday (0.8.4)
|
9
9
|
multipart-post (~> 1.1)
|
10
|
+
hashie (1.2.0)
|
10
11
|
hoe (3.1.0)
|
11
12
|
rake (~> 0.8)
|
13
|
+
json (1.7.4)
|
12
14
|
multi_json (1.3.6)
|
13
15
|
multipart-post (1.1.5)
|
14
16
|
newgem (1.5.3)
|
@@ -28,15 +30,20 @@ GEM
|
|
28
30
|
faraday (~> 0.8)
|
29
31
|
multi_json (~> 1.3)
|
30
32
|
simple_oauth (~> 0.1.6)
|
33
|
+
userstream (1.2.2)
|
34
|
+
hashie (~> 1.2.0)
|
35
|
+
oauth (~> 0.4.6)
|
31
36
|
|
32
37
|
PLATFORMS
|
38
|
+
java
|
33
39
|
ruby
|
34
40
|
|
35
41
|
DEPENDENCIES
|
36
42
|
args_parser
|
37
|
-
backports
|
38
43
|
hoe
|
44
|
+
json
|
39
45
|
newgem
|
40
46
|
oauth
|
41
47
|
rainbow
|
42
48
|
twitter
|
49
|
+
userstream
|
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
= tw
|
2
2
|
|
3
|
-
* http://github.com/
|
3
|
+
* http://shokai.github.com/tw
|
4
|
+
* https://rubygems.org/gems/tw
|
4
5
|
|
5
6
|
== INSTALL:
|
6
7
|
|
@@ -16,6 +17,11 @@ show help
|
|
16
17
|
|
17
18
|
% tw --help
|
18
19
|
|
20
|
+
Tweet
|
21
|
+
|
22
|
+
% tw hello hello
|
23
|
+
% echo "hello" | tw --pipe
|
24
|
+
|
19
25
|
read Timeline
|
20
26
|
|
21
27
|
% tw @username
|
@@ -23,16 +29,29 @@ read Timeline
|
|
23
29
|
% tw @username/listname
|
24
30
|
% tw --timeline
|
25
31
|
% tw --search=ruby
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
% tw hello hello
|
32
|
+
% tw --stream
|
33
|
+
% tw --stream:filter=ruby,java
|
30
34
|
|
31
35
|
DM
|
32
36
|
|
33
37
|
% tw --dm
|
34
38
|
% tw --dm:to=shokai "hello!"
|
35
39
|
|
40
|
+
Switch Accounts
|
41
|
+
|
42
|
+
% tw --user:add
|
43
|
+
open http://twitter.com/oauth/authorize?oauth_token=a1b2cDEF3456gh78
|
44
|
+
input PIN Number: 19283746
|
45
|
+
add "@user2"
|
46
|
+
% tw --user:list
|
47
|
+
* shokai
|
48
|
+
user2
|
49
|
+
user3
|
50
|
+
(3 users)
|
51
|
+
% tw hello --user=user2
|
52
|
+
% tw --user:default=user2
|
53
|
+
set default user "@user2"
|
54
|
+
|
36
55
|
|
37
56
|
== LICENSE:
|
38
57
|
|
data/Rakefile
CHANGED
@@ -15,8 +15,8 @@ $hoe = Hoe.spec 'tw' do
|
|
15
15
|
self.rubyforge_name = self.name # TODO this is default value
|
16
16
|
self.extra_deps = [['oauth','>= 0.4.7', '< 1.0.0'],
|
17
17
|
['twitter', '>= 4.0.0', '< 5.0.0'],
|
18
|
+
['userstream', '>= 1.2.0', '< 1.3.0'],
|
18
19
|
['args_parser', '>= 0.1.0'],
|
19
|
-
['backports', '>= 2.6.4'],
|
20
20
|
['rainbow', '>= 1.1.4', '< 2.0.0']]
|
21
21
|
|
22
22
|
end
|
data/lib/tw.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
|
-
require 'backports'
|
5
4
|
require 'oauth'
|
6
5
|
require 'twitter'
|
6
|
+
require 'time'
|
7
|
+
require 'user_stream'
|
7
8
|
require 'yaml'
|
8
9
|
require 'time'
|
9
10
|
require 'args_parser'
|
@@ -11,10 +12,11 @@ require 'rainbow'
|
|
11
12
|
require 'tw/conf'
|
12
13
|
require 'tw/client/auth'
|
13
14
|
require 'tw/client/request'
|
15
|
+
require 'tw/client/stream'
|
14
16
|
require 'tw/client/error'
|
15
17
|
|
16
18
|
module Tw
|
17
|
-
VERSION = '0.
|
19
|
+
VERSION = '0.2.0'
|
18
20
|
class Conf
|
19
21
|
REQUIRE_VERSION = '0.1.0'
|
20
22
|
end
|
data/lib/tw/app/cmds.rb
CHANGED
@@ -12,7 +12,7 @@ module Tw::App
|
|
12
12
|
end
|
13
13
|
|
14
14
|
cmd 'user:add' do |v|
|
15
|
-
|
15
|
+
Tw::Auth.regist_user
|
16
16
|
on_exit
|
17
17
|
end
|
18
18
|
|
@@ -80,6 +80,27 @@ module Tw::App
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
cmd :stream do |v|
|
84
|
+
stream = Tw::Client::Stream.new @parser.has_param?(:user) ? @parser[:user] : nil
|
85
|
+
stream.user_stream do |s|
|
86
|
+
Render.display s
|
87
|
+
end
|
88
|
+
on_exit
|
89
|
+
end
|
90
|
+
|
91
|
+
cmd 'stream:filter' do |v|
|
92
|
+
unless v.class == String
|
93
|
+
STDERR.puts "e.g. tw --stream:filter=ruby,java"
|
94
|
+
on_error
|
95
|
+
else
|
96
|
+
stream = Tw::Client::Stream.new @parser.has_param?(:user) ? @parser[:user] : nil
|
97
|
+
stream.filter v do |s|
|
98
|
+
Render.display s
|
99
|
+
end
|
100
|
+
on_exit
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
83
104
|
cmd :pipe do |v|
|
84
105
|
auth
|
85
106
|
STDIN.read.split(/[\r\n]+/).each do |line|
|
data/lib/tw/app/main.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require File.expand_path 'opt_parser', File.dirname(__FILE__)
|
3
2
|
require File.expand_path 'cmds', File.dirname(__FILE__)
|
4
3
|
require File.expand_path 'render', File.dirname(__FILE__)
|
@@ -51,9 +50,22 @@ module Tw::App
|
|
51
50
|
arg :dm, 'show direct messages'
|
52
51
|
arg 'dm:to', 'create direct message'
|
53
52
|
arg :search, 'search public timeline', :alias => :s
|
53
|
+
arg :stream, 'show user stream', :alias => :st
|
54
54
|
arg :pipe, 'pipe tweet'
|
55
55
|
arg :version, 'show version', :alias => :v
|
56
56
|
arg :help, 'show help', :alias => :h
|
57
|
+
|
58
|
+
validate :user, 'invalid user name' do |v|
|
59
|
+
v =~ /^[a-zA-Z0-9_]+$/
|
60
|
+
end
|
61
|
+
|
62
|
+
validate 'user:default', 'invalid user name' do |v|
|
63
|
+
v =~ /^[a-zA-Z0-9_]+$/
|
64
|
+
end
|
65
|
+
|
66
|
+
validate 'dm:to', 'invalid user name' do |v|
|
67
|
+
v =~ /^[a-zA-Z0-9_]+$/
|
68
|
+
end
|
57
69
|
end
|
58
70
|
|
59
71
|
if @parser.has_option? :help
|
@@ -61,11 +73,13 @@ module Tw::App
|
|
61
73
|
STDERR.puts
|
62
74
|
STDERR.puts "e.g."
|
63
75
|
STDERR.puts "tweet tw hello world"
|
76
|
+
STDERR.puts " echo 'hello' | tw --pipe"
|
64
77
|
STDERR.puts "read tw @username"
|
65
78
|
STDERR.puts " tw @username @user2 @user2/listname"
|
66
79
|
STDERR.puts " tw --search=ruby"
|
80
|
+
STDERR.puts " tw --stream"
|
81
|
+
STDERR.puts " tw --stream:filter=ruby,java"
|
67
82
|
STDERR.puts " tw --dm:to=username \"hello!\""
|
68
|
-
STDERR.puts " echo 'hello' | tw --pipe"
|
69
83
|
on_exit
|
70
84
|
end
|
71
85
|
|
data/lib/tw/app/render.rb
CHANGED
data/lib/tw/client/auth.rb
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
|
2
2
|
module Tw
|
3
3
|
class Client
|
4
|
-
|
5
|
-
|
4
|
+
def auth(user=nil)
|
5
|
+
Auth.auth user
|
6
6
|
end
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
return
|
13
|
-
end
|
14
|
-
raise ArgumentError, "Argument must be instance of String or Hash." unless [Hash, String].include? user.class
|
15
|
-
if user.class == String
|
16
|
-
raise ArgumentError, "user \"#{user}\" not exists." unless Conf['users'].include? user
|
17
|
-
user = Conf['users'][user]
|
18
|
-
end
|
9
|
+
class Auth
|
10
|
+
|
11
|
+
def self.auth(user=nil)
|
12
|
+
user = get_or_regist_user user
|
19
13
|
Twitter.configure do |c|
|
20
14
|
c.consumer_key = Conf['consumer_key']
|
21
15
|
c.consumer_secret = Conf['consumer_secret']
|
@@ -24,7 +18,19 @@ module Tw
|
|
24
18
|
end
|
25
19
|
end
|
26
20
|
|
27
|
-
def
|
21
|
+
def self.get_or_regist_user(user)
|
22
|
+
return user if user.kind_of? Hash
|
23
|
+
if user.kind_of? String
|
24
|
+
raise ArgumentError, "user \"#{user}\" not exists." unless Conf['users'].include? user
|
25
|
+
return Conf['users'][user]
|
26
|
+
end
|
27
|
+
unless user
|
28
|
+
return Conf['users'][ Conf['default_user'] ] if Conf['default_user']
|
29
|
+
return regist_user
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.regist_user
|
28
34
|
consumer = OAuth::Consumer.new(Conf['consumer_key'], Conf['consumer_secret'],
|
29
35
|
:site => 'http://twitter.com')
|
30
36
|
request_token = consumer.get_request_token
|
@@ -44,6 +50,7 @@ module Tw
|
|
44
50
|
Conf['default_user'] = u.screen_name unless Conf['default_user']
|
45
51
|
Conf.save
|
46
52
|
puts "add \"@#{u.screen_name}\""
|
53
|
+
return Conf['users'][u.screen_name]
|
47
54
|
end
|
48
55
|
|
49
56
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
module Tw
|
3
|
+
class Client::Stream
|
4
|
+
def initialize(user=nil)
|
5
|
+
user = Tw::Auth.get_or_regist_user user
|
6
|
+
UserStream.configure do |config|
|
7
|
+
config.consumer_key = Conf['consumer_key']
|
8
|
+
config.consumer_secret = Conf['consumer_secret']
|
9
|
+
config.oauth_token = user['access_token']
|
10
|
+
config.oauth_token_secret = user['access_secret']
|
11
|
+
end
|
12
|
+
|
13
|
+
puts '-- waiting stream..'
|
14
|
+
@client = UserStream::Client.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def user_stream(&block)
|
18
|
+
raise ArgumentError, 'block not given' unless block_given?
|
19
|
+
@client.user do |m|
|
20
|
+
if data = tweet?(m)
|
21
|
+
yield data
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def filter(*track_words, &block)
|
27
|
+
raise ArgumentError, 'block not given' unless block_given?
|
28
|
+
track_words = track_words.join(',')
|
29
|
+
puts "track #{track_words}"
|
30
|
+
@client.filter :track => track_words do |m|
|
31
|
+
if data = tweet?(m)
|
32
|
+
yield data
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def tweet?(chunk)
|
39
|
+
return false unless chunk.user and chunk.user.screen_name and chunk.text and chunk.created_at and chunk.id
|
40
|
+
{
|
41
|
+
:id => chunk.id,
|
42
|
+
:user => chunk.user.screen_name,
|
43
|
+
:text => chunk.text,
|
44
|
+
:time => (Time.parse chunk.created_at)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tw
|
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:
|
@@ -56,13 +56,16 @@ dependencies:
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: 5.0.0
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
59
|
+
name: userstream
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
65
|
+
version: 1.2.0
|
66
|
+
- - <
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.0
|
66
69
|
type: :runtime
|
67
70
|
prerelease: false
|
68
71
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -70,15 +73,18 @@ dependencies:
|
|
70
73
|
requirements:
|
71
74
|
- - ! '>='
|
72
75
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
76
|
+
version: 1.2.0
|
77
|
+
- - <
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 1.3.0
|
74
80
|
- !ruby/object:Gem::Dependency
|
75
|
-
name:
|
81
|
+
name: args_parser
|
76
82
|
requirement: !ruby/object:Gem::Requirement
|
77
83
|
none: false
|
78
84
|
requirements:
|
79
85
|
- - ! '>='
|
80
86
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
87
|
+
version: 0.1.0
|
82
88
|
type: :runtime
|
83
89
|
prerelease: false
|
84
90
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -86,7 +92,7 @@ dependencies:
|
|
86
92
|
requirements:
|
87
93
|
- - ! '>='
|
88
94
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
95
|
+
version: 0.1.0
|
90
96
|
- !ruby/object:Gem::Dependency
|
91
97
|
name: rainbow
|
92
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,6 +190,7 @@ files:
|
|
184
190
|
- lib/tw/client/auth.rb
|
185
191
|
- lib/tw/client/error.rb
|
186
192
|
- lib/tw/client/request.rb
|
193
|
+
- lib/tw/client/stream.rb
|
187
194
|
- lib/tw/conf.rb
|
188
195
|
- script/console
|
189
196
|
- script/destroy
|
@@ -191,7 +198,7 @@ files:
|
|
191
198
|
- test/test_helper.rb
|
192
199
|
- test/test_tw.rb
|
193
200
|
- .gemtest
|
194
|
-
homepage: http://github.com/
|
201
|
+
homepage: http://shokai.github.com/tw
|
195
202
|
licenses: []
|
196
203
|
post_install_message:
|
197
204
|
rdoc_options:
|
@@ -207,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
207
214
|
version: '0'
|
208
215
|
segments:
|
209
216
|
- 0
|
210
|
-
hash:
|
217
|
+
hash: 2435437866156816289
|
211
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
212
219
|
none: false
|
213
220
|
requirements:
|