tw 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ === 0.3.0 2012-10-10
2
+
3
+ * silent mode option : --silent
4
+ * pipe tweet each line from STDIN
5
+ * add Tw API sample
6
+ * update README
7
+
1
8
  === 0.2.6 2012-10-10
2
9
 
3
10
  * bugfix merging users and lists
data/Manifest.txt CHANGED
@@ -18,6 +18,7 @@ lib/tw/client/stream.rb
18
18
  lib/tw/client/tweet.rb
19
19
  lib/tw/conf.rb
20
20
  samples/README.md
21
+ samples/sample.rb
21
22
  samples/update_profile_image.rb
22
23
  script/console
23
24
  script/destroy
data/README.rdoc CHANGED
@@ -30,7 +30,7 @@ read Timeline
30
30
  % tw --timeline
31
31
  % tw --search=ruby
32
32
  % tw --stream
33
- % tw --stream:filter=ruby,java
33
+ % tw --stream:filter=ruby,java --silent
34
34
 
35
35
  DM
36
36
 
@@ -58,6 +58,13 @@ Format
58
58
  % tw --stream --format="@#{user} #{text} - http://twitter.com/#{user}/#{id}"
59
59
 
60
60
 
61
+ == Make Twitter Bot
62
+
63
+ stream reply bot
64
+
65
+ % tw --silent --stream:filter=BOT_NAME --user=BOT_NAME --format="@#{user} OK" | tw --pipe --user=BOT_NAME
66
+
67
+
61
68
  == LICENSE:
62
69
 
63
70
  (The MIT License)
data/bin/tw CHANGED
@@ -3,6 +3,7 @@ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
3
3
  require 'rubygems'
4
4
  require 'tw'
5
5
  require 'tw/app/main'
6
+ $stdout.sync = true
6
7
 
7
8
  app = Tw::App.new
8
9
  app.run ARGV
data/lib/tw.rb CHANGED
@@ -20,7 +20,7 @@ require 'tw/client/stream'
20
20
  require 'tw/client/error'
21
21
 
22
22
  module Tw
23
- VERSION = '0.2.6'
23
+ VERSION = '0.3.0'
24
24
  class Conf
25
25
  REQUIRE_VERSION = '0.1.0'
26
26
  end
data/lib/tw/app/cmds.rb CHANGED
@@ -31,7 +31,7 @@ module Tw::App
31
31
  puts "set default user \"@#{Tw::Conf['default_user']}\""
32
32
  else
33
33
  puts "@"+Tw::Conf['default_user'] if Tw::Conf['default_user']
34
- puts "e.g. tw --user:default=USERNAME"
34
+ STDERR.puts "e.g. tw --user:default=USERNAME"
35
35
  end
36
36
  on_exit
37
37
  end
@@ -82,7 +82,7 @@ module Tw::App
82
82
 
83
83
  cmd :stream do |v, opts|
84
84
  stream = Tw::Client::Stream.new @parser.has_param?(:user) ? @parser[:user] : nil
85
- puts "-- waiting stream.."
85
+ Render.puts "-- waiting stream.."
86
86
  loop do
87
87
  begin
88
88
  stream.user_stream do |s|
@@ -106,7 +106,7 @@ module Tw::App
106
106
  else
107
107
  track_words = v.split(/\s*,\s*/)
108
108
  stream = Tw::Client::Stream.new @parser.has_param?(:user) ? @parser[:user] : nil
109
- puts "-- waiting stream.. track \"#{track_words.join(',')}\""
109
+ Render.puts "-- waiting stream.. track \"#{track_words.join(',')}\""
110
110
  loop do
111
111
  begin
112
112
  stream.filter track_words do |s|
@@ -126,9 +126,13 @@ module Tw::App
126
126
 
127
127
  cmd :pipe do |v, opts|
128
128
  auth
129
- STDIN.read.split(/[\r\n]+/).each do |line|
129
+ while line = STDIN.gets do
130
130
  line.split(/(.{140})/u).select{|m|m.size>0}.each do |message|
131
- client.tweet message
131
+ begin
132
+ client.tweet message
133
+ rescue => e
134
+ STDERR.puts e.message
135
+ end
132
136
  end
133
137
  sleep 1
134
138
  end
data/lib/tw/app/main.rb CHANGED
@@ -53,6 +53,7 @@ module Tw::App
53
53
  arg :stream, 'show user stream', :alias => :st
54
54
  arg :pipe, 'pipe tweet'
55
55
  arg :format, 'output format', :default => 'text'
56
+ arg :silent, 'silent mode'
56
57
  arg :version, 'show version', :alias => :v
57
58
  arg :help, 'show help', :alias => :h
58
59
 
@@ -89,6 +90,8 @@ module Tw::App
89
90
  on_exit
90
91
  end
91
92
 
93
+ Render.silent = @parser[:silent]
94
+
92
95
  regist_cmds
93
96
 
94
97
  cmds.each do |name, cmd|
@@ -118,7 +121,11 @@ module Tw::App
118
121
  puts '[Y/n]'
119
122
  on_exit if STDIN.gets.strip =~ /^n/i
120
123
  end
121
- client.tweet message
124
+ begin
125
+ client.tweet message
126
+ rescue => e
127
+ STDERR.puts e.message
128
+ end
122
129
  end
123
130
  end
124
131
 
data/lib/tw/app/render.rb CHANGED
@@ -1,6 +1,18 @@
1
-
2
1
  module Tw::App
3
2
  class Render
3
+
4
+ def self.silent=(bool)
5
+ @@silent = bool ? true : false
6
+ end
7
+
8
+ def self.silent
9
+ @@silent ||= false
10
+ end
11
+
12
+ def self.puts(s)
13
+ STDOUT.puts s unless silent
14
+ end
15
+
4
16
  def self.color_code(str)
5
17
  colors = Sickill::Rainbow::TERM_COLORS.keys - [:default, :black, :white]
6
18
  n = str.each_byte.map{|c| c.to_i}.inject{|a,b|a+b}
@@ -14,7 +26,7 @@ module Tw::App
14
26
  }.values.sort{|a,b|
15
27
  a.id <=> b.id
16
28
  }.each{|m|
17
- puts case format
29
+ STDOUT.puts case format
18
30
  when 'text'
19
31
  user = m.user.kind_of?(Hash) ? "@#{m.user[:from]} > @#{m.user[:to]}" : "@#{m.user}"
20
32
  line = "#{m.time.strftime '[%m/%d %a] (%H:%M:%S)'} #{user} : #{CGI.unescapeHTML m.text}"
@@ -22,7 +34,7 @@ module Tw::App
22
34
  when 'json'
23
35
  m.to_json
24
36
  else
25
- m.to_s format
37
+ m.format format
26
38
  end
27
39
  }
28
40
  end
@@ -18,8 +18,16 @@ module Tw
18
18
  }.to_json(*a)
19
19
  end
20
20
 
21
- def to_s(format)
22
- self.instance_eval "\"#{format}\""
21
+ def url
22
+ "http://twitter.com/#{user}/status/#{id}"
23
+ end
24
+
25
+ def to_s
26
+ "@#{user} #{text} - #{time} #{url}"
27
+ end
28
+
29
+ def format(fmt)
30
+ self.instance_eval "\"#{fmt}\""
23
31
  end
24
32
  end
25
33
  end
data/samples/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  # tw samples
2
2
 
3
+ ## Tw API
4
+
5
+ % tw sample.rb hello woooorld
6
+
3
7
  ## Use Tw as front-end of twitter auth
4
8
 
5
9
  % tw --user:add
6
10
  % ruby upload_profile_image.rb image.jpg
7
11
  % ruby upload_profile_image.rb image.jpg shokai
12
+
data/samples/sample.rb ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
3
+ require 'rubygems'
4
+ require 'tw'
5
+
6
+ if ARGV.empty?
7
+ STDERR.puts "ruby #{$0} hello world"
8
+ exit 1
9
+ end
10
+
11
+ msg = ARGV.join(' ')
12
+
13
+ client = Tw::Client.new
14
+ client.auth
15
+ client.mentions.each do |m|
16
+ puts m
17
+ end
18
+
19
+ begin
20
+ p client.tweet msg
21
+ rescue => e
22
+ STDERR.puts e
23
+ exit 1
24
+ end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
2
3
  require 'rubygems'
3
4
  require 'tw'
4
5
 
data/test/test_tw.rb CHANGED
@@ -15,10 +15,10 @@ class TestTw < Test::Unit::TestCase
15
15
  def response?(arr)
16
16
  return false unless arr.kind_of? Array
17
17
  arr.each do |i|
18
- return false if !(i[:id].class == Fixnum and
19
- (user? i[:user] or (user? i[:user][:to] and user? i[:user][:from])) and
20
- i[:text].kind_of? String and
21
- i[:time].kind_of? Time)
18
+ return false if !(i.id.class == Fixnum and
19
+ (user? i.user or (user? i.user[:to] and user? i.user[:from])) and
20
+ i.text.kind_of? String and
21
+ i.time.kind_of? Time)
22
22
  end
23
23
  return true
24
24
  end
metadata CHANGED
@@ -1,240 +1,223 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tw
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 6
10
- version: 0.2.6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Sho Hashimoto
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-10-10 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-10-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: oauth
16
+ requirement: !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 1
28
- segments:
29
- - 0
30
- - 4
31
- - 7
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
32
21
  version: 0.4.7
33
22
  - - <
34
- - !ruby/object:Gem::Version
35
- hash: 23
36
- segments:
37
- - 1
38
- - 0
39
- - 0
23
+ - !ruby/object:Gem::Version
40
24
  version: 1.0.0
41
25
  type: :runtime
42
- name: oauth
43
- version_requirements: *id001
44
- - !ruby/object:Gem::Dependency
45
26
  prerelease: false
46
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.4.7
33
+ - - <
34
+ - !ruby/object:Gem::Version
35
+ version: 1.0.0
36
+ - !ruby/object:Gem::Dependency
37
+ name: twitter
38
+ requirement: !ruby/object:Gem::Requirement
47
39
  none: false
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- hash: 63
52
- segments:
53
- - 4
54
- - 0
55
- - 0
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
56
43
  version: 4.0.0
57
44
  - - <
58
- - !ruby/object:Gem::Version
59
- hash: 55
60
- segments:
61
- - 5
62
- - 0
63
- - 0
45
+ - !ruby/object:Gem::Version
64
46
  version: 5.0.0
65
47
  type: :runtime
66
- name: twitter
67
- version_requirements: *id002
68
- - !ruby/object:Gem::Dependency
69
48
  prerelease: false
70
- requirement: &id003 !ruby/object:Gem::Requirement
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 4.0.0
55
+ - - <
56
+ - !ruby/object:Gem::Version
57
+ version: 5.0.0
58
+ - !ruby/object:Gem::Dependency
59
+ name: userstream
60
+ requirement: !ruby/object:Gem::Requirement
71
61
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 31
76
- segments:
77
- - 1
78
- - 2
79
- - 0
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
80
65
  version: 1.2.0
81
66
  - - <
82
- - !ruby/object:Gem::Version
83
- hash: 27
84
- segments:
85
- - 1
86
- - 3
87
- - 0
67
+ - !ruby/object:Gem::Version
88
68
  version: 1.3.0
89
69
  type: :runtime
90
- name: userstream
91
- version_requirements: *id003
92
- - !ruby/object:Gem::Dependency
93
70
  prerelease: false
94
- requirement: &id004 !ruby/object:Gem::Requirement
71
+ version_requirements: !ruby/object:Gem::Requirement
95
72
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 1
100
- segments:
101
- - 1
102
- - 7
103
- - 5
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.2.0
77
+ - - <
78
+ - !ruby/object:Gem::Version
79
+ version: 1.3.0
80
+ - !ruby/object:Gem::Dependency
81
+ name: json
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
104
87
  version: 1.7.5
