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 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: