tw 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source :rubygems
2
2
 
3
+ gem 'backports'
3
4
  gem 'hoe'
4
5
  gem 'newgem'
5
6
  gem 'oauth'
data/Gemfile.lock CHANGED
@@ -4,6 +4,7 @@ GEM
4
4
  RedCloth (4.2.9)
5
5
  activesupport (2.3.14)
6
6
  args_parser (0.1.0)
7
+ backports (2.6.4)
7
8
  faraday (0.8.4)
8
9
  multipart-post (~> 1.1)
9
10
  hoe (3.1.0)
@@ -33,6 +34,7 @@ PLATFORMS
33
34
 
34
35
  DEPENDENCIES
35
36
  args_parser
37
+ backports
36
38
  hoe
37
39
  newgem
38
40
  oauth
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.0.4 2012-10-04
2
+
3
+ * show direct messages : --dm
4
+ * create direct message : --dm:to=USERNAME
5
+
1
6
  === 0.0.3 2012-10-03
2
7
 
3
8
  * show home timeline : --timeline
data/Manifest.txt CHANGED
@@ -7,6 +7,7 @@ Rakefile
7
7
  bin/tw
8
8
  lib/tw.rb
9
9
  lib/tw/app/cmds.rb
10
+ lib/tw/app/helper.rb
10
11
  lib/tw/app/main.rb
11
12
  lib/tw/app/opt_parser.rb
12
13
  lib/tw/app/render.rb
data/README.rdoc CHANGED
@@ -2,27 +2,37 @@
2
2
 
3
3
  * http://github.com/shokai/tw
4
4
 
5
+ == INSTALL:
6
+
7
+ * gem install tw
8
+
5
9
  == DESCRIPTION:
6
10
 
7
11
  * twitter client.
8
12
 
9
-
10
13
  == SYNOPSIS:
11
14
 
12
- read timeline
15
+ show help
16
+
17
+ % tw --help
18
+
19
+ read Timeline
13
20
 
14
21
  % tw @username
15
22
  % tw @username @user2 @user3
16
23
  % tw @username/listname
24
+ % tw --timeline
25
+ % tw --search=ruby
17
26
 
18
- tweet
27
+ Tweet
19
28
 
20
29
  % tw hello hello
21
30
 
31
+ DM
22
32
 
23
- == INSTALL:
33
+ % tw --dm
34
+ % tw --dm:to=shokai "hello!"
24
35
 
25
- * gem install tw
26
36
 
27
37
  == LICENSE:
28
38
 
data/Rakefile CHANGED
@@ -16,6 +16,7 @@ $hoe = Hoe.spec 'tw' do
16
16
  self.extra_deps = [['oauth','>= 0.4.7', '< 1.0.0'],
17
17
  ['twitter', '>= 4.0.0', '< 5.0.0'],
18
18
  ['args_parser', '>= 0.1.0'],
19
+ ['backports', '>= 2.6.4'],
19
20
  ['rainbow', '>= 1.1.4', '< 2.0.0']]
20
21
 
21
22
  end
data/lib/tw.rb CHANGED
@@ -1,6 +1,7 @@
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'
4
5
  require 'oauth'
5
6
  require 'twitter'
6
7
  require 'yaml'
@@ -13,5 +14,9 @@ require 'tw/client/request'
13
14
  require 'tw/client/error'
14
15
 
15
16
  module Tw
16
- VERSION = '0.0.3'
17
+ VERSION = '0.1.0'
18
+ class Conf
19
+ REQUIRE_VERSION = '0.1.0'
20
+ end
17
21
  end
22
+
data/lib/tw/app/cmds.rb CHANGED
@@ -44,6 +44,31 @@ module Tw::App
44
44
  end
45
45
  end
46
46
 
47
+ cmd :dm do |v|
48
+ auth
49
+ Render.display client.direct_messages
50
+ on_exit
51
+ end
52
+
53
+ cmd 'dm:to' do |to|
54
+ message = @parser.argv.join(' ')
55
+ len = message.split(//u).size
56
+ if len > 140
57
+ STDERR.puts "message too long (#{len} chars)"
58
+ on_error
59
+ elsif len < 1
60
+ STDERR.puts 'e.g. tw --dm:to=USERNAME "hello"'
61
+ on_error
62
+ else
63
+ puts "dm \"#{message}\"? (#{len} chars)"
64
+ puts '[Y/n]'
65
+ on_exit if STDIN.gets.strip =~ /^n/i
66
+ auth
67
+ client.direct_message_create to, message
68
+ end
69
+ on_exit
70
+ end
71
+
47
72
  cmd :search do |v|
48
73
  if v.class == String
49
74
  auth
@@ -0,0 +1,11 @@
1
+
2
+ class String
3
+ def colorize(pattern)
4
+ self.split(/(#{pattern})/).map{|term|
5
+ if term =~ /#{pattern}/
6
+ term = term.color(Tw::App::Render.color_code term).bright.underline
7
+ end
8
+ term
9
+ }.join('')
10
+ end
11
+ end
data/lib/tw/app/main.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  require File.expand_path 'opt_parser', File.dirname(__FILE__)
3
3
  require File.expand_path 'cmds', File.dirname(__FILE__)
4
4
  require File.expand_path 'render', File.dirname(__FILE__)
5
+ require File.expand_path 'helper', File.dirname(__FILE__)
5
6
 
6
7
  module Tw::App
7
8
 
@@ -47,6 +48,8 @@ module Tw::App
47
48
  arg 'user:list', 'show user list'
48
49
  arg 'user:default', 'set default user'
49
50
  arg :timeline, 'show timeline', :alias => :tl
51
+ arg :dm, 'show direct messages'
52
+ arg 'dm:to', 'create direct message'
50
53
  arg :search, 'search public timeline', :alias => :s
51
54
  arg :pipe, 'pipe tweet'
52
55
  arg :version, 'show version', :alias => :v
@@ -80,7 +83,7 @@ module Tw::App
80
83
  else
81
84
  message = @parser.argv.join(' ')
82
85
  if (len = message.split(//u).size) > 140
83
- puts "tweet too long (#{len} chars)"
86
+ STDERR.puts "tweet too long (#{len} chars)"
84
87
  on_error
85
88
  else
86
89
  puts "tweet \"#{message}\"? (#{len} chars)"
data/lib/tw/app/render.rb CHANGED
@@ -7,17 +7,13 @@ module Tw::App
7
7
  return colors[n%colors.size]
8
8
  end
9
9
 
10
- def self.display(hash)
11
- hash.flatten.sort{|a,b|
10
+ def self.display(arr)
11
+ arr.flatten.sort{|a,b|
12
12
  a[:id] <=> b[:id]
13
13
  }.uniq.each{|m|
14
- line = "#{m[:time].strftime '[%m/%d %a] (%H:%M:%S)'} @#{m[:user]} : #{m[:text]}"
15
- puts line.split(/(@[a-zA-Z0-9_]+)/).map{|term|
16
- if term =~ /@[a-zA-Z0-9_]+/
17
- term = term.color(color_code term).bright.underline
18
- end
19
- term
20
- }.join('')
14
+ user = m[:user].kind_of?(Hash) ? "@#{m[:user][:from]} > @#{m[:user][:to]}" : "@#{m[:user]}"
15
+ line = "#{m[:time].strftime '[%m/%d %a] (%H:%M:%S)'} #{user} : #{m[:text]}"
16
+ puts line.colorize(/@[a-zA-Z0-9_]+/)
21
17
  }
22
18
  end
23
19
  end
@@ -57,6 +57,27 @@ module Tw
57
57
  }
58
58
  end
59
59
 
60
+ def direct_messages
61
+ [Twitter.direct_messages.map{|m|
62
+ {
63
+ :id => m.id,
64
+ :user => m.sender.screen_name,
65
+ :text => m.text,
66
+ :time => m.created_at
67
+ }
68
+ }, Twitter.direct_messages_sent.map{|m|
69
+ {
70
+ :id => m.id,
71
+ :user => {
72
+ :from => m.sender.screen_name,
73
+ :to => m.recipient.screen_name
74
+ },
75
+ :text => m.text,
76
+ :time => m.created_at
77
+ }
78
+ }].flatten
79
+ end
80
+
60
81
  def tweet(message)
61
82
  res = Twitter.update message
62
83
  puts res.text
@@ -64,5 +85,11 @@ module Tw
64
85
  puts res.created_at
65
86
  end
66
87
 
88
+ def direct_message_create(to, message)
89
+ res = Twitter.direct_message_create to, message
90
+ puts res.text
91
+ puts res.created_at
92
+ end
93
+
67
94
  end
68
95
  end
data/lib/tw/conf.rb CHANGED
@@ -29,8 +29,17 @@ module Tw
29
29
  res = default
30
30
  if File.exists? conf_file
31
31
  begin
32
+ data = nil
32
33
  open_conf_file do |f|
33
- res = YAML::load f.read
34
+ data = YAML::load f.read
35
+ end
36
+ if data['version'] < REQUIRE_VERSION
37
+ puts "This is tw version #{Tw::VERSION}."
38
+ puts "Your config file is old ("+data['version']+"). Reset tw settings?"
39
+ puts "[Y/n]"
40
+ res = data if STDIN.gets =~ /^n/i
41
+ else
42
+ res = data
34
43
  end
35
44
  rescue => e
36
45
  STDERR.puts e
data/test/test_tw.rb CHANGED
@@ -7,11 +7,16 @@ class TestTw < Test::Unit::TestCase
7
7
  @client.auth
8
8
  end
9
9
 
10
+ def user?(str)
11
+ return false unless str.kind_of? String
12
+ str =~ /^[a-zA-Z0-9_]+$/
13
+ end
14
+
10
15
  def response?(arr)
11
16
  return false unless arr.kind_of? Array
12
17
  arr.each do |i|
13
18
  return false if !(i[:id].class == Fixnum and
14
- i[:user] =~ /^[a-zA-Z0-9_]+$/ and
19
+ (user? i[:user] or (user? i[:user][:to] and user? i[:user][:from])) and
15
20
  i[:text].kind_of? String and
16
21
  i[:time].kind_of? Time)
17
22
  end
@@ -37,4 +42,8 @@ class TestTw < Test::Unit::TestCase
37
42
  def test_list_timeline
38
43
  assert response? @client.list_timeline('shokai', 'arr')
39
44
  end
45
+
46
+ def test_direct_message
47
+ assert response? @client.direct_messages
48
+ end
40
49
  end
metadata CHANGED
@@ -1,168 +1,173 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tw
3
- version: !ruby/object:Gem::Version
4
- hash: 25
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 3
10
- version: 0.0.3
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-02 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: oauth
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.4.7
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: 1.0.0
25
+ type: :runtime
21
26
  prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 1
28
- segments:
29
- - 0
30
- - 4
31
- - 7
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
32
  version: 0.4.7
33
33
  - - <
34
- - !ruby/object:Gem::Version
35
- hash: 23
36
- segments:
37
- - 1
38
- - 0
39
- - 0
34
+ - !ruby/object:Gem::Version
40
35
  version: 1.0.0
36
+ - !ruby/object:Gem::Dependency
37
+ name: twitter
38
+ requirement: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 4.0.0
44
+ - - <
45
+ - !ruby/object:Gem::Version
46
+ version: 5.0.0
41
47
  type: :runtime
42
- name: oauth
43
- version_requirements: *id001
44
- - !ruby/object:Gem::Dependency
45
48
  prerelease: false
46
- requirement: &id002 !ruby/object:Gem::Requirement
47
- none: false
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- hash: 63
52
- segments:
53
- - 4
54
- - 0
55
- - 0
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
56
54
  version: 4.0.0
57
55
  - - <
58
- - !ruby/object:Gem::Version
59
- hash: 55
60
- segments:
61
- - 5
62
- - 0
63
- - 0
56
+ - !ruby/object:Gem::Version
64
57
  version: 5.0.0
58
+ - !ruby/object:Gem::Dependency
59
+ name: args_parser
60
+ requirement: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 0.1.0
65
66
  type: :runtime
66
- name: twitter
67
- version_requirements: *id002
68
- - !ruby/object:Gem::Dependency
69
67
  prerelease: false
70
- requirement: &id003 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 27
76
- segments:
77
- - 0
78
- - 1
79
- - 0
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
80
73
  version: 0.1.0
74
+ - !ruby/object:Gem::Dependency
75
+ name: backports
76
+ requirement: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: 2.6.4
81
82
  type: :runtime
82
- name: args_parser
83
- version_requirements: *id003
84
- - !ruby/object:Gem::Dependency
85
83
  prerelease: false
86
- requirement: &id004 !ruby/object:Gem::Requirement
87
- none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- hash: 27
92
- segments:
93
- - 1
94
- - 1
95
- - 4
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 2.6.4
90
+ - !ruby/object:Gem::Dependency
91
+ name: rainbow
92
+ requirement: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
96
97
  version: 1.1.4
97
98
  - - <
98
- - !ruby/object:Gem::Version
99
- hash: 15
100
- segments:
101
- - 2
102
- - 0
103
- - 0
99
+ - !ruby/object:Gem::Version
104
100
  version: 2.0.0
105
101
  type: :runtime
106
- name: rainbow
107
- version_requirements: *id004
108
- - !ruby/object:Gem::Dependency
109
102
  prerelease: false
110
- requirement: &id005 !ruby/object:Gem::Requirement
103
+ version_requirements: !ruby/object:Gem::Requirement
111
104
  none: false
112
- requirements:
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: 1.1.4
109
+ - - <
110
+ - !ruby/object:Gem::Version
111
+ version: 2.0.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: rdoc
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
113
117
  - - ~>
114
- - !ruby/object:Gem::Version
115
- hash: 19
116
- segments:
117
- - 3
118
- - 10
119
- version: "3.10"
118
+ - !ruby/object:Gem::Version
119
+ version: '3.10'
120
120
  type: :development
121
- name: rdoc
122
- version_requirements: *id005
123
- - !ruby/object:Gem::Dependency
124
121
  prerelease: false
125
- requirement: &id006 !ruby/object:Gem::Requirement
126
- none: false
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- hash: 5
131
- segments:
132
- - 1
133
- - 5
134
- - 3
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ version: '3.10'
128
+ - !ruby/object:Gem::Dependency
129
+ name: newgem
130
+ requirement: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
135
  version: 1.5.3
136
136
  type: :development
137
- name: newgem
138
- version_requirements: *id006
139
- - !ruby/object:Gem::Dependency
140
137
  prerelease: false
141
- requirement: &id007 !ruby/object:Gem::Requirement
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: 1.5.3
144
+ - !ruby/object:Gem::Dependency
145
+ name: hoe
146
+ requirement: !ruby/object:Gem::Requirement
142
147
  none: false
143
- requirements:
148
+ requirements:
144
149
  - - ~>
145
- - !ruby/object:Gem::Version
146
- hash: 5
147
- segments:
148
- - 3
149
- - 1
150
- version: "3.1"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.1'
151
152
  type: :development
152
- name: hoe
153
- version_requirements: *id007
154
- description: "* twitter client."
155
- email:
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ~>
158
+ - !ruby/object:Gem::Version
159
+ version: '3.1'
160
+ description: ! '* twitter client.'
161
+ email:
156
162
  - hashimoto@shokai.org
157
- executables:
163
+ executables:
158
164
  - tw
159
165
  extensions: []
160
-
161
- extra_rdoc_files:
166
+ extra_rdoc_files:
162
167
  - History.txt
163
168
  - Manifest.txt
164
169
  - README.rdoc
165
- files:
170
+ files:
166
171
  - Gemfile
167
172
  - Gemfile.lock
168
173
  - History.txt
@@ -172,6 +177,7 @@ files:
172
177
  - bin/tw
173
178
  - lib/tw.rb
174
179
  - lib/tw/app/cmds.rb
180
+ - lib/tw/app/helper.rb
175
181
  - lib/tw/app/main.rb
176
182
  - lib/tw/app/opt_parser.rb
177
183
  - lib/tw/app/render.rb
@@ -187,38 +193,33 @@ files:
187
193
  - .gemtest
188
194
  homepage: http://github.com/shokai/tw
189
195
  licenses: []
190
-
191
196
  post_install_message:
192
- rdoc_options:
197
+ rdoc_options:
193
198
  - --main
194
199
  - README.rdoc
195
- require_paths:
200
+ require_paths:
196
201
  - lib
197
- required_ruby_version: !ruby/object:Gem::Requirement
202
+ required_ruby_version: !ruby/object:Gem::Requirement
198
203
  none: false
199
- requirements:
200
- - - ">="
201
- - !ruby/object:Gem::Version
202
- hash: 3
203
- segments:
204
+ requirements:
205
+ - - ! '>='
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ segments:
204
209
  - 0
205
- version: "0"
206
- required_rubygems_version: !ruby/object:Gem::Requirement
210
+ hash: -3893906850154543404
211
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
212
  none: false
208
- requirements:
209
- - - ">="
210
- - !ruby/object:Gem::Version
211
- hash: 3
212
- segments:
213
- - 0
214
- version: "0"
213
+ requirements:
214
+ - - ! '>='
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
215
217
  requirements: []
216
-
217
218
  rubyforge_project: tw
218
219
  rubygems_version: 1.8.24
219
220
  signing_key:
220
221
  specification_version: 3
221
- summary: "* twitter client."
222
- test_files:
222
+ summary: ! '* twitter client.'
223
+ test_files:
223
224
  - test/test_helper.rb
224
225
  - test/test_tw.rb