105
88
  - - <
106
- - !ruby/object:Gem::Version
107
- hash: 55
108
- segments:
109
- - 1
110
- - 8
111
- - 0
89
+ - !ruby/object:Gem::Version
112
90
  version: 1.8.0
113
91
  type: :runtime
114
- name: json
115
- version_requirements: *id004
116
- - !ruby/object:Gem::Dependency
117
92
  prerelease: false
118
- requirement: &id005 !ruby/object:Gem::Requirement
93
+ version_requirements: !ruby/object:Gem::Requirement
119
94
  none: false
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- hash: 25
124
- segments:
125
- - 0
126
- - 1
127
- - 1
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: 1.7.5
99
+ - - <
100
+ - !ruby/object:Gem::Version
101
+ version: 1.8.0
102
+ - !ruby/object:Gem::Dependency
103
+ name: args_parser
104
+ requirement: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
128
109
  version: 0.1.1
129
110
  type: :runtime
130
- name: args_parser
131
- version_requirements: *id005
132
- - !ruby/object:Gem::Dependency
133
111
  prerelease: false
134
- requirement: &id006 !ruby/object:Gem::Requirement
112
+ version_requirements: !ruby/object:Gem::Requirement
135
113
  none: false
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- hash: 27
140
- segments:
141
- - 1
142
- - 1
143
- - 4
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.1.1
118
+ - !ruby/object:Gem::Dependency
119
+ name: rainbow
120
+ requirement: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
144
125
  version: 1.1.4
145
126
  - - <
146
- - !ruby/object:Gem::Version
147
- hash: 15
148
- segments:
149
- - 2
150
- - 0
151
- - 0
127
+ - !ruby/object:Gem::Version
152
128
  version: 2.0.0
153
129
  type: :runtime
154
- name: rainbow
155
- version_requirements: *id006
156
- - !ruby/object:Gem::Dependency
157
130
  prerelease: false
158
- requirement: &id007 !ruby/object:Gem::Requirement
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: 1.1.4
137
+ - - <
138
+ - !ruby/object:Gem::Version
139
+ version: 2.0.0
140
+ - !ruby/object:Gem::Dependency
141
+ name: parallel
142
+ requirement: !ruby/object:Gem::Requirement
159
143
  none: false
160
- requirements:
161
- - - ">="
162
- - !ruby/object:Gem::Version
163
- hash: 47
164
- segments:
165
- - 0
166
- - 5
167
- - 18
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
168
147
  version: 0.5.18
169
148
  - - <
170
- - !ruby/object:Gem::Version
171
- hash: 23
172
- segments:
173
- - 1
174
- - 0
175
- - 0
149
+ - !ruby/object:Gem::Version
176
150
  version: 1.0.0
177
151
  type: :runtime
178
- name: parallel
179
- version_requirements: *id007
180
- - !ruby/object:Gem::Dependency
181
152
  prerelease: false
182
- requirement: &id008 !ruby/object:Gem::Requirement
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: 0.5.18
159
+ - - <
160
+ - !ruby/object:Gem::Version
161
+ version: 1.0.0
162
+ - !ruby/object:Gem::Dependency
163
+ name: rdoc
164
+ requirement: !ruby/object:Gem::Requirement
183
165
  none: false
184
- requirements:
166
+ requirements:
185
167
  - - ~>
186
- - !ruby/object:Gem::Version
187
- hash: 19
188
- segments:
189
- - 3
190
- - 10
191
- version: "3.10"
168
+ - !ruby/object:Gem::Version
169
+ version: '3.10'
192
170
  type: :development
193
- name: rdoc
194
- version_requirements: *id008
195
- - !ruby/object:Gem::Dependency
196
171
  prerelease: false
197
- requirement: &id009 !ruby/object:Gem::Requirement
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ~>
176
+ - !ruby/object:Gem::Version
177
+ version: '3.10'
178
+ - !ruby/object:Gem::Dependency
179
+ name: newgem
180
+ requirement: !ruby/object:Gem::Requirement
198
181
  none: false
199
- requirements:
200
- - - ">="
201
- - !ruby/object:Gem::Version
202
- hash: 5
203
- segments:
204
- - 1
205
- - 5
206
- - 3
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
207
185
  version: 1.5.3
208
186
  type: :development
209
- name: newgem
210
- version_requirements: *id009
211
- - !ruby/object:Gem::Dependency
212
187
  prerelease: false
213
- requirement: &id010 !ruby/object:Gem::Requirement
188
+ version_requirements: !ruby/object:Gem::Requirement
214
189
  none: false
215
- requirements:
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: 1.5.3
194
+ - !ruby/object:Gem::Dependency
195
+ name: hoe
196
+ requirement: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
216
199
  - - ~>
217
- - !ruby/object:Gem::Version
218
- hash: 5
219
- segments:
220
- - 3
221
- - 1
222
- version: "3.1"
200
+ - !ruby/object:Gem::Version
201
+ version: '3.1'
223
202
  type: :development
224
- name: hoe
225
- version_requirements: *id010
226
- description: "* twitter client."
227
- email:
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ~>
208
+ - !ruby/object:Gem::Version
209
+ version: '3.1'
210
+ description: ! '* twitter client.'
211
+ email:
228
212
  - hashimoto@shokai.org
229
- executables:
213
+ executables:
230
214
  - tw
231
215
  extensions: []
232
-
233
- extra_rdoc_files:
216
+ extra_rdoc_files:
234
217
  - History.txt
235
218
  - Manifest.txt
236
219
  - README.rdoc
237
- files:
220
+ files:
238
221
  - Gemfile
239
222
  - Gemfile.lock
240
223
  - History.txt
@@ -255,6 +238,7 @@ files:
255
238
  - lib/tw/client/tweet.rb
256
239
  - lib/tw/conf.rb
257
240
  - samples/README.md
241
+ - samples/sample.rb
258
242
  - samples/update_profile_image.rb
259
243
  - script/console
260
244
  - script/destroy
@@ -264,38 +248,33 @@ files:
264
248
  - .gemtest
265
249
  homepage: http://shokai.github.com/tw
266
250
  licenses: []
267
-
268
- post_install_message: "!! Installed \"tw\" command. => http://shokai.github.com/tw"
269
- rdoc_options:
251
+ post_install_message: ! '!! Installed "tw" command. => http://shokai.github.com/tw'
252
+ rdoc_options:
270
253
  - --main
271
254
  - README.rdoc
272
- require_paths:
255
+ require_paths:
273
256
  - lib
274
- required_ruby_version: !ruby/object:Gem::Requirement
257
+ required_ruby_version: !ruby/object:Gem::Requirement
275
258
  none: false
276
- requirements:
277
- - - ">="
278
- - !ruby/object:Gem::Version
279
- hash: 3
280
- segments:
259
+ requirements:
260
+ - - ! '>='
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
263
+ segments:
281
264
  - 0
282
- version: "0"
283
- required_rubygems_version: !ruby/object:Gem::Requirement
265
+ hash: 3459005174118460767
266
+ required_rubygems_version: !ruby/object:Gem::Requirement
284
267
  none: false
285
- requirements:
286
- - - ">="
287
- - !ruby/object:Gem::Version
288
- hash: 3
289
- segments:
290
- - 0
291
- version: "0"
268
+ requirements:
269
+ - - ! '>='
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
292
272
  requirements: []
293
-
294
273
  rubyforge_project: tw
295
274
  rubygems_version: 1.8.24
296
275
  signing_key:
297
276
  specification_version: 3
298
- summary: "* twitter client."
299
- test_files:
277
+ summary: ! '* twitter client.'
278
+ test_files:
300
279
  - test/test_helper.rb
301
280
  - test/test_tw.rb