tw 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,9 +1,10 @@
1
1
  source :rubygems
2
2
 
3
- gem 'backports'
4
3
  gem 'hoe'
5
4
  gem 'newgem'
6
5
  gem 'oauth'
7
6
  gem 'twitter'
7
+ gem 'userstream'
8
+ gem 'json'
8
9
  gem 'rainbow'
9
10
  gem 'args_parser'
@@ -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
@@ -1,3 +1,8 @@
1
+ === 0.2.0 2012-10-04
2
+
3
+ * user stream : --stream
4
+ * filter stream : --stream:filter=WORD1,WORD2
5
+
1
6
  === 0.1.1 2012-10-04
2
7
 
3
8
  * command option detail on help
@@ -14,6 +14,7 @@ lib/tw/app/render.rb
14
14
  lib/tw/client/auth.rb
15
15
  lib/tw/client/error.rb
16
16
  lib/tw/client/request.rb
17
+ lib/tw/client/stream.rb
17
18
  lib/tw/conf.rb
18
19
  script/console
19
20
  script/destroy
@@ -1,6 +1,7 @@
1
1
  = tw
2
2
 
3
- * http://github.com/shokai/tw
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
- Tweet
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.1.1'
19
+ VERSION = '0.2.0'
18
20
  class Conf
19
21
  REQUIRE_VERSION = '0.1.0'
20
22
  end
@@ -12,7 +12,7 @@ module Tw::App
12
12
  end
13
13
 
14
14
  cmd 'user:add' do |v|
15
- client.add_user
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|
@@ -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
 
@@ -8,6 +8,7 @@ module Tw::App
8
8
  end
9
9
 
10
10
  def self.display(arr)
11
+ arr = [arr] unless arr.kind_of? Array
11
12
  arr.flatten.sort{|a,b|
12
13
  a[:id] <=> b[:id]
13
14
  }.uniq.each{|m|
@@ -1,21 +1,15 @@
1
1
 
2
2
  module Tw
3
3
  class Client
4
-
5
- def initialize
4
+ def auth(user=nil)
5
+ Auth.auth user
6
6
  end
7
+ end
7
8
 
8
- def auth(user=nil)
9
- user = Conf['default_user'] unless user
10
- if user == nil and Conf['users'].empty?
11
- add_user
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 add_user
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.1.1
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: args_parser
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: 0.1.0
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: 0.1.0
76
+ version: 1.2.0
77
+ - - <
78
+ - !ruby/object:Gem::Version
79
+ version: 1.3.0
74
80
  - !ruby/object:Gem::Dependency
75
- name: backports
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: 2.6.4
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: 2.6.4
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/shokai/tw
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: 945180289423209762
217
+ hash: 2435437866156816289
211
218
  required_rubygems_version: !ruby/object:Gem::Requirement
212
219
  none: false
213
220
  requirements: